scitex 2.13.0__py3-none-any.whl → 2.15.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scitex/__init__.py +80 -2
- scitex/__version__.py +11 -8
- scitex/_env_loader.py +156 -0
- scitex/_mcp_resources/__init__.py +37 -0
- scitex/_mcp_resources/_cheatsheet.py +135 -0
- scitex/_mcp_resources/_figrecipe.py +138 -0
- scitex/_mcp_resources/_formats.py +102 -0
- scitex/_mcp_resources/_modules.py +337 -0
- scitex/_mcp_resources/_session.py +149 -0
- scitex/_mcp_tools/__init__.py +40 -0
- scitex/_mcp_tools/audio.py +200 -0
- scitex/_mcp_tools/canvas.py +128 -0
- scitex/_mcp_tools/capture.py +174 -0
- scitex/_mcp_tools/diagram.py +22 -0
- scitex/_mcp_tools/introspect.py +191 -0
- scitex/_mcp_tools/plt.py +305 -0
- scitex/_mcp_tools/scholar.py +447 -0
- scitex/_mcp_tools/social.py +244 -0
- scitex/_mcp_tools/stats.py +206 -0
- scitex/_mcp_tools/template.py +66 -0
- scitex/_mcp_tools/ui.py +80 -0
- scitex/_mcp_tools/writer.py +37 -0
- scitex/ai/_gen_ai/_PARAMS.py +10 -7
- scitex/ai/classification/reporters/_ClassificationReporter.py +0 -0
- scitex/ai/classification/reporters/_SingleClassificationReporter.py +45 -1603
- scitex/ai/classification/reporters/_mixins/__init__.py +36 -0
- scitex/ai/classification/reporters/_mixins/_constants.py +67 -0
- scitex/ai/classification/reporters/_mixins/_cv_summary.py +387 -0
- scitex/ai/classification/reporters/_mixins/_feature_importance.py +119 -0
- scitex/ai/classification/reporters/_mixins/_metrics.py +275 -0
- scitex/ai/classification/reporters/_mixins/_plotting.py +179 -0
- scitex/ai/classification/reporters/_mixins/_reports.py +153 -0
- scitex/ai/classification/reporters/_mixins/_storage.py +160 -0
- scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +0 -0
- scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +0 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +0 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +0 -0
- scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +0 -0
- scitex/ai/classification/timeseries/_normalize_timestamp.py +0 -0
- scitex/ai/metrics/_calc_seizure_prediction_metrics.py +0 -0
- scitex/ai/plt/_plot_feature_importance.py +0 -0
- scitex/ai/plt/_plot_learning_curve.py +0 -0
- scitex/ai/plt/_plot_optuna_study.py +0 -0
- scitex/ai/plt/_plot_pre_rec_curve.py +0 -0
- scitex/ai/plt/_plot_roc_curve.py +0 -0
- scitex/ai/plt/_stx_conf_mat.py +0 -0
- scitex/ai/training/_LearningCurveLogger.py +0 -0
- scitex/audio/README.md +88 -7
- scitex/audio/__init__.py +127 -60
- scitex/audio/__main__.py +17 -21
- scitex/audio/_branding.py +185 -0
- scitex/audio/_mcp/__init__.py +36 -0
- scitex/audio/_mcp/handlers.py +419 -0
- scitex/audio/_mcp/speak_handlers.py +238 -0
- scitex/audio/_mcp/tool_schemas.py +203 -0
- scitex/audio/_relay.py +225 -0
- scitex/audio/engines/elevenlabs_engine.py +6 -1
- scitex/audio/mcp_server.py +355 -337
- scitex/bridge/_figrecipe.py +40 -8
- scitex/bridge/_stats_plt.py +2 -4
- scitex/bridge/_stats_vis.py +7 -5
- scitex/browser/automation/CookieHandler.py +0 -0
- scitex/browser/collaboration/__init__.py +0 -1
- scitex/browser/core/BrowserMixin.py +0 -0
- scitex/browser/core/ChromeProfileManager.py +10 -3
- scitex/browser/debugging/_browser_logger.py +6 -9
- scitex/browser/debugging/_highlight_element.py +0 -0
- scitex/browser/debugging/_show_grid.py +0 -0
- scitex/browser/interaction/click_center.py +0 -0
- scitex/browser/interaction/click_with_fallbacks.py +0 -0
- scitex/browser/interaction/close_popups.py +0 -0
- scitex/browser/interaction/fill_with_fallbacks.py +0 -0
- scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +0 -0
- scitex/browser/pdf/detect_chrome_pdf_viewer.py +0 -0
- scitex/browser/stealth/HumanBehavior.py +0 -0
- scitex/browser/stealth/StealthManager.py +0 -0
- scitex/canvas/README.md +1 -1
- scitex/canvas/_mcp/__init__.py +4 -0
- scitex/canvas/_mcp/handlers.py +372 -0
- scitex/canvas/_mcp/tool_schemas.py +219 -0
- scitex/canvas/editor/_dearpygui/__init__.py +25 -0
- scitex/canvas/editor/_dearpygui/_editor.py +147 -0
- scitex/canvas/editor/_dearpygui/_handlers.py +476 -0
- scitex/canvas/editor/_dearpygui/_panels/__init__.py +17 -0
- scitex/canvas/editor/_dearpygui/_panels/_control.py +119 -0
- scitex/canvas/editor/_dearpygui/_panels/_element_controls.py +190 -0
- scitex/canvas/editor/_dearpygui/_panels/_preview.py +43 -0
- scitex/canvas/editor/_dearpygui/_panels/_sections.py +390 -0
- scitex/canvas/editor/_dearpygui/_plotting.py +187 -0
- scitex/canvas/editor/_dearpygui/_rendering.py +504 -0
- scitex/canvas/editor/_dearpygui/_selection.py +295 -0
- scitex/canvas/editor/_dearpygui/_state.py +93 -0
- scitex/canvas/editor/_dearpygui/_utils.py +61 -0
- scitex/canvas/editor/flask_editor/templates/__init__.py +32 -70
- scitex/canvas/mcp_server.py +2 -2
- scitex/capture/__init__.py +0 -1
- scitex/capture/_mcp/__init__.py +11 -0
- scitex/capture/_mcp/handlers.py +438 -0
- scitex/capture/_mcp/tool_schemas.py +270 -0
- scitex/cli/__init__.py +44 -2
- scitex/cli/audio.py +150 -3
- scitex/cli/browser.py +310 -0
- scitex/cli/capture.py +14 -3
- scitex/cli/introspect.py +443 -0
- scitex/cli/main.py +230 -103
- scitex/cli/mcp.py +362 -0
- scitex/cli/repro.py +18 -0
- scitex/cli/resource.py +18 -0
- scitex/cli/scholar/__init__.py +97 -0
- scitex/cli/scholar/_crossref_scitex.py +296 -0
- scitex/cli/scholar/_fetch.py +369 -0
- scitex/cli/scholar/_jobs.py +306 -0
- scitex/cli/scholar/_library.py +152 -0
- scitex/cli/scholar/_utils.py +35 -0
- scitex/cli/social.py +314 -0
- scitex/cli/stats.py +18 -0
- scitex/cli/template.py +18 -0
- scitex/cli/tex.py +18 -0
- scitex/cli/writer.py +190 -20
- scitex/compat/__init__.py +74 -0
- scitex/config/README.md +1 -1
- scitex/config/__init__.py +16 -2
- scitex/config/_env_registry.py +191 -0
- scitex/config/default.yaml +31 -0
- scitex/cv/__init__.py +87 -0
- scitex/cv/_draw.py +236 -0
- scitex/cv/_filters.py +217 -0
- scitex/cv/_io.py +157 -0
- scitex/cv/_transform.py +184 -0
- scitex/dev/__init__.py +2 -0
- scitex/dev/cv/__init__.py +60 -0
- scitex/dev/cv/_compose.py +330 -0
- scitex/dev/cv/_title_card.py +351 -0
- scitex/dev/plt/__init__.py +0 -0
- scitex/dev/plt/demo_plotters/__init__.py +0 -0
- scitex/dev/plt/mpl/get_dir_ax.py +0 -0
- scitex/dev/plt/mpl/get_signatures.py +0 -0
- scitex/dev/plt/mpl/get_signatures_details.py +0 -0
- scitex/diagram/__init__.py +42 -19
- scitex/diagram/mcp_server.py +13 -125
- scitex/dt/_normalize_timestamp.py +0 -0
- scitex/gen/__init__.py +0 -0
- scitex/gen/misc.py +0 -0
- scitex/git/_init.py +2 -2
- scitex/git/_session.py +0 -0
- scitex/introspect/__init__.py +75 -0
- scitex/introspect/_call_graph.py +303 -0
- scitex/introspect/_class_hierarchy.py +163 -0
- scitex/introspect/_core.py +42 -0
- scitex/introspect/_docstring.py +131 -0
- scitex/introspect/_examples.py +113 -0
- scitex/introspect/_imports.py +271 -0
- scitex/introspect/_mcp/__init__.py +37 -0
- scitex/introspect/_mcp/handlers.py +208 -0
- scitex/introspect/_members.py +151 -0
- scitex/introspect/_resolve.py +89 -0
- scitex/introspect/_signature.py +131 -0
- scitex/introspect/_source.py +80 -0
- scitex/introspect/_type_hints.py +172 -0
- scitex/io/bundle/README.md +1 -1
- scitex/io/bundle/kinds/__init__.py +0 -0
- scitex/io/bundle/kinds/_figure/__init__.py +0 -0
- scitex/io/bundle/kinds/_plot/__init__.py +0 -0
- scitex/io/bundle/kinds/_shape/__init__.py +0 -0
- scitex/io/bundle/kinds/_text/__init__.py +0 -0
- scitex/logging/_context.py +5 -4
- scitex/mcp_server.py +170 -145
- scitex/plt/__init__.py +249 -548
- scitex/plt/_figrecipe_integration.py +121 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +5 -10
- scitex/plt/_subplots/_FigWrapper.py +139 -88
- scitex/plt/_subplots/_export_as_csv_formatters/_format_pcolormesh.py +0 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stackplot.py +0 -0
- scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/plt/gallery/README.md +1 -1
- scitex/plt/styles/_plot_postprocess.py +35 -117
- scitex/plt/styles/_postprocess_helpers.py +158 -0
- scitex/plt/utils/_hitmap/__init__.py +82 -0
- scitex/plt/utils/_hitmap/_artist_extraction.py +343 -0
- scitex/plt/utils/_hitmap/_color_application.py +346 -0
- scitex/plt/utils/_hitmap/_color_conversion.py +121 -0
- scitex/plt/utils/_hitmap/_constants.py +40 -0
- scitex/plt/utils/_hitmap/_hitmap_core.py +334 -0
- scitex/plt/utils/_hitmap/_path_extraction.py +357 -0
- scitex/plt/utils/_hitmap/_query.py +113 -0
- scitex/plt/utils/_hitmap.py +46 -1616
- scitex/plt/utils/_metadata/__init__.py +80 -0
- scitex/plt/utils/_metadata/_artists/__init__.py +25 -0
- scitex/plt/utils/_metadata/_artists/_base.py +195 -0
- scitex/plt/utils/_metadata/_artists/_collections.py +356 -0
- scitex/plt/utils/_metadata/_artists/_extract.py +57 -0
- scitex/plt/utils/_metadata/_artists/_images.py +80 -0
- scitex/plt/utils/_metadata/_artists/_lines.py +261 -0
- scitex/plt/utils/_metadata/_artists/_patches.py +247 -0
- scitex/plt/utils/_metadata/_artists/_text.py +106 -0
- scitex/plt/utils/_metadata/_csv.py +416 -0
- scitex/plt/utils/_metadata/_detect.py +225 -0
- scitex/plt/utils/_metadata/_legend.py +127 -0
- scitex/plt/utils/_metadata/_rounding.py +117 -0
- scitex/plt/utils/_metadata/_verification.py +202 -0
- scitex/repro/_RandomStateManager.py +0 -0
- scitex/repro/_gen_ID.py +0 -0
- scitex/repro/_gen_timestamp.py +0 -0
- scitex/repro/_hash_array.py +0 -0
- scitex/schema/README.md +1 -1
- scitex/scholar/__init__.py +8 -0
- scitex/scholar/_mcp/__init__.py +4 -0
- scitex/scholar/_mcp/all_handlers.py +74 -0
- scitex/scholar/_mcp/crossref_handlers.py +265 -0
- scitex/scholar/_mcp/handlers.py +1478 -0
- scitex/scholar/_mcp/job_handlers.py +172 -0
- scitex/scholar/_mcp/job_tool_schemas.py +166 -0
- scitex/scholar/_mcp/tool_schemas.py +505 -0
- scitex/scholar/auth/core/BrowserAuthenticator.py +126 -9
- scitex/scholar/auth/providers/OpenAthensAuthenticator.py +55 -210
- scitex/scholar/auth/providers/_notifications.py +417 -0
- scitex/scholar/auth/sso/BaseSSOAutomator.py +36 -17
- scitex/scholar/auth/sso/UniversityOfMelbourneSSOAutomator.py +8 -15
- scitex/scholar/citation_graph/__init__.py +0 -1
- scitex/scholar/config/core/_PathManager.py +5 -1
- scitex/scholar/config/default.yaml +1 -1
- scitex/scholar/core/Paper.py +19 -41
- scitex/scholar/core/Scholar.py +64 -1688
- scitex/scholar/core/_mixins/__init__.py +36 -0
- scitex/scholar/core/_mixins/_enrichers.py +270 -0
- scitex/scholar/core/_mixins/_library_handlers.py +100 -0
- scitex/scholar/core/_mixins/_loaders.py +103 -0
- scitex/scholar/core/_mixins/_pdf_download.py +375 -0
- scitex/scholar/core/_mixins/_pipeline.py +312 -0
- scitex/scholar/core/_mixins/_project_handlers.py +125 -0
- scitex/scholar/core/_mixins/_savers.py +69 -0
- scitex/scholar/core/_mixins/_search.py +103 -0
- scitex/scholar/core/_mixins/_services.py +88 -0
- scitex/scholar/core/_mixins/_url_finding.py +105 -0
- scitex/scholar/core/journal_normalizer.py +36 -25
- scitex/scholar/crossref_scitex.py +367 -0
- scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/scholar/examples/00_run_all.sh +120 -0
- scitex/scholar/examples/07_storage_integration.py +0 -0
- scitex/scholar/impact_factor/estimation/__init__.py +0 -1
- scitex/scholar/impact_factor/jcr/ImpactFactorJCREngine.py +19 -6
- scitex/scholar/impact_factor/jcr/build_database.py +0 -0
- scitex/scholar/jobs/_Job.py +266 -0
- scitex/scholar/jobs/_JobManager.py +458 -0
- scitex/scholar/jobs/__init__.py +74 -0
- scitex/scholar/jobs/_errors.py +346 -0
- scitex/scholar/jobs/_executors.py +397 -0
- scitex/scholar/mcp_server.py +52 -2
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +38 -416
- scitex/scholar/pdf_download/_cli.py +154 -0
- scitex/scholar/pdf_download/strategies/__init__.py +11 -8
- scitex/scholar/pdf_download/strategies/chrome_pdf_viewer.py +11 -11
- scitex/scholar/pdf_download/strategies/manual_download_fallback.py +80 -3
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +73 -121
- scitex/scholar/pipelines/ScholarPipelineParallel.py +83 -140
- scitex/scholar/pipelines/ScholarPipelineSearchParallel.py +11 -13
- scitex/scholar/pipelines/ScholarPipelineSingle.py +83 -656
- scitex/scholar/pipelines/_single_steps.py +465 -0
- scitex/scholar/storage/BibTeXHandler.py +71 -23
- scitex/scholar/storage/PaperIO.py +53 -18
- scitex/scholar/storage/_BibTeXValidator.py +571 -0
- scitex/scholar/storage/_LibraryManager.py +97 -1695
- scitex/scholar/storage/__init__.py +17 -3
- scitex/scholar/storage/_mixins/__init__.py +30 -0
- scitex/scholar/storage/_mixins/_bibtex_handlers.py +128 -0
- scitex/scholar/storage/_mixins/_library_operations.py +218 -0
- scitex/scholar/storage/_mixins/_metadata_conversion.py +226 -0
- scitex/scholar/storage/_mixins/_paper_saving.py +456 -0
- scitex/scholar/storage/_mixins/_resolution.py +376 -0
- scitex/scholar/storage/_mixins/_storage_helpers.py +121 -0
- scitex/scholar/storage/_mixins/_symlink_handlers.py +226 -0
- scitex/scholar/url_finder/translators/individual/cell_press.py +131 -4
- scitex/security/README.md +3 -3
- scitex/security/__init__.py +0 -1
- scitex/session/README.md +1 -1
- scitex/session/__init__.py +0 -0
- scitex/session/_decorator.py +0 -0
- scitex/session/_lifecycle.py +0 -0
- scitex/sh/README.md +1 -1
- scitex/social/__init__.py +153 -0
- scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/stats/__init__.py +14 -2
- scitex/stats/__main__.py +2 -2
- scitex/stats/_figrecipe_integration.py +116 -0
- scitex/stats/_mcp/__init__.py +4 -0
- scitex/stats/_mcp/handlers.py +1191 -0
- scitex/stats/_mcp/tool_schemas.py +384 -0
- scitex/stats/auto/__init__.py +0 -1
- scitex/stats/correct/_correct_bonferroni.py +0 -0
- scitex/stats/correct/_correct_fdr.py +0 -0
- scitex/stats/correct/_correct_fdr_.py +0 -0
- scitex/stats/correct/_correct_holm.py +0 -0
- scitex/stats/correct/_correct_sidak.py +0 -0
- scitex/stats/effect_sizes/_cliffs_delta.py +0 -0
- scitex/stats/effect_sizes/_cohens_d.py +0 -0
- scitex/stats/effect_sizes/_epsilon_squared.py +0 -0
- scitex/stats/effect_sizes/_eta_squared.py +0 -0
- scitex/stats/effect_sizes/_prob_superiority.py +0 -0
- scitex/stats/mcp_server.py +2 -2
- scitex/stats/posthoc/_dunnett.py +0 -0
- scitex/stats/posthoc/_games_howell.py +0 -0
- scitex/stats/posthoc/_tukey_hsd.py +0 -0
- scitex/stats/power/_power.py +0 -0
- scitex/stats/utils/_effect_size.py +0 -0
- scitex/stats/utils/_formatters.py +0 -0
- scitex/stats/utils/_power.py +0 -0
- scitex/template/README.md +1 -1
- scitex/template/_mcp/__init__.py +4 -0
- scitex/template/_mcp/handlers.py +259 -0
- scitex/template/_mcp/tool_schemas.py +112 -0
- scitex/template/clone_writer_directory.py +6 -6
- scitex/template/mcp_server.py +2 -2
- scitex/ui/__init__.py +173 -0
- scitex/ui/_backends/__init__.py +66 -0
- scitex/ui/_backends/_audio.py +86 -0
- scitex/ui/_backends/_config.py +250 -0
- scitex/ui/_backends/_desktop.py +184 -0
- scitex/ui/_backends/_emacs.py +210 -0
- scitex/ui/_backends/_email.py +78 -0
- scitex/ui/_backends/_matplotlib.py +118 -0
- scitex/ui/_backends/_playwright.py +109 -0
- scitex/ui/_backends/_types.py +58 -0
- scitex/ui/_backends/_webhook.py +77 -0
- scitex/ui/_backends.py +37 -0
- scitex/ui/_mcp/__init__.py +23 -0
- scitex/ui/_mcp/handlers.py +260 -0
- scitex/ui/_mcp/tool_schemas.py +107 -0
- scitex/ui/mcp_server.py +151 -0
- scitex/utils/_email.py +85 -7
- scitex/utils/_notify.py +16 -5
- scitex/utils/_search.py +11 -9
- scitex/utils/_verify_scitex_format.py +0 -0
- scitex/writer/README.md +1 -1
- scitex/writer/Writer.py +110 -111
- scitex/writer/__init__.py +26 -48
- scitex/writer/_clone_writer_project.py +0 -0
- scitex/writer/_compile/__init__.py +5 -4
- scitex/writer/_compile/_compile_async.py +130 -0
- scitex/writer/_compile/_compile_unified.py +148 -0
- scitex/writer/_compile/_runner.py +2 -2
- scitex/writer/_compile/_validator.py +3 -3
- scitex/writer/_compile/manuscript.py +1 -1
- scitex/writer/_compile/revision.py +1 -1
- scitex/writer/_compile/supplementary.py +1 -1
- scitex/writer/_dataclasses/config/_WriterConfig.py +175 -0
- scitex/writer/_dataclasses/contents/_ManuscriptContents.py +236 -0
- scitex/writer/_dataclasses/core/_Document.py +146 -0
- scitex/writer/_dataclasses/core/_DocumentSection.py +546 -0
- scitex/writer/_dataclasses/results/_CompilationResult.py +165 -0
- scitex/writer/_dataclasses/results/_LaTeXIssue.py +102 -0
- scitex/writer/_dataclasses/tree/MINIMUM_FILES.md +121 -0
- scitex/writer/_mcp/__init__.py +4 -0
- scitex/writer/_mcp/handlers.py +32 -0
- scitex/writer/_mcp/tool_schemas.py +33 -0
- scitex/writer/_project/_trees.py +2 -2
- scitex/writer/utils/__init__.py +19 -2
- scitex/writer/utils/_converters.py +635 -0
- scitex/writer/utils/_parse_latex_logs.py +1 -1
- scitex/writer/utils/_verify_tree_structure.py +205 -0
- scitex-2.15.1.dist-info/METADATA +648 -0
- scitex-2.15.1.dist-info/RECORD +2553 -0
- scitex-2.15.1.dist-info/entry_points.txt +12 -0
- scitex/audio/_mcp_handlers.py +0 -256
- scitex/audio/_mcp_tool_schemas.py +0 -203
- scitex/canvas/_mcp_handlers.py +0 -372
- scitex/canvas/_mcp_tool_schemas.py +0 -219
- scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
- scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
- scitex/capture/mcp_handlers.py +0 -401
- scitex/capture/mcp_tool_defs.py +0 -192
- scitex/capture/mcp_tools.py +0 -241
- scitex/capture/mcp_utils.py +0 -30
- scitex/cli/scholar.py +0 -313
- scitex/diagram/_compile.py +0 -312
- scitex/diagram/_diagram.py +0 -355
- scitex/diagram/_mcp_handlers.py +0 -400
- scitex/diagram/_mcp_tool_schemas.py +0 -157
- scitex/diagram/_presets.py +0 -173
- scitex/diagram/_schema.py +0 -182
- scitex/diagram/_split.py +0 -278
- scitex/plt/_mcp_handlers.py +0 -361
- scitex/plt/_mcp_tool_schemas.py +0 -169
- scitex/plt/mcp_server.py +0 -205
- scitex/scholar/.legacy/Scholar.py +0 -400
- scitex/scholar/.legacy/_Scholar.py +0 -1763
- scitex/scholar/.legacy/_ScholarAPI.py +0 -316
- scitex/scholar/.legacy/_tmp/search_engine/_BaseSearchEngine.py +0 -101
- scitex/scholar/.legacy/_tmp/search_engine/_UnifiedSearcher.py +0 -392
- scitex/scholar/.legacy/_tmp/search_engine/__init__.py +0 -53
- scitex/scholar/.legacy/_tmp/search_engine/local/_LocalSearchEngine.py +0 -134
- scitex/scholar/.legacy/_tmp/search_engine/local/_VectorSearchEngine.py +0 -129
- scitex/scholar/.legacy/_tmp/search_engine/web/_ArxivSearchEngine.py +0 -279
- scitex/scholar/.legacy/_tmp/search_engine/web/_CrossRefSearchEngine.py +0 -319
- scitex/scholar/.legacy/_tmp/search_engine/web/_GoogleScholarSearchEngine.py +0 -209
- scitex/scholar/.legacy/_tmp/search_engine/web/_PubMedSearchEngine.py +0 -374
- scitex/scholar/.legacy/_tmp/search_engine/web/_SemanticScholarSearchEngine.py +0 -362
- scitex/scholar/.legacy/database/README.md +0 -121
- scitex/scholar/.legacy/database/README_CONCURRENT_ACCESS.md +0 -103
- scitex/scholar/.legacy/database/_DatabaseEntry.py +0 -232
- scitex/scholar/.legacy/database/_DatabaseIndex.py +0 -426
- scitex/scholar/.legacy/database/_LibraryManager.py +0 -276
- scitex/scholar/.legacy/database/_PaperDatabase.py +0 -543
- scitex/scholar/.legacy/database/_ScholarDatabaseIntegration.py +0 -391
- scitex/scholar/.legacy/database/_StorageIntegratedDB.py +0 -619
- scitex/scholar/.legacy/database/_ZoteroCompatibleDB.py +0 -1194
- scitex/scholar/.legacy/database/__init__.py +0 -28
- scitex/scholar/.legacy/database/manage.py +0 -274
- scitex/scholar/.legacy/lookup/_LookupIndex.py +0 -470
- scitex/scholar/.legacy/lookup/__init__.py +0 -22
- scitex/scholar/.legacy/metadata/README.md +0 -62
- scitex/scholar/.legacy/metadata/__init__.py +0 -1
- scitex/scholar/.legacy/metadata/doi/README.md +0 -368
- scitex/scholar/.legacy/metadata/doi/__init__.py +0 -7
- scitex/scholar/.legacy/metadata/doi/batch/_MetadataHandlerForBatchDOIResolution.py +0 -304
- scitex/scholar/.legacy/metadata/doi/batch/_ProgressManagerForBatchDOIResolution.py +0 -304
- scitex/scholar/.legacy/metadata/doi/batch/_SourceStatsManagerForBatchDOIResolution.py +0 -299
- scitex/scholar/.legacy/metadata/doi/batch/__init__.py +0 -26
- scitex/scholar/.legacy/metadata/doi/resolvers/_BatchDOIResolver.py +0 -586
- scitex/scholar/.legacy/metadata/doi/resolvers/_BibTeXDOIResolver.py +0 -609
- scitex/scholar/.legacy/metadata/doi/resolvers/_DOIResolver.py +0 -192
- scitex/scholar/.legacy/metadata/doi/resolvers/_SingleDOIResolver.py +0 -395
- scitex/scholar/.legacy/metadata/doi/resolvers/__init__.py +0 -2
- scitex/scholar/.legacy/metadata/doi/sources/.combined-SemanticScholarSource/_SemanticScholarSource.py +0 -289
- scitex/scholar/.legacy/metadata/doi/sources/.combined-SemanticScholarSource/_SemanticScholarSourceEnhanced.py +0 -229
- scitex/scholar/.legacy/metadata/doi/sources/_ArXivSource.py +0 -306
- scitex/scholar/.legacy/metadata/doi/sources/_BaseDOISource.py +0 -347
- scitex/scholar/.legacy/metadata/doi/sources/_CrossRefLocalSource.py +0 -79
- scitex/scholar/.legacy/metadata/doi/sources/_CrossRefSource.py +0 -225
- scitex/scholar/.legacy/metadata/doi/sources/_OpenAlexSource.py +0 -306
- scitex/scholar/.legacy/metadata/doi/sources/_PubMedSource.py +0 -302
- scitex/scholar/.legacy/metadata/doi/sources/_SemanticScholarSource.py +0 -341
- scitex/scholar/.legacy/metadata/doi/sources/_SourceManager.py +0 -317
- scitex/scholar/.legacy/metadata/doi/sources/_SourceResolutionStrategy.py +0 -595
- scitex/scholar/.legacy/metadata/doi/sources/_SourceRotationManager.py +0 -585
- scitex/scholar/.legacy/metadata/doi/sources/_URLDOISource.py +0 -394
- scitex/scholar/.legacy/metadata/doi/sources/_UnifiedSource.py +0 -412
- scitex/scholar/.legacy/metadata/doi/sources/__init__.py +0 -38
- scitex/scholar/.legacy/metadata/doi/utils/_PubMedConverter.py +0 -465
- scitex/scholar/.legacy/metadata/doi/utils/_RateLimitHandler.py +0 -707
- scitex/scholar/.legacy/metadata/doi/utils/_TextNormalizer.py +0 -587
- scitex/scholar/.legacy/metadata/doi/utils/_URLDOIExtractor.py +0 -278
- scitex/scholar/.legacy/metadata/doi/utils/__init__.py +0 -40
- scitex/scholar/.legacy/metadata/doi/utils/_to_complete_metadata_structure.py +0 -315
- scitex/scholar/.legacy/metadata/enrichment/README.md +0 -51
- scitex/scholar/.legacy/metadata/enrichment/_LibraryEnricher.py +0 -99
- scitex/scholar/.legacy/metadata/enrichment/__init__.py +0 -2
- scitex/scholar/.legacy/metadata/enrichment/enrichers/_ImpactFactorEnricher.py +0 -107
- scitex/scholar/.legacy/metadata/enrichment/enrichers/_SmartEnricher.py +0 -164
- scitex/scholar/.legacy/metadata/enrichment/enrichers/__init__.py +0 -4
- scitex/scholar/.legacy/metadata/enrichment/sources/_UnifiedMetadataSource.py +0 -126
- scitex/scholar/.legacy/metadata/enrichment/sources/__init__.py +0 -3
- scitex/scholar/.legacy/metadata/query_to_full_meta_json.py +0 -184
- scitex/scholar/.legacy/metadata/urls/.tmp/open_url/KNOWN_RESOLVERS.py +0 -462
- scitex/scholar/.legacy/metadata/urls/.tmp/open_url/README.md +0 -223
- scitex/scholar/.legacy/metadata/urls/.tmp/open_url/_DOIToURLResolver.py +0 -694
- scitex/scholar/.legacy/metadata/urls/.tmp/open_url/_OpenURLResolver.py +0 -1160
- scitex/scholar/.legacy/metadata/urls/.tmp/open_url/_ResolverLinkFinder.py +0 -344
- scitex/scholar/.legacy/metadata/urls/.tmp/open_url/__init__.py +0 -24
- scitex/scholar/.legacy/metadata/urls/README.md +0 -142
- scitex/scholar/.legacy/metadata/urls/_URLMetadataHandler.py +0 -383
- scitex/scholar/.legacy/metadata/urls/_ZoteroTranslatorRunner.py +0 -294
- scitex/scholar/.legacy/metadata/urls/__init__.py +0 -39
- scitex/scholar/.legacy/metadata/urls/_finder.py +0 -319
- scitex/scholar/.legacy/metadata/urls/_handler.py +0 -326
- scitex/scholar/.legacy/metadata/urls/_resolver.py +0 -287
- scitex/scholar/.legacy/metadata/urls/docs/CORE_URL_TYPES.md +0 -187
- scitex/scholar/.legacy/metadata/urls/docs/URL_SCHEMA.md +0 -223
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/.eslintrc +0 -11
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/AGPL +0 -22
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/checkDeletedTxt.sh +0 -46
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/eslint-plugin-zotero-translator/bin/teslint.js +0 -9
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/eslint-plugin-zotero-translator/index.js +0 -15
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/eslint-plugin-zotero-translator/package-lock.json +0 -151
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/eslint-plugin-zotero-translator/package.json +0 -21
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/eslint-plugin-zotero-translator/processor.js +0 -257
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/helper.sh +0 -29
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/lint.sh +0 -12
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/pull-request-check/check-pull-request.sh +0 -39
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/pull-request-check/selenium-test.js +0 -147
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/pull-request-check/translator-server.js +0 -72
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.ci/updateTypes.mjs +0 -75
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.editorconfig +0 -8
- scitex/scholar/.legacy/metadata/urls/zotero_translators/.eslintrc +0 -70
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ABC News Australia.js +0 -224
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ACLS Humanities EBook.js +0 -165
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ACLWeb.js +0 -600
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ACM Digital Library.js +0 -710
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ACS Publications.js +0 -633
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ADS Bibcode.js +0 -664
- scitex/scholar/.legacy/metadata/urls/zotero_translators/AEA Web.js +0 -450
- scitex/scholar/.legacy/metadata/urls/zotero_translators/AGRIS.js +0 -311
- scitex/scholar/.legacy/metadata/urls/zotero_translators/AIP.js +0 -295
- scitex/scholar/.legacy/metadata/urls/zotero_translators/AMS Journals.js +0 -136
- scitex/scholar/.legacy/metadata/urls/zotero_translators/AMS MathSciNet (Legacy).js +0 -313
- scitex/scholar/.legacy/metadata/urls/zotero_translators/AMS MathSciNet.js +0 -288
- scitex/scholar/.legacy/metadata/urls/zotero_translators/APA PsycNET.js +0 -915
- scitex/scholar/.legacy/metadata/urls/zotero_translators/APN.ru.js +0 -132
- scitex/scholar/.legacy/metadata/urls/zotero_translators/APS-Physics.js +0 -204
- scitex/scholar/.legacy/metadata/urls/zotero_translators/APS.js +0 -542
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ARTFL Encyclopedie.js +0 -283
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ARTnews.js +0 -155
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ARTstor.js +0 -619
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ASCE.js +0 -199
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ASCO Meeting Library.js +0 -153
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ASTIS.js +0 -337
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ATS International Journal.js +0 -290
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Access Engineering.js +0 -384
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Access Medicine.js +0 -343
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Access Science.js +0 -391
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Adam Matthew Digital.js +0 -405
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Agencia del ISBN.js +0 -77
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Ahval News.js +0 -309
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Air University Journals.js +0 -236
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Airiti.js +0 -423
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Alexander Street Press.js +0 -198
- scitex/scholar/.legacy/metadata/urls/zotero_translators/AllAfrica.js +0 -291
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Alsharekh.js +0 -242
- scitex/scholar/.legacy/metadata/urls/zotero_translators/AlterNet.js +0 -134
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Aluka.js +0 -261
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Amazon.js +0 -1043
- scitex/scholar/.legacy/metadata/urls/zotero_translators/American Archive of Public Broadcasting.js +0 -592
- scitex/scholar/.legacy/metadata/urls/zotero_translators/American Institute of Aeronautics and Astronautics.js +0 -210
- scitex/scholar/.legacy/metadata/urls/zotero_translators/American Prospect.js +0 -114
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Ancestry.com US Federal Census.js +0 -164
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Annual Reviews.js +0 -329
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Antikvarium.hu.js +0 -280
- scitex/scholar/.legacy/metadata/urls/zotero_translators/AquaDocs.js +0 -390
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Archeion.js +0 -249
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Archiv fuer Sozialgeschichte.js +0 -157
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Archive Ouverte en Sciences de l'Information et de la Communication (AOSIC).js +0 -179
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Archives Canada.js +0 -142
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Ariana News.js +0 -203
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Art Institute of Chicago.js +0 -279
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Artefacts Canada.js +0 -192
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Artforum.js +0 -438
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Atlanta Journal-Constitution.js +0 -311
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Atypon Journals.js +0 -1204
- scitex/scholar/.legacy/metadata/urls/zotero_translators/AustLII and NZLII.js +0 -604
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Australian Dictionary of Biography.js +0 -196
- scitex/scholar/.legacy/metadata/urls/zotero_translators/BAILII.js +0 -176
- scitex/scholar/.legacy/metadata/urls/zotero_translators/BBC Genome.js +0 -254
- scitex/scholar/.legacy/metadata/urls/zotero_translators/BBC.js +0 -430
- scitex/scholar/.legacy/metadata/urls/zotero_translators/BIBSYS.js +0 -112
- scitex/scholar/.legacy/metadata/urls/zotero_translators/BOCC.js +0 -217
- scitex/scholar/.legacy/metadata/urls/zotero_translators/BOE.js +0 -229
- scitex/scholar/.legacy/metadata/urls/zotero_translators/BOFiP-Impots.js +0 -132
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Baidu Scholar.js +0 -276
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bangkok Post.js +0 -216
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Baruch Foundation.js +0 -175
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Beobachter.js +0 -175
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bezneng Gajit.js +0 -92
- scitex/scholar/.legacy/metadata/urls/zotero_translators/BibLaTeX.js +0 -888
- scitex/scholar/.legacy/metadata/urls/zotero_translators/BibTeX.js +0 -4236
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Biblio.com.js +0 -216
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bibliontology RDF.js +0 -1166
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Biblioteca Nacional de Maestros.js +0 -213
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bibliotheque et Archives Nationale du Quebec (Pistard).js +0 -147
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bibliotheque et Archives Nationales du Quebec.js +0 -266
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bibliotheque nationale de France.js +0 -872
- scitex/scholar/.legacy/metadata/urls/zotero_translators/BioMed Central.js +0 -585
- scitex/scholar/.legacy/metadata/urls/zotero_translators/BioOne.js +0 -233
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bioconductor.js +0 -343
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Blaetter.js +0 -192
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Blogger.js +0 -244
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bloomberg.js +0 -205
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bloomsbury Food Library.js +0 -296
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bluesky.js +0 -195
- scitex/scholar/.legacy/metadata/urls/zotero_translators/BnF ISBN.js +0 -129
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bookmarks.js +0 -282
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bookshop.org.js +0 -223
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Boston Review.js +0 -332
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bosworth Toller's Anglo-Saxon Dictionary Online.js +0 -496
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bracero History Archive.js +0 -200
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Brill.js +0 -434
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Brukerhandboken.js +0 -153
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bryn Mawr Classical Review.js +0 -303
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Bundesgesetzblatt.js +0 -231
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Business Standard.js +0 -151
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CABI - CAB Abstracts.js +0 -317
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CAOD.js +0 -260
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CBC.js +0 -439
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CCfr (BnF).js +0 -162
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CERN Document Server.js +0 -277
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CEUR Workshop Proceedings.js +0 -145
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CFF References.js +0 -170
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CFF.js +0 -113
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CIA World Factbook.js +0 -128
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CLACSO.js +0 -226
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CLASE.js +0 -135
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CNKI.js +0 -731
- scitex/scholar/.legacy/metadata/urls/zotero_translators/COBISS.js +0 -1945
- scitex/scholar/.legacy/metadata/urls/zotero_translators/COinS.js +0 -336
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CQ Press.js +0 -418
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CROSBI.js +0 -227
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CSIRO Publishing.js +0 -139
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CSL JSON.js +0 -203
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CSV.js +0 -294
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Cairn.info.js +0 -368
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CalMatters.js +0 -228
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Calisphere.js +0 -355
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Camara Brasileira do Livro ISBN.js +0 -842
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Cambridge Core.js +0 -580
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Cambridge Engage Preprints.js +0 -276
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CanLII.js +0 -284
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Canada.com.js +0 -171
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Canadian Letters and Images.js +0 -148
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Canadiana.ca.js +0 -196
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Cascadilla Proceedings Project.js +0 -390
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Cell Press.js +0 -516
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Central and Eastern European Online Library Journals.js +0 -313
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Champlain Society - Collection.js +0 -220
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Chicago Journal of Theoretical Computer Science.js +0 -203
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Christian Science Monitor.js +0 -148
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Chronicling America.js +0 -131
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CiNii Research.js +0 -168
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Citavi 5 XML.js +0 -516
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CiteSeer.js +0 -196
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Citizen Lab.js +0 -347
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Civilization.ca.js +0 -146
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Climate Change and Human Health Literature Portal.js +0 -283
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Clinical Key.js +0 -367
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Code4Lib Journal.js +0 -143
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Colorado State Legislature.js +0 -215
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Columbia University Press.js +0 -238
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Common-Place.js +0 -218
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Computer History Museum Archive.js +0 -1319
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Copernicus.js +0 -461
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Cornell LII.js +0 -252
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Cornell University Press.js +0 -235
- scitex/scholar/.legacy/metadata/urls/zotero_translators/CourtListener.js +0 -265
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Crossref REST.js +0 -1757
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Crossref Unixref XML.js +0 -965
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Current Affairs.js +0 -160
- scitex/scholar/.legacy/metadata/urls/zotero_translators/DABI.js +0 -476
- scitex/scholar/.legacy/metadata/urls/zotero_translators/DAI-Zenon.js +0 -392
- scitex/scholar/.legacy/metadata/urls/zotero_translators/DART-Europe.js +0 -176
- scitex/scholar/.legacy/metadata/urls/zotero_translators/DBLP Computer Science Bibliography.js +0 -462
- scitex/scholar/.legacy/metadata/urls/zotero_translators/DBpia.js +0 -233
- scitex/scholar/.legacy/metadata/urls/zotero_translators/DEPATISnet.js +0 -373
- scitex/scholar/.legacy/metadata/urls/zotero_translators/DOAJ.js +0 -242
- scitex/scholar/.legacy/metadata/urls/zotero_translators/DOI Content Negotiation.js +0 -352
- scitex/scholar/.legacy/metadata/urls/zotero_translators/DOI.js +0 -322
- scitex/scholar/.legacy/metadata/urls/zotero_translators/DPLA.js +0 -425
- scitex/scholar/.legacy/metadata/urls/zotero_translators/DSpace Intermediate Metadata.js +0 -208
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Dagens Nyheter.js +0 -369
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Dagstuhl Research Online Publication Server.js +0 -278
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Dar Almandumah.js +0 -253
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Data.gov.js +0 -225
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Databrary.js +0 -184
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Datacite JSON.js +0 -1182
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Dataverse.js +0 -418
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Daum News.js +0 -139
- scitex/scholar/.legacy/metadata/urls/zotero_translators/De Gruyter Brill.js +0 -674
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Defense Technical Information Center.js +0 -146
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Delpher.js +0 -413
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Demographic Research.js +0 -164
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Denik CZ.js +0 -273
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Der Freitag.js +0 -236
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Der Spiegel.js +0 -479
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Desiring God.js +0 -216
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Deutsche Fotothek.js +0 -364
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Deutsche Nationalbibliothek.js +0 -594
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Dialnet.js +0 -258
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Die Zeit.js +0 -378
- scitex/scholar/.legacy/metadata/urls/zotero_translators/DigiZeitschriften.js +0 -269
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Digital Humanities Quarterly.js +0 -207
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Digital Spy.js +0 -215
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Dimensions.js +0 -233
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Douban.js +0 -316
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Dreier Neuerscheinungsdienst.js +0 -209
- scitex/scholar/.legacy/metadata/urls/zotero_translators/DrugBank.ca.js +0 -209
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Dryad Digital Repository.js +0 -323
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Duke University Press Books.js +0 -250
- scitex/scholar/.legacy/metadata/urls/zotero_translators/E-periodica Switzerland.js +0 -347
- scitex/scholar/.legacy/metadata/urls/zotero_translators/EBSCO Discovery Layer.js +0 -147
- scitex/scholar/.legacy/metadata/urls/zotero_translators/EBSCOhost.js +0 -592
- scitex/scholar/.legacy/metadata/urls/zotero_translators/EIDR.js +0 -184
- scitex/scholar/.legacy/metadata/urls/zotero_translators/EPA National Library Catalog.js +0 -245
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ERIC.js +0 -986
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ESpacenet.js +0 -465
- scitex/scholar/.legacy/metadata/urls/zotero_translators/EUR-Lex.js +0 -423
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Eastview.js +0 -336
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Edinburgh University Press Journals.js +0 -178
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Education Week.js +0 -197
- scitex/scholar/.legacy/metadata/urls/zotero_translators/El Comercio (Peru).js +0 -347
- scitex/scholar/.legacy/metadata/urls/zotero_translators/El Pais.js +0 -262
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Electronic Colloquium on Computational Complexity.js +0 -230
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Elicit.js +0 -120
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Elsevier Health Journals.js +0 -531
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Elsevier Pure.js +0 -420
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Embedded Metadata.js +0 -1951
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Emerald Insight.js +0 -626
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Encyclopedia of Chicago.js +0 -162
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Encyclopedia of Korean Culture.js +0 -221
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Endnote XML.js +0 -1407
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Engineering Village.js +0 -139
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Envidat.js +0 -331
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Epicurious.js +0 -144
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Erudit.js +0 -272
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Euclid.js +0 -220
- scitex/scholar/.legacy/metadata/urls/zotero_translators/EurasiaNet.js +0 -109
- scitex/scholar/.legacy/metadata/urls/zotero_translators/EurogamerUSgamer.js +0 -380
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Europe PMC.js +0 -448
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Evernote.js +0 -104
- scitex/scholar/.legacy/metadata/urls/zotero_translators/F1000 Research.js +0 -655
- scitex/scholar/.legacy/metadata/urls/zotero_translators/FAO Publications.js +0 -1139
- scitex/scholar/.legacy/metadata/urls/zotero_translators/FAZ.NET.js +0 -231
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Fachportal Padagogik.js +0 -839
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Factiva.js +0 -302
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Failed Architecture.js +0 -114
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Fairfax Australia.js +0 -200
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Fatcat.js +0 -425
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Figshare.js +0 -191
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Financial Times.js +0 -187
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Finna.js +0 -357
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Flickr.js +0 -318
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Foreign Affairs.js +0 -485
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Foreign Policy.js +0 -146
- scitex/scholar/.legacy/metadata/urls/zotero_translators/FreeCite.js +0 -95
- scitex/scholar/.legacy/metadata/urls/zotero_translators/FreePatentsOnline.js +0 -265
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Frieze.js +0 -243
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Frontiers.js +0 -667
- scitex/scholar/.legacy/metadata/urls/zotero_translators/GMS German Medical Science.js +0 -319
- scitex/scholar/.legacy/metadata/urls/zotero_translators/GPO Access e-CFR.js +0 -134
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Gale Databases.js +0 -324
- scitex/scholar/.legacy/metadata/urls/zotero_translators/GaleGDC.js +0 -189
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Galegroup.js +0 -327
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Gallica.js +0 -194
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Game Studies.js +0 -155
- scitex/scholar/.legacy/metadata/urls/zotero_translators/GameSpot.js +0 -199
- scitex/scholar/.legacy/metadata/urls/zotero_translators/GameStar GamePro.js +0 -198
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Gasyrlar Awazy.js +0 -156
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Gemeinsamer Bibliotheksverbund ISBN.js +0 -23
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Gene Ontology.js +0 -128
- scitex/scholar/.legacy/metadata/urls/zotero_translators/GitHub.js +0 -501
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Globes.js +0 -243
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Gmail.js +0 -64
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Goodreads.js +0 -219
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Google Books.js +0 -552
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Google Patents.js +0 -959
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Google Play.js +0 -186
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Google Presentation.js +0 -104
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Google Research.js +0 -221
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Google Scholar.js +0 -1361
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Gulag Many Days, Many Lives.js +0 -179
- scitex/scholar/.legacy/metadata/urls/zotero_translators/HAL Archives Ouvertes.js +0 -429
- scitex/scholar/.legacy/metadata/urls/zotero_translators/HCSP.js +0 -312
- scitex/scholar/.legacy/metadata/urls/zotero_translators/HUDOC.js +0 -650
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Haaretz.js +0 -562
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Habr.js +0 -232
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Handelszeitung.js +0 -273
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Hanrei Watch.js +0 -123
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Harper's Magazine.js +0 -365
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Harvard Business Review.js +0 -326
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Harvard Caselaw Access Project.js +0 -244
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Harvard University Press Books.js +0 -286
- scitex/scholar/.legacy/metadata/urls/zotero_translators/HathiTrust.js +0 -311
- scitex/scholar/.legacy/metadata/urls/zotero_translators/HeinOnline.js +0 -266
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Heise.js +0 -200
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Herder.js +0 -236
- scitex/scholar/.legacy/metadata/urls/zotero_translators/HighBeam.js +0 -198
- scitex/scholar/.legacy/metadata/urls/zotero_translators/HighWire 2.0.js +0 -1355
- scitex/scholar/.legacy/metadata/urls/zotero_translators/HighWire.js +0 -209
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Hindawi Publishers.js +0 -177
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Hispanic-American Periodical Index.js +0 -236
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Homeland Security Digital Library.js +0 -426
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Huff Post.js +0 -223
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Human Rights Watch.js +0 -450
- scitex/scholar/.legacy/metadata/urls/zotero_translators/IBISWorld.js +0 -171
- scitex/scholar/.legacy/metadata/urls/zotero_translators/IDEA ALM.js +0 -536
- scitex/scholar/.legacy/metadata/urls/zotero_translators/IEEE Computer Society.js +0 -429
- scitex/scholar/.legacy/metadata/urls/zotero_translators/IEEE Xplore.js +0 -1000
- scitex/scholar/.legacy/metadata/urls/zotero_translators/IETF.js +0 -451
- scitex/scholar/.legacy/metadata/urls/zotero_translators/IGN.js +0 -136
- scitex/scholar/.legacy/metadata/urls/zotero_translators/IMDb.js +0 -566
- scitex/scholar/.legacy/metadata/urls/zotero_translators/INSPIRE.js +0 -247
- scitex/scholar/.legacy/metadata/urls/zotero_translators/IPCC.js +0 -757
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ISTC.js +0 -181
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Idref.js +0 -179
- scitex/scholar/.legacy/metadata/urls/zotero_translators/In These Times.js +0 -196
- scitex/scholar/.legacy/metadata/urls/zotero_translators/InfoTrac.js +0 -279
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Informationssystem Medienpaedagogik.js +0 -305
- scitex/scholar/.legacy/metadata/urls/zotero_translators/IngentaConnect.js +0 -312
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Inside Higher Ed.js +0 -167
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Insignia OPAC.js +0 -114
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Institute of Contemporary Art.js +0 -180
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Institute of Physics.js +0 -340
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Integrum.js +0 -173
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Intellixir.js +0 -264
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Inter-Research Science Center.js +0 -185
- scitex/scholar/.legacy/metadata/urls/zotero_translators/International Nuclear Information System.js +0 -285
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Internet Archive Scholar.js +0 -106
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Internet Archive Wayback Machine.js +0 -152
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Internet Archive.js +0 -552
- scitex/scholar/.legacy/metadata/urls/zotero_translators/InvenioRDM.js +0 -1260
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Isidore.js +0 -235
- scitex/scholar/.legacy/metadata/urls/zotero_translators/J-Stage.js +0 -272
- scitex/scholar/.legacy/metadata/urls/zotero_translators/JETS.js +0 -122
- scitex/scholar/.legacy/metadata/urls/zotero_translators/JISC Historical Texts.js +0 -273
- scitex/scholar/.legacy/metadata/urls/zotero_translators/JRC Publications Repository.js +0 -569
- scitex/scholar/.legacy/metadata/urls/zotero_translators/JSTOR.js +0 -821
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Jahrbuch.js +0 -213
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Japan Times Online.js +0 -138
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Journal of Electronic Publishing.js +0 -147
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Journal of Extension.js +0 -288
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Journal of Machine Learning Research.js +0 -441
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Journal of Religion and Society.js +0 -174
- scitex/scholar/.legacy/metadata/urls/zotero_translators/JurPC.js +0 -274
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Juricaf.js +0 -141
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Juris.js +0 -728
- scitex/scholar/.legacy/metadata/urls/zotero_translators/K10plus ISBN.js +0 -386
- scitex/scholar/.legacy/metadata/urls/zotero_translators/KStudy.js +0 -632
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Kanopy.js +0 -358
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Khaama Press.js +0 -249
- scitex/scholar/.legacy/metadata/urls/zotero_translators/KitapYurdu.com.js +0 -376
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Kommersant.js +0 -174
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Korean National Library.js +0 -621
- scitex/scholar/.legacy/metadata/urls/zotero_translators/L'Annee Philologique.js +0 -267
- scitex/scholar/.legacy/metadata/urls/zotero_translators/LA Times.js +0 -239
- scitex/scholar/.legacy/metadata/urls/zotero_translators/LIBRIS ISBN.js +0 -103
- scitex/scholar/.legacy/metadata/urls/zotero_translators/LIVIVO.js +0 -260
- scitex/scholar/.legacy/metadata/urls/zotero_translators/LWN.net.js +0 -315
- scitex/scholar/.legacy/metadata/urls/zotero_translators/La Croix.js +0 -237
- scitex/scholar/.legacy/metadata/urls/zotero_translators/La Nacion (Argentina).js +0 -231
- scitex/scholar/.legacy/metadata/urls/zotero_translators/La Presse.js +0 -218
- scitex/scholar/.legacy/metadata/urls/zotero_translators/La Republica (Peru).js +0 -174
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Lagen.nu.js +0 -214
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Landesbibliographie Baden-Wurttemberg.js +0 -324
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Lapham's Quarterly.js +0 -1062
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Le Devoir.js +0 -167
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Le Figaro.js +0 -225
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Le Maitron.js +0 -484
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Le Monde.js +0 -258
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Le monde diplomatique.js +0 -200
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Legifrance.js +0 -641
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Legislative Insight.js +0 -406
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Lexis+.js +0 -264
- scitex/scholar/.legacy/metadata/urls/zotero_translators/LexisNexis.js +0 -505
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Libraries Tasmania.js +0 -778
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Aleph).js +0 -385
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Amicus).js +0 -254
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Aquabrowser).js +0 -253
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (BiblioCommons).js +0 -249
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Blacklight).js +0 -341
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Capita Prism).js +0 -162
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (DRA).js +0 -203
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Dynix).js +0 -315
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Encore).js +0 -211
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (InnoPAC).js +0 -305
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Koha).js +0 -225
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Mango).js +0 -285
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (OPALS).js +0 -200
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (PICA).js +0 -2120
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (PICA2).js +0 -331
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Pika).js +0 -488
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Polaris).js +0 -183
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Quolto).js +0 -320
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (RERO ILS).js +0 -754
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (SIRSI eLibrary).js +0 -407
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (SIRSI).js +0 -452
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (SLIMS).js +0 -146
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (TIND ILS).js +0 -773
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (TLCYouSeeMore).js +0 -132
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (TinREAD).js +0 -277
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (VTLS).js +0 -125
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Visual Library 2021).js +0 -765
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Voyager 7).js +0 -199
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Catalog (Voyager).js +0 -212
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Genesis.js +0 -337
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library Hub Discover.js +0 -359
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library of Congress Digital Collections.js +0 -869
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Library of Congress ISBN.js +0 -86
- scitex/scholar/.legacy/metadata/urls/zotero_translators/LingBuzz.js +0 -359
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Lippincott Williams and Wilkins.js +0 -341
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Literary Hub.js +0 -950
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Litres.js +0 -236
- scitex/scholar/.legacy/metadata/urls/zotero_translators/LiveJournal.js +0 -219
- scitex/scholar/.legacy/metadata/urls/zotero_translators/London Review of Books.js +0 -291
- scitex/scholar/.legacy/metadata/urls/zotero_translators/LookUs.js +0 -260
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Lulu.js +0 -264
- scitex/scholar/.legacy/metadata/urls/zotero_translators/MAB2.js +0 -373
- scitex/scholar/.legacy/metadata/urls/zotero_translators/MARC.js +0 -1080
- scitex/scholar/.legacy/metadata/urls/zotero_translators/MARCXML.js +0 -489
- scitex/scholar/.legacy/metadata/urls/zotero_translators/MCV.js +0 -258
- scitex/scholar/.legacy/metadata/urls/zotero_translators/MDPI Journals.js +0 -356
- scitex/scholar/.legacy/metadata/urls/zotero_translators/MEDLINEnbib.js +0 -1561
- scitex/scholar/.legacy/metadata/urls/zotero_translators/METS.js +0 -384
- scitex/scholar/.legacy/metadata/urls/zotero_translators/MIDAS Journals.js +0 -343
- scitex/scholar/.legacy/metadata/urls/zotero_translators/MIT Press Books.js +0 -637
- scitex/scholar/.legacy/metadata/urls/zotero_translators/MODS.js +0 -2545
- scitex/scholar/.legacy/metadata/urls/zotero_translators/MPG PuRe.js +0 -541
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Mailman.js +0 -136
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Mainichi Daily News.js +0 -189
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Mastodon.js +0 -198
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Matbugat.ru.js +0 -110
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Max Planck Institute for the History of Science Virtual Laboratory Library.js +0 -136
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Medium.js +0 -208
- scitex/scholar/.legacy/metadata/urls/zotero_translators/MetaLib.js +0 -126
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Microbiology Society Journals.js +0 -343
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Microsoft Academic.js +0 -424
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Mikromarc.js +0 -207
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Milli Kutuphane.js +0 -244
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Musee du Louvre.js +0 -265
- scitex/scholar/.legacy/metadata/urls/zotero_translators/NASA ADS.js +0 -889
- scitex/scholar/.legacy/metadata/urls/zotero_translators/NASA NTRS.js +0 -610
- scitex/scholar/.legacy/metadata/urls/zotero_translators/NCBI Nucleotide.js +0 -227
- scitex/scholar/.legacy/metadata/urls/zotero_translators/NPR.js +0 -341
- scitex/scholar/.legacy/metadata/urls/zotero_translators/NRC Research Press.js +0 -181
- scitex/scholar/.legacy/metadata/urls/zotero_translators/NRC.nl.js +0 -226
- scitex/scholar/.legacy/metadata/urls/zotero_translators/NTSB Accident Reports.js +0 -226
- scitex/scholar/.legacy/metadata/urls/zotero_translators/NYPL Menus.js +0 -275
- scitex/scholar/.legacy/metadata/urls/zotero_translators/NYPL Research Catalog.js +0 -458
- scitex/scholar/.legacy/metadata/urls/zotero_translators/NYTimes.com.js +0 -858
- scitex/scholar/.legacy/metadata/urls/zotero_translators/NZZ.ch.js +0 -272
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Nagoya University OPAC.js +0 -336
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Academies Press.js +0 -243
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Agriculture Library.js +0 -524
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Archives of Australia.js +0 -522
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Archives of South Africa.js +0 -122
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Bureau of Economic Research.js +0 -363
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Diet Library Catalogue.js +0 -333
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Gallery of Art - USA.js +0 -149
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Gallery of Australia.js +0 -252
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Library of Australia (new catalog).js +0 -223
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Library of Belarus.js +0 -171
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Library of Norway.js +0 -310
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Library of Poland ISBN.js +0 -140
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Post.js +0 -186
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Technical Reports Library.js +0 -276
- scitex/scholar/.legacy/metadata/urls/zotero_translators/National Transportation Library ROSA P.js +0 -562
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Nature Publishing Group.js +0 -3394
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Neural Information Processing Systems.js +0 -385
- scitex/scholar/.legacy/metadata/urls/zotero_translators/New Left Review.js +0 -245
- scitex/scholar/.legacy/metadata/urls/zotero_translators/New Zealand Herald.js +0 -282
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Newlines Magazine.js +0 -190
- scitex/scholar/.legacy/metadata/urls/zotero_translators/News Corp Australia.js +0 -251
- scitex/scholar/.legacy/metadata/urls/zotero_translators/NewsBank.js +0 -202
- scitex/scholar/.legacy/metadata/urls/zotero_translators/NewsnetTamedia.js +0 -509
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Noor Digital Library.js +0 -267
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Note HTML.js +0 -206
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Note Markdown.js +0 -1638
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Notre Dame Philosophical Reviews.js +0 -201
- scitex/scholar/.legacy/metadata/urls/zotero_translators/OAPEN.js +0 -331
- scitex/scholar/.legacy/metadata/urls/zotero_translators/OCLC WorldCat FirstSearch.js +0 -213
- scitex/scholar/.legacy/metadata/urls/zotero_translators/OECD.js +0 -216
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ORCID.js +0 -104
- scitex/scholar/.legacy/metadata/urls/zotero_translators/OSF Preprints.js +0 -417
- scitex/scholar/.legacy/metadata/urls/zotero_translators/OSTI Energy Citations.js +0 -202
- scitex/scholar/.legacy/metadata/urls/zotero_translators/OVID Tagged.js +0 -1226
- scitex/scholar/.legacy/metadata/urls/zotero_translators/OZON.ru.js +0 -465
- scitex/scholar/.legacy/metadata/urls/zotero_translators/OhioLINK.js +0 -43
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Old Bailey Online.js +0 -315
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Open Conf.js +0 -172
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Open Knowledge Repository.js +0 -811
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Open WorldCat.js +0 -1401
- scitex/scholar/.legacy/metadata/urls/zotero_translators/OpenAlex JSON.js +0 -740
- scitex/scholar/.legacy/metadata/urls/zotero_translators/OpenAlex.js +0 -444
- scitex/scholar/.legacy/metadata/urls/zotero_translators/OpenEdition Books.js +0 -155
- scitex/scholar/.legacy/metadata/urls/zotero_translators/OpenEdition Journals.js +0 -432
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Optical Society of America.js +0 -562
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Optimization Online.js +0 -418
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Ovid.js +0 -302
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Oxford Dictionaries Premium.js +0 -194
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Oxford English Dictionary.js +0 -122
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Oxford Music and Art Online.js +0 -120
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Oxford Reference.js +0 -202
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Oxford University Press.js +0 -277
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PC Gamer.js +0 -302
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PC Games.js +0 -128
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PEI Archival Information Network.js +0 -242
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PEP Web.js +0 -165
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PKP Catalog Systems.js +0 -1455
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PLoS Journals.js +0 -284
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PRC History Review.js +0 -298
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Pajhwok Afghan News.js +0 -198
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Papers Past.js +0 -297
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Paris Review.js +0 -227
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Pastebin.js +0 -199
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Patents - USPTO.js +0 -210
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Peeters.js +0 -587
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Perceiving Systems.js +0 -350
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Perlego.js +0 -416
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PhilPapers.js +0 -249
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Philosopher's Imprint.js +0 -169
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Pleade.js +0 -329
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Polygon.js +0 -270
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Potsdamer Neueste Nachrichten.js +0 -188
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Preprints.org.js +0 -305
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Primo 2018.js +0 -126
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Primo Normalized XML.js +0 -987
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Primo.js +0 -322
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ProMED.js +0 -66
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ProQuest Ebook Central.js +0 -226
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ProQuest PolicyFile.js +0 -115
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ProQuest.js +0 -2210
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Probing the Past.js +0 -151
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Project Gutenberg.js +0 -191
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Project MUSE.js +0 -451
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Protein Data Bank.js +0 -445
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PubFactory Journals.js +0 -712
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PubMed Central.js +0 -577
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PubMed XML.js +0 -1139
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PubMed.js +0 -1317
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PubPub.js +0 -530
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Public Record Office Victoria.js +0 -252
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Publications Office of the European Union.js +0 -540
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Publications du Quebec.js +0 -225
- scitex/scholar/.legacy/metadata/urls/zotero_translators/PyPI.js +0 -288
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Qatar Digital Library.js +0 -802
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Queensland State Archives.js +0 -303
- scitex/scholar/.legacy/metadata/urls/zotero_translators/R-Packages.js +0 -410
- scitex/scholar/.legacy/metadata/urls/zotero_translators/RAND.js +0 -283
- scitex/scholar/.legacy/metadata/urls/zotero_translators/RDF.js +0 -1777
- scitex/scholar/.legacy/metadata/urls/zotero_translators/REDALYC.js +0 -196
- scitex/scholar/.legacy/metadata/urls/zotero_translators/RIS.js +0 -7265
- scitex/scholar/.legacy/metadata/urls/zotero_translators/RSC Publishing.js +0 -250
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Radio Free Europe Radio Liberty.js +0 -706
- scitex/scholar/.legacy/metadata/urls/zotero_translators/RePEc - Econpapers.js +0 -725
- scitex/scholar/.legacy/metadata/urls/zotero_translators/RePEc - IDEAS.js +0 -337
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Rechtspraak.nl.js +0 -295
- scitex/scholar/.legacy/metadata/urls/zotero_translators/RefWorks Tagged.js +0 -1185
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ReferBibIX.js +0 -463
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Regeringskansliet.js +0 -89
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Research Square.js +0 -335
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ResearchGate.js +0 -394
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Retsinformation.js +0 -348
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Reuters.js +0 -255
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Rock, Paper, Shotgun.js +0 -304
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Roll Call.js +0 -173
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Russian State Library.js +0 -1517
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SAE Papers.js +0 -241
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SAGE Journals.js +0 -427
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SAGE Knowledge.js +0 -505
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SAILDART.js +0 -364
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SALT Research Archives.js +0 -196
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SFU IPinCH.js +0 -946
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SIPRI.js +0 -256
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SIRS Knowledge Source.js +0 -546
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SLUB Dresden.js +0 -300
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SORA.js +0 -340
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SSOAR.js +0 -399
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SSRN.js +0 -235
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SVT Nyheter.js +0 -381
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Sacramento Bee.js +0 -274
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Safari Books Online.js +0 -391
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Scholars Portal Journals.js +0 -220
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Scholia.js +0 -189
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Schweizer Radio und Fernsehen SRF.js +0 -152
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SciELO.js +0 -440
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ScienceDirect.js +0 -1304
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Scopus.js +0 -418
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Semantic Scholar.js +0 -513
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Silverchair.js +0 -886
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Slate.js +0 -228
- scitex/scholar/.legacy/metadata/urls/zotero_translators/SlideShare.js +0 -112
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Springer Link.js +0 -696
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Stack Exchange.js +0 -134
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Standard Ebooks.js +0 -198
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Stanford Encyclopedia of Philosophy.js +0 -285
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Stanford University Press.js +0 -343
- scitex/scholar/.legacy/metadata/urls/zotero_translators/State Records Office of Western Australia.js +0 -439
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Stitcher.js +0 -141
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Store norske leksikon.js +0 -291
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Stuff.co.nz.js +0 -446
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Substack.js +0 -237
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Sud Ouest.js +0 -181
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Sueddeutsche.de.js +0 -205
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Summon 2.js +0 -117
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Superlib.js +0 -647
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Svenska Dagbladet.js +0 -274
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Sveriges radio.js +0 -416
- scitex/scholar/.legacy/metadata/urls/zotero_translators/TEI.js +0 -648
- scitex/scholar/.legacy/metadata/urls/zotero_translators/TV by the Numbers.js +0 -194
- scitex/scholar/.legacy/metadata/urls/zotero_translators/TVNZ.js +0 -165
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Tagesspiegel.js +0 -249
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Talis Aspire.js +0 -316
- scitex/scholar/.legacy/metadata/urls/zotero_translators/TalisPrism.js +0 -445
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Tatknigafund.js +0 -174
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Tatpressa.ru.js +0 -121
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Taylor & Francis eBooks.js +0 -334
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Taylor and Francis+NEJM.js +0 -813
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Tesis Doctorals en Xarxa.js +0 -233
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Art Newspaper.js +0 -268
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Atlantic.js +0 -535
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Boston Globe.js +0 -285
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Chronicle of Higher Education.js +0 -308
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Daily Beast.js +0 -183
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Economic Times - The Times of India.js +0 -305
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Economist.js +0 -207
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Free Dictionary.js +0 -58
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Globe and Mail.js +0 -241
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Guardian.js +0 -717
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Hamilton Spectator.js +0 -129
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Hindu.js +0 -318
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Independent.js +0 -184
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Intercept.js +0 -258
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Met.js +0 -300
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Microfinance Gateway.js +0 -174
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Nation.js +0 -188
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The National Archives (UK).js +0 -242
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The New Republic.js +0 -160
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The New York Review of Books.js +0 -467
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The New Yorker.js +0 -360
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Open Library.js +0 -220
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Straits Times.js +0 -528
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Telegraph.js +0 -337
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Times and Sunday Times.js +0 -180
- scitex/scholar/.legacy/metadata/urls/zotero_translators/The Times of Israel.js +0 -151
- scitex/scholar/.legacy/metadata/urls/zotero_translators/TheMarker.js +0 -108
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Theory of Computing.js +0 -488
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ThesesFR.js +0 -298
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Thieme.js +0 -326
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Time.com.js +0 -557
- scitex/scholar/.legacy/metadata/urls/zotero_translators/TimesMachine.js +0 -222
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Tony Blair Institute for Global Change.js +0 -195
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Toronto Star.js +0 -331
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Transportation Research Board.js +0 -253
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Treesearch.js +0 -535
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Trove.js +0 -616
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Tumblr.js +0 -179
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Twitter.js +0 -413
- scitex/scholar/.legacy/metadata/urls/zotero_translators/UChicago VuFind.js +0 -907
- scitex/scholar/.legacy/metadata/urls/zotero_translators/UNZ Print Archive.js +0 -276
- scitex/scholar/.legacy/metadata/urls/zotero_translators/UPCommons.js +0 -227
- scitex/scholar/.legacy/metadata/urls/zotero_translators/US National Archives Research Catalog.js +0 -275
- scitex/scholar/.legacy/metadata/urls/zotero_translators/USENIX.js +0 -151
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Ubiquity Journals.js +0 -228
- scitex/scholar/.legacy/metadata/urls/zotero_translators/University Press Scholarship.js +0 -301
- scitex/scholar/.legacy/metadata/urls/zotero_translators/University of California Press Books.js +0 -403
- scitex/scholar/.legacy/metadata/urls/zotero_translators/University of Chicago Press Books.js +0 -378
- scitex/scholar/.legacy/metadata/urls/zotero_translators/University of Wisconsin-Madison Libraries Catalog.js +0 -298
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Unqualified Dublin Core RDF.js +0 -153
- scitex/scholar/.legacy/metadata/urls/zotero_translators/UpToDate References.js +0 -203
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Vanity Fair.js +0 -242
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Verniana-Jules Verne Studies.js +0 -190
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Verso Books.js +0 -311
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Vice.js +0 -445
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Victoria & Albert Museum.js +0 -277
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Vimeo.js +0 -188
- scitex/scholar/.legacy/metadata/urls/zotero_translators/VoxEU.js +0 -151
- scitex/scholar/.legacy/metadata/urls/zotero_translators/WHO.js +0 -458
- scitex/scholar/.legacy/metadata/urls/zotero_translators/WIPO.js +0 -189
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wall Street Journal.js +0 -525
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wanfang Data.js +0 -310
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Washington Monthly.js +0 -195
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Washington Post.js +0 -447
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Web of Science Nextgen.js +0 -715
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Web of Science Tagged.js +0 -1242
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Web of Science.js +0 -228
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Welt Online.js +0 -161
- scitex/scholar/.legacy/metadata/urls/zotero_translators/WestLaw UK.js +0 -190
- scitex/scholar/.legacy/metadata/urls/zotero_translators/WikiLeaks PlusD.js +0 -182
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikidata QuickStatements.js +0 -306
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikidata.js +0 -911
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikimedia Commons.js +0 -285
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikipedia Citation Templates.js +0 -432
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikipedia.js +0 -385
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikisource.js +0 -399
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wikiwand.js +0 -122
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wiktionary.js +0 -141
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wildlife Biology in Practice.js +0 -172
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wiley Online Library.js +0 -1412
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wilson Center Digital Archive.js +0 -321
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Winnipeg Free Press.js +0 -204
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Wired.js +0 -249
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Womennews.js +0 -230
- scitex/scholar/.legacy/metadata/urls/zotero_translators/World Digital Library.js +0 -403
- scitex/scholar/.legacy/metadata/urls/zotero_translators/World History Connected.js +0 -185
- scitex/scholar/.legacy/metadata/urls/zotero_translators/World Shakespeare Bibliography Online.js +0 -595
- scitex/scholar/.legacy/metadata/urls/zotero_translators/WorldCat Discovery Service.js +0 -630
- scitex/scholar/.legacy/metadata/urls/zotero_translators/XML ContextObject.js +0 -274
- scitex/scholar/.legacy/metadata/urls/zotero_translators/YPSF.js +0 -224
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Yandex Books.js +0 -265
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Ynet.js +0 -171
- scitex/scholar/.legacy/metadata/urls/zotero_translators/YouTube.js +0 -209
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ZIPonline.js +0 -267
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ZOBODAT.js +0 -341
- scitex/scholar/.legacy/metadata/urls/zotero_translators/Zotero RDF.js +0 -583
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ZoteroBib.js +0 -94
- scitex/scholar/.legacy/metadata/urls/zotero_translators/arXiv.org.js +0 -1099
- scitex/scholar/.legacy/metadata/urls/zotero_translators/artnet.js +0 -207
- scitex/scholar/.legacy/metadata/urls/zotero_translators/beck-online.js +0 -1339
- scitex/scholar/.legacy/metadata/urls/zotero_translators/clinicaltrials.gov.js +0 -331
- scitex/scholar/.legacy/metadata/urls/zotero_translators/dLibra.js +0 -367
- scitex/scholar/.legacy/metadata/urls/zotero_translators/dejure.org.js +0 -242
- scitex/scholar/.legacy/metadata/urls/zotero_translators/deleted.txt +0 -132
- scitex/scholar/.legacy/metadata/urls/zotero_translators/dhistory.js +0 -103
- scitex/scholar/.legacy/metadata/urls/zotero_translators/digibib.net.js +0 -245
- scitex/scholar/.legacy/metadata/urls/zotero_translators/eLibrary.ru.js +0 -867
- scitex/scholar/.legacy/metadata/urls/zotero_translators/eLife.js +0 -462
- scitex/scholar/.legacy/metadata/urls/zotero_translators/eMJA.js +0 -246
- scitex/scholar/.legacy/metadata/urls/zotero_translators/eMedicine.js +0 -123
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ePrint IACR.js +0 -608
- scitex/scholar/.legacy/metadata/urls/zotero_translators/ebrary.js +0 -140
- scitex/scholar/.legacy/metadata/urls/zotero_translators/etatar.ru.js +0 -104
- scitex/scholar/.legacy/metadata/urls/zotero_translators/feb-web.ru.js +0 -167
- scitex/scholar/.legacy/metadata/urls/zotero_translators/fishpond.co.nz.js +0 -224
- scitex/scholar/.legacy/metadata/urls/zotero_translators/fr-online.de.js +0 -209
- scitex/scholar/.legacy/metadata/urls/zotero_translators/govinfo.js +0 -189
- scitex/scholar/.legacy/metadata/urls/zotero_translators/index.d.ts +0 -1646
- scitex/scholar/.legacy/metadata/urls/zotero_translators/informIT database.js +0 -248
- scitex/scholar/.legacy/metadata/urls/zotero_translators/io-port.js +0 -68
- scitex/scholar/.legacy/metadata/urls/zotero_translators/jsconfig.json +0 -10
- scitex/scholar/.legacy/metadata/urls/zotero_translators/jurion.js +0 -377
- scitex/scholar/.legacy/metadata/urls/zotero_translators/mEDRA.js +0 -597
- scitex/scholar/.legacy/metadata/urls/zotero_translators/magazines.russ.ru.js +0 -120
- scitex/scholar/.legacy/metadata/urls/zotero_translators/medes.js +0 -284
- scitex/scholar/.legacy/metadata/urls/zotero_translators/newshub.co.nz.js +0 -206
- scitex/scholar/.legacy/metadata/urls/zotero_translators/newspapers.com.js +0 -335
- scitex/scholar/.legacy/metadata/urls/zotero_translators/openJur.js +0 -161
- scitex/scholar/.legacy/metadata/urls/zotero_translators/package-lock.json +0 -2345
- scitex/scholar/.legacy/metadata/urls/zotero_translators/package.json +0 -24
- scitex/scholar/.legacy/metadata/urls/zotero_translators/reddit.js +0 -275
- scitex/scholar/.legacy/metadata/urls/zotero_translators/sbn.it.js +0 -186
- scitex/scholar/.legacy/metadata/urls/zotero_translators/scinapse.js +0 -273
- scitex/scholar/.legacy/metadata/urls/zotero_translators/semantics Visual Library.js +0 -643
- scitex/scholar/.legacy/metadata/urls/zotero_translators/taz.de.js +0 -200
- scitex/scholar/.legacy/metadata/urls/zotero_translators/unAPI.js +0 -481
- scitex/scholar/.legacy/metadata/urls/zotero_translators/wiso.js +0 -314
- scitex/scholar/.legacy/metadata/urls/zotero_translators/zbMATH.js +0 -278
- scitex/scholar/.legacy/metadata/urls/zotero_translators/zotero.org.js +0 -311
- scitex/scholar/.legacy/search/README.md +0 -205
- scitex/scholar/.legacy/search/_Embedder.py +0 -329
- scitex/scholar/.legacy/search/_SemanticSearch.py +0 -278
- scitex/scholar/.legacy/search/_SemanticSearchEngine.py +0 -452
- scitex/scholar/.legacy/search/_UnifiedSearcher.py +0 -1353
- scitex/scholar/.legacy/search/_VectorDatabase.py +0 -443
- scitex/scholar/.legacy/search/__init__.py +0 -25
- scitex/scholar/.legacy/storage/_EnhancedStorageManager.py +0 -617
- scitex/scholar/.legacy/storage/__init__.py +0 -19
- scitex/scholar/CLAUDE.md +0 -257
- scitex/scholar/TODO.md +0 -174
- scitex/scholar/_mcp_handlers.py +0 -685
- scitex/scholar/_mcp_tool_schemas.py +0 -339
- scitex/scholar/docs/backup/papers-orig.bib +0 -698
- scitex/scholar/docs/backup/papers.bib.zip +0 -0
- scitex/scholar/docs/to_claude/bin/elisp/check_parens.sh +0 -56
- scitex/scholar/docs/to_claude/bin/elisp/elisp-ci/README.md +0 -412
- scitex/scholar/docs/to_claude/bin/elisp/elisp-ci/elisp-ci +0 -622
- scitex/scholar/docs/to_claude/bin/elisp/elisp-ci/elisp-ci-simple +0 -105
- scitex/scholar/docs/to_claude/bin/elisp/find_incorrect_require_provide_statements.sh +0 -113
- scitex/scholar/docs/to_claude/bin/elisp/run_tests_elisp.sh +0 -532
- scitex/scholar/docs/to_claude/bin/elisp/run_tests_elisp_v02.sh +0 -555
- scitex/scholar/docs/to_claude/bin/elisp/sync_elisp_tdd.sh +0 -626
- scitex/scholar/docs/to_claude/bin/general/claude_emacs_server.sh +0 -192
- scitex/scholar/docs/to_claude/bin/general/create_github_release.sh +0 -36
- scitex/scholar/docs/to_claude/bin/general/find_errors.sh +0 -75
- scitex/scholar/docs/to_claude/bin/general/rename.sh +0 -145
- scitex/scholar/docs/to_claude/bin/general/render_mermaid.sh +0 -116
- scitex/scholar/docs/to_claude/bin/general/safe_rm.sh +0 -75
- scitex/scholar/docs/to_claude/bin/general/view_repo.sh +0 -4
- scitex/scholar/docs/to_claude/bin/general/wsl2-buzzer.sh +0 -73
- scitex/scholar/docs/to_claude/bin/python/black_all.sh +0 -41
- scitex/scholar/docs/to_claude/bin/python/run_tests_python_pip_package.sh +0 -291
- scitex/scholar/docs/to_claude/bin/safe_rm.sh +0 -3
- scitex/scholar/docs/to_claude/bin/slurm/README.md +0 -54
- scitex/scholar/docs/to_claude/bin/slurm/login.sh +0 -23
- scitex/scholar/docs/to_claude/bin/slurm/request.sh +0 -62
- scitex/scholar/docs/to_claude/bin/slurm/run.sh +0 -73
- scitex/scholar/docs/to_claude/examples/README.md +0 -9
- scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/ELISP-TEST-REPORT-20250513-012234-48-PASSED-49-TOTAL-97-PERCENT.org +0 -105
- scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/LATEST-ELISP-REPORT.org +0 -105
- scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/README.md +0 -11
- scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/run_tests.sh +0 -652
- scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/tests/test-ehw-core/ELISP-TEST-REPORT-20250512-235622-0-SUCCESS-4-TOTAL-0-PERCENT.org +0 -25
- scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/tests/test-ehw-friends/ELISP-TEST-REPORT-20250512-235622-0-SUCCESS-34-TOTAL-0-PERCENT.org +0 -66
- scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/tests/test-ehw-prep/ELISP-TEST-REPORT-20250512-235622-0-SUCCESS-5-TOTAL-0-PERCENT.org +0 -26
- scitex/scholar/docs/to_claude/examples/example-elisp-project-emacs-hello-world/tests/test-ehw-utils/ELISP-TEST-REPORT-20250512-235622-0-SUCCESS-4-TOTAL-0-PERCENT.org +0 -25
- scitex/scholar/docs/to_claude/examples/example-python-project-scitex/.gitignore +0 -626
- scitex/scholar/docs/to_claude/examples/example-python-project-scitex/README.md +0 -155
- scitex/scholar/docs/to_claude/examples/example-python-project-scitex/config/MNIST.yaml +0 -24
- scitex/scholar/docs/to_claude/examples/example-python-project-scitex/config/PATH.yaml +0 -30
- scitex/scholar/docs/to_claude/examples/example-python-project-scitex/data/.gitkeep +0 -0
- scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/clf_svm.py +0 -124
- scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/download.py +0 -165
- scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/main.sh +0 -26
- scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/plot_conf_mat.py +0 -86
- scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/plot_digits.py +0 -118
- scitex/scholar/docs/to_claude/examples/example-python-project-scitex/scripts/mnist/plot_umap_space.py +0 -110
- scitex/scholar/docs/to_claude/guidelines/README.md +0 -9
- scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/01_DEVELOPMENT_CYCLE.md +0 -47
- scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/02_NAMING_CONVENSIONS.md +0 -91
- scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/03_ARCHITECTUAL_AGREEMENT_PROCESS.md +0 -86
- scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/04_ARCHITECTURE_PREDEFINED.md +0 -77
- scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/05_PRIORITY_CONFIG.md +0 -22
- scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/06_MULTIPLE_SPECIAL_AGENTS.md +0 -35
- scitex/scholar/docs/to_claude/guidelines/USER_PHILOSOPHY/07_DEBUGGING_TECHNIQUES.md +0 -153
- scitex/scholar/docs/to_claude/guidelines/command/IMPORTANT-rm.md +0 -69
- scitex/scholar/docs/to_claude/guidelines/command/IMPORTANT-tree.md +0 -162
- scitex/scholar/docs/to_claude/guidelines/elisp/IMPORTANT-ELISP-01-basic.md +0 -65
- scitex/scholar/docs/to_claude/guidelines/elisp/IMPORTANT-ELISP-02-project-structure.md +0 -97
- scitex/scholar/docs/to_claude/guidelines/elisp/IMPORTANT-ELISP-03-file-template.md +0 -70
- scitex/scholar/docs/to_claude/guidelines/elisp/IMPORTANT-ELISP-04-coding-style.md +0 -42
- scitex/scholar/docs/to_claude/guidelines/elisp/IMPORTANT-ELISP-05-testing-guide.md +0 -190
- scitex/scholar/docs/to_claude/guidelines/elisp/IMPORTANT-ELISP-99-example-project.md +0 -15
- scitex/scholar/docs/to_claude/guidelines/elisp/ci.md +0 -650
- scitex/scholar/docs/to_claude/guidelines/elisp/testing-with-docker.md +0 -243
- scitex/scholar/docs/to_claude/guidelines/programming_common/EXAMPLE-README-MODULE-ROOT.md +0 -32
- scitex/scholar/docs/to_claude/guidelines/programming_common/EXAMPLE-README-REPOSITORY-ROOT.md +0 -60
- scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-art-of-readable-code.md +0 -1317
- scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-art-of-testing.md +0 -799
- scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-cleanliness.md +0 -18
- scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-documentation-performance-claims.md +0 -163
- scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-general.md +0 -156
- scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-refactoring.md +0 -32
- scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-regression-prevention.md +0 -14
- scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-slurm.md +0 -73
- scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-start-from-small.md +0 -30
- scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-test-driven-workflow.md +0 -80
- scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-version-control.md +0 -47
- scitex/scholar/docs/to_claude/guidelines/programming_common/clean-code.md +0 -305
- scitex/scholar/docs/to_claude/guidelines/programming_common/debugging-message.md +0 -52
- scitex/scholar/docs/to_claude/guidelines/programming_common/do-not-repeat-yourself.md +0 -27
- scitex/scholar/docs/to_claude/guidelines/programming_common/emacs-server.md +0 -39
- scitex/scholar/docs/to_claude/guidelines/programming_common/keep-it-simple-stupid.md +0 -19
- scitex/scholar/docs/to_claude/guidelines/programming_common/renaming-and-cleaning-workflow.md +0 -311
- scitex/scholar/docs/to_claude/guidelines/programming_common/screen.md +0 -32
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-CLAUDE_ID.md +0 -15
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-beyond-control.md +0 -14
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-bug-report.md +0 -43
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-cleanliness.md +0 -162
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-communication.md +0 -13
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-do-not-create-any-new-file-nor-directory-in-project-root.md +0 -9
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-documentation.md +0 -11
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-feature-request.md +0 -33
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-general-multi-agent-coordination.md +0 -311
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-multi-agent-protocol.md +0 -97
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-project-management-bulletin-board.md +0 -48
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-project-management-markdown.md +0 -156
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-project-management-org.org +0 -161
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-tools.md +0 -10
- scitex/scholar/docs/to_claude/guidelines/project/IMPORTANT-understand-message-in-filename.md +0 -12
- scitex/scholar/docs/to_claude/guidelines/project/general.md +0 -7
- scitex/scholar/docs/to_claude/guidelines/project/report.md +0 -50
- scitex/scholar/docs/to_claude/guidelines/project/timeline-gantt-chart.md +0 -49
- scitex/scholar/docs/to_claude/guidelines/python/CHECKLIST.md +0 -51
- scitex/scholar/docs/to_claude/guidelines/python/HOW-TO-DEBUG-with-MULTIPLE_AGENTS.md +0 -191
- scitex/scholar/docs/to_claude/guidelines/python/Machine-Learning.md +0 -15
- scitex/scholar/docs/to_claude/guidelines/python/NOT-FULL-PYTEST-BUT-PARTIAL-PYTEST.md +0 -21
- scitex/scholar/docs/to_claude/guidelines/python/django.md +0 -217
- scitex/scholar/docs/to_claude/guidelines/python/env.md +0 -10
- scitex/scholar/docs/to_claude/guidelines/python/general.md +0 -55
- scitex/scholar/docs/to_claude/guidelines/python/official/cipdb-README.md +0 -219
- scitex/scholar/docs/to_claude/guidelines/python/official/fastmcp-README.md +0 -442
- scitex/scholar/docs/to_claude/guidelines/python/official/fastmcp-TESTING.md +0 -146
- scitex/scholar/docs/to_claude/guidelines/python/official/icecream-README.md +0 -433
- scitex/scholar/docs/to_claude/guidelines/python/official/priority_config-README.md +0 -126
- scitex/scholar/docs/to_claude/guidelines/python/scitex/01-basic.md +0 -42
- scitex/scholar/docs/to_claude/guidelines/python/scitex/02-file-template.md +0 -132
- scitex/scholar/docs/to_claude/guidelines/python/scitex/03-configuration.md +0 -53
- scitex/scholar/docs/to_claude/guidelines/python/scitex/04-coding-style.md +0 -126
- scitex/scholar/docs/to_claude/guidelines/python/scitex/05-testing-guide.md +0 -56
- scitex/scholar/docs/to_claude/guidelines/python/scitex/06-examples-guide.md +0 -42
- scitex/scholar/docs/to_claude/guidelines/python/scitex/11-gen-module.md +0 -15
- scitex/scholar/docs/to_claude/guidelines/python/scitex/11-session-module.md +0 -24
- scitex/scholar/docs/to_claude/guidelines/python/scitex/12-io-module.md +0 -112
- scitex/scholar/docs/to_claude/guidelines/python/scitex/13-plt-module.md +0 -101
- scitex/scholar/docs/to_claude/guidelines/python/scitex/14-dsp-module.md +0 -78
- scitex/scholar/docs/to_claude/guidelines/python/scitex/15-pd-module.md +0 -24
- scitex/scholar/docs/to_claude/guidelines/python/scitex/16-stats-module.md +0 -79
- scitex/scholar/docs/to_claude/guidelines/python/scitex/17-other-modules.md +0 -23
- scitex/scholar/docs/to_claude/guidelines/python/scitex/17-str-module.md +0 -24
- scitex/scholar/docs/to_claude/guidelines/python/scitex/18-directory-structure-for-scientific-work.md +0 -48
- scitex/scholar/docs/to_claude/guidelines/python/scitex/19-directory-structure-for-pip-package.md +0 -234
- scitex/scholar/docs/to_claude/guidelines/python/scitex/99-example-project.md +0 -19
- scitex/scholar/docs/to_claude/guidelines/python/zen_of_python.md +0 -82
- scitex/scholar/docs/to_claude/guidelines/science/IMPORTANT-general.md +0 -16
- scitex/scholar/docs/to_claude/guidelines/science/IMPORTANT-scientific-attitude.md +0 -25
- scitex/scholar/docs/to_claude/guidelines/science/scientific-writing-abstract.md +0 -93
- scitex/scholar/docs/to_claude/guidelines/science/scientific-writing-discussion.md +0 -116
- scitex/scholar/docs/to_claude/guidelines/science/scientific-writing-general-1.md +0 -157
- scitex/scholar/docs/to_claude/guidelines/science/scientific-writing-general-2.md +0 -83
- scitex/scholar/docs/to_claude/guidelines/science/scientific-writing-introduction.md +0 -123
- scitex/scholar/docs/to_claude/guidelines/science/scientific-writing-methods.md +0 -88
- scitex/scholar/docs/to_claude/guidelines/shell/IMPORTANT-general.md +0 -196
- scitex/scholar/examples/SUGGESTIONS.md +0 -865
- scitex/scholar/examples/dev.py +0 -38
- scitex/scholar/library/neurovista/info/bibtex/seizure_prediction_enriched.bib +0 -1092
- scitex/stats/_mcp_handlers.py +0 -1191
- scitex/stats/_mcp_tool_schemas.py +0 -384
- scitex/template/.legacy/_clone_project.py +0 -267
- scitex/template/_mcp_handlers.py +0 -259
- scitex/template/_mcp_tool_schemas.py +0 -112
- scitex/writer/.legacy/Writer_v01-refactored.py +0 -189
- scitex/writer/.legacy/_compile.py +0 -342
- scitex/writer/_compile_async.py +0 -126
- scitex/writer/_validate_tree_structures.py +0 -197
- scitex/writer/dataclasses/config/_WriterConfig.py +0 -175
- scitex/writer/dataclasses/contents/_ManuscriptContents.py +0 -236
- scitex/writer/dataclasses/core/_Document.py +0 -146
- scitex/writer/dataclasses/core/_DocumentSection.py +0 -546
- scitex/writer/dataclasses/results/_CompilationResult.py +0 -165
- scitex/writer/dataclasses/results/_LaTeXIssue.py +0 -102
- scitex/writer/dataclasses/tree/MINIMUM_FILES.md +0 -121
- scitex/writer/tests/__init__.py +0 -3
- scitex/writer/tests/test_diff_between.py +0 -451
- scitex/writer/tests/test_document_section.py +0 -311
- scitex/writer/tests/test_document_workflow.py +0 -393
- scitex/writer/tests/test_writer.py +0 -361
- scitex/writer/tests/test_writer_integration.py +0 -303
- scitex-2.13.0.dist-info/METADATA +0 -1231
- scitex-2.13.0.dist-info/RECORD +0 -3402
- scitex-2.13.0.dist-info/entry_points.txt +0 -11
- /scitex/scholar/docs/{SUMMARY.md → 00_SUMMARY.md} +0 -0
- /scitex/scholar/docs/{STORAGE_ARCHITECTURE.md → 01_STORAGE_ARCHITECTURE.md} +0 -0
- /scitex/scholar/docs/{PIPELINE_ORGANIZATION.md → 02_PIPELINE_ORGANIZATION.md} +0 -0
- /scitex/scholar/docs/{PIPELINE_IMPLEMENTATION_PLAN.md → 03_PIPELINE_IMPLEMENTATION_PLAN.md} +0 -0
- /scitex/scholar/docs/{PIPELINE_IMPLEMENTATION_COMPLETE.md → 04_PIPELINE_IMPLEMENTATION_COMPLETE.md} +0 -0
- /scitex/scholar/docs/{DETAILS_FOR_DEVELOPERS.md → 05_DETAILS_FOR_DEVELOPERS.md} +0 -0
- /scitex/scholar/docs/{IMPACT_FACTOR_CITATION_INTEGRATION.md → 06_IMPACT_FACTOR_CITATION_INTEGRATION.md} +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/__init__.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/config/_CONSTANTS.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/config/__init__.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/contents/_RevisionContents.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/contents/_SupplementaryContents.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/contents/__init__.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/core/__init__.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/results/_SaveSectionsResponse.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/results/_SectionReadResponse.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/results/__init__.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/tree/_ConfigTree.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/tree/_ManuscriptTree.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/tree/_RevisionTree.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/tree/_ScriptsTree.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/tree/_SharedTree.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/tree/_SupplementaryTree.py +0 -0
- /scitex/writer/{dataclasses → _dataclasses}/tree/__init__.py +0 -0
- {scitex-2.13.0.dist-info → scitex-2.15.1.dist-info}/WHEEL +0 -0
- {scitex-2.13.0.dist-info → scitex-2.15.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,1353 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
# Timestamp: "2025-07-19 11:10:00 (ywatanabe)"
|
|
4
|
-
# File: ./src/scitex/scholar/_search_unified.py
|
|
5
|
-
# ----------------------------------------
|
|
6
|
-
import os
|
|
7
|
-
|
|
8
|
-
__FILE__ = __file__
|
|
9
|
-
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
-
# ----------------------------------------
|
|
11
|
-
|
|
12
|
-
"""
|
|
13
|
-
Unified search functionality for SciTeX Scholar.
|
|
14
|
-
|
|
15
|
-
This module consolidates:
|
|
16
|
-
- Web search (Semantic Scholar, PubMed, arXiv)
|
|
17
|
-
- Local PDF search
|
|
18
|
-
- Vector similarity search
|
|
19
|
-
- Search result ranking and merging
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
import asyncio
|
|
23
|
-
from scitex import logging
|
|
24
|
-
import json
|
|
25
|
-
import pickle
|
|
26
|
-
from pathlib import Path
|
|
27
|
-
from typing import List, Dict, Any, Optional, Union, Tuple
|
|
28
|
-
from datetime import datetime
|
|
29
|
-
import aiohttp
|
|
30
|
-
import xml.etree.ElementTree as ET
|
|
31
|
-
from urllib.parse import quote_plus
|
|
32
|
-
|
|
33
|
-
from scitex.scholar.core import Paper
|
|
34
|
-
from scitex.errors import SearchError
|
|
35
|
-
from ..utils._paths import get_scholar_dir
|
|
36
|
-
|
|
37
|
-
logger = logging.getLogger(__name__)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
class SearchEngine:
|
|
41
|
-
"""Base class for all search engines."""
|
|
42
|
-
|
|
43
|
-
def __init__(self, name: str):
|
|
44
|
-
self.name = name
|
|
45
|
-
self.rate_limit = 0.1 # seconds between requests
|
|
46
|
-
self._last_request = 0
|
|
47
|
-
|
|
48
|
-
async def search_async(self, query: str, limit: int = 20, **kwargs) -> List[Paper]:
|
|
49
|
-
"""Search for papers. Must be implemented by subclasses."""
|
|
50
|
-
raise NotImplementedError
|
|
51
|
-
|
|
52
|
-
async def _rate_limit_async(self):
|
|
53
|
-
"""Enforce rate limiting."""
|
|
54
|
-
import time
|
|
55
|
-
|
|
56
|
-
now = time.time()
|
|
57
|
-
elapsed = now - self._last_request
|
|
58
|
-
if elapsed < self.rate_limit:
|
|
59
|
-
await asyncio.sleep(self.rate_limit - elapsed)
|
|
60
|
-
self._last_request = time.time()
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
class SemanticScholarEngine(SearchEngine):
|
|
64
|
-
"""Semantic Scholar search engine."""
|
|
65
|
-
|
|
66
|
-
def __init__(self, api_key: Optional[str] = None):
|
|
67
|
-
super().__init__("semantic_scholar")
|
|
68
|
-
self.api_key = api_key
|
|
69
|
-
self.base_url = "https://api.semanticscholar.org/graph/v1"
|
|
70
|
-
self.rate_limit = 0.1 if api_key else 1.0 # Faster with API key
|
|
71
|
-
|
|
72
|
-
async def search_async(self, query: str, limit: int = 20, **kwargs) -> List[Paper]:
|
|
73
|
-
"""Search Semantic Scholar for papers."""
|
|
74
|
-
await self._rate_limit_async()
|
|
75
|
-
|
|
76
|
-
# Check if query is for a specific paper ID
|
|
77
|
-
if query.startswith("CorpusId:"):
|
|
78
|
-
corpus_id = query.replace("CorpusId:", "").strip()
|
|
79
|
-
paper = await self._fetch_paper_by_id_async(f"CorpusId:{corpus_id}")
|
|
80
|
-
return [paper] if paper else []
|
|
81
|
-
|
|
82
|
-
headers = {}
|
|
83
|
-
if self.api_key:
|
|
84
|
-
headers["x-api-key"] = self.api_key
|
|
85
|
-
|
|
86
|
-
params = {
|
|
87
|
-
"query": query,
|
|
88
|
-
"limit": min(limit, 100),
|
|
89
|
-
"fields": "title,authors,abstract,year,citationCount,journal,paperId,venue,fieldsOfStudy,isOpenAccess,url,tldr,doi,externalIds",
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
# Add year filters if provided
|
|
93
|
-
if "year_min" in kwargs:
|
|
94
|
-
params["year"] = f"{kwargs['year_min']}-"
|
|
95
|
-
if "year_max" in kwargs:
|
|
96
|
-
if "year" in params:
|
|
97
|
-
params["year"] = f"{kwargs['year_min']}-{kwargs['year_max']}"
|
|
98
|
-
else:
|
|
99
|
-
params["year"] = f"-{kwargs['year_max']}"
|
|
100
|
-
|
|
101
|
-
papers = []
|
|
102
|
-
|
|
103
|
-
try:
|
|
104
|
-
async with aiohttp.ClientSession() as session:
|
|
105
|
-
async with session.get(
|
|
106
|
-
f"{self.base_url}/paper/search", params=params, headers=headers
|
|
107
|
-
) as response:
|
|
108
|
-
if response.status == 200:
|
|
109
|
-
data = await response.json()
|
|
110
|
-
|
|
111
|
-
for item in data.get("data", []):
|
|
112
|
-
paper = self._parse_semantic_scholar_paper(item)
|
|
113
|
-
if paper:
|
|
114
|
-
papers.append(paper)
|
|
115
|
-
else:
|
|
116
|
-
error_msg = await response.text()
|
|
117
|
-
|
|
118
|
-
if response.status == 429:
|
|
119
|
-
# Rate limiting - show_async this to user
|
|
120
|
-
logger.warning(
|
|
121
|
-
"Semantic Scholar rate limit reached. Please wait a moment or get a free API key at https://www.semanticscholar.org/product/api"
|
|
122
|
-
)
|
|
123
|
-
raise SearchError(
|
|
124
|
-
query=query,
|
|
125
|
-
source="semantic_scholar",
|
|
126
|
-
reason="Rate limit reached. Please wait 1-2 seconds between searches or get a free API key.",
|
|
127
|
-
)
|
|
128
|
-
else:
|
|
129
|
-
# Other errors - just log
|
|
130
|
-
logger.debug(
|
|
131
|
-
f"Semantic Scholar API returned {response.status}: {error_msg}"
|
|
132
|
-
)
|
|
133
|
-
return []
|
|
134
|
-
|
|
135
|
-
except SearchError:
|
|
136
|
-
# Re-raise SearchError so user sees it
|
|
137
|
-
raise
|
|
138
|
-
except Exception as e:
|
|
139
|
-
logger.debug(f"Semantic Scholar search error: {e}")
|
|
140
|
-
# Return empty list instead of raising to allow fallback to other sources
|
|
141
|
-
return []
|
|
142
|
-
|
|
143
|
-
return papers
|
|
144
|
-
|
|
145
|
-
async def _fetch_paper_by_id_async(self, paper_id: str) -> Optional[Paper]:
|
|
146
|
-
"""Fetch a specific paper by its ID (CorpusId, DOI, arXiv ID, etc.)."""
|
|
147
|
-
await self._rate_limit_async()
|
|
148
|
-
|
|
149
|
-
headers = {}
|
|
150
|
-
if self.api_key:
|
|
151
|
-
headers["x-api-key"] = self.api_key
|
|
152
|
-
|
|
153
|
-
# Build URL for fetching paper by ID
|
|
154
|
-
url = f"{self.base_url}/paper/{paper_id}"
|
|
155
|
-
params = {
|
|
156
|
-
"fields": "title,authors,abstract,year,citationCount,journal,paperId,venue,fieldsOfStudy,isOpenAccess,url,tldr,externalIds"
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
try:
|
|
160
|
-
async with aiohttp.ClientSession() as session:
|
|
161
|
-
async with session.get(url, params=params, headers=headers) as response:
|
|
162
|
-
if response.status == 200:
|
|
163
|
-
data = await response.json()
|
|
164
|
-
return self._parse_semantic_scholar_paper(data)
|
|
165
|
-
else:
|
|
166
|
-
logger.debug(
|
|
167
|
-
f"Failed to fetch paper {paper_id}: {response.status}"
|
|
168
|
-
)
|
|
169
|
-
return None
|
|
170
|
-
|
|
171
|
-
except Exception as e:
|
|
172
|
-
logger.debug(f"Error fetching paper {paper_id}: {e}")
|
|
173
|
-
return None
|
|
174
|
-
|
|
175
|
-
def _parse_semantic_scholar_paper(self, data: Dict[str, Any]) -> Optional[Paper]:
|
|
176
|
-
"""Parse Semantic Scholar paper data."""
|
|
177
|
-
if not data or not isinstance(data, dict):
|
|
178
|
-
logger.warning("Received None or non-dict data for Semantic Scholar paper")
|
|
179
|
-
return None
|
|
180
|
-
|
|
181
|
-
try:
|
|
182
|
-
# Extract authors
|
|
183
|
-
authors = []
|
|
184
|
-
for author_data in data.get("authors", []):
|
|
185
|
-
name = author_data.get("name", "")
|
|
186
|
-
if name:
|
|
187
|
-
authors.append(name)
|
|
188
|
-
|
|
189
|
-
# Get PDF URL if available
|
|
190
|
-
pdf_url = None
|
|
191
|
-
if data.get("isOpenAccess"):
|
|
192
|
-
pdf_url = data.get("url")
|
|
193
|
-
|
|
194
|
-
# Extract journal/venue
|
|
195
|
-
journal_data = data.get("journal")
|
|
196
|
-
journal = ""
|
|
197
|
-
if journal_data and isinstance(journal_data, dict):
|
|
198
|
-
journal = journal_data.get("name", "")
|
|
199
|
-
if not journal:
|
|
200
|
-
journal = data.get("venue", "")
|
|
201
|
-
|
|
202
|
-
# Extract DOI from externalIds if not directly available
|
|
203
|
-
doi = data.get("doi")
|
|
204
|
-
if not doi and data.get("externalIds"):
|
|
205
|
-
doi = data.get("externalIds", {}).get("DOI")
|
|
206
|
-
|
|
207
|
-
# Create paper
|
|
208
|
-
paper = Paper(
|
|
209
|
-
title=data.get("title", ""),
|
|
210
|
-
authors=authors,
|
|
211
|
-
abstract=data.get("abstract", "")
|
|
212
|
-
or (data.get("tldr", {}) or {}).get("text", ""),
|
|
213
|
-
year=data.get("year"),
|
|
214
|
-
doi=doi,
|
|
215
|
-
journal=journal,
|
|
216
|
-
keywords=data.get("fieldsOfStudy", []),
|
|
217
|
-
citation_count=data.get("citationCount", 0),
|
|
218
|
-
pdf_url=pdf_url,
|
|
219
|
-
source="semantic_scholar",
|
|
220
|
-
metadata={
|
|
221
|
-
"semantic_scholar_paper_id": data.get("paperId"),
|
|
222
|
-
"fields_of_study": data.get("fieldsOfStudy", []),
|
|
223
|
-
"is_open_access": data.get("isOpenAccess", False),
|
|
224
|
-
"citation_count_source": "Semantic Scholar"
|
|
225
|
-
if data.get("citationCount") is not None
|
|
226
|
-
else None,
|
|
227
|
-
"external_ids": data.get("externalIds", {}),
|
|
228
|
-
},
|
|
229
|
-
)
|
|
230
|
-
|
|
231
|
-
return paper
|
|
232
|
-
|
|
233
|
-
except Exception as e:
|
|
234
|
-
logger.warning(f"Failed to parse Semantic Scholar paper: {e}")
|
|
235
|
-
return None
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
class PubMedEngine(SearchEngine):
|
|
239
|
-
"""PubMed search engine using E-utilities."""
|
|
240
|
-
|
|
241
|
-
def __init__(self, email: Optional[str] = None):
|
|
242
|
-
super().__init__("pubmed")
|
|
243
|
-
self.email = email or "research@example.com"
|
|
244
|
-
self.base_url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils"
|
|
245
|
-
self.rate_limit = 0.4 # NCBI rate limit
|
|
246
|
-
|
|
247
|
-
async def search_async(self, query: str, limit: int = 20, **kwargs) -> List[Paper]:
|
|
248
|
-
"""Search PubMed for papers."""
|
|
249
|
-
await self._rate_limit_async()
|
|
250
|
-
|
|
251
|
-
# First, search for IDs
|
|
252
|
-
search_params = {
|
|
253
|
-
"db": "pubmed",
|
|
254
|
-
"term": query,
|
|
255
|
-
"retmax": limit,
|
|
256
|
-
"retmode": "json",
|
|
257
|
-
"email": self.email,
|
|
258
|
-
"sort": "relevance", # Sort by relevance instead of date to get diverse years
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
# Add date filters
|
|
262
|
-
year_min = kwargs.get("year_min")
|
|
263
|
-
year_max = kwargs.get("year_max")
|
|
264
|
-
if year_min is not None or year_max is not None:
|
|
265
|
-
min_date = f"{year_min or 1900}/01/01"
|
|
266
|
-
max_date = f"{year_max or datetime.now().year}/12/31"
|
|
267
|
-
search_params["mindate"] = min_date
|
|
268
|
-
search_params["maxdate"] = max_date
|
|
269
|
-
search_params["datetype"] = "pdat" # Publication date
|
|
270
|
-
else:
|
|
271
|
-
# When no date range specified, search last 20 years to avoid only getting current year
|
|
272
|
-
current_year = datetime.now().year
|
|
273
|
-
search_params["mindate"] = f"{current_year - 20}/01/01"
|
|
274
|
-
search_params["maxdate"] = f"{current_year}/12/31"
|
|
275
|
-
search_params["datetype"] = "pdat"
|
|
276
|
-
|
|
277
|
-
papers = []
|
|
278
|
-
|
|
279
|
-
try:
|
|
280
|
-
async with aiohttp.ClientSession() as session:
|
|
281
|
-
# Search for IDs
|
|
282
|
-
logger.info(f"PubMed API URL: {self.base_url}/esearch.fcgi")
|
|
283
|
-
logger.info(f"PubMed search params: {search_params}")
|
|
284
|
-
async with session.get(
|
|
285
|
-
f"{self.base_url}/esearch.fcgi", params=search_params
|
|
286
|
-
) as response:
|
|
287
|
-
if response.status == 200:
|
|
288
|
-
data = await response.json()
|
|
289
|
-
pmids = data.get("esearchresult", {}).get("idlist", [])
|
|
290
|
-
logger.info(f"PubMed search returned {len(pmids)} PMIDs")
|
|
291
|
-
|
|
292
|
-
if pmids:
|
|
293
|
-
# Fetch details
|
|
294
|
-
papers = await self._fetch_pubmed_details_async(
|
|
295
|
-
session, pmids
|
|
296
|
-
)
|
|
297
|
-
else:
|
|
298
|
-
logger.error(f"PubMed search failed: {response.status}")
|
|
299
|
-
|
|
300
|
-
except Exception as e:
|
|
301
|
-
logger.error(f"PubMed search error: {type(e).__name__}: {e}")
|
|
302
|
-
import traceback
|
|
303
|
-
|
|
304
|
-
logger.error(traceback.format_exc())
|
|
305
|
-
# Return empty list instead of raising to allow other sources
|
|
306
|
-
return []
|
|
307
|
-
|
|
308
|
-
return papers
|
|
309
|
-
|
|
310
|
-
async def _fetch_pubmed_details_async(
|
|
311
|
-
self, session: aiohttp.ClientSession, pmids: List[str]
|
|
312
|
-
) -> List[Paper]:
|
|
313
|
-
"""Fetch detailed information for PubMed IDs."""
|
|
314
|
-
await self._rate_limit_async()
|
|
315
|
-
|
|
316
|
-
fetch_params = {
|
|
317
|
-
"db": "pubmed",
|
|
318
|
-
"id": ",".join(pmids),
|
|
319
|
-
"retmode": "xml",
|
|
320
|
-
"email": self.email,
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
papers = []
|
|
324
|
-
|
|
325
|
-
async with session.get(
|
|
326
|
-
f"{self.base_url}/efetch.fcgi", params=fetch_params
|
|
327
|
-
) as response:
|
|
328
|
-
if response.status == 200:
|
|
329
|
-
xml_data = await response.text()
|
|
330
|
-
papers = self._parse_pubmed_xml(xml_data)
|
|
331
|
-
else:
|
|
332
|
-
logger.error(f"PubMed fetch failed: {response.status}")
|
|
333
|
-
|
|
334
|
-
return papers
|
|
335
|
-
|
|
336
|
-
def _parse_pubmed_xml(self, xml_data: str) -> List[Paper]:
|
|
337
|
-
"""Parse PubMed XML response."""
|
|
338
|
-
papers = []
|
|
339
|
-
|
|
340
|
-
try:
|
|
341
|
-
root = ET.fromstring(xml_data)
|
|
342
|
-
|
|
343
|
-
for article_elem in root.findall(".//PubmedArticle"):
|
|
344
|
-
try:
|
|
345
|
-
# Extract article data
|
|
346
|
-
medline = article_elem.find(".//MedlineCitation")
|
|
347
|
-
if medline is None:
|
|
348
|
-
continue
|
|
349
|
-
|
|
350
|
-
# Title
|
|
351
|
-
title_elem = medline.find(".//ArticleTitle")
|
|
352
|
-
title = title_elem.text if title_elem is not None else ""
|
|
353
|
-
|
|
354
|
-
# Authors
|
|
355
|
-
authors = []
|
|
356
|
-
for author_elem in medline.findall(".//Author"):
|
|
357
|
-
last_name = author_elem.findtext("LastName", "")
|
|
358
|
-
first_name = author_elem.findtext("ForeName", "")
|
|
359
|
-
if last_name:
|
|
360
|
-
name = (
|
|
361
|
-
f"{last_name}, {first_name}"
|
|
362
|
-
if first_name
|
|
363
|
-
else last_name
|
|
364
|
-
)
|
|
365
|
-
authors.append(name)
|
|
366
|
-
|
|
367
|
-
# Abstract
|
|
368
|
-
abstract_parts = []
|
|
369
|
-
for abstract_elem in medline.findall(".//AbstractText"):
|
|
370
|
-
text = abstract_elem.text or ""
|
|
371
|
-
abstract_parts.append(text)
|
|
372
|
-
abstract = " ".join(abstract_parts)
|
|
373
|
-
|
|
374
|
-
# Year
|
|
375
|
-
year_elem = medline.find(".//PubDate/Year")
|
|
376
|
-
year = year_elem.text if year_elem is not None else None
|
|
377
|
-
|
|
378
|
-
# Journal
|
|
379
|
-
journal_elem = medline.find(".//Journal/Title")
|
|
380
|
-
journal = journal_elem.text if journal_elem is not None else ""
|
|
381
|
-
|
|
382
|
-
# PMID
|
|
383
|
-
pmid_elem = medline.find(".//PMID")
|
|
384
|
-
pmid = pmid_elem.text if pmid_elem is not None else ""
|
|
385
|
-
|
|
386
|
-
# DOI
|
|
387
|
-
doi = None
|
|
388
|
-
for id_elem in article_elem.findall(".//ArticleId"):
|
|
389
|
-
if id_elem.get("IdType") == "doi":
|
|
390
|
-
doi = id_elem.text
|
|
391
|
-
break
|
|
392
|
-
|
|
393
|
-
# Keywords
|
|
394
|
-
keywords = []
|
|
395
|
-
for kw_elem in medline.findall(".//MeshHeading/DescriptorName"):
|
|
396
|
-
if kw_elem.text:
|
|
397
|
-
keywords.append(kw_elem.text)
|
|
398
|
-
|
|
399
|
-
paper = Paper(
|
|
400
|
-
title=title,
|
|
401
|
-
authors=authors,
|
|
402
|
-
abstract=abstract,
|
|
403
|
-
year=year,
|
|
404
|
-
doi=doi,
|
|
405
|
-
pmid=pmid,
|
|
406
|
-
journal=journal,
|
|
407
|
-
keywords=keywords,
|
|
408
|
-
source="pubmed",
|
|
409
|
-
)
|
|
410
|
-
|
|
411
|
-
papers.append(paper)
|
|
412
|
-
|
|
413
|
-
except Exception as e:
|
|
414
|
-
logger.warning(f"Failed to parse PubMed article: {e}")
|
|
415
|
-
continue
|
|
416
|
-
|
|
417
|
-
except Exception as e:
|
|
418
|
-
logger.error(f"Failed to parse PubMed XML: {e}")
|
|
419
|
-
|
|
420
|
-
return papers
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
class ArxivEngine(SearchEngine):
|
|
424
|
-
"""arXiv search engine."""
|
|
425
|
-
|
|
426
|
-
def __init__(self):
|
|
427
|
-
super().__init__("arxiv")
|
|
428
|
-
self.base_url = "http://export.arxiv.org/api/query"
|
|
429
|
-
self.rate_limit = 0.5
|
|
430
|
-
|
|
431
|
-
async def search_async(self, query: str, limit: int = 20, **kwargs) -> List[Paper]:
|
|
432
|
-
"""Search arXiv for papers."""
|
|
433
|
-
await self._rate_limit_async()
|
|
434
|
-
|
|
435
|
-
params = {
|
|
436
|
-
"search_query": f"all:{query}",
|
|
437
|
-
"start": 0,
|
|
438
|
-
"max_results": limit,
|
|
439
|
-
"sortBy": "relevance",
|
|
440
|
-
"sortOrder": "descending",
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
papers = []
|
|
444
|
-
|
|
445
|
-
try:
|
|
446
|
-
async with aiohttp.ClientSession() as session:
|
|
447
|
-
async with session.get(self.base_url, params=params) as response:
|
|
448
|
-
if response.status == 200:
|
|
449
|
-
xml_data = await response.text()
|
|
450
|
-
papers = self._parse_arxiv_xml(xml_data)
|
|
451
|
-
else:
|
|
452
|
-
logger.error(f"arXiv search failed: {response.status}")
|
|
453
|
-
|
|
454
|
-
except Exception as e:
|
|
455
|
-
logger.error(f"arXiv search error: {e}")
|
|
456
|
-
raise SearchError(query, "arXiv", str(e))
|
|
457
|
-
|
|
458
|
-
return papers
|
|
459
|
-
|
|
460
|
-
def _parse_arxiv_xml(self, xml_data: str) -> List[Paper]:
|
|
461
|
-
"""Parse arXiv XML response."""
|
|
462
|
-
papers = []
|
|
463
|
-
|
|
464
|
-
try:
|
|
465
|
-
# Parse XML with namespace
|
|
466
|
-
root = ET.fromstring(xml_data)
|
|
467
|
-
ns = {"atom": "http://www.w3.org/2005/Atom"}
|
|
468
|
-
|
|
469
|
-
for entry in root.findall("atom:entry", ns):
|
|
470
|
-
try:
|
|
471
|
-
# Title
|
|
472
|
-
title_elem = entry.find("atom:title", ns)
|
|
473
|
-
title = title_elem.text.strip() if title_elem is not None else ""
|
|
474
|
-
|
|
475
|
-
# Authors
|
|
476
|
-
authors = []
|
|
477
|
-
for author_elem in entry.findall("atom:author", ns):
|
|
478
|
-
name_elem = author_elem.find("atom:name", ns)
|
|
479
|
-
if name_elem is not None and name_elem.text:
|
|
480
|
-
authors.append(name_elem.text)
|
|
481
|
-
|
|
482
|
-
# Abstract
|
|
483
|
-
summary_elem = entry.find("atom:summary", ns)
|
|
484
|
-
abstract = (
|
|
485
|
-
summary_elem.text.strip() if summary_elem is not None else ""
|
|
486
|
-
)
|
|
487
|
-
|
|
488
|
-
# Year
|
|
489
|
-
published_elem = entry.find("atom:published", ns)
|
|
490
|
-
year = None
|
|
491
|
-
if published_elem is not None and published_elem.text:
|
|
492
|
-
year = published_elem.text[:4]
|
|
493
|
-
|
|
494
|
-
# arXiv ID
|
|
495
|
-
id_elem = entry.find("atom:id", ns)
|
|
496
|
-
arxiv_id = None
|
|
497
|
-
pdf_url = None
|
|
498
|
-
if id_elem is not None and id_elem.text:
|
|
499
|
-
# Extract ID from URL
|
|
500
|
-
arxiv_id = id_elem.text.split("/")[-1]
|
|
501
|
-
pdf_url = f"https://arxiv.org/pdf/{arxiv_id}.pdf"
|
|
502
|
-
|
|
503
|
-
# Categories (as keywords)
|
|
504
|
-
keywords = []
|
|
505
|
-
for cat_elem in entry.findall("atom:category", ns):
|
|
506
|
-
term = cat_elem.get("term")
|
|
507
|
-
if term:
|
|
508
|
-
keywords.append(term)
|
|
509
|
-
|
|
510
|
-
paper = Paper(
|
|
511
|
-
title=title,
|
|
512
|
-
authors=authors,
|
|
513
|
-
abstract=abstract,
|
|
514
|
-
year=year,
|
|
515
|
-
arxiv_id=arxiv_id,
|
|
516
|
-
keywords=keywords,
|
|
517
|
-
pdf_url=pdf_url,
|
|
518
|
-
source="arxiv",
|
|
519
|
-
)
|
|
520
|
-
|
|
521
|
-
papers.append(paper)
|
|
522
|
-
|
|
523
|
-
except Exception as e:
|
|
524
|
-
logger.warning(f"Failed to parse arXiv entry: {e}")
|
|
525
|
-
continue
|
|
526
|
-
|
|
527
|
-
except Exception as e:
|
|
528
|
-
logger.error(f"Failed to parse arXiv XML: {e}")
|
|
529
|
-
|
|
530
|
-
return papers
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
class CrossRefEngine(SearchEngine):
|
|
534
|
-
"""CrossRef search engine for academic papers."""
|
|
535
|
-
|
|
536
|
-
def __init__(self, api_key: Optional[str] = None, email: Optional[str] = None):
|
|
537
|
-
super().__init__("crossref")
|
|
538
|
-
self.api_key = api_key
|
|
539
|
-
self.email = email or "research@example.com"
|
|
540
|
-
self.base_url = "https://api.crossref.org/works"
|
|
541
|
-
self.rate_limit = 0.5 # CrossRef recommends 50ms between requests
|
|
542
|
-
|
|
543
|
-
async def search_async(self, query: str, limit: int = 20, **kwargs) -> List[Paper]:
|
|
544
|
-
"""Search CrossRef for papers."""
|
|
545
|
-
await self._rate_limit_async()
|
|
546
|
-
|
|
547
|
-
# Build query parameters
|
|
548
|
-
params = {
|
|
549
|
-
"query": query,
|
|
550
|
-
"rows": min(limit, 1000), # CrossRef max is 1000
|
|
551
|
-
"sort": "relevance",
|
|
552
|
-
"order": "desc",
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
# Add filters for year if provided
|
|
556
|
-
filters = []
|
|
557
|
-
if "year_min" in kwargs and kwargs["year_min"] is not None:
|
|
558
|
-
filters.append(f"from-pub-date:{kwargs['year_min']}")
|
|
559
|
-
if "year_max" in kwargs and kwargs["year_max"] is not None:
|
|
560
|
-
filters.append(f"until-pub-date:{kwargs['year_max']}")
|
|
561
|
-
|
|
562
|
-
if filters:
|
|
563
|
-
params["filter"] = ",".join(filters)
|
|
564
|
-
|
|
565
|
-
# Add API key if available
|
|
566
|
-
if self.api_key:
|
|
567
|
-
params["key"] = self.api_key
|
|
568
|
-
|
|
569
|
-
# Headers with user agent
|
|
570
|
-
headers = {"User-Agent": f"SciTeX/1.0 (mailto:{self.email})"}
|
|
571
|
-
|
|
572
|
-
papers = []
|
|
573
|
-
|
|
574
|
-
try:
|
|
575
|
-
async with aiohttp.ClientSession() as session:
|
|
576
|
-
async with session.get(
|
|
577
|
-
self.base_url, params=params, headers=headers
|
|
578
|
-
) as response:
|
|
579
|
-
if response.status == 200:
|
|
580
|
-
data = await response.json()
|
|
581
|
-
papers = self._parse_crossref_response(data)
|
|
582
|
-
else:
|
|
583
|
-
error_text = await response.text()
|
|
584
|
-
logger.error(
|
|
585
|
-
f"CrossRef search failed: {response.status} - {error_text}"
|
|
586
|
-
)
|
|
587
|
-
raise SearchError(
|
|
588
|
-
query=query,
|
|
589
|
-
source="crossref",
|
|
590
|
-
reason=f"API returned status {response.status}",
|
|
591
|
-
)
|
|
592
|
-
|
|
593
|
-
except asyncio.TimeoutError:
|
|
594
|
-
logger.error("CrossRef search timed out")
|
|
595
|
-
raise SearchError(query=query, source="crossref", reason="Search timed out")
|
|
596
|
-
except Exception as e:
|
|
597
|
-
logger.error(f"CrossRef search error: {e}")
|
|
598
|
-
raise SearchError(query=query, source="crossref", reason=str(e))
|
|
599
|
-
|
|
600
|
-
return papers
|
|
601
|
-
|
|
602
|
-
def _parse_crossref_response(self, data: Dict[str, Any]) -> List[Paper]:
|
|
603
|
-
"""Parse CrossRef API response into Paper objects."""
|
|
604
|
-
papers = []
|
|
605
|
-
|
|
606
|
-
items = data.get("message", {}).get("items", [])
|
|
607
|
-
|
|
608
|
-
for item in items:
|
|
609
|
-
try:
|
|
610
|
-
# Extract basic metadata
|
|
611
|
-
title = " ".join(item.get("title", ["No title"]))
|
|
612
|
-
|
|
613
|
-
# Authors
|
|
614
|
-
authors = []
|
|
615
|
-
for author in item.get("author", []):
|
|
616
|
-
given = author.get("given", "")
|
|
617
|
-
family = author.get("family", "")
|
|
618
|
-
if given and family:
|
|
619
|
-
authors.append(f"{given} {family}")
|
|
620
|
-
elif family:
|
|
621
|
-
authors.append(family)
|
|
622
|
-
|
|
623
|
-
# Abstract - CrossRef doesn't always have abstracts
|
|
624
|
-
abstract = item.get("abstract", "")
|
|
625
|
-
|
|
626
|
-
# Year from published-print or published-online
|
|
627
|
-
year = None
|
|
628
|
-
published = item.get("published-print") or item.get("published-online")
|
|
629
|
-
if published and "date-parts" in published:
|
|
630
|
-
date_parts = published["date-parts"]
|
|
631
|
-
if date_parts and date_parts[0]:
|
|
632
|
-
year = str(date_parts[0][0])
|
|
633
|
-
|
|
634
|
-
# Journal
|
|
635
|
-
journal = None
|
|
636
|
-
container_title = item.get("container-title", [])
|
|
637
|
-
if container_title:
|
|
638
|
-
journal = container_title[0]
|
|
639
|
-
|
|
640
|
-
# DOI
|
|
641
|
-
doi = item.get("DOI")
|
|
642
|
-
|
|
643
|
-
# Citation count
|
|
644
|
-
citation_count = item.get("is-referenced-by-count", 0)
|
|
645
|
-
|
|
646
|
-
# Keywords/subjects
|
|
647
|
-
keywords = item.get("subject", [])
|
|
648
|
-
|
|
649
|
-
# URL
|
|
650
|
-
url = item.get("URL")
|
|
651
|
-
|
|
652
|
-
paper = Paper(
|
|
653
|
-
title=title,
|
|
654
|
-
authors=authors,
|
|
655
|
-
abstract=abstract,
|
|
656
|
-
year=year,
|
|
657
|
-
doi=doi,
|
|
658
|
-
journal=journal,
|
|
659
|
-
keywords=keywords,
|
|
660
|
-
citation_count=citation_count,
|
|
661
|
-
source="crossref",
|
|
662
|
-
metadata={
|
|
663
|
-
"citation_count_source": "CrossRef",
|
|
664
|
-
"url": url,
|
|
665
|
-
"publisher": item.get("publisher"),
|
|
666
|
-
"issn": item.get("ISSN", []),
|
|
667
|
-
"type": item.get("type"),
|
|
668
|
-
"score": item.get("score"),
|
|
669
|
-
},
|
|
670
|
-
)
|
|
671
|
-
|
|
672
|
-
papers.append(paper)
|
|
673
|
-
|
|
674
|
-
except Exception as e:
|
|
675
|
-
logger.warning(f"Failed to parse CrossRef item: {e}")
|
|
676
|
-
continue
|
|
677
|
-
|
|
678
|
-
return papers
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
class GoogleScholarEngine(SearchEngine):
|
|
682
|
-
"""Search engine for Google Scholar using scholarly package."""
|
|
683
|
-
|
|
684
|
-
def __init__(self, timeout: int = 10):
|
|
685
|
-
super().__init__("google_scholar")
|
|
686
|
-
self.rate_limit = 2.0 # Be respectful to Google Scholar
|
|
687
|
-
self._scholarly = None
|
|
688
|
-
self.timeout = timeout
|
|
689
|
-
|
|
690
|
-
def _init_scholarly(self):
|
|
691
|
-
"""Lazy load scholarly package."""
|
|
692
|
-
if self._scholarly is None:
|
|
693
|
-
try:
|
|
694
|
-
from scholarly import scholarly
|
|
695
|
-
|
|
696
|
-
self._scholarly = scholarly
|
|
697
|
-
# Configure proxy to avoid blocking (optional)
|
|
698
|
-
# from scholarly import ProxyGenerator
|
|
699
|
-
# pg = ProxyGenerator()
|
|
700
|
-
# pg.FreeProxies() # Use free proxies
|
|
701
|
-
# scholarly.use_proxy(pg)
|
|
702
|
-
except ImportError:
|
|
703
|
-
raise ImportError(
|
|
704
|
-
"scholarly package not installed. "
|
|
705
|
-
"Install with: pip install scholarly"
|
|
706
|
-
)
|
|
707
|
-
return self._scholarly
|
|
708
|
-
|
|
709
|
-
async def search_async(self, query: str, limit: int = 20, **kwargs) -> List[Paper]:
|
|
710
|
-
"""
|
|
711
|
-
Search Google Scholar for papers.
|
|
712
|
-
|
|
713
|
-
Args:
|
|
714
|
-
query: Search query
|
|
715
|
-
limit: Maximum number of results
|
|
716
|
-
**kwargs: Additional parameters (year_min, year_max)
|
|
717
|
-
|
|
718
|
-
Returns:
|
|
719
|
-
List of Paper objects
|
|
720
|
-
"""
|
|
721
|
-
papers = []
|
|
722
|
-
|
|
723
|
-
try:
|
|
724
|
-
# Initialize scholarly
|
|
725
|
-
scholarly = self._init_scholarly()
|
|
726
|
-
|
|
727
|
-
# Quick test to see if Google Scholar is accessible
|
|
728
|
-
try:
|
|
729
|
-
# Try a minimal search to detect blocking immediately
|
|
730
|
-
test_search = scholarly.search_pubs("test")
|
|
731
|
-
next(test_search) # Try to get first result
|
|
732
|
-
except Exception as e:
|
|
733
|
-
if "Cannot Fetch" in str(e) or "403" in str(e):
|
|
734
|
-
logger.warning("Google Scholar is blocking requests")
|
|
735
|
-
raise SearchError(
|
|
736
|
-
query=query,
|
|
737
|
-
source="google_scholar",
|
|
738
|
-
reason="Google Scholar is blocking automated access. Use PubMed or Semantic Scholar instead.",
|
|
739
|
-
)
|
|
740
|
-
|
|
741
|
-
# Apply year filters if provided
|
|
742
|
-
year_min = kwargs.get("year_min")
|
|
743
|
-
year_max = kwargs.get("year_max")
|
|
744
|
-
|
|
745
|
-
# Build query with year filters
|
|
746
|
-
search_query = query
|
|
747
|
-
if year_min and year_max:
|
|
748
|
-
search_query += f" after:{year_min - 1} before:{year_max + 1}"
|
|
749
|
-
elif year_min:
|
|
750
|
-
search_query += f" after:{year_min - 1}"
|
|
751
|
-
elif year_max:
|
|
752
|
-
search_query += f" before:{year_max + 1}"
|
|
753
|
-
|
|
754
|
-
logger.info(f"Searching Google Scholar: {search_query}")
|
|
755
|
-
|
|
756
|
-
# Run search in executor with timeout to avoid blocking
|
|
757
|
-
loop = asyncio.get_event_loop()
|
|
758
|
-
|
|
759
|
-
def search_with_limit():
|
|
760
|
-
"""Search and limit results to avoid hanging."""
|
|
761
|
-
results = []
|
|
762
|
-
try:
|
|
763
|
-
search_query_obj = scholarly.search_pubs(search_query)
|
|
764
|
-
for i, result in enumerate(search_query_obj):
|
|
765
|
-
if i >= limit:
|
|
766
|
-
break
|
|
767
|
-
results.append(result)
|
|
768
|
-
except Exception as e:
|
|
769
|
-
logger.warning(f"Google Scholar search interrupted: {e}")
|
|
770
|
-
# Common error from scholarly when blocked
|
|
771
|
-
if "Cannot Fetch" in str(e) or "403" in str(e):
|
|
772
|
-
logger.info(
|
|
773
|
-
"Google Scholar is blocking automated requests. This is common due to anti-bot measures."
|
|
774
|
-
)
|
|
775
|
-
return results
|
|
776
|
-
|
|
777
|
-
# Apply timeout to prevent hanging
|
|
778
|
-
try:
|
|
779
|
-
search_results = await asyncio.wait_for(
|
|
780
|
-
loop.run_in_executor(None, search_with_limit), timeout=self.timeout
|
|
781
|
-
)
|
|
782
|
-
except asyncio.TimeoutError:
|
|
783
|
-
logger.warning(
|
|
784
|
-
f"Google Scholar search timed out after {self.timeout} seconds"
|
|
785
|
-
)
|
|
786
|
-
raise SearchError(
|
|
787
|
-
query=search_query,
|
|
788
|
-
source="google_scholar",
|
|
789
|
-
reason=f"Search timed out after {self.timeout} seconds. Google Scholar may be blocking requests. You can increase timeout with SCITEX_SCHOLAR_GOOGLE_SCHOLAR_TIMEOUT environment variable.",
|
|
790
|
-
)
|
|
791
|
-
|
|
792
|
-
# Process results
|
|
793
|
-
for result in search_results:
|
|
794
|
-
try:
|
|
795
|
-
# Extract basic info from search result
|
|
796
|
-
bib = result.get("bib", {})
|
|
797
|
-
|
|
798
|
-
title = bib.get("title", "")
|
|
799
|
-
if not title:
|
|
800
|
-
continue
|
|
801
|
-
|
|
802
|
-
# Authors
|
|
803
|
-
authors = bib.get("author", "").split(" and ")
|
|
804
|
-
if not authors or authors == [""]:
|
|
805
|
-
authors = []
|
|
806
|
-
|
|
807
|
-
# Abstract (often not available in search results)
|
|
808
|
-
abstract = bib.get("abstract", "")
|
|
809
|
-
|
|
810
|
-
# Year
|
|
811
|
-
year = None
|
|
812
|
-
pub_year = bib.get("pub_year")
|
|
813
|
-
if pub_year:
|
|
814
|
-
try:
|
|
815
|
-
year = int(pub_year)
|
|
816
|
-
except:
|
|
817
|
-
pass
|
|
818
|
-
|
|
819
|
-
# Journal/Venue
|
|
820
|
-
journal = bib.get("venue", "")
|
|
821
|
-
|
|
822
|
-
# Citation count
|
|
823
|
-
citation_count = result.get("num_citations", 0)
|
|
824
|
-
|
|
825
|
-
# URL
|
|
826
|
-
url = result.get("pub_url", "")
|
|
827
|
-
|
|
828
|
-
# Try to extract DOI from URL or other fields
|
|
829
|
-
doi = None
|
|
830
|
-
if "doi.org/" in url:
|
|
831
|
-
doi = url.split("doi.org/")[-1]
|
|
832
|
-
|
|
833
|
-
# Create Paper object
|
|
834
|
-
paper = Paper(
|
|
835
|
-
title=title,
|
|
836
|
-
authors=authors,
|
|
837
|
-
abstract=abstract
|
|
838
|
-
or "Abstract not available from Google Scholar search",
|
|
839
|
-
year=year,
|
|
840
|
-
journal=journal,
|
|
841
|
-
doi=doi,
|
|
842
|
-
citation_count=citation_count,
|
|
843
|
-
source="google_scholar",
|
|
844
|
-
metadata={
|
|
845
|
-
"google_scholar_url": url,
|
|
846
|
-
"google_scholar_id": result.get("author_id", ""),
|
|
847
|
-
"eprint_url": result.get("eprint_url", ""),
|
|
848
|
-
},
|
|
849
|
-
)
|
|
850
|
-
|
|
851
|
-
papers.append(paper)
|
|
852
|
-
|
|
853
|
-
except Exception as e:
|
|
854
|
-
logger.warning(f"Failed to parse Google Scholar result: {e}")
|
|
855
|
-
continue
|
|
856
|
-
|
|
857
|
-
except ImportError as e:
|
|
858
|
-
logger.error(f"Google Scholar search unavailable: {e}")
|
|
859
|
-
raise SearchError(
|
|
860
|
-
query=query,
|
|
861
|
-
source="google_scholar",
|
|
862
|
-
reason=f"Google Scholar search unavailable: {e}",
|
|
863
|
-
)
|
|
864
|
-
except Exception as e:
|
|
865
|
-
logger.error(f"Google Scholar search failed: {e}")
|
|
866
|
-
if (
|
|
867
|
-
"robot" in str(e).lower()
|
|
868
|
-
or "captcha" in str(e).lower()
|
|
869
|
-
or "Cannot Fetch" in str(e)
|
|
870
|
-
):
|
|
871
|
-
raise SearchError(
|
|
872
|
-
query=query,
|
|
873
|
-
source="google_scholar",
|
|
874
|
-
reason="Google Scholar is blocking automated access. Consider using PubMed or Semantic Scholar instead, or configure a proxy in the scholarly package.",
|
|
875
|
-
)
|
|
876
|
-
raise SearchError(
|
|
877
|
-
query=query, source="google_scholar", reason=f"Search failed: {e}"
|
|
878
|
-
)
|
|
879
|
-
|
|
880
|
-
logger.info(f"Found {len(papers)} papers from Google Scholar")
|
|
881
|
-
return papers
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
class LocalSearchEngine(SearchEngine):
|
|
885
|
-
"""Search engine for local PDF files."""
|
|
886
|
-
|
|
887
|
-
def __init__(self, index_path: Optional[Path] = None):
|
|
888
|
-
super().__init__("local")
|
|
889
|
-
self.index_path = index_path or get_scholar_dir() / "local_index.json"
|
|
890
|
-
self.index = self._load_index()
|
|
891
|
-
|
|
892
|
-
async def search_async(self, query: str, limit: int = 20, **kwargs) -> List[Paper]:
|
|
893
|
-
"""Search local PDF collection."""
|
|
894
|
-
# Local search is synchronous, wrap in async
|
|
895
|
-
return await asyncio.to_thread(self._search_sync, query, limit, kwargs)
|
|
896
|
-
|
|
897
|
-
def _search_sync(self, query: str, limit: int, kwargs: dict) -> List[Paper]:
|
|
898
|
-
"""Synchronous local search implementation."""
|
|
899
|
-
if not self.index:
|
|
900
|
-
return []
|
|
901
|
-
|
|
902
|
-
# Simple keyword matching
|
|
903
|
-
query_terms = query.lower().split()
|
|
904
|
-
scored_papers = []
|
|
905
|
-
|
|
906
|
-
for paper_data in self.index.values():
|
|
907
|
-
# Calculate relevance score
|
|
908
|
-
score = 0
|
|
909
|
-
searchable_text = f"{paper_data.get('title', '')} {paper_data.get('abstract', '')} {' '.join(paper_data.get('keywords', []))}".lower()
|
|
910
|
-
|
|
911
|
-
for term in query_terms:
|
|
912
|
-
score += searchable_text.count(term)
|
|
913
|
-
|
|
914
|
-
if score > 0:
|
|
915
|
-
# Create Paper object
|
|
916
|
-
paper = Paper(
|
|
917
|
-
title=paper_data.get("title", "Unknown Title"),
|
|
918
|
-
authors=paper_data.get("authors", []),
|
|
919
|
-
abstract=paper_data.get("abstract", ""),
|
|
920
|
-
year=paper_data.get("year"),
|
|
921
|
-
keywords=paper_data.get("keywords", []),
|
|
922
|
-
pdf_path=Path(paper_data.get("pdf_path", "")),
|
|
923
|
-
source="local",
|
|
924
|
-
)
|
|
925
|
-
scored_papers.append((score, paper))
|
|
926
|
-
|
|
927
|
-
# Sort by score and return top results
|
|
928
|
-
scored_papers.sort(key=lambda x: x[0], reverse=True)
|
|
929
|
-
return [paper for score, paper in scored_papers[:limit]]
|
|
930
|
-
|
|
931
|
-
def _load_index(self) -> Dict[str, Any]:
|
|
932
|
-
"""Load local search index."""
|
|
933
|
-
if self.index_path.exists():
|
|
934
|
-
try:
|
|
935
|
-
with open(self.index_path, "r") as f:
|
|
936
|
-
return json.load(f)
|
|
937
|
-
except Exception as e:
|
|
938
|
-
logger.warning(f"Failed to load local index: {e}")
|
|
939
|
-
return {}
|
|
940
|
-
|
|
941
|
-
def build_index(self, pdf_dirs: List[Path]) -> Dict[str, Any]:
|
|
942
|
-
"""Build search index from PDF directories."""
|
|
943
|
-
logger.info(f"Building local index from {len(pdf_dirs)} directories")
|
|
944
|
-
|
|
945
|
-
index = {}
|
|
946
|
-
stats = {"files_indexed": 0, "errors": 0}
|
|
947
|
-
|
|
948
|
-
for pdf_dir in pdf_dirs:
|
|
949
|
-
if not pdf_dir.exists():
|
|
950
|
-
continue
|
|
951
|
-
|
|
952
|
-
for pdf_path in pdf_dir.rglob("*.pdf"):
|
|
953
|
-
try:
|
|
954
|
-
# Extract text and metadata
|
|
955
|
-
paper_data = self._extract_pdf_metadata(pdf_path)
|
|
956
|
-
if paper_data:
|
|
957
|
-
index[str(pdf_path)] = paper_data
|
|
958
|
-
stats["files_indexed"] += 1
|
|
959
|
-
except Exception as e:
|
|
960
|
-
logger.warning(f"Failed to index {pdf_path}: {e}")
|
|
961
|
-
stats["errors"] += 1
|
|
962
|
-
|
|
963
|
-
# Save index
|
|
964
|
-
self.index = index
|
|
965
|
-
self._save_index()
|
|
966
|
-
|
|
967
|
-
logger.info(
|
|
968
|
-
f"Indexed {stats['files_indexed']} files with {stats['errors']} errors"
|
|
969
|
-
)
|
|
970
|
-
return stats
|
|
971
|
-
|
|
972
|
-
def _extract_pdf_metadata(self, pdf_path: Path) -> Optional[Dict[str, Any]]:
|
|
973
|
-
"""Extract metadata from PDF file."""
|
|
974
|
-
# This is a placeholder - in real implementation would use PyPDF2 or similar
|
|
975
|
-
return {
|
|
976
|
-
"title": pdf_path.stem.replace("_", " ").title(),
|
|
977
|
-
"authors": [],
|
|
978
|
-
"abstract": "",
|
|
979
|
-
"year": None,
|
|
980
|
-
"keywords": [],
|
|
981
|
-
"pdf_path": str(pdf_path),
|
|
982
|
-
}
|
|
983
|
-
|
|
984
|
-
def _save_index(self) -> None:
|
|
985
|
-
"""Save index to disk."""
|
|
986
|
-
self.index_path.parent.mkdir(parents=True, exist_ok=True)
|
|
987
|
-
with open(self.index_path, "w") as f:
|
|
988
|
-
json.dump(self.index, f, indent=2)
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
class VectorSearchEngine(SearchEngine):
|
|
992
|
-
"""Vector similarity search using sentence embeddings."""
|
|
993
|
-
|
|
994
|
-
def __init__(
|
|
995
|
-
self, index_path: Optional[Path] = None, model_name: str = "all-MiniLM-L6-v2"
|
|
996
|
-
):
|
|
997
|
-
super().__init__("vector")
|
|
998
|
-
self.index_path = index_path or get_scholar_dir() / "vector_index.pkl"
|
|
999
|
-
self.model_name = model_name
|
|
1000
|
-
self._model = None
|
|
1001
|
-
self._papers = []
|
|
1002
|
-
self._embeddings = None
|
|
1003
|
-
self._load_index()
|
|
1004
|
-
|
|
1005
|
-
async def search_async(self, query: str, limit: int = 20, **kwargs) -> List[Paper]:
|
|
1006
|
-
"""Search using vector similarity."""
|
|
1007
|
-
# Vector search is CPU-bound, use thread
|
|
1008
|
-
return await asyncio.to_thread(self._search_sync, query, limit)
|
|
1009
|
-
|
|
1010
|
-
def _search_sync(self, query: str, limit: int) -> List[Paper]:
|
|
1011
|
-
"""Synchronous vector search implementation."""
|
|
1012
|
-
if not self._embeddings or not self._papers:
|
|
1013
|
-
return []
|
|
1014
|
-
|
|
1015
|
-
# Lazy load model
|
|
1016
|
-
if self._model is None:
|
|
1017
|
-
self._load_model()
|
|
1018
|
-
|
|
1019
|
-
# Encode query
|
|
1020
|
-
query_embedding = self._model.encode([query])[0]
|
|
1021
|
-
|
|
1022
|
-
# Calculate similarities
|
|
1023
|
-
import numpy as np
|
|
1024
|
-
|
|
1025
|
-
similarities = np.dot(self._embeddings, query_embedding)
|
|
1026
|
-
|
|
1027
|
-
# Get top results
|
|
1028
|
-
top_indices = np.argsort(similarities)[-limit:][::-1]
|
|
1029
|
-
|
|
1030
|
-
results = []
|
|
1031
|
-
for idx in top_indices:
|
|
1032
|
-
if idx < len(self._papers):
|
|
1033
|
-
results.append(self._papers[idx])
|
|
1034
|
-
|
|
1035
|
-
return results
|
|
1036
|
-
|
|
1037
|
-
def add_papers(self, papers: List[Paper]) -> None:
|
|
1038
|
-
"""Add papers to vector index."""
|
|
1039
|
-
if self._model is None:
|
|
1040
|
-
self._load_model()
|
|
1041
|
-
|
|
1042
|
-
# Create searchable text for each paper
|
|
1043
|
-
texts = []
|
|
1044
|
-
for paper in papers:
|
|
1045
|
-
text = f"{paper.title} {paper.abstract}"
|
|
1046
|
-
texts.append(text)
|
|
1047
|
-
|
|
1048
|
-
# Encode papers
|
|
1049
|
-
new_embeddings = self._model.encode(texts)
|
|
1050
|
-
|
|
1051
|
-
# Add to index
|
|
1052
|
-
import numpy as np
|
|
1053
|
-
|
|
1054
|
-
if self._embeddings is None:
|
|
1055
|
-
self._embeddings = new_embeddings
|
|
1056
|
-
self._papers = papers
|
|
1057
|
-
else:
|
|
1058
|
-
self._embeddings = np.vstack([self._embeddings, new_embeddings])
|
|
1059
|
-
self._papers.extend(papers)
|
|
1060
|
-
|
|
1061
|
-
# Save index
|
|
1062
|
-
self._save_index()
|
|
1063
|
-
|
|
1064
|
-
def _load_model(self) -> None:
|
|
1065
|
-
"""Load sentence transformer model."""
|
|
1066
|
-
try:
|
|
1067
|
-
from sentence_transformers import SentenceTransformer
|
|
1068
|
-
|
|
1069
|
-
self._model = SentenceTransformer(self.model_name)
|
|
1070
|
-
except ImportError:
|
|
1071
|
-
logger.warning(
|
|
1072
|
-
"sentence-transformers not installed. Vector search disabled."
|
|
1073
|
-
)
|
|
1074
|
-
self._model = None
|
|
1075
|
-
|
|
1076
|
-
def _load_index(self) -> None:
|
|
1077
|
-
"""Load vector index from disk."""
|
|
1078
|
-
if self.index_path.exists():
|
|
1079
|
-
try:
|
|
1080
|
-
with open(self.index_path, "rb") as f:
|
|
1081
|
-
data = pickle.load(f)
|
|
1082
|
-
self._papers = data.get("papers", [])
|
|
1083
|
-
self._embeddings = data.get("embeddings")
|
|
1084
|
-
except Exception as e:
|
|
1085
|
-
logger.warning(f"Failed to load vector index: {e}")
|
|
1086
|
-
|
|
1087
|
-
def _save_index(self) -> None:
|
|
1088
|
-
"""Save vector index to disk."""
|
|
1089
|
-
self.index_path.parent.mkdir(parents=True, exist_ok=True)
|
|
1090
|
-
data = {"papers": self._papers, "embeddings": self._embeddings}
|
|
1091
|
-
with open(self.index_path, "wb") as f:
|
|
1092
|
-
pickle.dump(data, f)
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
class UnifiedSearcher:
|
|
1096
|
-
"""
|
|
1097
|
-
Unified searcher that combines results from multiple engines.
|
|
1098
|
-
"""
|
|
1099
|
-
|
|
1100
|
-
def __init__(
|
|
1101
|
-
self,
|
|
1102
|
-
config=None,
|
|
1103
|
-
email: Optional[str] = None,
|
|
1104
|
-
semantic_scholar_api_key: Optional[str] = None,
|
|
1105
|
-
crossref_api_key: Optional[str] = None,
|
|
1106
|
-
google_scholar_timeout: int = 10,
|
|
1107
|
-
):
|
|
1108
|
-
"""Initialize unified searcher with all engines."""
|
|
1109
|
-
|
|
1110
|
-
# Handle config parameter
|
|
1111
|
-
if config is not None:
|
|
1112
|
-
from scitex.scholar.config import ScholarConfig
|
|
1113
|
-
|
|
1114
|
-
if not isinstance(config, ScholarConfig):
|
|
1115
|
-
raise TypeError("config must be a ScholarConfig instance")
|
|
1116
|
-
self.config = config
|
|
1117
|
-
|
|
1118
|
-
# Use config resolution for parameters
|
|
1119
|
-
self.email = self.config.resolve(
|
|
1120
|
-
"pubmed_email", email, "research@example.com"
|
|
1121
|
-
)
|
|
1122
|
-
self.semantic_scholar_api_key = self.config.resolve(
|
|
1123
|
-
"semantic_scholar_api_key", semantic_scholar_api_key, None
|
|
1124
|
-
)
|
|
1125
|
-
self.crossref_api_key = self.config.resolve(
|
|
1126
|
-
"crossref_api_key", crossref_api_key, None
|
|
1127
|
-
)
|
|
1128
|
-
self.google_scholar_timeout = (
|
|
1129
|
-
google_scholar_timeout # No config key for this yet
|
|
1130
|
-
)
|
|
1131
|
-
else:
|
|
1132
|
-
# Fallback to direct parameters
|
|
1133
|
-
self.config = None
|
|
1134
|
-
self.email = email
|
|
1135
|
-
self.semantic_scholar_api_key = semantic_scholar_api_key
|
|
1136
|
-
self.crossref_api_key = crossref_api_key
|
|
1137
|
-
self.google_scholar_timeout = google_scholar_timeout
|
|
1138
|
-
|
|
1139
|
-
self._engines = {} # Lazy-loaded engines
|
|
1140
|
-
|
|
1141
|
-
@property
|
|
1142
|
-
def engines(self):
|
|
1143
|
-
"""Lazy-load engines as needed."""
|
|
1144
|
-
return self._engines
|
|
1145
|
-
|
|
1146
|
-
def _get_engine(self, source: str):
|
|
1147
|
-
"""Get or create engine for a source."""
|
|
1148
|
-
if source not in self._engines:
|
|
1149
|
-
if source == "semantic_scholar":
|
|
1150
|
-
self._engines[source] = SemanticScholarEngine(
|
|
1151
|
-
self.semantic_scholar_api_key
|
|
1152
|
-
)
|
|
1153
|
-
elif source == "pubmed":
|
|
1154
|
-
self._engines[source] = PubMedEngine(self.email)
|
|
1155
|
-
elif source == "arxiv":
|
|
1156
|
-
self._engines[source] = ArxivEngine()
|
|
1157
|
-
elif source == "google_scholar":
|
|
1158
|
-
self._engines[source] = GoogleScholarEngine(
|
|
1159
|
-
timeout=self.google_scholar_timeout
|
|
1160
|
-
)
|
|
1161
|
-
elif source == "crossref":
|
|
1162
|
-
self._engines[source] = CrossRefEngine(
|
|
1163
|
-
api_key=self.crossref_api_key, email=self.email
|
|
1164
|
-
)
|
|
1165
|
-
elif source == "local":
|
|
1166
|
-
self._engines[source] = LocalSearchEngine()
|
|
1167
|
-
elif source == "vector":
|
|
1168
|
-
self._engines[source] = VectorSearchEngine()
|
|
1169
|
-
else:
|
|
1170
|
-
raise ValueError(f"Unknown source: {source}")
|
|
1171
|
-
return self._engines[source]
|
|
1172
|
-
|
|
1173
|
-
async def search_async(
|
|
1174
|
-
self,
|
|
1175
|
-
query: str,
|
|
1176
|
-
sources: List[str] = None,
|
|
1177
|
-
limit: int = 20,
|
|
1178
|
-
deduplicate: bool = True,
|
|
1179
|
-
**kwargs,
|
|
1180
|
-
) -> List[Paper]:
|
|
1181
|
-
"""
|
|
1182
|
-
Search across multiple sources and merge results.
|
|
1183
|
-
|
|
1184
|
-
Args:
|
|
1185
|
-
query: Search query
|
|
1186
|
-
sources: List of sources to search (default: all web sources)
|
|
1187
|
-
limit: Maximum results per source
|
|
1188
|
-
deduplicate: Remove duplicate papers
|
|
1189
|
-
**kwargs: Additional parameters for engines
|
|
1190
|
-
|
|
1191
|
-
Returns:
|
|
1192
|
-
Merged and ranked list of papers
|
|
1193
|
-
"""
|
|
1194
|
-
if sources is None:
|
|
1195
|
-
sources = ["pubmed"] # Default to PubMed only
|
|
1196
|
-
|
|
1197
|
-
# Filter to valid sources
|
|
1198
|
-
valid_sources = [
|
|
1199
|
-
"pubmed",
|
|
1200
|
-
"semantic_scholar",
|
|
1201
|
-
"google_scholar",
|
|
1202
|
-
"crossref",
|
|
1203
|
-
"arxiv",
|
|
1204
|
-
"local",
|
|
1205
|
-
"vector",
|
|
1206
|
-
]
|
|
1207
|
-
sources = [s for s in sources if s in valid_sources]
|
|
1208
|
-
|
|
1209
|
-
if not sources:
|
|
1210
|
-
logger.warning("No valid search sources specified")
|
|
1211
|
-
return []
|
|
1212
|
-
|
|
1213
|
-
# Search all sources concurrently
|
|
1214
|
-
tasks = []
|
|
1215
|
-
for source in sources:
|
|
1216
|
-
try:
|
|
1217
|
-
engine = self._get_engine(source)
|
|
1218
|
-
task = engine.search_async(query, limit, **kwargs)
|
|
1219
|
-
tasks.append(task)
|
|
1220
|
-
except Exception as e:
|
|
1221
|
-
logger.debug(f"Failed to initialize {source} engine: {e}")
|
|
1222
|
-
|
|
1223
|
-
logger.debug(f"Searching {len(tasks)} sources: {sources}")
|
|
1224
|
-
results = await asyncio.gather(*tasks, return_exceptions=True)
|
|
1225
|
-
|
|
1226
|
-
# Merge results
|
|
1227
|
-
all_papers = []
|
|
1228
|
-
for source, result in zip(sources, results):
|
|
1229
|
-
if isinstance(result, Exception):
|
|
1230
|
-
logger.debug(f"Search failed for {source}: {result}")
|
|
1231
|
-
else:
|
|
1232
|
-
logger.debug(f"{source} returned {len(result)} papers")
|
|
1233
|
-
all_papers.extend(result)
|
|
1234
|
-
|
|
1235
|
-
# Deduplicate if requested
|
|
1236
|
-
if deduplicate:
|
|
1237
|
-
all_papers = self._deduplicate_papers(all_papers)
|
|
1238
|
-
|
|
1239
|
-
# Sort by relevance (using citation count as proxy)
|
|
1240
|
-
all_papers.sort(key=lambda p: p.citation_count or 0, reverse=True)
|
|
1241
|
-
|
|
1242
|
-
return all_papers[:limit]
|
|
1243
|
-
|
|
1244
|
-
def _deduplicate_papers(self, papers: List[Paper]) -> List[Paper]:
|
|
1245
|
-
"""Remove duplicate papers based on similarity."""
|
|
1246
|
-
if not papers:
|
|
1247
|
-
return []
|
|
1248
|
-
|
|
1249
|
-
unique_papers = [papers[0]]
|
|
1250
|
-
|
|
1251
|
-
for paper in papers[1:]:
|
|
1252
|
-
is_duplicate = False
|
|
1253
|
-
|
|
1254
|
-
for unique_paper in unique_papers:
|
|
1255
|
-
if paper.similarity_score(unique_paper) > 0.85:
|
|
1256
|
-
is_duplicate = True
|
|
1257
|
-
# Keep the one with more information
|
|
1258
|
-
if (paper.citation_count or 0) > (unique_paper.citation_count or 0):
|
|
1259
|
-
unique_papers.remove(unique_paper)
|
|
1260
|
-
unique_papers.append(paper)
|
|
1261
|
-
break
|
|
1262
|
-
|
|
1263
|
-
if not is_duplicate:
|
|
1264
|
-
unique_papers.append(paper)
|
|
1265
|
-
|
|
1266
|
-
return unique_papers
|
|
1267
|
-
|
|
1268
|
-
def build_local_index(self, pdf_dirs: List[Union[str, Path]]) -> Dict[str, Any]:
|
|
1269
|
-
"""Build local search index."""
|
|
1270
|
-
pdf_dirs = [Path(d) for d in pdf_dirs]
|
|
1271
|
-
return self.engines["local"].build_index(pdf_dirs)
|
|
1272
|
-
|
|
1273
|
-
def add_to_vector_index(self, papers: List[Paper]) -> None:
|
|
1274
|
-
"""Add papers to vector search index."""
|
|
1275
|
-
self.engines["vector"].add_papers(papers)
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
# Convenience functions - get_scholar_dir moved to utils._paths
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
async def search_async(
|
|
1282
|
-
query: str,
|
|
1283
|
-
sources: List[str] = None,
|
|
1284
|
-
limit: int = 20,
|
|
1285
|
-
email: Optional[str] = None,
|
|
1286
|
-
semantic_scholar_api_key: Optional[str] = None,
|
|
1287
|
-
**kwargs,
|
|
1288
|
-
) -> List[Paper]:
|
|
1289
|
-
"""
|
|
1290
|
-
Async convenience function for searching papers.
|
|
1291
|
-
"""
|
|
1292
|
-
searcher = UnifiedSearcher(
|
|
1293
|
-
email=email, semantic_scholar_api_key=semantic_scholar_api_key
|
|
1294
|
-
)
|
|
1295
|
-
return await searcher.search_async(query, sources, limit, **kwargs)
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
def search_sync(
|
|
1299
|
-
query: str,
|
|
1300
|
-
sources: List[str] = None,
|
|
1301
|
-
limit: int = 20,
|
|
1302
|
-
email: Optional[str] = None,
|
|
1303
|
-
semantic_scholar_api_key: Optional[str] = None,
|
|
1304
|
-
**kwargs,
|
|
1305
|
-
) -> List[Paper]:
|
|
1306
|
-
"""
|
|
1307
|
-
Synchronous convenience function for searching papers.
|
|
1308
|
-
"""
|
|
1309
|
-
return asyncio.run(
|
|
1310
|
-
search_async(query, sources, limit, email, semantic_scholar_api_key, **kwargs)
|
|
1311
|
-
)
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
def build_index(
|
|
1315
|
-
paths: List[Union[str, Path]], vector_index: bool = True
|
|
1316
|
-
) -> Dict[str, Any]:
|
|
1317
|
-
"""
|
|
1318
|
-
Build local search indices.
|
|
1319
|
-
|
|
1320
|
-
Args:
|
|
1321
|
-
paths: Directories containing PDFs
|
|
1322
|
-
vector_index: Also build vector similarity index
|
|
1323
|
-
|
|
1324
|
-
Returns:
|
|
1325
|
-
Statistics about indexing
|
|
1326
|
-
"""
|
|
1327
|
-
searcher = UnifiedSearcher()
|
|
1328
|
-
stats = searcher.build_local_index(paths)
|
|
1329
|
-
|
|
1330
|
-
if vector_index:
|
|
1331
|
-
# Add papers to vector index
|
|
1332
|
-
papers = searcher.engines["local"]._search_sync("*", 9999, {})
|
|
1333
|
-
if papers:
|
|
1334
|
-
searcher.add_to_vector_index(papers)
|
|
1335
|
-
stats["vector_indexed"] = len(papers)
|
|
1336
|
-
|
|
1337
|
-
return stats
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
# Export all classes and functions
|
|
1341
|
-
__all__ = [
|
|
1342
|
-
"SearchEngine",
|
|
1343
|
-
"SemanticScholarEngine",
|
|
1344
|
-
"PubMedEngine",
|
|
1345
|
-
"ArxivEngine",
|
|
1346
|
-
"LocalSearchEngine",
|
|
1347
|
-
"VectorSearchEngine",
|
|
1348
|
-
"UnifiedSearcher",
|
|
1349
|
-
"get_scholar_dir",
|
|
1350
|
-
"search",
|
|
1351
|
-
"search_sync",
|
|
1352
|
-
"build_index",
|
|
1353
|
-
]
|