72 if (ch == 198 || ch == 196)
76 else if (ch == 230 || ch == 228)
112 else if (ch >= 200 && ch <= 203)
116 else if (ch >= 204 && ch <= 207)
124 else if ((ch >= 210 && ch <= 214) || ch == 216)
128 else if (ch >= 217 && ch <= 220)
136 else if (ch >= 224 && ch <= 229)
144 else if (ch >= 232 && ch <= 235)
148 else if (ch >= 236 && ch <= 239)
156 else if ((ch >= 242 && ch <= 246) || ch == 248)
160 else if (ch >= 249 && ch <= 252)
164 else if (ch == 253 || ch == 255)
172 case 0x100:
r =
"A";
break;
173 case 0x101:
r =
"a";
break;
174 case 0x102:
r =
"A";
break;
175 case 0x103:
r =
"a";
break;
176 case 0x104:
r =
"A";
break;
177 case 0x105:
r =
"a";
break;
178 case 0x106:
r =
"C";
break;
179 case 0x107:
r =
"c";
break;
180 case 0x108:
r =
"C";
break;
181 case 0x109:
r =
"c";
break;
182 case 0x10A:
r =
"C";
break;
183 case 0x10B:
r =
"c";
break;
184 case 0x10C:
r =
"C";
break;
185 case 0x10D:
r =
"c";
break;
186 case 0x10E:
r =
"D";
break;
187 case 0x10F:
r =
"d";
break;
188 case 0x110:
r =
"D";
break;
189 case 0x111:
r =
"d";
break;
190 case 0x112:
r =
"E";
break;
191 case 0x113:
r =
"e";
break;
192 case 0x114:
r =
"E";
break;
193 case 0x115:
r =
"e";
break;
194 case 0x116:
r =
"E";
break;
195 case 0x117:
r =
"e";
break;
196 case 0x118:
r =
"E";
break;
197 case 0x119:
r =
"e";
break;
198 case 0x11A:
r =
"E";
break;
199 case 0x11B:
r =
"e";
break;
200 case 0x11C:
r =
"G";
break;
201 case 0x11D:
r =
"g";
break;
202 case 0x11E:
r =
"G";
break;
203 case 0x11F:
r =
"g";
break;
204 case 0x120:
r =
"G";
break;
205 case 0x121:
r =
"g";
break;
206 case 0x122:
r =
"G";
break;
207 case 0x123:
r =
"g";
break;
208 case 0x124:
r =
"H";
break;
209 case 0x125:
r =
"h";
break;
210 case 0x126:
r =
"H";
break;
211 case 0x127:
r =
"h";
break;
212 case 0x128:
r =
"I";
break;
213 case 0x129:
r =
"i";
break;
214 case 0x12A:
r =
"I";
break;
215 case 0x12B:
r =
"i";
break;
216 case 0x12C:
r =
"I";
break;
217 case 0x12D:
r =
"i";
break;
218 case 0x12E:
r =
"I";
break;
219 case 0x12F:
r =
"i";
break;
220 case 0x130:
r =
"I";
break;
221 case 0x131:
r =
"i";
break;
222 case 0x132:
r =
"IJ";
break;
223 case 0x133:
r =
"ij";
break;
224 case 0x134:
r =
"J";
break;
225 case 0x135:
r =
"j";
break;
226 case 0x136:
r =
"K";
break;
227 case 0x137:
r =
"k";
break;
228 case 0x138:
r =
"k";
break;
229 case 0x139:
r =
"L";
break;
230 case 0x13A:
r =
"l";
break;
231 case 0x13B:
r =
"L";
break;
232 case 0x13C:
r =
"l";
break;
233 case 0x13D:
r =
"L";
break;
234 case 0x13E:
r =
"l";
break;
235 case 0x13F:
r =
"L";
break;
236 case 0x140:
r =
"l";
break;
237 case 0x141:
r =
"L";
break;
238 case 0x142:
r =
"l";
break;
239 case 0x143:
r =
"N";
break;
240 case 0x144:
r =
"n";
break;
241 case 0x145:
r =
"N";
break;
242 case 0x146:
r =
"n";
break;
243 case 0x147:
r =
"N";
break;
244 case 0x148:
r =
"n";
break;
245 case 0x149:
r =
"n";
break;
246 case 0x14A:
r =
"N";
break;
247 case 0x14B:
r =
"n";
break;
248 case 0x14C:
r =
"O";
break;
249 case 0x14D:
r =
"o";
break;
250 case 0x14E:
r =
"O";
break;
251 case 0x14F:
r =
"o";
break;
252 case 0x150:
r =
"O";
break;
253 case 0x151:
r =
"o";
break;
254 case 0x152:
r =
"OE";
break;
255 case 0x153:
r =
"oe";
break;
256 case 0x154:
r =
"R";
break;
257 case 0x155:
r =
"r";
break;
258 case 0x156:
r =
"R";
break;
259 case 0x157:
r =
"r";
break;
260 case 0x158:
r =
"R";
break;
261 case 0x159:
r =
"r";
break;
262 case 0x15A:
r =
"S";
break;
263 case 0x15B:
r =
"s";
break;
264 case 0x15C:
r =
"S";
break;
265 case 0x15D:
r =
"s";
break;
266 case 0x15E:
r =
"S";
break;
267 case 0x15F:
r =
"s";
break;
268 case 0x160:
r =
"S";
break;
269 case 0x161:
r =
"s";
break;
270 case 0x162:
r =
"T";
break;
271 case 0x163:
r =
"t";
break;
272 case 0x164:
r =
"T";
break;
273 case 0x165:
r =
"t";
break;
274 case 0x166:
r =
"T";
break;
275 case 0x167:
r =
"t";
break;
276 case 0x168:
r =
"U";
break;
277 case 0x169:
r =
"u";
break;
278 case 0x16A:
r =
"U";
break;
279 case 0x16B:
r =
"u";
break;
280 case 0x16C:
r =
"U";
break;
281 case 0x16D:
r =
"u";
break;
282 case 0x16E:
r =
"U";
break;
283 case 0x16F:
r =
"u";
break;
284 case 0x170:
r =
"U";
break;
285 case 0x171:
r =
"u";
break;
286 case 0x172:
r =
"U";
break;
287 case 0x173:
r =
"u";
break;
288 case 0x174:
r =
"W";
break;
289 case 0x175:
r =
"w";
break;
290 case 0x176:
r =
"Y";
break;
291 case 0x177:
r =
"y";
break;
292 case 0x178:
r =
"Y";
break;
293 case 0x179:
r =
"Z";
break;
294 case 0x17A:
r =
"z";
break;
295 case 0x17B:
r =
"Z";
break;
296 case 0x17C:
r =
"z";
break;
297 case 0x17D:
r =
"Z";
break;
298 case 0x17E:
r =
"z";
break;
299 case 0x17F:
r =
"s";
break;
302 case 0x1E00:
r =
"A";
break;
303 case 0x1E01:
r =
"a";
break;
304 case 0x1E02:
r =
"B";
break;
305 case 0x1E03:
r =
"b";
break;
306 case 0x1E04:
r =
"B";
break;
307 case 0x1E05:
r =
"b";
break;
308 case 0x1E06:
r =
"B";
break;
309 case 0x1E07:
r =
"b";
break;
310 case 0x1E08:
r =
"C";
break;
311 case 0x1E09:
r =
"c";
break;
312 case 0x1E0A:
r =
"D";
break;
313 case 0x1E0B:
r =
"d";
break;
314 case 0x1E0C:
r =
"D";
break;
315 case 0x1E0D:
r =
"d";
break;
316 case 0x1E0E:
r =
"D";
break;
317 case 0x1E0F:
r =
"d";
break;
318 case 0x1E10:
r =
"D";
break;
319 case 0x1E11:
r =
"d";
break;
320 case 0x1E12:
r =
"D";
break;
321 case 0x1E13:
r =
"d";
break;
322 case 0x1E14:
r =
"E";
break;
323 case 0x1E15:
r =
"e";
break;
324 case 0x1E16:
r =
"E";
break;
325 case 0x1E17:
r =
"e";
break;
326 case 0x1E18:
r =
"E";
break;
327 case 0x1E19:
r =
"e";
break;
328 case 0x1E1A:
r =
"E";
break;
329 case 0x1E1B:
r =
"e";
break;
330 case 0x1E1C:
r =
"E";
break;
331 case 0x1E1D:
r =
"e";
break;
332 case 0x1E1E:
r =
"F";
break;
333 case 0x1E1F:
r =
"f";
break;
334 case 0x1E20:
r =
"G";
break;
335 case 0x1E21:
r =
"g";
break;
336 case 0x1E22:
r =
"H";
break;
337 case 0x1E23:
r =
"h";
break;
338 case 0x1E24:
r =
"H";
break;
339 case 0x1E25:
r =
"h";
break;
340 case 0x1E26:
r =
"H";
break;
341 case 0x1E27:
r =
"h";
break;
342 case 0x1E28:
r =
"H";
break;
343 case 0x1E29:
r =
"h";
break;
344 case 0x1E2A:
r =
"H";
break;
345 case 0x1E2B:
r =
"h";
break;
346 case 0x1E2C:
r =
"I";
break;
347 case 0x1E2D:
r =
"i";
break;
348 case 0x1E2E:
r =
"I";
break;
349 case 0x1E2F:
r =
"i";
break;
350 case 0x1E30:
r =
"K";
break;
351 case 0x1E31:
r =
"k";
break;
352 case 0x1E32:
r =
"K";
break;
353 case 0x1E33:
r =
"k";
break;
354 case 0x1E34:
r =
"K";
break;
355 case 0x1E35:
r =
"k";
break;
356 case 0x1E36:
r =
"L";
break;
357 case 0x1E37:
r =
"l";
break;
358 case 0x1E38:
r =
"L";
break;
359 case 0x1E39:
r =
"l";
break;
360 case 0x1E3A:
r =
"L";
break;
361 case 0x1E3B:
r =
"l";
break;
362 case 0x1E3C:
r =
"L";
break;
363 case 0x1E3D:
r =
"l";
break;
364 case 0x1E3E:
r =
"M";
break;
365 case 0x1E3F:
r =
"m";
break;
366 case 0x1E40:
r =
"M";
break;
367 case 0x1E41:
r =
"m";
break;
368 case 0x1E42:
r =
"M";
break;
369 case 0x1E43:
r =
"m";
break;
370 case 0x1E44:
r =
"N";
break;
371 case 0x1E45:
r =
"n";
break;
372 case 0x1E46:
r =
"N";
break;
373 case 0x1E47:
r =
"n";
break;
374 case 0x1E48:
r =
"N";
break;
375 case 0x1E49:
r =
"n";
break;
376 case 0x1E4A:
r =
"N";
break;
377 case 0x1E4B:
r =
"n";
break;
378 case 0x1E4C:
r =
"O";
break;
379 case 0x1E4D:
r =
"o";
break;
380 case 0x1E4E:
r =
"O";
break;
381 case 0x1E4F:
r =
"o";
break;
382 case 0x1E50:
r =
"O";
break;
383 case 0x1E51:
r =
"o";
break;
384 case 0x1E52:
r =
"O";
break;
385 case 0x1E53:
r =
"o";
break;
386 case 0x1E54:
r =
"P";
break;
387 case 0x1E55:
r =
"p";
break;
388 case 0x1E56:
r =
"P";
break;
389 case 0x1E57:
r =
"p";
break;
390 case 0x1E58:
r =
"P";
break;
391 case 0x1E59:
r =
"p";
break;
392 case 0x1E5A:
r =
"R";
break;
393 case 0x1E5B:
r =
"r";
break;
394 case 0x1E5C:
r =
"R";
break;
395 case 0x1E5D:
r =
"r";
break;
396 case 0x1E5E:
r =
"R";
break;
397 case 0x1E5F:
r =
"r";
break;
398 case 0x1E60:
r =
"S";
break;
399 case 0x1E61:
r =
"s";
break;
400 case 0x1E62:
r =
"S";
break;
401 case 0x1E63:
r =
"s";
break;
402 case 0x1E64:
r =
"S";
break;
403 case 0x1E65:
r =
"s";
break;
404 case 0x1E66:
r =
"S";
break;
405 case 0x1E67:
r =
"s";
break;
406 case 0x1E68:
r =
"S";
break;
407 case 0x1E69:
r =
"s";
break;
408 case 0x1E6A:
r =
"T";
break;
409 case 0x1E6B:
r =
"t";
break;
410 case 0x1E6C:
r =
"T";
break;
411 case 0x1E6D:
r =
"t";
break;
412 case 0x1E6E:
r =
"T";
break;
413 case 0x1E6F:
r =
"t";
break;
414 case 0x1E70:
r =
"T";
break;
415 case 0x1E71:
r =
"t";
break;
416 case 0x1E72:
r =
"U";
break;
417 case 0x1E73:
r =
"u";
break;
418 case 0x1E74:
r =
"U";
break;
419 case 0x1E75:
r =
"u";
break;
420 case 0x1E76:
r =
"U";
break;
421 case 0x1E77:
r =
"u";
break;
422 case 0x1E78:
r =
"U";
break;
423 case 0x1E79:
r =
"u";
break;
424 case 0x1E7A:
r =
"U";
break;
425 case 0x1E7B:
r =
"u";
break;
426 case 0x1E7C:
r =
"V";
break;
427 case 0x1E7D:
r =
"v";
break;
428 case 0x1E7E:
r =
"V";
break;
429 case 0x1E7F:
r =
"v";
break;
430 case 0x1E80:
r =
"V";
break;
431 case 0x1E81:
r =
"w";
break;
432 case 0x1E82:
r =
"W";
break;
433 case 0x1E83:
r =
"w";
break;
434 case 0x1E84:
r =
"W";
break;
435 case 0x1E85:
r =
"w";
break;
436 case 0x1E86:
r =
"W";
break;
437 case 0x1E87:
r =
"w";
break;
438 case 0x1E88:
r =
"W";
break;
439 case 0x1E89:
r =
"w";
break;
440 case 0x1E8A:
r =
"W";
break;
441 case 0x1E8B:
r =
"x";
break;
442 case 0x1E8C:
r =
"X";
break;
443 case 0x1E8D:
r =
"x";
break;
444 case 0x1E8E:
r =
"Y";
break;
445 case 0x1E8F:
r =
"y";
break;
446 case 0x1E90:
r =
"Z";
break;
447 case 0x1E91:
r =
"z";
break;
448 case 0x1E92:
r =
"Z";
break;
449 case 0x1E93:
r =
"z";
break;
450 case 0x1E94:
r =
"Z";
break;
451 case 0x1E95:
r =
"z";
break;
452 case 0x1E96:
r =
"h";
break;
453 case 0x1E97:
r =
"t";
break;
454 case 0x1E98:
r =
"w";
break;
455 case 0x1E99:
r =
"y";
break;
456 case 0x1E9A:
r =
"a";
break;
457 case 0x1E9B:
r =
"s";
break;
458 case 0x1E9C:
r =
"s";
break;
459 case 0x1E9D:
r =
"s";
break;
460 case 0x1E9E:
r =
"S";
break;
461 case 0x1E9F:
r =
"d";
break;
462 case 0x1EA0:
r =
"A";
break;
463 case 0x1EA1:
r =
"a";
break;
464 case 0x1EA2:
r =
"A";
break;
465 case 0x1EA3:
r =
"a";
break;
466 case 0x1EA4:
r =
"A";
break;
467 case 0x1EA5:
r =
"a";
break;
468 case 0x1EA6:
r =
"A";
break;
469 case 0x1EA7:
r =
"a";
break;
470 case 0x1EA8:
r =
"A";
break;
471 case 0x1EA9:
r =
"a";
break;
472 case 0x1EAA:
r =
"A";
break;
473 case 0x1EAB:
r =
"a";
break;
474 case 0x1EAC:
r =
"A";
break;
475 case 0x1EAD:
r =
"a";
break;
476 case 0x1EAE:
r =
"A";
break;
477 case 0x1EAF:
r =
"a";
break;
478 case 0x1EB0:
r =
"A";
break;
479 case 0x1EB1:
r =
"a";
break;
480 case 0x1EB2:
r =
"A";
break;
481 case 0x1EB3:
r =
"a";
break;
482 case 0x1EB4:
r =
"A";
break;
483 case 0x1EB5:
r =
"a";
break;
484 case 0x1EB6:
r =
"A";
break;
485 case 0x1EB7:
r =
"a";
break;
486 case 0x1EB8:
r =
"E";
break;
487 case 0x1EB9:
r =
"e";
break;
488 case 0x1EBA:
r =
"E";
break;
489 case 0x1EBB:
r =
"e";
break;
490 case 0x1EBC:
r =
"E";
break;
491 case 0x1EBD:
r =
"e";
break;
492 case 0x1EBE:
r =
"E";
break;
493 case 0x1EBF:
r =
"e";
break;
494 case 0x1EC0:
r =
"E";
break;
495 case 0x1EC1:
r =
"e";
break;
496 case 0x1EC2:
r =
"E";
break;
497 case 0x1EC3:
r =
"e";
break;
498 case 0x1EC4:
r =
"E";
break;
499 case 0x1EC5:
r =
"e";
break;
500 case 0x1EC6:
r =
"E";
break;
501 case 0x1EC7:
r =
"e";
break;
502 case 0x1EC8:
r =
"I";
break;
503 case 0x1EC9:
r =
"i";
break;
504 case 0x1ECA:
r =
"I";
break;
505 case 0x1ECB:
r =
"i";
break;
506 case 0x1ECC:
r =
"O";
break;
507 case 0x1ECD:
r =
"o";
break;
508 case 0x1ECE:
r =
"O";
break;
509 case 0x1ECF:
r =
"o";
break;
510 case 0x1ED0:
r =
"O";
break;
511 case 0x1ED1:
r =
"o";
break;
512 case 0x1ED2:
r =
"O";
break;
513 case 0x1ED3:
r =
"o";
break;
514 case 0x1ED4:
r =
"O";
break;
515 case 0x1ED5:
r =
"o";
break;
516 case 0x1ED6:
r =
"O";
break;
517 case 0x1ED7:
r =
"o";
break;
518 case 0x1ED8:
r =
"O";
break;
519 case 0x1ED9:
r =
"o";
break;
520 case 0x1EDA:
r =
"O";
break;
521 case 0x1EDB:
r =
"o";
break;
522 case 0x1EDC:
r =
"O";
break;
523 case 0x1EDD:
r =
"o";
break;
524 case 0x1EDE:
r =
"O";
break;
525 case 0x1EDF:
r =
"o";
break;
526 case 0x1EE0:
r =
"O";
break;
527 case 0x1EE1:
r =
"o";
break;
528 case 0x1EE2:
r =
"O";
break;
529 case 0x1EE3:
r =
"o";
break;
530 case 0x1EE4:
r =
"U";
break;
531 case 0x1EE5:
r =
"u";
break;
532 case 0x1EE6:
r =
"U";
break;
533 case 0x1EE7:
r =
"u";
break;
534 case 0x1EE8:
r =
"U";
break;
535 case 0x1EE9:
r =
"u";
break;
536 case 0x1EEA:
r =
"U";
break;
537 case 0x1EEB:
r =
"u";
break;
538 case 0x1EEC:
r =
"U";
break;
539 case 0x1EED:
r =
"u";
break;
540 case 0x1EEE:
r =
"U";
break;
541 case 0x1EEF:
r =
"u";
break;
542 case 0x1EF0:
r =
"U";
break;
543 case 0x1EF1:
r =
"u";
break;
544 case 0x1EF2:
r =
"Y";
break;
545 case 0x1EF3:
r =
"y";
break;
546 case 0x1EF4:
r =
"Y";
break;
547 case 0x1EF5:
r =
"y";
break;
548 case 0x1EF6:
r =
"Y";
break;
549 case 0x1EF7:
r =
"y";
break;
550 case 0x1EF8:
r =
"Y";
break;
551 case 0x1EF9:
r =
"y";
break;
552 case 0x1EFA:
r =
"LL";
break;
553 case 0x1EFB:
r =
"ll";
break;
554 case 0x1EFC:
r =
"V";
break;
555 case 0x1EFD:
r =
"v";
break;
556 case 0x1EFE:
r =
"Y";
break;
557 case 0x1EFF:
r =
"y";
break;
559 case 0x2019:
r =
"'";
break;
570 for (string::const_iterator
i =
input.begin();
i !=
input.end(); ++
i)
575 new_str +=
static_cast<char>(sym);
580 new_str += replacement;
600 if (node.
size() > 0) {
602 while (it != node.
end()) {
620 if (medline.empty()) {
623 string suggest = medline;
655 if (!medline.empty()) {
672 if (node.
size() > 0) {
674 while (it != node.
end()) {
675 s_GetTitle(*it, medline, title, issn, titles);
686 bool s_GetJournalIds(
const string& old_title,
const string& collection, vector<string>& uids)
690 string db(
"nlmcatalog");
697 ecli.
Search(db, old_title + collection, uids);
703 catch (
const exception& e) {
714 auto start = chrono::steady_clock::now();
716 vector<string> search_ids;
719 if (!shortcut_title.empty()) {
720 success = s_GetJournalIds(shortcut_title,
"[iso]", search_ids);
728 if (search_ids.empty()) {
729 auto diff = chrono::steady_clock::now() - start;
730 if (chrono::duration_cast<chrono::seconds>(diff) < chrono::seconds(45) || success) {
732 success = s_GetJournalIds(old_title,
"[issn]", search_ids);
736 if (search_ids.empty()) {
737 auto diff = chrono::steady_clock::now() - start;
738 if (chrono::duration_cast<chrono::seconds>(diff) < chrono::seconds(45) || success) {
739 success = s_GetJournalIds(old_title,
"[ti] AND ncbijournals[sb]", search_ids);
742 if (search_ids.empty()) {
743 auto diff = chrono::steady_clock::now() - start;
744 if (chrono::duration_cast<chrono::seconds>(diff) < chrono::seconds(45) || success) {
745 success = s_GetJournalIds(old_title,
"[jour]", search_ids);
748 if (search_ids.empty()) {
753 vector<string> tokens;
755 string fields =
NStr::Join(tokens,
"[All Fields] AND ");
756 auto diff = chrono::steady_clock::now() - start;
757 if (chrono::duration_cast<chrono::seconds>(diff) < chrono::seconds(45) || success) {
758 success = s_GetJournalIds(fields,
"[All Fields] AND ncbijournals[All Fields]", search_ids);
761 if (!search_ids.empty()) {
763 string db =
"nlmcatalog";
769 auto diff = chrono::steady_clock::now() - start;
770 if (chrono::duration_cast<chrono::seconds>(diff) < chrono::seconds(45) || success) {
771 ecli.
Summary(db, search_ids, docsums,
"2.0");
775 string medline =
"", title =
"", issn =
"";
776 while (node_it != docsums.
end()) {
777 s_GetTitle(*node_it, medline, title, issn, titles);
780 if (!medline.empty()) {
793 vector<string> parts;
795 if (parts.size() != 2)
797 if (parts[1].
size() != 2)
799 if (!
isupper(parts[1][0]) || parts[1][1] !=
'.')
802 initial = parts[1][0];
819 string json = ss.str();
821 return make_pair(
CRef<CPubdesc>(
NULL),
"Empty json object returned from api.crossref.org");
828 return make_pair(
CRef<CPubdesc>(
NULL),
"Unable to parse json returned from api.crossref.org");
830 if ( !obj.
has(
"status"))
833 if (obj[
"status"].GetValue().GetString() !=
"ok")
834 return make_pair(
CRef<CPubdesc>(
NULL),
"Record status is " + obj[
"status"].GetValue().GetString());
836 if (!obj.
has(
"message") || !obj[
"message"].
IsObject())
837 return make_pair(
CRef<CPubdesc>(
NULL),
"Empty record returned from api.crossref.org");
844 if (
msg.has(
"ISSN") &&
msg[
"ISSN"].IsArray()) {
845 for (
size_t i = 0;
i <
msg[
"ISSN"].GetArray().
size();
i++) {
846 if (
msg[
"ISSN"].GetArray()[
i].IsValue() &&
msg[
"ISSN"].GetArray()[
i].GetValue().IsString()) {
847 string value =
msg[
"ISSN"].GetArray()[
i].GetValue().GetString();
849 issn.push_back(
value);
855 string journal_title;
856 const char* kContainerTitle =
"container-title";
857 const char* kInst =
"institution";
859 if (
msg.has(kContainerTitle) &&
msg[kContainerTitle].IsArray() && !
msg[kContainerTitle].GetArray().empty()) {
860 const auto& cont_title =
msg[kContainerTitle].GetArray().front();
861 if (cont_title.IsValue() && cont_title.GetValue().IsString()) {
865 else if (
msg.has(kInst) &&
msg[kInst].IsArray() && !
msg[kInst].GetArray().empty()) {
866 const auto& msg_array =
msg[kInst].GetArray().front();
867 if (msg_array.IsObject() &&
868 msg_array.GetObject().has(
"name") &&
869 msg_array.GetObject()[
"name"].IsValue() &&
870 msg_array.GetObject()[
"name"].GetValue().IsString()) {
875 if (!journal_title.empty())
876 issn.push_back(journal_title);
878 bool is_isojta =
false;
879 for (
const auto& old_title : issn)
881 vector<string> titles;
887 if (titles.size() == 1)
889 string new_title = titles[0];
891 if (pos != string::npos)
893 new_title = new_title.substr(0, pos);
897 journal_title = new_title;
905 title->SetIso_jta(journal_title);
907 title->SetName(journal_title);
910 journal.SetTitle().Set().push_back(title);
912 auto& imprint =
journal.SetImp();
914 if (
msg.has(
"issue") &&
msg[
"issue"].IsValue() &&
msg[
"issue"].GetValue().IsString()) {
918 if (
msg.has(
"volume") &&
msg[
"volume"].IsValue() &&
msg[
"volume"].GetValue().IsString()) {
922 if (
msg.has(
"page") &&
msg[
"page"].IsValue() &&
msg[
"page"].GetValue().IsString()) {
924 imprint.SetPubstatus(4);
927 if (
msg.has(
"title") &&
msg[
"title"].IsArray()
928 && !
msg[
"title"].GetArray().empty()
929 &&
msg[
"title"].GetArray().front().IsValue()
930 &&
msg[
"title"].GetArray().front().GetValue().IsString()) {
936 if (
msg.has(
"author") &&
msg[
"author"].IsArray())
939 for (
size_t i = 0;
i <
msg[
"author"].GetArray().
size();
i++) {
940 if (!
msg[
"author"].GetArray()[
i].IsObject())
949 auth->
SetName().SetName().SetFirst(name);
950 if (!initial.empty())
951 auth->
SetName().SetName().SetInitials(initial);
956 auth->
SetName().SetName().SetLast(name);
986 if (
msg.has(
"published-print") &&
msg[
"published-print"].IsObject()) {
987 date =
"published-print";
990 else if (
msg.has(
"published-online") &&
msg[
"published-online"].IsObject())
992 date =
"published-online";
995 else if (
msg.has(
"posted") &&
msg[
"posted"].IsObject())
1001 &&
msg[date].GetObject().has(
"date-parts")
1002 &&
msg[date].GetObject()[
"date-parts"].IsArray()
1003 && !
msg[date].GetObject()[
"date-parts"].GetArray().empty()
1004 &&
msg[date].GetObject()[
"date-parts"].GetArray().front().IsArray()
1005 && !
msg[date].GetObject()[
"date-parts"].GetArray().front().GetArray().empty())
1008 if (
msg[date].GetObject()[
"date-parts"].GetArray().
front().GetArray()[0].IsValue()
1009 &&
msg[date].GetObject()[
"date-parts"].GetArray().
front().GetArray()[0].GetValue().IsInt4())
1011 int year =
msg[date].GetObject()[
"date-parts"].GetArray().front().GetArray()[0].GetValue().GetInt4();
1012 pub->
SetArticle().
SetFrom().SetJournal().SetImp().SetDate().SetStd().SetYear(year);
1014 if (
msg[date].GetObject()[
"date-parts"].GetArray().
front().GetArray().
size() > 1
1015 &&
msg[date].GetObject()[
"date-parts"].GetArray().
front().GetArray()[1].IsValue()
1016 &&
msg[date].GetObject()[
"date-parts"].GetArray().
front().GetArray()[1].GetValue().IsInt4())
1018 int month =
msg[date].GetObject()[
"date-parts"].GetArray().front().GetArray()[1].GetValue().GetInt4();
1019 pub->
SetArticle().
SetFrom().SetJournal().SetImp().SetDate().SetStd().SetMonth(month);
1021 if (
msg[date].GetObject()[
"date-parts"].GetArray().
front().GetArray().
size() > 2
1022 &&
msg[date].GetObject()[
"date-parts"].GetArray().
front().GetArray()[2].IsValue()
1023 &&
msg[date].GetObject()[
"date-parts"].GetArray().
front().GetArray()[2].GetValue().IsInt4())
1025 int day =
msg[date].GetObject()[
"date-parts"].GetArray().front().GetArray()[2].GetValue().GetInt4();
1026 pub->
SetArticle().
SetFrom().SetJournal().SetImp().SetDate().SetStd().SetDay(day);
1036 pubdesc->SetPub().Set().push_back(pub);
1038 return make_pair(pubdesc,
"Failed ISOJTA lookup");
1041 return make_pair(pubdesc,
"");
1052 looked_up_pubdesc = it->second;
1057 looked_up_pubdesc = new_pubdesc_str.first;
1058 if (looked_up_pubdesc) {
1062 error_msg = new_pubdesc_str.second;
1065 return make_pair(looked_up_pubdesc, error_msg);
1070 ostr <<
"CDoiLookupWithCache: " <<
m_CacheHits <<
" cache hits out of " <<
m_Requests <<
" requests\n";
1075 {
"Antimicrobial Agents and Chemotherapy",
"Antimicrob Agents Chemother" },
1077 {
"Genes",
"Genes Basel" },
1078 {
"IJSEM",
"Int J Syst Evol Microbiol" },
1079 {
"Journal of Clinical Microbiology",
"J Clin Microbiol" },
1080 {
"journal of microbiology",
"J Microbiol" },
1081 {
"Journal of Virology",
"J Virol" },
1082 {
"mitochondrial DNA A",
"Mitochondrial DNA A DNA Mapp Seq Anal" },
1083 {
"mitochondrial DNA B",
"Mitochondrial DNA B Resour" },
1084 {
"Nature",
"Nature" },
1085 {
"Nucleic Acids Research",
"Nucleic Acids Res" },
1086 {
"Science",
"Science" },
1087 {
"Virology",
"Virology" },
1095 auto it = sc_ISOShortcutMap.find(old_title.c_str());
1096 if (it != sc_ISOShortcutMap.end()) {
1109 titles = it->second;
1121 if (!new_title.empty()) {
1122 titles.push_back(new_title);
1126 string tmp_title = old_title;
1129 NCBI_USER_THROW(
"Failed to execute ISOJTA lookup possibly due to service failure");
1132 for (
auto& it : titles) {
1134 it = it.substr(0, pos);
1138 titles.erase(
remove_if(titles.begin(), titles.end(), [](
const string& elem) { return NStr::IsBlank(elem); }), titles.end());
1139 if (titles.size() > 1 && (old_title.find(
'.') !=
NPOS)) {
1141 if (find(titles.begin(), titles.end(), nodots_title) != titles.end()) {
1142 titles.assign({ nodots_title });
1149 ostr <<
"CISOJTALookupWithCache: " <<
m_CacheHits <<
" cache hits out of " <<
m_Requests <<
" requests\n";
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
void remove_if(Container &c, Predicate *__pred)
pair< CRef< objects::CPubdesc >, string > GetPub(const string &doi)
TDOILookupMap m_DOILookupMap
void ReportStats(std::ostream &ostr)
static string GetSpecialCharacterReplacement(TUnicodeSymbol ch)
static bool LookupIsojta(string old_title, vector< string > &titles)
static pair< CRef< objects::CPubdesc >, string > GetPubFromCrossRef(const string &doi)
static string Transcode(const CStringUTF8 &input)
void SetMaxReturn(int ret_max)
Uint8 Search(const string &db, const string &term, vector< objects::CSeq_id_Handle > &uids, const string &xml_path=kEmptyStr)
void Summary(const string &db, const vector< objects::CSeq_id_Handle > &uids, xml::document &docsums, const string &version="")
static CGuiRegistry & GetInstance()
access the application-wide singleton
int GetInt(const string &key, int default_val=0) const
retrieve values by section and key.
static string s_GetISOShortcut(const string &old_title)
TISOJTALookupMap m_ISOJTALookupMap
void GetJournalAbbr(const string &old_title, vector< string > &titles)
void ReportStats(std::ostream &ostr)
static void s_DoLookup(const string &old_title, vector< string > &titles)
bool IsObject(void) const
CJson_ConstObject GetObject(void) const
Get JSON object contents of the node.
CJson_ConstValue GetValue(void) const
Get JSON value contents of the node.
bool has(const CJson_Node::TKeyType &name) const
Test if an element with this name exists in the object.
bool IsString(void) const
bool ParseString(const TStringType &v)
Read JSON data from a UTF8 string.
bool ReadSucceeded(void) const
Test if the most recent read was successful.
@Pubdesc.hpp User-defined methods of the data storage class.
class CStaticArrayMap<> provides access to a static array in much the same way as CStaticArraySet<>,...
CTimeout – Timeout interval.
const_iterator end() const
const_iterator find(const key_type &key) const
The xml::document class is used to hold the XML tree and various bits of information about it.
node::iterator begin(void)
Get an iterator to the first child node of this document.
node::iterator end(void)
Get an iterator that points one past the last child node for this document.
The xml::node::iterator provides a way to access children nodes similar to a standard C++ container.
The xml::node class is used to hold information about one XML node.
bool is_text(void) const
Find out if this node is a text node or sometiming like a text node, CDATA for example.
const char * get_name(void) const
Get the name of this xml::node.
iterator end(void)
Get an iterator that points one past the last child for this node.
iterator begin(void)
Get an iterator that points to the beginning of this node's children.
const char * get_content(void) const
Get the content for this text node.
size_type size(void) const
Returns the number of childer this nodes has.
CStaticArrayMap< const char *, const char *, PNocase_CStr > TISOShortcutMap
void FixAuthorCap(string &name, bool bApostrophes)
DEFINE_STATIC_ARRAY_MAP(TISOShortcutMap, sc_ISOShortcutMap, k_iso_shortcut_pair_map)
static const TISOShortcutPairElem k_iso_shortcut_pair_map[]
string s_GetValFromChildren(xml::node &node)
void s_GetTitle(xml::node &node, string &medline, string &title, string &issn, vector< string > &titles)
string s_GetTitleSuggestion(const string &medline, const string &title, const string &issn)
SStaticPair< const char *, const char * > TISOShortcutPairElem
static void ExtractMiddleInitial(string &name, string &initial)
static auto & FixCapitalizationInElement
static auto & CapitalizeAfterApostrophe
#define LOG_POST(message)
This macro is deprecated and it's strongly recomended to move in all projects (except tests) to macro...
#define NCBI_USER_THROW(message)
Throw a quick-and-dirty runtime exception of type 'CException' with the given error message and error...
void Error(CExceptionArgs_Base &args)
const string & GetMsg(void) const
Get message string.
static string StripHTML(const string &str)
Strip all HTML code from a string.
CHttpResponse Get(const CUrl &url, const CTimeout &timeout=CTimeout(CTimeout::eDefault), THttpRetries retries=null)
Shortcut for GET requests.
CNcbiIstream & ContentStream(void) const
Get input stream.
int GetStatusCode(void) const
Get response status code.
const string & GetStatusText(void) const
Get response status text.
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
bool NcbiStreamCopy(CNcbiOstream &os, CNcbiIstream &is)
Copy the entire contents of stream "is" to stream "os".
static list< string > & Split(const CTempString str, const CTempString delim, list< string > &arr, TSplitFlags flags=0, vector< SIZE_TYPE > *token_pos=NULL)
Split a string using specified delimiters.
static bool IsBlank(const CTempString str, SIZE_TYPE pos=0)
Check if a string is blank (has no text).
static string IntToString(int value, TNumToStringFlags flags=0, int base=10)
Convert int to string.
static SIZE_TYPE Find(const CTempString str, const CTempString pattern, ECase use_case=eCase, EDirection direction=eForwardSearch, SIZE_TYPE occurrence=0)
Find the pattern in the string.
static string Join(const TContainer &arr, const CTempString &delim)
Join strings using the specified delimiter.
char32_t TUnicodeSymbol
Unicode character.
static string & Replace(const string &src, const string &search, const string &replace, string &dst, SIZE_TYPE start_pos=0, SIZE_TYPE max_replace=0, SIZE_TYPE *num_replace=0)
Replace occurrences of a substring within a string.
static bool StartsWith(const CTempString str, const CTempString start, ECase use_case=eCase)
Check if a string starts with a specified prefix value.
static TUnicodeSymbol Decode(const char *&src)
Convert sequence of UTF8 code units into Unicode code point.
static bool EqualNocase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-insensitive equality of a substring with another string.
static bool IsUpper(const CTempString str)
Checks if all letters in the given string have a upper case.
static string & ReplaceInPlace(string &src, const string &search, const string &replace, SIZE_TYPE start_pos=0, SIZE_TYPE max_replace=0, SIZE_TYPE *num_replace=0)
Replace occurrences of a substring within a string.
static string URLEncode(const CTempString str, EUrlEncode flag=eUrlEnc_SkipMarkChars)
URL-encode string.
@ fSplit_Tokenize
All delimiters are merged and trimmed, to get non-empty tokens only.
@ eNocase
Case insensitive compare.
void SetIds(TIds &value)
Assign a value to Ids data member.
void SetTitle(TTitle &value)
Assign a value to Title data member.
void SetName(TName &value)
Assign a value to Name data member.
void SetFrom(TFrom &value)
Assign a value to From data member.
void SetAuthors(TAuthors &value)
Assign a value to Authors data member.
TDoi & SetDoi(void)
Select the variant.
bool IsSetName(void) const
Author, Primary or Secondary Check if a value has been assigned to Name data member.
TArticle & SetArticle(void)
Select the variant.
This file contains the definition of the xml::document class.
constexpr auto front(list< Head, As... >, T=T()) noexcept -> Head
const struct ncbi::grid::netcache::search::fields::SIZE size
const GenericPointer< typename T::ValueType > T2 value
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
User-defined methods of the data storage class.
CRef< CPub > journal(ParserPtr pp, char *bptr, char *eptr, CRef< CAuth_list > &auth_list, CRef< CTitle::C_E > &title, bool has_muid, CRef< CCit_art > &cit_art, Int4 er)
static SLJIT_INLINE sljit_ins msg(sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b)
Template structure SStaticPair is simlified replacement of STL pair<> Main reason of introducing this...