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
|
@@ -0,0 +1,1478 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Timestamp: 2026-01-08
|
|
3
|
+
# File: src/scitex/scholar/_mcp.handlers.py
|
|
4
|
+
# ----------------------------------------
|
|
5
|
+
|
|
6
|
+
"""Handler implementations for the scitex-scholar MCP server."""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
import hashlib
|
|
12
|
+
import json
|
|
13
|
+
import os
|
|
14
|
+
from datetime import datetime
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"search_papers_handler",
|
|
19
|
+
"resolve_dois_handler",
|
|
20
|
+
"enrich_bibtex_handler",
|
|
21
|
+
"download_pdf_handler",
|
|
22
|
+
"download_pdfs_batch_handler",
|
|
23
|
+
"get_library_status_handler",
|
|
24
|
+
"parse_bibtex_handler",
|
|
25
|
+
"validate_pdfs_handler",
|
|
26
|
+
"resolve_openurls_handler",
|
|
27
|
+
"authenticate_handler",
|
|
28
|
+
"check_auth_status_handler",
|
|
29
|
+
"logout_handler",
|
|
30
|
+
"export_papers_handler",
|
|
31
|
+
"create_project_handler",
|
|
32
|
+
"list_projects_handler",
|
|
33
|
+
"add_papers_to_project_handler",
|
|
34
|
+
"parse_pdf_content_handler",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _get_scholar_dir() -> Path:
|
|
39
|
+
"""Get the scholar data directory."""
|
|
40
|
+
base_dir = Path(os.getenv("SCITEX_DIR", Path.home() / ".scitex"))
|
|
41
|
+
scholar_dir = base_dir / "scholar"
|
|
42
|
+
scholar_dir.mkdir(parents=True, exist_ok=True)
|
|
43
|
+
return scholar_dir
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _ensure_scholar():
|
|
47
|
+
"""Ensure Scholar module is available and return instance."""
|
|
48
|
+
try:
|
|
49
|
+
from scitex.scholar import Scholar
|
|
50
|
+
|
|
51
|
+
return Scholar()
|
|
52
|
+
except ImportError as e:
|
|
53
|
+
raise RuntimeError(f"Scholar module not available: {e}")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
async def search_papers_handler(
|
|
57
|
+
query: str,
|
|
58
|
+
sources: list[str] | None = None,
|
|
59
|
+
limit: int = 20,
|
|
60
|
+
year_min: int | None = None,
|
|
61
|
+
year_max: int | None = None,
|
|
62
|
+
search_mode: str = "local", # "local", "external", or "both"
|
|
63
|
+
) -> dict:
|
|
64
|
+
"""Search for scientific papers.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
query: Search query string
|
|
68
|
+
sources: Sources to search (crossref, semantic_scholar, pubmed, arxiv, openalex)
|
|
69
|
+
limit: Maximum number of results
|
|
70
|
+
year_min: Minimum publication year
|
|
71
|
+
year_max: Maximum publication year
|
|
72
|
+
search_mode: "local" (library only), "external" (online databases), or "both"
|
|
73
|
+
"""
|
|
74
|
+
try:
|
|
75
|
+
results = []
|
|
76
|
+
sources_used = []
|
|
77
|
+
|
|
78
|
+
# Local library search
|
|
79
|
+
if search_mode in ("local", "both"):
|
|
80
|
+
from scitex.scholar import Scholar
|
|
81
|
+
|
|
82
|
+
loop = asyncio.get_running_loop()
|
|
83
|
+
scholar = Scholar()
|
|
84
|
+
|
|
85
|
+
def do_local_search():
|
|
86
|
+
papers = scholar.search_across_projects(query)
|
|
87
|
+
filtered = []
|
|
88
|
+
for paper in papers:
|
|
89
|
+
paper_year = paper.metadata.basic.year
|
|
90
|
+
if year_min and paper_year and paper_year < year_min:
|
|
91
|
+
continue
|
|
92
|
+
if year_max and paper_year and paper_year > year_max:
|
|
93
|
+
continue
|
|
94
|
+
filtered.append(paper)
|
|
95
|
+
if len(filtered) >= limit:
|
|
96
|
+
break
|
|
97
|
+
return filtered
|
|
98
|
+
|
|
99
|
+
local_papers = await loop.run_in_executor(None, do_local_search)
|
|
100
|
+
|
|
101
|
+
for paper in local_papers:
|
|
102
|
+
results.append(
|
|
103
|
+
{
|
|
104
|
+
"title": paper.metadata.basic.title,
|
|
105
|
+
"authors": paper.metadata.basic.authors[:5]
|
|
106
|
+
if paper.metadata.basic.authors
|
|
107
|
+
else [],
|
|
108
|
+
"year": paper.metadata.basic.year,
|
|
109
|
+
"doi": paper.metadata.id.doi,
|
|
110
|
+
"journal": paper.metadata.publication.journal,
|
|
111
|
+
"abstract": (
|
|
112
|
+
paper.metadata.basic.abstract[:300] + "..."
|
|
113
|
+
if paper.metadata.basic.abstract
|
|
114
|
+
and len(paper.metadata.basic.abstract) > 300
|
|
115
|
+
else paper.metadata.basic.abstract
|
|
116
|
+
),
|
|
117
|
+
"citation_count": paper.metadata.citation_count.total,
|
|
118
|
+
"source": "local_library",
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
sources_used.append("local_library")
|
|
122
|
+
|
|
123
|
+
# External search via ScholarSearchEngine
|
|
124
|
+
if search_mode in ("external", "both"):
|
|
125
|
+
try:
|
|
126
|
+
from scitex.scholar.search_engines.ScholarSearchEngine import (
|
|
127
|
+
ScholarSearchEngine,
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
engine = ScholarSearchEngine(default_mode="parallel")
|
|
131
|
+
|
|
132
|
+
# Build filters
|
|
133
|
+
filters = {}
|
|
134
|
+
if year_min:
|
|
135
|
+
filters["year_start"] = year_min
|
|
136
|
+
if year_max:
|
|
137
|
+
filters["year_end"] = year_max
|
|
138
|
+
|
|
139
|
+
# Execute external search
|
|
140
|
+
external_result = await engine.search(
|
|
141
|
+
query=query,
|
|
142
|
+
filters=filters,
|
|
143
|
+
max_results=limit,
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
# Process external results
|
|
147
|
+
for paper in external_result.get("results", []):
|
|
148
|
+
# Avoid duplicates by DOI
|
|
149
|
+
doi = paper.get("doi")
|
|
150
|
+
if doi and any(r.get("doi") == doi for r in results):
|
|
151
|
+
continue
|
|
152
|
+
|
|
153
|
+
results.append(
|
|
154
|
+
{
|
|
155
|
+
"title": paper.get("title"),
|
|
156
|
+
"authors": paper.get("authors", [])[:5],
|
|
157
|
+
"year": paper.get("year"),
|
|
158
|
+
"doi": doi,
|
|
159
|
+
"journal": paper.get("journal"),
|
|
160
|
+
"abstract": (
|
|
161
|
+
paper.get("abstract", "")[:300] + "..."
|
|
162
|
+
if paper.get("abstract")
|
|
163
|
+
and len(paper.get("abstract", "")) > 300
|
|
164
|
+
else paper.get("abstract")
|
|
165
|
+
),
|
|
166
|
+
"citation_count": paper.get("citation_count"),
|
|
167
|
+
"source": paper.get("source", "external"),
|
|
168
|
+
}
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
# Add sources used
|
|
172
|
+
sources_used.extend(engine.get_supported_engines())
|
|
173
|
+
|
|
174
|
+
except Exception as e:
|
|
175
|
+
# If external search fails, log but continue with local results
|
|
176
|
+
if search_mode == "external":
|
|
177
|
+
return {"success": False, "error": f"External search failed: {e}"}
|
|
178
|
+
|
|
179
|
+
return {
|
|
180
|
+
"success": True,
|
|
181
|
+
"count": len(results),
|
|
182
|
+
"query": query,
|
|
183
|
+
"search_mode": search_mode,
|
|
184
|
+
"sources_used": sources_used,
|
|
185
|
+
"papers": results[:limit],
|
|
186
|
+
"timestamp": datetime.now().isoformat(),
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
except Exception as e:
|
|
190
|
+
return {"success": False, "error": str(e)}
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
async def resolve_dois_handler(
|
|
194
|
+
bibtex_path: str | None = None,
|
|
195
|
+
titles: list[str] | None = None,
|
|
196
|
+
resume: bool = True,
|
|
197
|
+
project: str | None = None,
|
|
198
|
+
) -> dict:
|
|
199
|
+
"""Resolve DOIs from paper titles using process_paper.
|
|
200
|
+
|
|
201
|
+
Uses Scholar.process_paper_async which resolves DOIs via Crossref API.
|
|
202
|
+
"""
|
|
203
|
+
try:
|
|
204
|
+
from scitex.scholar import Scholar
|
|
205
|
+
|
|
206
|
+
scholar = Scholar(project=project) if project else Scholar()
|
|
207
|
+
resolved = []
|
|
208
|
+
failed = []
|
|
209
|
+
|
|
210
|
+
if bibtex_path:
|
|
211
|
+
# Load papers from BibTeX and resolve DOIs
|
|
212
|
+
papers = scholar.load_bibtex(bibtex_path)
|
|
213
|
+
|
|
214
|
+
for paper in papers:
|
|
215
|
+
title = paper.metadata.basic.title
|
|
216
|
+
doi = paper.metadata.id.doi
|
|
217
|
+
|
|
218
|
+
if doi:
|
|
219
|
+
# Already has DOI
|
|
220
|
+
resolved.append({"title": title, "doi": doi, "source": "existing"})
|
|
221
|
+
elif title:
|
|
222
|
+
# Try to resolve DOI using process_paper
|
|
223
|
+
try:
|
|
224
|
+
processed = await scholar.process_paper_async(title=title)
|
|
225
|
+
if processed and processed.metadata.id.doi:
|
|
226
|
+
resolved.append(
|
|
227
|
+
{
|
|
228
|
+
"title": title,
|
|
229
|
+
"doi": processed.metadata.id.doi,
|
|
230
|
+
"source": "crossref",
|
|
231
|
+
}
|
|
232
|
+
)
|
|
233
|
+
else:
|
|
234
|
+
failed.append({"title": title, "reason": "No DOI found"})
|
|
235
|
+
except Exception as e:
|
|
236
|
+
failed.append({"title": title, "reason": str(e)})
|
|
237
|
+
else:
|
|
238
|
+
failed.append({"title": "(no title)", "reason": "Missing title"})
|
|
239
|
+
|
|
240
|
+
total = len(papers)
|
|
241
|
+
|
|
242
|
+
elif titles:
|
|
243
|
+
for title in titles:
|
|
244
|
+
try:
|
|
245
|
+
processed = await scholar.process_paper_async(title=title)
|
|
246
|
+
if processed and processed.metadata.id.doi:
|
|
247
|
+
resolved.append(
|
|
248
|
+
{
|
|
249
|
+
"title": title,
|
|
250
|
+
"doi": processed.metadata.id.doi,
|
|
251
|
+
"source": "crossref",
|
|
252
|
+
}
|
|
253
|
+
)
|
|
254
|
+
else:
|
|
255
|
+
failed.append({"title": title, "reason": "No DOI found"})
|
|
256
|
+
except Exception as e:
|
|
257
|
+
failed.append({"title": title, "reason": str(e)})
|
|
258
|
+
|
|
259
|
+
total = len(titles)
|
|
260
|
+
|
|
261
|
+
else:
|
|
262
|
+
return {
|
|
263
|
+
"success": False,
|
|
264
|
+
"error": "Either bibtex_path or titles required",
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return {
|
|
268
|
+
"success": True,
|
|
269
|
+
"resolved": resolved,
|
|
270
|
+
"failed": failed,
|
|
271
|
+
"total": total,
|
|
272
|
+
"resolved_count": len(resolved),
|
|
273
|
+
"failed_count": len(failed),
|
|
274
|
+
"timestamp": datetime.now().isoformat(),
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
except Exception as e:
|
|
278
|
+
return {"success": False, "error": str(e)}
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
async def enrich_bibtex_handler(
|
|
282
|
+
bibtex_path: str,
|
|
283
|
+
output_path: str | None = None,
|
|
284
|
+
add_abstracts: bool = True,
|
|
285
|
+
add_citations: bool = True,
|
|
286
|
+
add_impact_factors: bool = True,
|
|
287
|
+
) -> dict:
|
|
288
|
+
"""Enrich BibTeX entries with metadata using Scholar.enrich_papers().
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
bibtex_path: Path to BibTeX file to enrich
|
|
292
|
+
output_path: Output path for enriched BibTeX (auto-generated if None)
|
|
293
|
+
add_abstracts: Whether to add abstracts
|
|
294
|
+
add_citations: Whether to add citation counts
|
|
295
|
+
add_impact_factors: Whether to add journal impact factors
|
|
296
|
+
"""
|
|
297
|
+
try:
|
|
298
|
+
from scitex.scholar import Scholar
|
|
299
|
+
|
|
300
|
+
loop = asyncio.get_running_loop()
|
|
301
|
+
scholar = Scholar()
|
|
302
|
+
|
|
303
|
+
def do_enrich():
|
|
304
|
+
# Load papers from BibTeX
|
|
305
|
+
papers = scholar.load_bibtex(bibtex_path)
|
|
306
|
+
|
|
307
|
+
# Count papers before enrichment
|
|
308
|
+
before_stats = {
|
|
309
|
+
"with_abstract": sum(1 for p in papers if p.metadata.basic.abstract),
|
|
310
|
+
"with_citations": sum(
|
|
311
|
+
1 for p in papers if p.metadata.citation_count.total
|
|
312
|
+
),
|
|
313
|
+
"with_impact_factor": sum(
|
|
314
|
+
1 for p in papers if p.metadata.publication.impact_factor
|
|
315
|
+
),
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
# Use scholar's enrich_papers method (correct API)
|
|
319
|
+
enriched_papers = scholar.enrich_papers(papers)
|
|
320
|
+
|
|
321
|
+
# Save to output using correct API
|
|
322
|
+
out_path = output_path or bibtex_path.replace(".bib", "-enriched.bib")
|
|
323
|
+
scholar.save_papers_as_bibtex(enriched_papers, out_path)
|
|
324
|
+
|
|
325
|
+
# Count papers after enrichment
|
|
326
|
+
summary = {
|
|
327
|
+
"total": len(enriched_papers),
|
|
328
|
+
"with_doi": sum(1 for p in enriched_papers if p.metadata.id.doi),
|
|
329
|
+
"with_abstract": sum(
|
|
330
|
+
1 for p in enriched_papers if p.metadata.basic.abstract
|
|
331
|
+
),
|
|
332
|
+
"with_citations": sum(
|
|
333
|
+
1 for p in enriched_papers if p.metadata.citation_count.total
|
|
334
|
+
),
|
|
335
|
+
"with_impact_factor": sum(
|
|
336
|
+
1 for p in enriched_papers if p.metadata.publication.impact_factor
|
|
337
|
+
),
|
|
338
|
+
"enriched": {
|
|
339
|
+
"abstracts_added": sum(
|
|
340
|
+
1 for p in enriched_papers if p.metadata.basic.abstract
|
|
341
|
+
)
|
|
342
|
+
- before_stats["with_abstract"],
|
|
343
|
+
"citations_added": sum(
|
|
344
|
+
1 for p in enriched_papers if p.metadata.citation_count.total
|
|
345
|
+
)
|
|
346
|
+
- before_stats["with_citations"],
|
|
347
|
+
"impact_factors_added": sum(
|
|
348
|
+
1
|
|
349
|
+
for p in enriched_papers
|
|
350
|
+
if p.metadata.publication.impact_factor
|
|
351
|
+
)
|
|
352
|
+
- before_stats["with_impact_factor"],
|
|
353
|
+
},
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
return {"output_path": out_path, "summary": summary}
|
|
357
|
+
|
|
358
|
+
result = await loop.run_in_executor(None, do_enrich)
|
|
359
|
+
|
|
360
|
+
return {
|
|
361
|
+
"success": True,
|
|
362
|
+
**result,
|
|
363
|
+
"timestamp": datetime.now().isoformat(),
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
except Exception as e:
|
|
367
|
+
return {"success": False, "error": str(e)}
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
async def download_pdf_handler(
|
|
371
|
+
doi: str,
|
|
372
|
+
output_dir: str = "./pdfs",
|
|
373
|
+
auth_method: str = "none",
|
|
374
|
+
) -> dict:
|
|
375
|
+
"""Download a PDF using authenticated browser.
|
|
376
|
+
|
|
377
|
+
Delegates to ScholarPipelineSingle which has proper AuthenticationGateway
|
|
378
|
+
support for institutional access to paywalled content.
|
|
379
|
+
|
|
380
|
+
Args:
|
|
381
|
+
doi: DOI of the paper to download
|
|
382
|
+
output_dir: Output directory (stored in library by default)
|
|
383
|
+
auth_method: Authentication method ("none", "openathens", "shibboleth")
|
|
384
|
+
"""
|
|
385
|
+
try:
|
|
386
|
+
import hashlib
|
|
387
|
+
|
|
388
|
+
from scitex.scholar.pipelines import ScholarPipelineSingle
|
|
389
|
+
|
|
390
|
+
# Use ScholarPipelineSingle - same as CLI, has AuthenticationGateway
|
|
391
|
+
pipeline = ScholarPipelineSingle(
|
|
392
|
+
browser_mode="stealth",
|
|
393
|
+
chrome_profile="system",
|
|
394
|
+
)
|
|
395
|
+
|
|
396
|
+
# Process paper through full pipeline with authentication
|
|
397
|
+
# Returns (paper, symlink_path) tuple
|
|
398
|
+
paper, _symlink_path = await pipeline.process_single_paper(
|
|
399
|
+
doi_or_title=doi,
|
|
400
|
+
project=None,
|
|
401
|
+
force=False,
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
# Compute paper ID from DOI (same algorithm as pipeline)
|
|
405
|
+
paper_id = hashlib.md5(f"DOI:{doi}".encode()).hexdigest()[:8].upper()
|
|
406
|
+
|
|
407
|
+
# Construct PDF path directly from library structure
|
|
408
|
+
library_dir = _get_scholar_dir() / "library" / "MASTER"
|
|
409
|
+
paper_dir = library_dir / paper_id
|
|
410
|
+
|
|
411
|
+
# Find PDF file in paper directory
|
|
412
|
+
pdf_path = None
|
|
413
|
+
if paper_dir and paper_dir.exists():
|
|
414
|
+
for pdf_file in paper_dir.glob("*.pdf"):
|
|
415
|
+
pdf_path = pdf_file
|
|
416
|
+
break
|
|
417
|
+
|
|
418
|
+
if pdf_path and pdf_path.exists():
|
|
419
|
+
return {
|
|
420
|
+
"success": True,
|
|
421
|
+
"doi": doi,
|
|
422
|
+
"path": str(pdf_path),
|
|
423
|
+
"paper_id": paper_id,
|
|
424
|
+
"title": paper.metadata.basic.title,
|
|
425
|
+
"timestamp": datetime.now().isoformat(),
|
|
426
|
+
}
|
|
427
|
+
else:
|
|
428
|
+
return {
|
|
429
|
+
"success": False,
|
|
430
|
+
"doi": doi,
|
|
431
|
+
"error": "PDF not downloaded (may require manual access)",
|
|
432
|
+
"paper_id": paper_id,
|
|
433
|
+
"title": paper.metadata.basic.title,
|
|
434
|
+
"pdf_urls_found": paper.metadata.url.pdfs or [],
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
except Exception as e:
|
|
438
|
+
return {"success": False, "doi": doi, "error": str(e)}
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
async def download_pdfs_batch_handler(
|
|
442
|
+
dois: list[str] | None = None,
|
|
443
|
+
bibtex_path: str | None = None,
|
|
444
|
+
project: str | None = None,
|
|
445
|
+
output_dir: str | None = None,
|
|
446
|
+
max_concurrent: int = 3,
|
|
447
|
+
resume: bool = True,
|
|
448
|
+
) -> dict:
|
|
449
|
+
"""Download PDFs for multiple papers using ScholarPipelineParallel.
|
|
450
|
+
|
|
451
|
+
Delegates to ScholarPipelineParallel which has proper AuthenticationGateway
|
|
452
|
+
support for institutional access to paywalled content.
|
|
453
|
+
"""
|
|
454
|
+
try:
|
|
455
|
+
from scitex.scholar import Scholar
|
|
456
|
+
from scitex.scholar.pipelines import ScholarPipelineParallel
|
|
457
|
+
|
|
458
|
+
# Collect DOIs
|
|
459
|
+
doi_list = []
|
|
460
|
+
skipped = []
|
|
461
|
+
|
|
462
|
+
if bibtex_path:
|
|
463
|
+
scholar = Scholar()
|
|
464
|
+
papers = scholar.load_bibtex(bibtex_path)
|
|
465
|
+
for paper in papers:
|
|
466
|
+
if paper.metadata.id.doi:
|
|
467
|
+
doi_list.append(paper.metadata.id.doi)
|
|
468
|
+
else:
|
|
469
|
+
skipped.append(
|
|
470
|
+
{
|
|
471
|
+
"title": paper.metadata.basic.title or "(no title)",
|
|
472
|
+
"reason": "No DOI",
|
|
473
|
+
}
|
|
474
|
+
)
|
|
475
|
+
elif dois:
|
|
476
|
+
doi_list = dois
|
|
477
|
+
else:
|
|
478
|
+
return {
|
|
479
|
+
"success": False,
|
|
480
|
+
"error": "Either dois or bibtex_path required",
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
if not doi_list:
|
|
484
|
+
return {
|
|
485
|
+
"success": True,
|
|
486
|
+
"total_dois": 0,
|
|
487
|
+
"downloaded": [],
|
|
488
|
+
"downloaded_count": 0,
|
|
489
|
+
"failed": [],
|
|
490
|
+
"failed_count": 0,
|
|
491
|
+
"skipped": skipped,
|
|
492
|
+
"skipped_count": len(skipped),
|
|
493
|
+
"timestamp": datetime.now().isoformat(),
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
# Use ScholarPipelineParallel - same as CLI, has AuthenticationGateway
|
|
497
|
+
pipeline = ScholarPipelineParallel(
|
|
498
|
+
num_workers=max_concurrent,
|
|
499
|
+
browser_mode="stealth",
|
|
500
|
+
base_chrome_profile="system",
|
|
501
|
+
)
|
|
502
|
+
|
|
503
|
+
# Process papers through parallel pipeline with authentication
|
|
504
|
+
papers = await pipeline.process_papers_from_list_async(
|
|
505
|
+
doi_or_title_list=doi_list,
|
|
506
|
+
project=project,
|
|
507
|
+
)
|
|
508
|
+
|
|
509
|
+
# Collect results
|
|
510
|
+
downloaded = []
|
|
511
|
+
failed = []
|
|
512
|
+
processed_dois = set()
|
|
513
|
+
library_dir = _get_scholar_dir() / "library" / "MASTER"
|
|
514
|
+
|
|
515
|
+
for paper in papers:
|
|
516
|
+
if paper is None:
|
|
517
|
+
continue
|
|
518
|
+
|
|
519
|
+
doi = paper.metadata.id.doi
|
|
520
|
+
processed_dois.add(doi)
|
|
521
|
+
|
|
522
|
+
# Compute paper ID from DOI (same algorithm as pipeline)
|
|
523
|
+
paper_id = hashlib.md5(f"DOI:{doi}".encode()).hexdigest()[:8].upper()
|
|
524
|
+
paper_dir = library_dir / paper_id
|
|
525
|
+
|
|
526
|
+
# Find PDF file in paper directory
|
|
527
|
+
pdf_path = None
|
|
528
|
+
if paper_dir and paper_dir.exists():
|
|
529
|
+
for pdf_file in paper_dir.glob("*.pdf"):
|
|
530
|
+
pdf_path = pdf_file
|
|
531
|
+
break
|
|
532
|
+
|
|
533
|
+
if pdf_path and pdf_path.exists():
|
|
534
|
+
downloaded.append(
|
|
535
|
+
{
|
|
536
|
+
"doi": doi,
|
|
537
|
+
"path": str(pdf_path),
|
|
538
|
+
"paper_id": paper_id,
|
|
539
|
+
"title": paper.metadata.basic.title,
|
|
540
|
+
}
|
|
541
|
+
)
|
|
542
|
+
else:
|
|
543
|
+
failed.append(
|
|
544
|
+
{
|
|
545
|
+
"doi": doi,
|
|
546
|
+
"reason": "PDF not downloaded",
|
|
547
|
+
"paper_id": paper_id,
|
|
548
|
+
}
|
|
549
|
+
)
|
|
550
|
+
|
|
551
|
+
# Add DOIs that weren't processed at all
|
|
552
|
+
for doi in doi_list:
|
|
553
|
+
if doi not in processed_dois:
|
|
554
|
+
failed.append({"doi": doi, "reason": "Processing failed"})
|
|
555
|
+
|
|
556
|
+
return {
|
|
557
|
+
"success": True,
|
|
558
|
+
"total_dois": len(doi_list),
|
|
559
|
+
"downloaded": downloaded,
|
|
560
|
+
"downloaded_count": len(downloaded),
|
|
561
|
+
"failed": failed,
|
|
562
|
+
"failed_count": len(failed),
|
|
563
|
+
"skipped": skipped,
|
|
564
|
+
"skipped_count": len(skipped),
|
|
565
|
+
"timestamp": datetime.now().isoformat(),
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
except Exception as e:
|
|
569
|
+
return {"success": False, "error": str(e)}
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
async def get_library_status_handler(
|
|
573
|
+
project: str | None = None,
|
|
574
|
+
include_details: bool = False,
|
|
575
|
+
) -> dict:
|
|
576
|
+
"""Get library status."""
|
|
577
|
+
try:
|
|
578
|
+
library_dir = _get_scholar_dir() / "library"
|
|
579
|
+
|
|
580
|
+
if project:
|
|
581
|
+
project_dir = library_dir / project
|
|
582
|
+
else:
|
|
583
|
+
project_dir = library_dir
|
|
584
|
+
|
|
585
|
+
if not project_dir.exists():
|
|
586
|
+
return {
|
|
587
|
+
"success": True,
|
|
588
|
+
"exists": False,
|
|
589
|
+
"message": f"Library directory not found: {project_dir}",
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
# Count PDFs
|
|
593
|
+
pdf_files = list(project_dir.rglob("*.pdf"))
|
|
594
|
+
metadata_files = list(project_dir.rglob("metadata.json"))
|
|
595
|
+
|
|
596
|
+
status = {
|
|
597
|
+
"success": True,
|
|
598
|
+
"exists": True,
|
|
599
|
+
"path": str(project_dir),
|
|
600
|
+
"pdf_count": len(pdf_files),
|
|
601
|
+
"entry_count": len(metadata_files),
|
|
602
|
+
"timestamp": datetime.now().isoformat(),
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
if include_details:
|
|
606
|
+
entries = []
|
|
607
|
+
for meta_file in metadata_files[:50]: # Limit to 50 for performance
|
|
608
|
+
try:
|
|
609
|
+
with open(meta_file) as f:
|
|
610
|
+
meta = json.load(f)
|
|
611
|
+
pdf_exists = any(
|
|
612
|
+
(meta_file.parent / f).exists()
|
|
613
|
+
for f in meta_file.parent.glob("*.pdf")
|
|
614
|
+
)
|
|
615
|
+
entries.append(
|
|
616
|
+
{
|
|
617
|
+
"id": meta_file.parent.name,
|
|
618
|
+
"title": meta.get("title", "Unknown"),
|
|
619
|
+
"doi": meta.get("doi"),
|
|
620
|
+
"has_pdf": pdf_exists,
|
|
621
|
+
}
|
|
622
|
+
)
|
|
623
|
+
except Exception:
|
|
624
|
+
pass
|
|
625
|
+
|
|
626
|
+
status["entries"] = entries
|
|
627
|
+
|
|
628
|
+
return status
|
|
629
|
+
|
|
630
|
+
except Exception as e:
|
|
631
|
+
return {"success": False, "error": str(e)}
|
|
632
|
+
|
|
633
|
+
|
|
634
|
+
async def parse_bibtex_handler(bibtex_path: str) -> dict:
|
|
635
|
+
"""Parse a BibTeX file."""
|
|
636
|
+
try:
|
|
637
|
+
from scitex.scholar import Scholar
|
|
638
|
+
|
|
639
|
+
loop = asyncio.get_running_loop()
|
|
640
|
+
scholar = Scholar()
|
|
641
|
+
|
|
642
|
+
def do_parse():
|
|
643
|
+
papers = scholar.load_bibtex(bibtex_path)
|
|
644
|
+
return papers
|
|
645
|
+
|
|
646
|
+
papers = await loop.run_in_executor(None, do_parse)
|
|
647
|
+
|
|
648
|
+
results = []
|
|
649
|
+
for paper in papers:
|
|
650
|
+
authors = paper.metadata.basic.authors or []
|
|
651
|
+
results.append(
|
|
652
|
+
{
|
|
653
|
+
"title": paper.metadata.basic.title,
|
|
654
|
+
"authors": authors[:5] if authors else [],
|
|
655
|
+
"year": paper.metadata.basic.year,
|
|
656
|
+
"doi": paper.metadata.id.doi,
|
|
657
|
+
"journal": paper.metadata.publication.journal,
|
|
658
|
+
"bibtex_key": getattr(paper, "bibtex_key", None),
|
|
659
|
+
}
|
|
660
|
+
)
|
|
661
|
+
|
|
662
|
+
return {
|
|
663
|
+
"success": True,
|
|
664
|
+
"count": len(results),
|
|
665
|
+
"path": bibtex_path,
|
|
666
|
+
"papers": results,
|
|
667
|
+
"timestamp": datetime.now().isoformat(),
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
except Exception as e:
|
|
671
|
+
return {"success": False, "error": str(e)}
|
|
672
|
+
|
|
673
|
+
|
|
674
|
+
async def validate_pdfs_handler(
|
|
675
|
+
project: str | None = None,
|
|
676
|
+
pdf_paths: list[str] | None = None,
|
|
677
|
+
) -> dict:
|
|
678
|
+
"""Validate PDF files."""
|
|
679
|
+
try:
|
|
680
|
+
from PyPDF2 import PdfReader
|
|
681
|
+
|
|
682
|
+
if pdf_paths:
|
|
683
|
+
paths = [Path(p) for p in pdf_paths]
|
|
684
|
+
elif project:
|
|
685
|
+
library_dir = _get_scholar_dir() / "library" / project
|
|
686
|
+
paths = list(library_dir.rglob("*.pdf"))
|
|
687
|
+
else:
|
|
688
|
+
library_dir = _get_scholar_dir() / "library"
|
|
689
|
+
paths = list(library_dir.rglob("*.pdf"))
|
|
690
|
+
|
|
691
|
+
results = {
|
|
692
|
+
"total": len(paths),
|
|
693
|
+
"valid": [],
|
|
694
|
+
"invalid": [],
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
for pdf_path in paths:
|
|
698
|
+
try:
|
|
699
|
+
reader = PdfReader(str(pdf_path))
|
|
700
|
+
page_count = len(reader.pages)
|
|
701
|
+
|
|
702
|
+
# Check if it has text content
|
|
703
|
+
has_text = False
|
|
704
|
+
if page_count > 0:
|
|
705
|
+
text = reader.pages[0].extract_text()
|
|
706
|
+
has_text = bool(text and len(text.strip()) > 100)
|
|
707
|
+
|
|
708
|
+
results["valid"].append(
|
|
709
|
+
{
|
|
710
|
+
"path": str(pdf_path),
|
|
711
|
+
"pages": page_count,
|
|
712
|
+
"has_text": has_text,
|
|
713
|
+
"size_kb": round(pdf_path.stat().st_size / 1024, 2),
|
|
714
|
+
}
|
|
715
|
+
)
|
|
716
|
+
except Exception as e:
|
|
717
|
+
results["invalid"].append(
|
|
718
|
+
{
|
|
719
|
+
"path": str(pdf_path),
|
|
720
|
+
"error": str(e),
|
|
721
|
+
}
|
|
722
|
+
)
|
|
723
|
+
|
|
724
|
+
return {
|
|
725
|
+
"success": True,
|
|
726
|
+
**results,
|
|
727
|
+
"valid_count": len(results["valid"]),
|
|
728
|
+
"invalid_count": len(results["invalid"]),
|
|
729
|
+
"timestamp": datetime.now().isoformat(),
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
except ImportError:
|
|
733
|
+
return {"success": False, "error": "PyPDF2 not installed"}
|
|
734
|
+
except Exception as e:
|
|
735
|
+
return {"success": False, "error": str(e)}
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
async def resolve_openurls_handler(
|
|
739
|
+
dois: list[str],
|
|
740
|
+
resolver_url: str | None = None,
|
|
741
|
+
resume: bool = True,
|
|
742
|
+
) -> dict:
|
|
743
|
+
"""Resolve OpenURLs for DOIs using OpenURLResolver with browser automation.
|
|
744
|
+
|
|
745
|
+
This uses the institutional OpenURL resolver to get access URLs for papers.
|
|
746
|
+
Requires browser context for navigation.
|
|
747
|
+
|
|
748
|
+
Args:
|
|
749
|
+
dois: List of DOIs to resolve
|
|
750
|
+
resolver_url: Custom OpenURL resolver URL (uses config default if None)
|
|
751
|
+
resume: Whether to skip already resolved DOIs
|
|
752
|
+
"""
|
|
753
|
+
try:
|
|
754
|
+
from scitex.scholar.auth import ScholarAuthManager
|
|
755
|
+
from scitex.scholar.auth.gateway import OpenURLResolver
|
|
756
|
+
from scitex.scholar.browser import ScholarBrowserManager
|
|
757
|
+
from scitex.scholar.config import ScholarConfig
|
|
758
|
+
|
|
759
|
+
config = ScholarConfig.load()
|
|
760
|
+
auth_manager = ScholarAuthManager()
|
|
761
|
+
browser_manager = ScholarBrowserManager(
|
|
762
|
+
auth_manager=auth_manager,
|
|
763
|
+
chrome_profile_name="system",
|
|
764
|
+
browser_mode="stealth",
|
|
765
|
+
)
|
|
766
|
+
|
|
767
|
+
results = {
|
|
768
|
+
"resolved": [],
|
|
769
|
+
"failed": [],
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
try:
|
|
773
|
+
# Get authenticated browser context
|
|
774
|
+
(
|
|
775
|
+
browser,
|
|
776
|
+
context,
|
|
777
|
+
) = await browser_manager.get_authenticated_browser_and_context_async()
|
|
778
|
+
|
|
779
|
+
# Create OpenURL resolver
|
|
780
|
+
openurl_resolver = OpenURLResolver(config=config)
|
|
781
|
+
|
|
782
|
+
# Create a page for resolution
|
|
783
|
+
page = await context.new_page()
|
|
784
|
+
|
|
785
|
+
try:
|
|
786
|
+
for doi in dois:
|
|
787
|
+
try:
|
|
788
|
+
# Resolve OpenURL for this DOI using browser
|
|
789
|
+
resolved_url = await openurl_resolver.resolve_doi(doi, page)
|
|
790
|
+
if resolved_url and resolved_url != "skipped":
|
|
791
|
+
results["resolved"].append(
|
|
792
|
+
{"doi": doi, "url": resolved_url}
|
|
793
|
+
)
|
|
794
|
+
else:
|
|
795
|
+
results["failed"].append(
|
|
796
|
+
{"doi": doi, "reason": "No URL resolved"}
|
|
797
|
+
)
|
|
798
|
+
except Exception as e:
|
|
799
|
+
results["failed"].append({"doi": doi, "reason": str(e)})
|
|
800
|
+
finally:
|
|
801
|
+
await page.close()
|
|
802
|
+
|
|
803
|
+
finally:
|
|
804
|
+
await browser_manager.close()
|
|
805
|
+
|
|
806
|
+
return {
|
|
807
|
+
"success": True,
|
|
808
|
+
**results,
|
|
809
|
+
"total": len(dois),
|
|
810
|
+
"resolved_count": len(results["resolved"]),
|
|
811
|
+
"failed_count": len(results["failed"]),
|
|
812
|
+
"timestamp": datetime.now().isoformat(),
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
except Exception as e:
|
|
816
|
+
return {"success": False, "error": str(e)}
|
|
817
|
+
|
|
818
|
+
|
|
819
|
+
async def authenticate_handler(
|
|
820
|
+
method: str,
|
|
821
|
+
institution: str | None = None,
|
|
822
|
+
force: bool = False,
|
|
823
|
+
confirm: bool = False,
|
|
824
|
+
) -> dict:
|
|
825
|
+
"""Authenticate with institutional access (OpenAthens, Shibboleth).
|
|
826
|
+
|
|
827
|
+
This opens a browser window for SSO login. The process:
|
|
828
|
+
1. Opens browser to authentication provider
|
|
829
|
+
2. Automates login if credentials are configured
|
|
830
|
+
3. Waits for 2FA approval if required
|
|
831
|
+
4. Stores session cookies for future use
|
|
832
|
+
|
|
833
|
+
Args:
|
|
834
|
+
method: Authentication method ("openathens" or "shibboleth")
|
|
835
|
+
institution: Institution identifier (e.g., "unimelb")
|
|
836
|
+
force: Force re-authentication even if session exists
|
|
837
|
+
confirm: Set to True to proceed with authentication after reviewing requirements
|
|
838
|
+
"""
|
|
839
|
+
try:
|
|
840
|
+
# Get email from environment based on method
|
|
841
|
+
email_env_map = {
|
|
842
|
+
"openathens": "SCITEX_SCHOLAR_OPENATHENS_EMAIL",
|
|
843
|
+
"shibboleth": "SCITEX_SCHOLAR_SHIBBOLETH_EMAIL",
|
|
844
|
+
"ezproxy": "SCITEX_SCHOLAR_EZPROXY_EMAIL",
|
|
845
|
+
}
|
|
846
|
+
sso_env_vars = ["UNIMELB_SSO_USERNAME", "UNIMELB_SSO_PASSWORD"]
|
|
847
|
+
|
|
848
|
+
email_var = email_env_map.get(method)
|
|
849
|
+
email = os.getenv(email_var) if email_var else None
|
|
850
|
+
|
|
851
|
+
# Check environment variables
|
|
852
|
+
env_status = {
|
|
853
|
+
"email_configured": bool(email),
|
|
854
|
+
"email_var": email_var,
|
|
855
|
+
"email": email if email else None,
|
|
856
|
+
"sso_username_set": bool(os.getenv("UNIMELB_SSO_USERNAME")),
|
|
857
|
+
"sso_password_set": bool(os.getenv("UNIMELB_SSO_PASSWORD")),
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
# If confirm=False, return requirements check (don't start login yet)
|
|
861
|
+
if not confirm:
|
|
862
|
+
requirements_met = email is not None
|
|
863
|
+
|
|
864
|
+
return {
|
|
865
|
+
"success": True,
|
|
866
|
+
"status": "awaiting_confirmation",
|
|
867
|
+
"method": method,
|
|
868
|
+
"message": "Please review requirements before starting SSO login",
|
|
869
|
+
"requirements": {
|
|
870
|
+
"email_configured": env_status["email_configured"],
|
|
871
|
+
"email": env_status["email"],
|
|
872
|
+
"sso_automation_available": (
|
|
873
|
+
env_status["sso_username_set"]
|
|
874
|
+
and env_status["sso_password_set"]
|
|
875
|
+
),
|
|
876
|
+
},
|
|
877
|
+
"warnings": []
|
|
878
|
+
if requirements_met
|
|
879
|
+
else [f"Environment variable {email_var} is NOT set"],
|
|
880
|
+
"instructions": [
|
|
881
|
+
"A browser window will open for SSO login",
|
|
882
|
+
"If SSO credentials are set, login will be automated",
|
|
883
|
+
"You may need to approve 2FA on your device",
|
|
884
|
+
"Do NOT close the browser until authentication completes",
|
|
885
|
+
],
|
|
886
|
+
"next_step": (
|
|
887
|
+
f"Call authenticate(method='{method}', confirm=True) to proceed"
|
|
888
|
+
if requirements_met
|
|
889
|
+
else f"Set {email_var} first, then call with confirm=True"
|
|
890
|
+
),
|
|
891
|
+
"timestamp": datetime.now().isoformat(),
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
# confirm=True - proceed with authentication
|
|
895
|
+
if not email:
|
|
896
|
+
return {
|
|
897
|
+
"success": False,
|
|
898
|
+
"error": f"Environment variable {email_var} not set. "
|
|
899
|
+
f"Please set your institutional email first.",
|
|
900
|
+
"hint": f"export {email_var}='your.email@institution.edu'",
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
from scitex.scholar.auth import ScholarAuthManager
|
|
904
|
+
|
|
905
|
+
# Create auth manager with appropriate email
|
|
906
|
+
auth_kwargs = {f"email_{method}": email}
|
|
907
|
+
auth_manager = ScholarAuthManager(**auth_kwargs)
|
|
908
|
+
|
|
909
|
+
# Check if already authenticated (unless force)
|
|
910
|
+
if not force:
|
|
911
|
+
is_auth = await auth_manager.is_authenticate_async(verify_live=True)
|
|
912
|
+
if is_auth:
|
|
913
|
+
return {
|
|
914
|
+
"success": True,
|
|
915
|
+
"method": method,
|
|
916
|
+
"status": "already_authenticated",
|
|
917
|
+
"message": "Using existing valid session",
|
|
918
|
+
"email": email,
|
|
919
|
+
"timestamp": datetime.now().isoformat(),
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
# Perform authentication (opens browser)
|
|
923
|
+
auth_result = await auth_manager.authenticate_async(provider_name=method)
|
|
924
|
+
|
|
925
|
+
if auth_result:
|
|
926
|
+
# Get session info
|
|
927
|
+
provider = auth_manager.get_active_provider()
|
|
928
|
+
session_info = {}
|
|
929
|
+
if hasattr(provider, "get_session_info_async"):
|
|
930
|
+
session_info = await provider.get_session_info_async()
|
|
931
|
+
|
|
932
|
+
return {
|
|
933
|
+
"success": True,
|
|
934
|
+
"method": method,
|
|
935
|
+
"status": "authenticated",
|
|
936
|
+
"message": "Authentication successful",
|
|
937
|
+
"email": email,
|
|
938
|
+
"session_expires": session_info.get("expiry"),
|
|
939
|
+
"cookies_count": len(auth_result.get("cookies", [])),
|
|
940
|
+
"timestamp": datetime.now().isoformat(),
|
|
941
|
+
}
|
|
942
|
+
else:
|
|
943
|
+
return {
|
|
944
|
+
"success": False,
|
|
945
|
+
"method": method,
|
|
946
|
+
"status": "failed",
|
|
947
|
+
"error": "Authentication failed or was cancelled",
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
except Exception as e:
|
|
951
|
+
return {"success": False, "error": str(e)}
|
|
952
|
+
|
|
953
|
+
|
|
954
|
+
async def check_auth_status_handler(
|
|
955
|
+
method: str = "openathens",
|
|
956
|
+
verify_live: bool = False,
|
|
957
|
+
) -> dict:
|
|
958
|
+
"""Check current authentication status without starting login.
|
|
959
|
+
|
|
960
|
+
Args:
|
|
961
|
+
method: Authentication method to check ("openathens", "shibboleth", "ezproxy")
|
|
962
|
+
verify_live: If True, verify session is still valid with remote server
|
|
963
|
+
"""
|
|
964
|
+
try:
|
|
965
|
+
from scitex.scholar.auth import ScholarAuthManager
|
|
966
|
+
|
|
967
|
+
# Get email from environment
|
|
968
|
+
email_env_map = {
|
|
969
|
+
"openathens": "SCITEX_SCHOLAR_OPENATHENS_EMAIL",
|
|
970
|
+
"shibboleth": "SCITEX_SCHOLAR_SHIBBOLETH_EMAIL",
|
|
971
|
+
"ezproxy": "SCITEX_SCHOLAR_EZPROXY_EMAIL",
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
email_var = email_env_map.get(method)
|
|
975
|
+
email = os.getenv(email_var) if email_var else None
|
|
976
|
+
|
|
977
|
+
if not email:
|
|
978
|
+
return {
|
|
979
|
+
"success": True,
|
|
980
|
+
"authenticated": False,
|
|
981
|
+
"method": method,
|
|
982
|
+
"reason": f"No email configured ({email_var} not set)",
|
|
983
|
+
"timestamp": datetime.now().isoformat(),
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
# Create auth manager
|
|
987
|
+
auth_kwargs = {f"email_{method}": email}
|
|
988
|
+
auth_manager = ScholarAuthManager(**auth_kwargs)
|
|
989
|
+
|
|
990
|
+
# Check authentication status
|
|
991
|
+
is_auth = await auth_manager.is_authenticate_async(verify_live=verify_live)
|
|
992
|
+
|
|
993
|
+
result = {
|
|
994
|
+
"success": True,
|
|
995
|
+
"authenticated": is_auth,
|
|
996
|
+
"method": method,
|
|
997
|
+
"email": email,
|
|
998
|
+
"verified_live": verify_live,
|
|
999
|
+
"timestamp": datetime.now().isoformat(),
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
if is_auth:
|
|
1003
|
+
# Get session details
|
|
1004
|
+
provider = auth_manager.get_active_provider()
|
|
1005
|
+
if hasattr(provider, "get_session_info_async"):
|
|
1006
|
+
session_info = await provider.get_session_info_async()
|
|
1007
|
+
result["session_expires"] = session_info.get("expiry")
|
|
1008
|
+
result["cookies_count"] = session_info.get("cookies_count", 0)
|
|
1009
|
+
|
|
1010
|
+
return result
|
|
1011
|
+
|
|
1012
|
+
except Exception as e:
|
|
1013
|
+
return {"success": False, "error": str(e)}
|
|
1014
|
+
|
|
1015
|
+
|
|
1016
|
+
async def logout_handler(
|
|
1017
|
+
method: str = "openathens",
|
|
1018
|
+
clear_cache: bool = True,
|
|
1019
|
+
) -> dict:
|
|
1020
|
+
"""Logout from institutional authentication and clear session.
|
|
1021
|
+
|
|
1022
|
+
Args:
|
|
1023
|
+
method: Authentication method to logout from
|
|
1024
|
+
clear_cache: If True, also clear cached session files
|
|
1025
|
+
"""
|
|
1026
|
+
try:
|
|
1027
|
+
from scitex.scholar.auth import ScholarAuthManager
|
|
1028
|
+
|
|
1029
|
+
email_env_map = {
|
|
1030
|
+
"openathens": "SCITEX_SCHOLAR_OPENATHENS_EMAIL",
|
|
1031
|
+
"shibboleth": "SCITEX_SCHOLAR_SHIBBOLETH_EMAIL",
|
|
1032
|
+
"ezproxy": "SCITEX_SCHOLAR_EZPROXY_EMAIL",
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
email_var = email_env_map.get(method)
|
|
1036
|
+
email = os.getenv(email_var) if email_var else None
|
|
1037
|
+
|
|
1038
|
+
if email:
|
|
1039
|
+
auth_kwargs = {f"email_{method}": email}
|
|
1040
|
+
auth_manager = ScholarAuthManager(**auth_kwargs)
|
|
1041
|
+
await auth_manager.logout_async()
|
|
1042
|
+
|
|
1043
|
+
# Clear cache files if requested
|
|
1044
|
+
if clear_cache:
|
|
1045
|
+
cache_dir = _get_scholar_dir() / "cache" / method
|
|
1046
|
+
if cache_dir.exists():
|
|
1047
|
+
import shutil
|
|
1048
|
+
|
|
1049
|
+
shutil.rmtree(cache_dir, ignore_errors=True)
|
|
1050
|
+
|
|
1051
|
+
return {
|
|
1052
|
+
"success": True,
|
|
1053
|
+
"method": method,
|
|
1054
|
+
"cache_cleared": clear_cache,
|
|
1055
|
+
"message": f"Logged out from {method}",
|
|
1056
|
+
"timestamp": datetime.now().isoformat(),
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
except Exception as e:
|
|
1060
|
+
return {"success": False, "error": str(e)}
|
|
1061
|
+
|
|
1062
|
+
|
|
1063
|
+
async def export_papers_handler(
|
|
1064
|
+
output_path: str,
|
|
1065
|
+
project: str | None = None,
|
|
1066
|
+
format: str = "bibtex",
|
|
1067
|
+
filter_has_pdf: bool = False,
|
|
1068
|
+
) -> dict:
|
|
1069
|
+
"""Export papers to various formats.
|
|
1070
|
+
|
|
1071
|
+
Args:
|
|
1072
|
+
output_path: Path to save the exported file
|
|
1073
|
+
project: Project name to export (exports all if None)
|
|
1074
|
+
format: Export format (bibtex, json, csv, ris)
|
|
1075
|
+
filter_has_pdf: If True, only export papers with PDFs
|
|
1076
|
+
"""
|
|
1077
|
+
try:
|
|
1078
|
+
from scitex.scholar import Scholar
|
|
1079
|
+
|
|
1080
|
+
loop = asyncio.get_running_loop()
|
|
1081
|
+
scholar = Scholar(project=project) if project else Scholar()
|
|
1082
|
+
|
|
1083
|
+
def do_export():
|
|
1084
|
+
# Get papers from project using load_project
|
|
1085
|
+
papers = scholar.load_project(project=project)
|
|
1086
|
+
|
|
1087
|
+
if filter_has_pdf:
|
|
1088
|
+
# Filter papers that have PDF paths
|
|
1089
|
+
filtered = []
|
|
1090
|
+
for p in papers:
|
|
1091
|
+
if p.metadata.path.pdfs and len(p.metadata.path.pdfs) > 0:
|
|
1092
|
+
filtered.append(p)
|
|
1093
|
+
papers = type(papers)(filtered, project=project)
|
|
1094
|
+
|
|
1095
|
+
# Export based on format
|
|
1096
|
+
out_path = Path(output_path)
|
|
1097
|
+
out_path.parent.mkdir(parents=True, exist_ok=True)
|
|
1098
|
+
|
|
1099
|
+
if format == "bibtex":
|
|
1100
|
+
scholar.save_papers_as_bibtex(papers, str(out_path))
|
|
1101
|
+
elif format == "json":
|
|
1102
|
+
with open(out_path, "w") as f:
|
|
1103
|
+
json.dump([p.to_dict() for p in papers], f, indent=2)
|
|
1104
|
+
elif format == "csv":
|
|
1105
|
+
import csv
|
|
1106
|
+
|
|
1107
|
+
with open(out_path, "w", newline="") as f:
|
|
1108
|
+
writer = csv.DictWriter(
|
|
1109
|
+
f, fieldnames=["title", "authors", "year", "doi", "journal"]
|
|
1110
|
+
)
|
|
1111
|
+
writer.writeheader()
|
|
1112
|
+
for p in papers:
|
|
1113
|
+
authors = p.metadata.basic.authors or []
|
|
1114
|
+
writer.writerow(
|
|
1115
|
+
{
|
|
1116
|
+
"title": p.metadata.basic.title,
|
|
1117
|
+
"authors": ("; ".join(authors[:3]) if authors else ""),
|
|
1118
|
+
"year": p.metadata.basic.year,
|
|
1119
|
+
"doi": p.metadata.id.doi,
|
|
1120
|
+
"journal": p.metadata.publication.journal,
|
|
1121
|
+
}
|
|
1122
|
+
)
|
|
1123
|
+
elif format == "ris":
|
|
1124
|
+
# RIS format not directly supported, use BibTeX as fallback
|
|
1125
|
+
scholar.save_papers_as_bibtex(papers, str(out_path))
|
|
1126
|
+
|
|
1127
|
+
return {"count": len(papers), "path": str(out_path)}
|
|
1128
|
+
|
|
1129
|
+
result = await loop.run_in_executor(None, do_export)
|
|
1130
|
+
|
|
1131
|
+
return {
|
|
1132
|
+
"success": True,
|
|
1133
|
+
"format": format,
|
|
1134
|
+
**result,
|
|
1135
|
+
"timestamp": datetime.now().isoformat(),
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
except Exception as e:
|
|
1139
|
+
return {"success": False, "error": str(e)}
|
|
1140
|
+
|
|
1141
|
+
|
|
1142
|
+
async def create_project_handler(
|
|
1143
|
+
project_name: str,
|
|
1144
|
+
description: str | None = None,
|
|
1145
|
+
) -> dict:
|
|
1146
|
+
"""Create a new scholar project for organizing papers.
|
|
1147
|
+
|
|
1148
|
+
Args:
|
|
1149
|
+
project_name: Name of the project to create
|
|
1150
|
+
description: Optional project description
|
|
1151
|
+
"""
|
|
1152
|
+
try:
|
|
1153
|
+
library_dir = _get_scholar_dir() / "library"
|
|
1154
|
+
project_dir = library_dir / project_name
|
|
1155
|
+
|
|
1156
|
+
if project_dir.exists():
|
|
1157
|
+
return {
|
|
1158
|
+
"success": False,
|
|
1159
|
+
"error": f"Project '{project_name}' already exists",
|
|
1160
|
+
"path": str(project_dir),
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
# Create project directory
|
|
1164
|
+
project_dir.mkdir(parents=True, exist_ok=True)
|
|
1165
|
+
|
|
1166
|
+
# Create project info file
|
|
1167
|
+
info_dir = project_dir / "info"
|
|
1168
|
+
info_dir.mkdir(exist_ok=True)
|
|
1169
|
+
|
|
1170
|
+
project_info = {
|
|
1171
|
+
"name": project_name,
|
|
1172
|
+
"description": description,
|
|
1173
|
+
"created_at": datetime.now().isoformat(),
|
|
1174
|
+
"paper_count": 0,
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1177
|
+
info_file = info_dir / "project.json"
|
|
1178
|
+
with open(info_file, "w") as f:
|
|
1179
|
+
json.dump(project_info, f, indent=2)
|
|
1180
|
+
|
|
1181
|
+
return {
|
|
1182
|
+
"success": True,
|
|
1183
|
+
"project": project_name,
|
|
1184
|
+
"path": str(project_dir),
|
|
1185
|
+
"timestamp": datetime.now().isoformat(),
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
except Exception as e:
|
|
1189
|
+
return {"success": False, "error": str(e)}
|
|
1190
|
+
|
|
1191
|
+
|
|
1192
|
+
async def list_projects_handler() -> dict:
|
|
1193
|
+
"""List all scholar projects."""
|
|
1194
|
+
try:
|
|
1195
|
+
library_dir = _get_scholar_dir() / "library"
|
|
1196
|
+
|
|
1197
|
+
if not library_dir.exists():
|
|
1198
|
+
return {
|
|
1199
|
+
"success": True,
|
|
1200
|
+
"count": 0,
|
|
1201
|
+
"projects": [],
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
projects = []
|
|
1205
|
+
for item in library_dir.iterdir():
|
|
1206
|
+
if item.is_dir() and item.name != "MASTER":
|
|
1207
|
+
# Count papers (symlinks or directories with metadata.json)
|
|
1208
|
+
paper_count = 0
|
|
1209
|
+
for sub in item.iterdir():
|
|
1210
|
+
if sub.is_symlink() or (
|
|
1211
|
+
sub.is_dir() and (sub / "metadata.json").exists()
|
|
1212
|
+
):
|
|
1213
|
+
paper_count += 1
|
|
1214
|
+
|
|
1215
|
+
# Check for project info
|
|
1216
|
+
info_file = item / "info" / "project.json"
|
|
1217
|
+
description = None
|
|
1218
|
+
if info_file.exists():
|
|
1219
|
+
with open(info_file) as f:
|
|
1220
|
+
info = json.load(f)
|
|
1221
|
+
description = info.get("description")
|
|
1222
|
+
|
|
1223
|
+
projects.append(
|
|
1224
|
+
{
|
|
1225
|
+
"name": item.name,
|
|
1226
|
+
"description": description,
|
|
1227
|
+
"paper_count": paper_count,
|
|
1228
|
+
"path": str(item),
|
|
1229
|
+
}
|
|
1230
|
+
)
|
|
1231
|
+
|
|
1232
|
+
return {
|
|
1233
|
+
"success": True,
|
|
1234
|
+
"count": len(projects),
|
|
1235
|
+
"projects": projects,
|
|
1236
|
+
"timestamp": datetime.now().isoformat(),
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
except Exception as e:
|
|
1240
|
+
return {"success": False, "error": str(e)}
|
|
1241
|
+
|
|
1242
|
+
|
|
1243
|
+
async def add_papers_to_project_handler(
|
|
1244
|
+
project: str,
|
|
1245
|
+
dois: list[str] | None = None,
|
|
1246
|
+
bibtex_path: str | None = None,
|
|
1247
|
+
) -> dict:
|
|
1248
|
+
"""Add papers to a project by DOI or from BibTeX file.
|
|
1249
|
+
|
|
1250
|
+
Args:
|
|
1251
|
+
project: Target project name
|
|
1252
|
+
dois: List of DOIs to add
|
|
1253
|
+
bibtex_path: Path to BibTeX file with papers to add
|
|
1254
|
+
"""
|
|
1255
|
+
try:
|
|
1256
|
+
from scitex.scholar import Scholar
|
|
1257
|
+
|
|
1258
|
+
loop = asyncio.get_running_loop()
|
|
1259
|
+
scholar = Scholar(project=project)
|
|
1260
|
+
|
|
1261
|
+
def do_add():
|
|
1262
|
+
added = []
|
|
1263
|
+
failed = []
|
|
1264
|
+
|
|
1265
|
+
if bibtex_path:
|
|
1266
|
+
# Load papers from BibTeX
|
|
1267
|
+
papers = scholar.load_bibtex(bibtex_path)
|
|
1268
|
+
for paper in papers:
|
|
1269
|
+
try:
|
|
1270
|
+
# Save to library (this creates symlinks from project to MASTER)
|
|
1271
|
+
scholar.save_papers_to_library([paper])
|
|
1272
|
+
added.append(
|
|
1273
|
+
{
|
|
1274
|
+
"title": paper.metadata.basic.title,
|
|
1275
|
+
"doi": paper.metadata.id.doi,
|
|
1276
|
+
}
|
|
1277
|
+
)
|
|
1278
|
+
except Exception as e:
|
|
1279
|
+
failed.append(
|
|
1280
|
+
{
|
|
1281
|
+
"title": paper.metadata.basic.title,
|
|
1282
|
+
"error": str(e),
|
|
1283
|
+
}
|
|
1284
|
+
)
|
|
1285
|
+
|
|
1286
|
+
elif dois:
|
|
1287
|
+
for doi in dois:
|
|
1288
|
+
try:
|
|
1289
|
+
# Create paper from DOI and save
|
|
1290
|
+
from scitex.scholar.core import Paper
|
|
1291
|
+
|
|
1292
|
+
paper = Paper(doi=doi)
|
|
1293
|
+
scholar.save_papers_to_library([paper])
|
|
1294
|
+
added.append({"doi": doi})
|
|
1295
|
+
except Exception as e:
|
|
1296
|
+
failed.append({"doi": doi, "error": str(e)})
|
|
1297
|
+
|
|
1298
|
+
return {"added": added, "failed": failed}
|
|
1299
|
+
|
|
1300
|
+
result = await loop.run_in_executor(None, do_add)
|
|
1301
|
+
|
|
1302
|
+
return {
|
|
1303
|
+
"success": True,
|
|
1304
|
+
"project": project,
|
|
1305
|
+
**result,
|
|
1306
|
+
"timestamp": datetime.now().isoformat(),
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
except Exception as e:
|
|
1310
|
+
return {"success": False, "error": str(e)}
|
|
1311
|
+
|
|
1312
|
+
|
|
1313
|
+
async def parse_pdf_content_handler(
|
|
1314
|
+
pdf_path: str | None = None,
|
|
1315
|
+
doi: str | None = None,
|
|
1316
|
+
project: str | None = None,
|
|
1317
|
+
mode: str = "scientific",
|
|
1318
|
+
extract_sections: bool = True,
|
|
1319
|
+
extract_tables: bool = False,
|
|
1320
|
+
extract_images: bool = False,
|
|
1321
|
+
max_pages: int | None = None,
|
|
1322
|
+
) -> dict:
|
|
1323
|
+
"""Parse PDF content to extract text, sections, tables, and metadata.
|
|
1324
|
+
|
|
1325
|
+
Args:
|
|
1326
|
+
pdf_path: Direct path to PDF file
|
|
1327
|
+
doi: DOI to find PDF in library
|
|
1328
|
+
project: Project name to search for PDF
|
|
1329
|
+
mode: Extraction mode - "text", "sections", "tables", "images",
|
|
1330
|
+
"metadata", "pages", "scientific", or "full"
|
|
1331
|
+
extract_sections: Whether to parse IMRaD sections
|
|
1332
|
+
extract_tables: Whether to extract tables
|
|
1333
|
+
extract_images: Whether to extract images
|
|
1334
|
+
max_pages: Maximum pages to process (None = all)
|
|
1335
|
+
"""
|
|
1336
|
+
try:
|
|
1337
|
+
loop = asyncio.get_running_loop()
|
|
1338
|
+
|
|
1339
|
+
def do_parse():
|
|
1340
|
+
target_path = None
|
|
1341
|
+
|
|
1342
|
+
# Find PDF path
|
|
1343
|
+
if pdf_path:
|
|
1344
|
+
target_path = Path(pdf_path)
|
|
1345
|
+
elif doi:
|
|
1346
|
+
# Search library for PDF by DOI
|
|
1347
|
+
library_dir = _get_scholar_dir() / "library"
|
|
1348
|
+
master_dir = library_dir / "MASTER"
|
|
1349
|
+
|
|
1350
|
+
if master_dir.exists():
|
|
1351
|
+
for paper_dir in master_dir.iterdir():
|
|
1352
|
+
if paper_dir.is_dir():
|
|
1353
|
+
meta_file = paper_dir / "metadata.json"
|
|
1354
|
+
if meta_file.exists():
|
|
1355
|
+
with open(meta_file) as f:
|
|
1356
|
+
meta = json.load(f)
|
|
1357
|
+
if meta.get("doi") == doi:
|
|
1358
|
+
pdf_files = list(paper_dir.glob("*.pdf"))
|
|
1359
|
+
if pdf_files:
|
|
1360
|
+
target_path = pdf_files[0]
|
|
1361
|
+
break
|
|
1362
|
+
|
|
1363
|
+
if not target_path or not target_path.exists():
|
|
1364
|
+
return {
|
|
1365
|
+
"error": f"PDF not found: {pdf_path or doi}",
|
|
1366
|
+
"searched_library": bool(doi),
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
# Use scitex.io PDF loader
|
|
1370
|
+
try:
|
|
1371
|
+
from scitex.io import load
|
|
1372
|
+
|
|
1373
|
+
result = load(str(target_path), mode=mode)
|
|
1374
|
+
|
|
1375
|
+
# Build response based on mode
|
|
1376
|
+
parsed = {
|
|
1377
|
+
"path": str(target_path),
|
|
1378
|
+
"mode": mode,
|
|
1379
|
+
"file_size_kb": round(target_path.stat().st_size / 1024, 2),
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
if mode == "text":
|
|
1383
|
+
parsed["text"] = (
|
|
1384
|
+
result[:5000] + "..." if len(result) > 5000 else result
|
|
1385
|
+
)
|
|
1386
|
+
parsed["text_length"] = len(result)
|
|
1387
|
+
|
|
1388
|
+
elif mode == "sections":
|
|
1389
|
+
parsed["sections"] = {}
|
|
1390
|
+
for section_name, content in result.items():
|
|
1391
|
+
if content:
|
|
1392
|
+
parsed["sections"][section_name] = (
|
|
1393
|
+
content[:1000] + "..."
|
|
1394
|
+
if len(content) > 1000
|
|
1395
|
+
else content
|
|
1396
|
+
)
|
|
1397
|
+
|
|
1398
|
+
elif mode == "metadata":
|
|
1399
|
+
parsed["metadata"] = result
|
|
1400
|
+
|
|
1401
|
+
elif mode == "pages":
|
|
1402
|
+
parsed["page_count"] = len(result)
|
|
1403
|
+
parsed["pages"] = [
|
|
1404
|
+
{
|
|
1405
|
+
"page": i + 1,
|
|
1406
|
+
"text_preview": (
|
|
1407
|
+
text[:500] + "..." if len(text) > 500 else text
|
|
1408
|
+
),
|
|
1409
|
+
}
|
|
1410
|
+
for i, text in enumerate(result[:5])
|
|
1411
|
+
]
|
|
1412
|
+
|
|
1413
|
+
elif mode == "tables":
|
|
1414
|
+
parsed["table_count"] = len(result) if result else 0
|
|
1415
|
+
parsed["tables"] = result[:5] if result else []
|
|
1416
|
+
|
|
1417
|
+
elif mode == "scientific":
|
|
1418
|
+
# Scientific mode returns structured paper data
|
|
1419
|
+
parsed["title"] = result.get("title")
|
|
1420
|
+
parsed["abstract"] = result.get("abstract")
|
|
1421
|
+
parsed["sections"] = {
|
|
1422
|
+
k: v[:500] + "..." if v and len(v) > 500 else v
|
|
1423
|
+
for k, v in result.get("sections", {}).items()
|
|
1424
|
+
}
|
|
1425
|
+
parsed["references_count"] = len(result.get("references", []))
|
|
1426
|
+
|
|
1427
|
+
elif mode == "full":
|
|
1428
|
+
# Full mode - summarize all components
|
|
1429
|
+
parsed["text_length"] = len(result.get("text", ""))
|
|
1430
|
+
parsed["sections"] = list(result.get("sections", {}).keys())
|
|
1431
|
+
parsed["metadata"] = result.get("metadata", {})
|
|
1432
|
+
parsed["page_count"] = len(result.get("pages", []))
|
|
1433
|
+
parsed["table_count"] = len(result.get("tables", []))
|
|
1434
|
+
|
|
1435
|
+
return parsed
|
|
1436
|
+
|
|
1437
|
+
except ImportError:
|
|
1438
|
+
# Fallback to PyPDF2 if scitex.io not available
|
|
1439
|
+
from PyPDF2 import PdfReader
|
|
1440
|
+
|
|
1441
|
+
reader = PdfReader(str(target_path))
|
|
1442
|
+
page_count = len(reader.pages)
|
|
1443
|
+
|
|
1444
|
+
text_content = []
|
|
1445
|
+
for i, page in enumerate(reader.pages):
|
|
1446
|
+
if max_pages and i >= max_pages:
|
|
1447
|
+
break
|
|
1448
|
+
text_content.append(page.extract_text() or "")
|
|
1449
|
+
|
|
1450
|
+
full_text = "\n\n".join(text_content)
|
|
1451
|
+
|
|
1452
|
+
return {
|
|
1453
|
+
"path": str(target_path),
|
|
1454
|
+
"mode": "text",
|
|
1455
|
+
"page_count": page_count,
|
|
1456
|
+
"text": full_text[:5000] + "..."
|
|
1457
|
+
if len(full_text) > 5000
|
|
1458
|
+
else full_text,
|
|
1459
|
+
"text_length": len(full_text),
|
|
1460
|
+
"fallback": "PyPDF2",
|
|
1461
|
+
}
|
|
1462
|
+
|
|
1463
|
+
result = await loop.run_in_executor(None, do_parse)
|
|
1464
|
+
|
|
1465
|
+
if "error" in result:
|
|
1466
|
+
return {"success": False, **result}
|
|
1467
|
+
|
|
1468
|
+
return {
|
|
1469
|
+
"success": True,
|
|
1470
|
+
**result,
|
|
1471
|
+
"timestamp": datetime.now().isoformat(),
|
|
1472
|
+
}
|
|
1473
|
+
|
|
1474
|
+
except Exception as e:
|
|
1475
|
+
return {"success": False, "error": str(e)}
|
|
1476
|
+
|
|
1477
|
+
|
|
1478
|
+
# EOF
|