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
scitex/scholar/docs/to_claude/guidelines/programming_common/IMPORTANT-art-of-readable-code.md
DELETED
|
@@ -1,1317 +0,0 @@
|
|
|
1
|
-
<!-- ---
|
|
2
|
-
!-- Timestamp: 2025-05-25 23:31:54
|
|
3
|
-
!-- Author: ywatanabe
|
|
4
|
-
!-- File: /ssh:sp:/home/ywatanabe/.claude/to_claude/guidelines/programming_common/art-of-readable-code.md
|
|
5
|
-
!-- --- -->
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Code should minimize the time and effort needed for others to understand it. Readable code directly improves maintainability, reduces bugs, and enhances team productivity.
|
|
9
|
-
_____________________________________
|
|
10
|
-
|
|
11
|
-
## Core Philosophy
|
|
12
|
-
1. Code should be easy to understand for humans.
|
|
13
|
-
2. Readability is more important than being clever.
|
|
14
|
-
3. The measure of good code is how long it takes someone else to understand it.
|
|
15
|
-
4. Simplicity trumps familiarity.
|
|
16
|
-
|
|
17
|
-
## Naming Rules
|
|
18
|
-
1. Use specific, precise names that convey meaning.
|
|
19
|
-
2. Choose names at appropriate level of abstraction.
|
|
20
|
-
3. Add prefixes/suffixes when they add vital information.
|
|
21
|
-
4. Establish consistent naming patterns within your codebase.
|
|
22
|
-
5. Use descriptive verbs for function names.
|
|
23
|
-
6. Avoid ambiguous abbreviations and acronyms.
|
|
24
|
-
7. Prioritize clarity over brevity.
|
|
25
|
-
|
|
26
|
-
### Variable and Function Naming
|
|
27
|
-
|
|
28
|
-
**DO NOT**
|
|
29
|
-
```python
|
|
30
|
-
def get_data(d, t, fl):
|
|
31
|
-
r = []
|
|
32
|
-
for i in d:
|
|
33
|
-
if i['tp'] == t and i['age'] > 30 and i['act'] == fl:
|
|
34
|
-
r.append(i)
|
|
35
|
-
return r
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
**DO**
|
|
39
|
-
```python
|
|
40
|
-
def filter_active_users_by_type(users, user_type, is_active):
|
|
41
|
-
"""Return users of specified type who are active and over 30."""
|
|
42
|
-
filtered_users = []
|
|
43
|
-
for user in users:
|
|
44
|
-
if (user['type'] == user_type and
|
|
45
|
-
user['age'] > 30 and
|
|
46
|
-
user['active'] == is_active):
|
|
47
|
-
filtered_users.append(user)
|
|
48
|
-
return filtered_users
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### Machine Learning Code Naming
|
|
52
|
-
|
|
53
|
-
**DO NOT**
|
|
54
|
-
```python
|
|
55
|
-
def proc(X, y, f=10, a=0.01, i=1000):
|
|
56
|
-
m = len(X)
|
|
57
|
-
w = np.zeros(X.shape[1])
|
|
58
|
-
b = 0
|
|
59
|
-
for _ in range(i):
|
|
60
|
-
z = np.dot(X, w) + b
|
|
61
|
-
p = 1 / (1 + np.exp(-z))
|
|
62
|
-
g_w = (1/m) * np.dot(X.T, (p - y))
|
|
63
|
-
g_b = (1/m) * np.sum(p - y)
|
|
64
|
-
if _ % f == 0:
|
|
65
|
-
c = (-1/m) * np.sum(y*np.log(p) + (1-y)*np.log(1-p))
|
|
66
|
-
print(f"Cost: {c}")
|
|
67
|
-
w -= a * g_w
|
|
68
|
-
b -= a * g_b
|
|
69
|
-
return w, b
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
**DO**
|
|
73
|
-
```python
|
|
74
|
-
def train_logistic_regression(features, labels, print_every=10,
|
|
75
|
-
learning_rate=0.01, max_iterations=1000):
|
|
76
|
-
"""Train a logistic regression model using gradient descent.
|
|
77
|
-
|
|
78
|
-
Args:
|
|
79
|
-
features: Training features matrix (n_samples, n_features)
|
|
80
|
-
labels: Target binary labels (n_samples,)
|
|
81
|
-
print_every: Print cost every n iterations
|
|
82
|
-
learning_rate: Step size for gradient descent
|
|
83
|
-
max_iterations: Maximum number of training iterations
|
|
84
|
-
|
|
85
|
-
Returns:
|
|
86
|
-
weights, bias: Trained model parameters
|
|
87
|
-
"""
|
|
88
|
-
num_samples = len(features)
|
|
89
|
-
weights = np.zeros(features.shape[1])
|
|
90
|
-
bias = 0
|
|
91
|
-
|
|
92
|
-
for iteration in range(max_iterations):
|
|
93
|
-
# Forward pass
|
|
94
|
-
linear_predictions = np.dot(features, weights) + bias
|
|
95
|
-
predictions = 1 / (1 + np.exp(-linear_predictions))
|
|
96
|
-
|
|
97
|
-
# Compute gradients
|
|
98
|
-
weight_gradient = (1/num_samples) * np.dot(features.T, (predictions - labels))
|
|
99
|
-
bias_gradient = (1/num_samples) * np.sum(predictions - labels)
|
|
100
|
-
|
|
101
|
-
# Print cost if needed
|
|
102
|
-
if iteration % print_every == 0:
|
|
103
|
-
cost = (-1/num_samples) * np.sum(
|
|
104
|
-
labels * np.log(predictions) +
|
|
105
|
-
(1-labels) * np.log(1-predictions)
|
|
106
|
-
)
|
|
107
|
-
print(f"Iteration {iteration}, Cost: {cost:.6f}")
|
|
108
|
-
|
|
109
|
-
# Update parameters
|
|
110
|
-
weights -= learning_rate * weight_gradient
|
|
111
|
-
bias -= learning_rate * bias_gradient
|
|
112
|
-
|
|
113
|
-
return weights, bias
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
## Aesthetics
|
|
117
|
-
1. Use consistent formatting throughout the codebase.
|
|
118
|
-
2. Break code into logical "paragraphs" separated by blank lines.
|
|
119
|
-
3. Align code with similar structure when it helps identify patterns.
|
|
120
|
-
4. Use whitespace strategically to group related items.
|
|
121
|
-
5. Keep lines short enough to be easily scanned.
|
|
122
|
-
6. Maintain consistent indentation.
|
|
123
|
-
|
|
124
|
-
### Code Formatting
|
|
125
|
-
|
|
126
|
-
**DO NOT**
|
|
127
|
-
```python
|
|
128
|
-
def calculate_total(items,tax,discount):
|
|
129
|
-
result=0;
|
|
130
|
-
for i in range(len(items)):result+=items[i]
|
|
131
|
-
if discount:result*=0.9
|
|
132
|
-
return result*(1+tax)
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
**DO**
|
|
136
|
-
```python
|
|
137
|
-
def calculate_total(items, tax, apply_discount):
|
|
138
|
-
"""Calculate the total price with tax and optional discount."""
|
|
139
|
-
subtotal = 0
|
|
140
|
-
|
|
141
|
-
# Sum all item prices
|
|
142
|
-
for item in items:
|
|
143
|
-
subtotal += item
|
|
144
|
-
|
|
145
|
-
# Apply discount if needed
|
|
146
|
-
if apply_discount:
|
|
147
|
-
subtotal *= 0.9 # 10% discount
|
|
148
|
-
|
|
149
|
-
# Add tax and return
|
|
150
|
-
return subtotal * (1 + tax)
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### Configuration Formatting
|
|
154
|
-
|
|
155
|
-
**DO NOT**
|
|
156
|
-
```python
|
|
157
|
-
DEFAULT_SETTINGS={"timeout":30,"retries":3,"log_level":"INFO","cache_size":100,"max_connections":5,"debug":False,"user_agent":"MyApp/1.0","ssl_verify":True,"chunk_size":8192,"base_url":"https://api.example.com/v1","poll_interval":5}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
**DO**
|
|
161
|
-
```python
|
|
162
|
-
DEFAULT_SETTINGS = {
|
|
163
|
-
# Connection settings
|
|
164
|
-
"timeout": 30,
|
|
165
|
-
"retries": 3,
|
|
166
|
-
"max_connections": 5,
|
|
167
|
-
"poll_interval": 5,
|
|
168
|
-
|
|
169
|
-
# Server configuration
|
|
170
|
-
"base_url": "https://api.example.com/v1",
|
|
171
|
-
"ssl_verify": True,
|
|
172
|
-
|
|
173
|
-
# Request settings
|
|
174
|
-
"user_agent": "MyApp/1.0",
|
|
175
|
-
"chunk_size": 8192,
|
|
176
|
-
|
|
177
|
-
# Debugging options
|
|
178
|
-
"log_level": "INFO",
|
|
179
|
-
"debug": False,
|
|
180
|
-
|
|
181
|
-
# Cache configuration
|
|
182
|
-
"cache_size": 100,
|
|
183
|
-
}
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
## Comments Rules
|
|
187
|
-
1. Focus on explaining "why" not "what" in comments.
|
|
188
|
-
2. Document assumptions, edge cases, and non-obvious constraints.
|
|
189
|
-
3. Use "director commentary" to explain tricky sections.
|
|
190
|
-
4. Add summary comments for complex blocks of code.
|
|
191
|
-
5. Avoid redundant comments that repeat the code.
|
|
192
|
-
6. Use markers like TODO, FIXME consistently.
|
|
193
|
-
7. Update comments when code changes.
|
|
194
|
-
|
|
195
|
-
### Basic Comments
|
|
196
|
-
|
|
197
|
-
**DO NOT**
|
|
198
|
-
```python
|
|
199
|
-
# This function adds a and b
|
|
200
|
-
def add(a, b):
|
|
201
|
-
return a + b # Return the sum
|
|
202
|
-
|
|
203
|
-
# Loop through array
|
|
204
|
-
for i in range(len(data)):
|
|
205
|
-
# Get the current item
|
|
206
|
-
item = data[i]
|
|
207
|
-
# Process item
|
|
208
|
-
process(item)
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
**DO**
|
|
212
|
-
```python
|
|
213
|
-
# Apply Gaussian blur using a 9-step approximation
|
|
214
|
-
# instead of the full algorithm for performance reasons
|
|
215
|
-
def fast_gaussian_blur(image_data, radius):
|
|
216
|
-
# Early return for edge case - no blur needed
|
|
217
|
-
if radius < 1:
|
|
218
|
-
return image_data
|
|
219
|
-
|
|
220
|
-
# Implementation works in-place to avoid extra allocations
|
|
221
|
-
# which is critical for large images
|
|
222
|
-
# ... implementation ...
|
|
223
|
-
|
|
224
|
-
return image_data
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
### API Documentation
|
|
228
|
-
|
|
229
|
-
**DO NOT**
|
|
230
|
-
```python
|
|
231
|
-
def authenticate(username, password):
|
|
232
|
-
"""Authenticates a user."""
|
|
233
|
-
# Code to check password
|
|
234
|
-
if check_password(username, password):
|
|
235
|
-
token = generate_token(username)
|
|
236
|
-
return token
|
|
237
|
-
else:
|
|
238
|
-
return None
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
**DO**
|
|
242
|
-
```python
|
|
243
|
-
def authenticate(username, password):
|
|
244
|
-
"""Authenticate a user and generate an access token.
|
|
245
|
-
|
|
246
|
-
Args:
|
|
247
|
-
username: The user's username (case-sensitive)
|
|
248
|
-
password: The user's plain-text password
|
|
249
|
-
|
|
250
|
-
Returns:
|
|
251
|
-
str: A JWT token that's valid for 24 hours if authentication succeeds
|
|
252
|
-
None: If authentication fails
|
|
253
|
-
|
|
254
|
-
Raises:
|
|
255
|
-
RateLimitError: If too many failed attempts from this IP address
|
|
256
|
-
LockoutError: If account is locked due to multiple failed attempts
|
|
257
|
-
|
|
258
|
-
Security note:
|
|
259
|
-
While this function accepts plain-text passwords, they're never stored
|
|
260
|
-
in raw form. Passwords are verified against salted bcrypt hashes in the
|
|
261
|
-
database with work factor 12.
|
|
262
|
-
"""
|
|
263
|
-
# Verify credentials
|
|
264
|
-
if check_password(username, password):
|
|
265
|
-
token = generate_token(username)
|
|
266
|
-
return token
|
|
267
|
-
else:
|
|
268
|
-
record_failed_attempt(username)
|
|
269
|
-
return None
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
## Simplification Rules
|
|
273
|
-
1. Break down complex expressions into simpler components.
|
|
274
|
-
2. Use named variables to document intermediate values.
|
|
275
|
-
3. Simplify boolean expressions when possible.
|
|
276
|
-
4. Avoid double negatives in conditions.
|
|
277
|
-
5. Use early returns to reduce nesting.
|
|
278
|
-
6. Replace complex loops with helper functions.
|
|
279
|
-
7. Eliminate unnecessary variables and code.
|
|
280
|
-
|
|
281
|
-
### Boolean Logic Simplification
|
|
282
|
-
|
|
283
|
-
**DO NOT**
|
|
284
|
-
```python
|
|
285
|
-
if not(not(user.is_active) or not(user.has_permission("admin"))):
|
|
286
|
-
# Complex logic with double negatives
|
|
287
|
-
do_something_for_active_admins()
|
|
288
|
-
|
|
289
|
-
def process_data(data):
|
|
290
|
-
temp1 = 0
|
|
291
|
-
for i in range(len(data)):
|
|
292
|
-
temp2 = data[i] * 2
|
|
293
|
-
if temp2 > 10:
|
|
294
|
-
temp1 += temp2
|
|
295
|
-
return temp1
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
**DO**
|
|
299
|
-
```python
|
|
300
|
-
if user.is_active and user.has_permission("admin"):
|
|
301
|
-
do_something_for_active_admins()
|
|
302
|
-
|
|
303
|
-
def process_data(data):
|
|
304
|
-
sum_of_valid_doubles = 0
|
|
305
|
-
for value in data:
|
|
306
|
-
doubled = value * 2
|
|
307
|
-
if doubled > 10:
|
|
308
|
-
sum_of_valid_doubles += doubled
|
|
309
|
-
return sum_of_valid_doubles
|
|
310
|
-
``` |
|
|
311
|
-
|
|
312
|
-
### Regex Simplification
|
|
313
|
-
|
|
314
|
-
**DO NOT**
|
|
315
|
-
```python
|
|
316
|
-
def is_valid_email(email):
|
|
317
|
-
# Overly complex regex that's hard to understand and maintain
|
|
318
|
-
pattern = r'^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'
|
|
319
|
-
return re.match(pattern, email) is not None
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
**DO**
|
|
323
|
-
```python
|
|
324
|
-
def is_valid_email(email):
|
|
325
|
-
"""Validate an email address format.
|
|
326
|
-
|
|
327
|
-
Validates that the string:
|
|
328
|
-
1. Contains a username and domain separated by '@'
|
|
329
|
-
2. Username doesn't start/end with a period
|
|
330
|
-
3. Domain has at least one period
|
|
331
|
-
4. Only contains allowed characters
|
|
332
|
-
|
|
333
|
-
A more complete validation would require actually sending
|
|
334
|
-
an email to verify the address exists.
|
|
335
|
-
"""
|
|
336
|
-
# Split regex into named components for clarity
|
|
337
|
-
username_pattern = r'[a-zA-Z0-9_.+-]+'
|
|
338
|
-
domain_pattern = r'[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
|
|
339
|
-
pattern = f'^{username_pattern}@{domain_pattern}$'
|
|
340
|
-
|
|
341
|
-
# Basic format check
|
|
342
|
-
if not re.match(pattern, email):
|
|
343
|
-
return False
|
|
344
|
-
|
|
345
|
-
# Additional checks that are easier to express in code than regex
|
|
346
|
-
username, domain = email.split('@')
|
|
347
|
-
|
|
348
|
-
if username.startswith('.') or username.endswith('.'):
|
|
349
|
-
return False
|
|
350
|
-
|
|
351
|
-
if '.' not in domain:
|
|
352
|
-
return False
|
|
353
|
-
|
|
354
|
-
return True
|
|
355
|
-
```
|
|
356
|
-
|
|
357
|
-
## Function Rules
|
|
358
|
-
1. Functions should do one thing well.
|
|
359
|
-
2. Extract unrelated subproblems into separate functions.
|
|
360
|
-
3. Keep functions small and focused.
|
|
361
|
-
4. Functions should operate at a single level of abstraction.
|
|
362
|
-
5. Choose argument order thoughtfully and consistently.
|
|
363
|
-
6. Minimize the number of function parameters.
|
|
364
|
-
7. Consider creating wrapper functions for common use cases.
|
|
365
|
-
|
|
366
|
-
### Function Design
|
|
367
|
-
|
|
368
|
-
**DO NOT**
|
|
369
|
-
```python
|
|
370
|
-
def process_user_data(user_id, update_profile=False, send_email=False, reset_password=False):
|
|
371
|
-
user = get_user(user_id)
|
|
372
|
-
|
|
373
|
-
if update_profile:
|
|
374
|
-
# Update user profile logic
|
|
375
|
-
user.name = request.form.get('name')
|
|
376
|
-
user.email = request.form.get('email')
|
|
377
|
-
user.save()
|
|
378
|
-
|
|
379
|
-
if send_email:
|
|
380
|
-
# Send email logic
|
|
381
|
-
template = get_email_template('welcome')
|
|
382
|
-
send_mail(user.email, template, {})
|
|
383
|
-
|
|
384
|
-
if reset_password:
|
|
385
|
-
# Reset password logic
|
|
386
|
-
new_password = generate_password()
|
|
387
|
-
user.set_password(new_password)
|
|
388
|
-
user.save()
|
|
389
|
-
send_mail(user.email, 'password_reset', {'password': new_password})
|
|
390
|
-
|
|
391
|
-
return user
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
**DO**
|
|
395
|
-
```python
|
|
396
|
-
def get_user(user_id):
|
|
397
|
-
return User.find(user_id)
|
|
398
|
-
|
|
399
|
-
def update_user_profile(user, profile_data):
|
|
400
|
-
user.name = profile_data.get('name', user.name)
|
|
401
|
-
user.email = profile_data.get('email', user.email)
|
|
402
|
-
user.save()
|
|
403
|
-
return user
|
|
404
|
-
|
|
405
|
-
def send_welcome_email(user):
|
|
406
|
-
template = get_email_template('welcome')
|
|
407
|
-
send_mail(user.email, template, {})
|
|
408
|
-
|
|
409
|
-
def reset_user_password(user):
|
|
410
|
-
new_password = generate_password()
|
|
411
|
-
user.set_password(new_password)
|
|
412
|
-
user.save()
|
|
413
|
-
send_mail(user.email, 'password_reset', {'password': new_password})
|
|
414
|
-
return new_password
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
### Abstraction Level Mixing
|
|
418
|
-
|
|
419
|
-
**DO NOT**
|
|
420
|
-
```python
|
|
421
|
-
def analyze_text(text, lang="en"):
|
|
422
|
-
# Low-level string operations mixed with high-level analysis
|
|
423
|
-
text = text.lower().strip()
|
|
424
|
-
text = re.sub(r'[^\w\s]', '', text)
|
|
425
|
-
words = text.split()
|
|
426
|
-
word_count = len(words)
|
|
427
|
-
|
|
428
|
-
# Load language-specific stopwords
|
|
429
|
-
if lang == "en":
|
|
430
|
-
stopwords_file = open("data/stopwords/english.txt", "r")
|
|
431
|
-
stopwords = set([w.strip() for w in stopwords_file.readlines()])
|
|
432
|
-
stopwords_file.close()
|
|
433
|
-
elif lang == "fr":
|
|
434
|
-
stopwords_file = open("data/stopwords/french.txt", "r")
|
|
435
|
-
stopwords = set([w.strip() for w in stopwords_file.readlines()])
|
|
436
|
-
stopwords_file.close()
|
|
437
|
-
else:
|
|
438
|
-
stopwords = set()
|
|
439
|
-
|
|
440
|
-
# Filter content words and count frequencies
|
|
441
|
-
content_words = [w for w in words if w not in stopwords]
|
|
442
|
-
freq = {}
|
|
443
|
-
for word in content_words:
|
|
444
|
-
if word in freq:
|
|
445
|
-
freq[word] += 1
|
|
446
|
-
else:
|
|
447
|
-
freq[word] = 1
|
|
448
|
-
|
|
449
|
-
# Calculate sentiment using third-party library
|
|
450
|
-
sentiment_analyzer = SentimentIntensityAnalyzer()
|
|
451
|
-
sentiment = sentiment_analyzer.polarity_scores(text)
|
|
452
|
-
|
|
453
|
-
# Return all statistics at once
|
|
454
|
-
return {
|
|
455
|
-
"word_count": word_count,
|
|
456
|
-
"content_word_count": len(content_words),
|
|
457
|
-
"frequencies": freq,
|
|
458
|
-
"sentiment": sentiment
|
|
459
|
-
}
|
|
460
|
-
```
|
|
461
|
-
|
|
462
|
-
**DO**
|
|
463
|
-
```python
|
|
464
|
-
def preprocess_text(text):
|
|
465
|
-
"""Convert text to lowercase, remove punctuation and return words."""
|
|
466
|
-
text = text.lower().strip()
|
|
467
|
-
text = re.sub(r'[^\w\s]', '', text)
|
|
468
|
-
return text.split()
|
|
469
|
-
|
|
470
|
-
def load_stopwords(language="en"):
|
|
471
|
-
"""Load stopwords for the specified language."""
|
|
472
|
-
languages = {
|
|
473
|
-
"en": "english.txt",
|
|
474
|
-
"fr": "french.txt",
|
|
475
|
-
# More languages can be added here
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
filename = languages.get(language)
|
|
479
|
-
if not filename:
|
|
480
|
-
return set()
|
|
481
|
-
|
|
482
|
-
filepath = f"data/stopwords/{filename}"
|
|
483
|
-
with open(filepath, "r") as file:
|
|
484
|
-
return set(line.strip() for line in file)
|
|
485
|
-
|
|
486
|
-
def calculate_word_frequencies(words):
|
|
487
|
-
"""Count frequency of each word in a list."""
|
|
488
|
-
frequencies = {}
|
|
489
|
-
for word in words:
|
|
490
|
-
frequencies[word] = frequencies.get(word, 0) + 1
|
|
491
|
-
return frequencies
|
|
492
|
-
|
|
493
|
-
def analyze_text(text, language="en"):
|
|
494
|
-
"""Analyze text and return statistics about it."""
|
|
495
|
-
# Each step uses a single level of abstraction
|
|
496
|
-
words = preprocess_text(text)
|
|
497
|
-
stopwords = load_stopwords(language)
|
|
498
|
-
content_words = [word for word in words if word not in stopwords]
|
|
499
|
-
|
|
500
|
-
# Analyze the text
|
|
501
|
-
word_frequencies = calculate_word_frequencies(content_words)
|
|
502
|
-
sentiment = SentimentIntensityAnalyzer().polarity_scores(text)
|
|
503
|
-
|
|
504
|
-
# Return the analysis results
|
|
505
|
-
return {
|
|
506
|
-
"word_count": len(words),
|
|
507
|
-
"content_word_count": len(content_words),
|
|
508
|
-
"frequencies": word_frequencies,
|
|
509
|
-
"sentiment": sentiment
|
|
510
|
-
}
|
|
511
|
-
```
|
|
512
|
-
|
|
513
|
-
## Control Flow Rules
|
|
514
|
-
1. Minimize nesting depth in code.
|
|
515
|
-
2. Prefer positive conditionals over negative ones.
|
|
516
|
-
3. Handle the most common code path first.
|
|
517
|
-
4. Return early from functions when possible.
|
|
518
|
-
5. Avoid "clever" shortcuts that reduce readability.
|
|
519
|
-
6. Structure conditionals to minimize cognitive load.
|
|
520
|
-
|
|
521
|
-
### Nesting and Early Returns
|
|
522
|
-
|
|
523
|
-
**DO NOT**
|
|
524
|
-
```python
|
|
525
|
-
def process_order(order):
|
|
526
|
-
if order is not None:
|
|
527
|
-
if order.is_valid():
|
|
528
|
-
if len(order.get_items()) > 0:
|
|
529
|
-
if order.get_customer().has_valid_payment():
|
|
530
|
-
# Process the order
|
|
531
|
-
execute_order(order)
|
|
532
|
-
send_confirmation(order)
|
|
533
|
-
update_inventory(order)
|
|
534
|
-
else:
|
|
535
|
-
raise PaymentException("Invalid payment")
|
|
536
|
-
else:
|
|
537
|
-
raise OrderException("Empty order")
|
|
538
|
-
else:
|
|
539
|
-
raise ValidationException("Invalid order")
|
|
540
|
-
else:
|
|
541
|
-
raise ValueError("Order is None")
|
|
542
|
-
|
|
543
|
-
```
|
|
544
|
-
|
|
545
|
-
**DO**
|
|
546
|
-
```python
|
|
547
|
-
def process_order(order):
|
|
548
|
-
if order is None:
|
|
549
|
-
raise ValueError("Order is None")
|
|
550
|
-
|
|
551
|
-
if not order.is_valid():
|
|
552
|
-
raise ValidationException("Invalid order")
|
|
553
|
-
|
|
554
|
-
if not order.get_items():
|
|
555
|
-
raise OrderException("Empty order")
|
|
556
|
-
|
|
557
|
-
if not order.get_customer().has_valid_payment():
|
|
558
|
-
raise PaymentException("Invalid payment")
|
|
559
|
-
|
|
560
|
-
# Process the valid order
|
|
561
|
-
execute_order(order)
|
|
562
|
-
send_confirmation(order)
|
|
563
|
-
update_inventory(order)
|
|
564
|
-
```
|
|
565
|
-
|
|
566
|
-
### Complex Conditionals
|
|
567
|
-
|
|
568
|
-
**DO NOT**
|
|
569
|
-
```python
|
|
570
|
-
def check_eligibility(user):
|
|
571
|
-
# Hard-to-follow nested conditions with mixed logic
|
|
572
|
-
if user.age >= 18:
|
|
573
|
-
if user.is_active and user.subscription.status == "paid":
|
|
574
|
-
if not user.has_flag("banned") and not user.has_flag("suspended"):
|
|
575
|
-
if user.last_login and (user.last_login > (datetime.now() - timedelta(days=30))):
|
|
576
|
-
if user.profile_completion > 80 or user.is_legacy_user:
|
|
577
|
-
return True
|
|
578
|
-
return False
|
|
579
|
-
```
|
|
580
|
-
|
|
581
|
-
**DO**
|
|
582
|
-
```python
|
|
583
|
-
def check_eligibility(user):
|
|
584
|
-
"""Check if user is eligible for premium content access."""
|
|
585
|
-
# Validate basic requirements first
|
|
586
|
-
if user.age < 18:
|
|
587
|
-
return False
|
|
588
|
-
|
|
589
|
-
if not user.is_active:
|
|
590
|
-
return False
|
|
591
|
-
|
|
592
|
-
if user.subscription.status != "paid":
|
|
593
|
-
return False
|
|
594
|
-
|
|
595
|
-
# Check disqualifying flags
|
|
596
|
-
if user.has_flag("banned") or user.has_flag("suspended"):
|
|
597
|
-
return False
|
|
598
|
-
|
|
599
|
-
# Check activity requirements
|
|
600
|
-
if not user.last_login:
|
|
601
|
-
return False
|
|
602
|
-
|
|
603
|
-
one_month_ago = datetime.now() - timedelta(days=30)
|
|
604
|
-
if user.last_login <= one_month_ago:
|
|
605
|
-
return False
|
|
606
|
-
|
|
607
|
-
# Check profile completion requirement (with Exception for legacy users)
|
|
608
|
-
if user.profile_completion <= 80 and not user.is_legacy_user:
|
|
609
|
-
return False
|
|
610
|
-
|
|
611
|
-
# If all checks passed, user is eligible
|
|
612
|
-
return True
|
|
613
|
-
```
|
|
614
|
-
|
|
615
|
-
## Data Structure Rules
|
|
616
|
-
1. Use the simplest data structure that does the job.
|
|
617
|
-
2. Reduce variable scope as much as possible.
|
|
618
|
-
3. Prefer constants and immutable data when possible.
|
|
619
|
-
4. Define variables close to where they're used.
|
|
620
|
-
5. Make interfaces to your code "narrow and deep".
|
|
621
|
-
6. Design data structures that prevent errors.
|
|
622
|
-
7. Document expectations about data with assertions.
|
|
623
|
-
|
|
624
|
-
### Generic Dict vs. Classes
|
|
625
|
-
|
|
626
|
-
**DO NOT**
|
|
627
|
-
```python
|
|
628
|
-
def process_user_data(user_data):
|
|
629
|
-
# Using general-purpose dict with inconsistent structure
|
|
630
|
-
result = {}
|
|
631
|
-
|
|
632
|
-
if user_data["type"] == "employee":
|
|
633
|
-
result["name"] = user_data["name"]
|
|
634
|
-
result["salary"] = user_data.get("salary", 0)
|
|
635
|
-
result["department"] = user_data["dept"]
|
|
636
|
-
# Might forget to handle other properties
|
|
637
|
-
elif user_data["type"] == "customer":
|
|
638
|
-
result["name"] = user_data["name"]
|
|
639
|
-
result["total_purchases"] = user_data.get("purchases", 0)
|
|
640
|
-
result["last_purchase_date"] = user_data["last_purchase"]
|
|
641
|
-
# Different structure for different types
|
|
642
|
-
|
|
643
|
-
return result
|
|
644
|
-
```
|
|
645
|
-
|
|
646
|
-
**DO**
|
|
647
|
-
```python
|
|
648
|
-
class Employee:
|
|
649
|
-
def __init__(self, data):
|
|
650
|
-
self.name = data["name"]
|
|
651
|
-
self.salary = data.get("salary", 0)
|
|
652
|
-
self.department = data["dept"]
|
|
653
|
-
self.start_date = data.get("start_date")
|
|
654
|
-
|
|
655
|
-
def get_annual_cost(self):
|
|
656
|
-
"""Calculate total annual cost including benefits."""
|
|
657
|
-
return self.salary * 1.25 # Including benefits
|
|
658
|
-
|
|
659
|
-
class Customer:
|
|
660
|
-
def __init__(self, data):
|
|
661
|
-
self.name = data["name"]
|
|
662
|
-
self.total_purchases = data.get("purchases", 0)
|
|
663
|
-
self.last_purchase_date = data["last_purchase"]
|
|
664
|
-
self.loyalty_points = data.get("loyalty_points", 0)
|
|
665
|
-
|
|
666
|
-
def get_value_score(self):
|
|
667
|
-
"""Calculate customer value based on purchase history."""
|
|
668
|
-
return self.total_purchases * 0.1 + self.loyalty_points * 0.5
|
|
669
|
-
|
|
670
|
-
def create_user_from_data(user_data):
|
|
671
|
-
if user_data["type"] == "employee":
|
|
672
|
-
return Employee(user_data)
|
|
673
|
-
elif user_data["type"] == "customer":
|
|
674
|
-
return Customer(user_data)
|
|
675
|
-
raise ValueError(f"Unknown user type: {user_data['type']}")
|
|
676
|
-
```
|
|
677
|
-
|
|
678
|
-
### Data Validation
|
|
679
|
-
|
|
680
|
-
**DO NOT**
|
|
681
|
-
```python
|
|
682
|
-
def create_account(data):
|
|
683
|
-
# Data format isn't enforced, values could be missing or wrong type
|
|
684
|
-
username = data.get('username')
|
|
685
|
-
email = data.get('email')
|
|
686
|
-
password = data.get('password')
|
|
687
|
-
|
|
688
|
-
# No validation of data, errors will occur later
|
|
689
|
-
account = {
|
|
690
|
-
'username': username,
|
|
691
|
-
'email': email,
|
|
692
|
-
'password_hash': hash_password(password),
|
|
693
|
-
'created_at': datetime.now(),
|
|
694
|
-
'is_active': True,
|
|
695
|
-
'login_count': 0,
|
|
696
|
-
'last_login': None
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
save_to_database(account)
|
|
700
|
-
return account
|
|
701
|
-
```
|
|
702
|
-
|
|
703
|
-
**DO**
|
|
704
|
-
```python
|
|
705
|
-
from dataclasses import dataclass, field
|
|
706
|
-
from datetime import datetime
|
|
707
|
-
import re
|
|
708
|
-
from typing import Optional
|
|
709
|
-
|
|
710
|
-
@dataclass
|
|
711
|
-
class AccountCreationRequest:
|
|
712
|
-
"""Data required to create a new user account."""
|
|
713
|
-
username: str
|
|
714
|
-
email: str
|
|
715
|
-
password: str
|
|
716
|
-
|
|
717
|
-
def validate(self):
|
|
718
|
-
"""Validate all fields meet requirements."""
|
|
719
|
-
errors = []
|
|
720
|
-
|
|
721
|
-
# Username validation
|
|
722
|
-
if not self.username or len(self.username) < 3:
|
|
723
|
-
errors.append("Username must be at least 3 characters")
|
|
724
|
-
if not re.match(r'^[a-zA-Z0-9_]+$', self.username):
|
|
725
|
-
errors.append("Username can only contain letters, numbers, and underscores")
|
|
726
|
-
|
|
727
|
-
# Email validation
|
|
728
|
-
if not self.email or '@' not in self.email:
|
|
729
|
-
errors.append("Valid email is required")
|
|
730
|
-
|
|
731
|
-
# Password validation
|
|
732
|
-
if not self.password or len(self.password) < 8:
|
|
733
|
-
errors.append("Password must be at least 8 characters")
|
|
734
|
-
|
|
735
|
-
if errors:
|
|
736
|
-
raise ValidationError(errors)
|
|
737
|
-
|
|
738
|
-
@dataclass
|
|
739
|
-
class Account:
|
|
740
|
-
"""User account with enforced types and defaults."""
|
|
741
|
-
username: str
|
|
742
|
-
email: str
|
|
743
|
-
password_hash: str
|
|
744
|
-
created_at: datetime = field(default_factory=datetime.now)
|
|
745
|
-
is_active: bool = True
|
|
746
|
-
login_count: int = 0
|
|
747
|
-
last_login: Optional[datetime] = None
|
|
748
|
-
|
|
749
|
-
def create_account(request: AccountCreationRequest) -> Account:
|
|
750
|
-
"""Create a new account from validated request data."""
|
|
751
|
-
# Validate incoming data
|
|
752
|
-
request.validate()
|
|
753
|
-
|
|
754
|
-
# Create account with properly typed fields and defaults
|
|
755
|
-
account = Account(
|
|
756
|
-
username=request.username,
|
|
757
|
-
email=request.email,
|
|
758
|
-
password_hash=hash_password(request.password)
|
|
759
|
-
)
|
|
760
|
-
|
|
761
|
-
save_to_database(account)
|
|
762
|
-
return account
|
|
763
|
-
```
|
|
764
|
-
|
|
765
|
-
## Organization Rules
|
|
766
|
-
1. Organize code from high level to low level.
|
|
767
|
-
2. Keep related actions together, unrelated actions separate.
|
|
768
|
-
3. Use consistent patterns for similar functionality.
|
|
769
|
-
4. Minimize state changes and side effects.
|
|
770
|
-
5. Place helper functions after the code that uses them.
|
|
771
|
-
6. Group related functions together.
|
|
772
|
-
|
|
773
|
-
### Code Organization
|
|
774
|
-
|
|
775
|
-
**DO NOT**
|
|
776
|
-
```python
|
|
777
|
-
def process_data():
|
|
778
|
-
# Mix of high-level and low-level operations
|
|
779
|
-
data = []
|
|
780
|
-
file = open('data.csv', 'r')
|
|
781
|
-
lines = file.readlines()
|
|
782
|
-
file.close()
|
|
783
|
-
|
|
784
|
-
for line in lines:
|
|
785
|
-
if line.strip():
|
|
786
|
-
parts = line.strip().split(',')
|
|
787
|
-
if len(parts) >= 3:
|
|
788
|
-
name = parts[0]
|
|
789
|
-
age = int(parts[1])
|
|
790
|
-
salary = float(parts[2])
|
|
791
|
-
|
|
792
|
-
# Complex business logic mixed with parsing
|
|
793
|
-
if age > 30 and salary < 50000:
|
|
794
|
-
tax_rate = 0.15
|
|
795
|
-
else:
|
|
796
|
-
tax_rate = 0.2
|
|
797
|
-
|
|
798
|
-
net_salary = salary * (1 - tax_rate)
|
|
799
|
-
data.append({'name': name, 'age': age, 'net_salary': net_salary})
|
|
800
|
-
|
|
801
|
-
return data
|
|
802
|
-
```
|
|
803
|
-
|
|
804
|
-
**DO**
|
|
805
|
-
```python
|
|
806
|
-
def read_csv_file(file_path):
|
|
807
|
-
"""Read data from CSV file and return as list of lines."""
|
|
808
|
-
with open(file_path, 'r') as file:
|
|
809
|
-
return [line.strip() for line in file.readlines() if line.strip()]
|
|
810
|
-
|
|
811
|
-
def parse_employee_data(line):
|
|
812
|
-
"""Parse a CSV line into employee data dictionary."""
|
|
813
|
-
parts = line.split(',')
|
|
814
|
-
if len(parts) < 3:
|
|
815
|
-
return None
|
|
816
|
-
|
|
817
|
-
return {
|
|
818
|
-
'name': parts[0],
|
|
819
|
-
'age': int(parts[1]),
|
|
820
|
-
'salary': float(parts[2])
|
|
821
|
-
}
|
|
822
|
-
|
|
823
|
-
def calculate_tax_rate(employee):
|
|
824
|
-
"""Determine tax rate based on employee criteria."""
|
|
825
|
-
if employee['age'] > 30 and employee['salary'] < 50000:
|
|
826
|
-
return 0.15
|
|
827
|
-
return 0.2
|
|
828
|
-
|
|
829
|
-
def calculate_net_salary(employee):
|
|
830
|
-
"""Calculate employee's net salary after taxes."""
|
|
831
|
-
tax_rate = calculate_tax_rate(employee)
|
|
832
|
-
return employee['salary'] * (1 - tax_rate)
|
|
833
|
-
|
|
834
|
-
def process_data():
|
|
835
|
-
"""Main function to process employee data."""
|
|
836
|
-
lines = read_csv_file('data.csv')
|
|
837
|
-
employees = []
|
|
838
|
-
|
|
839
|
-
for line in lines:
|
|
840
|
-
employee = parse_employee_data(line)
|
|
841
|
-
if employee:
|
|
842
|
-
employee['net_salary'] = calculate_net_salary(employee)
|
|
843
|
-
employees.append(employee)
|
|
844
|
-
|
|
845
|
-
return employees
|
|
846
|
-
```
|
|
847
|
-
|
|
848
|
-
### UI Organization
|
|
849
|
-
|
|
850
|
-
**DO NOT**
|
|
851
|
-
```python
|
|
852
|
-
# Event handlers scattered throughout file and mixed with business logic
|
|
853
|
-
def initialize_app():
|
|
854
|
-
window = create_window("My App", 800, 600)
|
|
855
|
-
|
|
856
|
-
# Button click handlers
|
|
857
|
-
def on_save_button_click():
|
|
858
|
-
data = get_form_data()
|
|
859
|
-
validate_data(data)
|
|
860
|
-
save_to_database(data)
|
|
861
|
-
show_success_message("Data saved successfully!")
|
|
862
|
-
|
|
863
|
-
def validate_data(data):
|
|
864
|
-
if not data["name"]:
|
|
865
|
-
show_error("Name is required")
|
|
866
|
-
return False
|
|
867
|
-
if len(data["description"]) > 200:
|
|
868
|
-
show_error("Description too long")
|
|
869
|
-
return False
|
|
870
|
-
return True
|
|
871
|
-
|
|
872
|
-
save_button = create_button("Save", on_save_button_click)
|
|
873
|
-
|
|
874
|
-
def on_clear_button_click():
|
|
875
|
-
clear_form()
|
|
876
|
-
|
|
877
|
-
clear_button = create_button("Clear", on_clear_button_click)
|
|
878
|
-
|
|
879
|
-
# More UI setup code...
|
|
880
|
-
|
|
881
|
-
# Database functions mixed in
|
|
882
|
-
def save_to_database(data):
|
|
883
|
-
conn = get_database_connection()
|
|
884
|
-
# ... database code ...
|
|
885
|
-
conn.close()
|
|
886
|
-
**DO**
|
|
887
|
-
```python
|
|
888
|
-
# Organized by logical layers
|
|
889
|
-
class DataValidator:
|
|
890
|
-
"""Validates form data before processing."""
|
|
891
|
-
|
|
892
|
-
@staticmethod
|
|
893
|
-
def validate_save_data(data):
|
|
894
|
-
"""Validate data for saving."""
|
|
895
|
-
if not data["name"]:
|
|
896
|
-
return False, "Name is required"
|
|
897
|
-
|
|
898
|
-
if len(data["description"]) > 200:
|
|
899
|
-
return False, "Description too long"
|
|
900
|
-
|
|
901
|
-
return True, ""
|
|
902
|
-
|
|
903
|
-
class DatabaseService:
|
|
904
|
-
"""Handles database operations."""
|
|
905
|
-
|
|
906
|
-
@staticmethod
|
|
907
|
-
def save_data(data):
|
|
908
|
-
"""Save data to database."""
|
|
909
|
-
with get_database_connection() as conn:
|
|
910
|
-
# ... database code ...
|
|
911
|
-
return True
|
|
912
|
-
|
|
913
|
-
class EventHandlers:
|
|
914
|
-
"""All event handlers for the application UI."""
|
|
915
|
-
|
|
916
|
-
def __init__(self, ui, validator, db_service):
|
|
917
|
-
self.ui = ui
|
|
918
|
-
self.validator = validator
|
|
919
|
-
self.db_service = db_service
|
|
920
|
-
self.current_file = None
|
|
921
|
-
|
|
922
|
-
def on_save_button_click(self):
|
|
923
|
-
"""Handle save button click."""
|
|
924
|
-
data = self.ui.get_form_data()
|
|
925
|
-
|
|
926
|
-
# Validate data
|
|
927
|
-
valid, error_message = self.validator.validate_save_data(data)
|
|
928
|
-
if not valid:
|
|
929
|
-
self.ui.show_error(error_message)
|
|
930
|
-
return
|
|
931
|
-
|
|
932
|
-
# Save data
|
|
933
|
-
if self.db_service.save_data(data):
|
|
934
|
-
self.ui.show_success_message("Data saved successfully!")
|
|
935
|
-
else:
|
|
936
|
-
self.ui.show_error("Failed to save data")
|
|
937
|
-
|
|
938
|
-
def initialize_app():
|
|
939
|
-
"""Initialize the application."""
|
|
940
|
-
# Create services
|
|
941
|
-
validator = DataValidator()
|
|
942
|
-
db_service = DatabaseService()
|
|
943
|
-
|
|
944
|
-
# Create UI
|
|
945
|
-
ui = ApplicationUI()
|
|
946
|
-
|
|
947
|
-
# Create event handlers
|
|
948
|
-
handlers = EventHandlers(ui, validator, db_service)
|
|
949
|
-
|
|
950
|
-
# Connect UI events to handlers
|
|
951
|
-
ui.connect("save_button", handlers.on_save_button_click)
|
|
952
|
-
```
|
|
953
|
-
|
|
954
|
-
## Error Handling Rules
|
|
955
|
-
1. Handle error cases explicitly.
|
|
956
|
-
2. Make error messages specific and actionable.
|
|
957
|
-
3. Fail early at the source of the problem.
|
|
958
|
-
4. Use defensive programming for unexpected inputs.
|
|
959
|
-
5. Add redundant checks for critical code.
|
|
960
|
-
|
|
961
|
-
### Basic Error Handling
|
|
962
|
-
|
|
963
|
-
**DO NOT**
|
|
964
|
-
```python
|
|
965
|
-
def save_user_data(user):
|
|
966
|
-
try:
|
|
967
|
-
# Vague error handling
|
|
968
|
-
database.save(user)
|
|
969
|
-
except Exception as e:
|
|
970
|
-
print("Error")
|
|
971
|
-
```
|
|
972
|
-
|
|
973
|
-
**DO**
|
|
974
|
-
```python
|
|
975
|
-
def save_user_data(user):
|
|
976
|
-
if user is None:
|
|
977
|
-
raise ValueError("Cannot save None user")
|
|
978
|
-
|
|
979
|
-
try:
|
|
980
|
-
database.save(user)
|
|
981
|
-
except DatabaseConnectionError as e:
|
|
982
|
-
logger.error(f"Database connection failed while saving user {user.id}: {e}")
|
|
983
|
-
raise ServiceError("Unable to save user due to database connection issue") from e
|
|
984
|
-
except ValidationError as e:
|
|
985
|
-
logger.warning(f"User validation failed for user {user.id}: {e}")
|
|
986
|
-
raise InvalidUserDataError(f"User data is invalid: {e}") from e
|
|
987
|
-
except Exception as e:
|
|
988
|
-
logger.error(f"Unexpected error while saving user {user.id}", exc_info=True)
|
|
989
|
-
raise ServiceError("User save operation failed") from e
|
|
990
|
-
```
|
|
991
|
-
|
|
992
|
-
### Configuration Processing
|
|
993
|
-
|
|
994
|
-
**DO NOT**
|
|
995
|
-
```python
|
|
996
|
-
def process_config_file(filename):
|
|
997
|
-
# Doesn't handle errors specifically
|
|
998
|
-
with open(filename, 'r') as f:
|
|
999
|
-
config = json.load(f)
|
|
1000
|
-
|
|
1001
|
-
host = config['database']['host']
|
|
1002
|
-
port = config['database']['port']
|
|
1003
|
-
username = config['database']['credentials']['username']
|
|
1004
|
-
password = config['database']['credentials']['password']
|
|
1005
|
-
|
|
1006
|
-
return connect_to_database(host, port, username, password)
|
|
1007
|
-
```
|
|
1008
|
-
|
|
1009
|
-
**DO**
|
|
1010
|
-
```python
|
|
1011
|
-
def process_config_file(filename):
|
|
1012
|
-
"""Process configuration file and establish database connection.
|
|
1013
|
-
|
|
1014
|
-
Args:
|
|
1015
|
-
filename: Path to the configuration JSON file
|
|
1016
|
-
|
|
1017
|
-
Returns:
|
|
1018
|
-
Database connection object
|
|
1019
|
-
|
|
1020
|
-
Raises:
|
|
1021
|
-
ConfigError: When file has missing or invalid configuration
|
|
1022
|
-
ConnectionError: When database connection fails
|
|
1023
|
-
"""
|
|
1024
|
-
# File existence and permission checks
|
|
1025
|
-
if not os.path.exists(filename):
|
|
1026
|
-
raise ConfigError(f"Configuration file not found: {filename}")
|
|
1027
|
-
|
|
1028
|
-
if not os.access(filename, os.R_OK):
|
|
1029
|
-
raise ConfigError(f"No permission to read configuration file: {filename}")
|
|
1030
|
-
|
|
1031
|
-
# File opening and parsing
|
|
1032
|
-
try:
|
|
1033
|
-
with open(filename, 'r') as f:
|
|
1034
|
-
try:
|
|
1035
|
-
config = json.load(f)
|
|
1036
|
-
except json.JSONDecodeError as e:
|
|
1037
|
-
raise ConfigError(f"Invalid JSON in configuration file: {e}") from e
|
|
1038
|
-
except IOError as e:
|
|
1039
|
-
raise ConfigError(f"Unable to read configuration file: {e}") from e
|
|
1040
|
-
|
|
1041
|
-
# Configuration validation
|
|
1042
|
-
try:
|
|
1043
|
-
database_config = config.get('database')
|
|
1044
|
-
if not database_config:
|
|
1045
|
-
raise ConfigError("Missing 'database' section in config")
|
|
1046
|
-
|
|
1047
|
-
host = database_config.get('host')
|
|
1048
|
-
if not host:
|
|
1049
|
-
raise ConfigError("Missing database host in config")
|
|
1050
|
-
|
|
1051
|
-
port = database_config.get('port')
|
|
1052
|
-
if not isinstance(port, int):
|
|
1053
|
-
raise ConfigError(f"Invalid database port: {port}")
|
|
1054
|
-
|
|
1055
|
-
credentials = database_config.get('credentials', {})
|
|
1056
|
-
username = credentials.get('username')
|
|
1057
|
-
password = credentials.get('password')
|
|
1058
|
-
|
|
1059
|
-
if not username or not password:
|
|
1060
|
-
raise ConfigError("Missing database credentials in config")
|
|
1061
|
-
except Exception as e:
|
|
1062
|
-
if not isinstance(e, ConfigError):
|
|
1063
|
-
raise ConfigError(f"Error processing configuration: {e}") from e
|
|
1064
|
-
raise
|
|
1065
|
-
|
|
1066
|
-
# Connection attempt with specific error handling
|
|
1067
|
-
try:
|
|
1068
|
-
return connect_to_database(host, port, username, password)
|
|
1069
|
-
except ConnectionRefusedError:
|
|
1070
|
-
raise ConnectionError(f"Database refused connection at {host}:{port}")
|
|
1071
|
-
except AuthenticationError:
|
|
1072
|
-
raise ConnectionError("Invalid database credentials")
|
|
1073
|
-
except Exception as e:
|
|
1074
|
-
raise ConnectionError(f"Failed to connect to database: {e}") from e
|
|
1075
|
-
```
|
|
1076
|
-
|
|
1077
|
-
## Testing Rules
|
|
1078
|
-
1. Write tests for both expected and edge cases.
|
|
1079
|
-
2. Make test failures easy to diagnose.
|
|
1080
|
-
3. Test with realistic data.
|
|
1081
|
-
4. Test the interface, not the implementation.
|
|
1082
|
-
5. Write self-testing code where practical.
|
|
1083
|
-
|
|
1084
|
-
### Basic Testing
|
|
1085
|
-
|
|
1086
|
-
**DO NOT**
|
|
1087
|
-
```python
|
|
1088
|
-
def test_user_registration():
|
|
1089
|
-
user = register_user("john", "password123", "john@example.com")
|
|
1090
|
-
assert user is not None
|
|
1091
|
-
|
|
1092
|
-
```
|
|
1093
|
-
**DO**
|
|
1094
|
-
```python
|
|
1095
|
-
def test_user_registration_with_valid_data():
|
|
1096
|
-
# Arrange
|
|
1097
|
-
username = "john_doe"
|
|
1098
|
-
password = "password123"
|
|
1099
|
-
email = "john@example.com"
|
|
1100
|
-
|
|
1101
|
-
# Act
|
|
1102
|
-
user = register_user(username, password, email)
|
|
1103
|
-
|
|
1104
|
-
# Assert
|
|
1105
|
-
assert user.username == username
|
|
1106
|
-
assert user.email == email
|
|
1107
|
-
assert user.is_active is True
|
|
1108
|
-
assert user.id is not None
|
|
1109
|
-
|
|
1110
|
-
def test_user_registration_with_duplicate_username():
|
|
1111
|
-
# Arrange - create a user first
|
|
1112
|
-
existing_username = "existing_user"
|
|
1113
|
-
User.objects.create(username=existing_username, email="existing@example.com")
|
|
1114
|
-
|
|
1115
|
-
# Act & Assert
|
|
1116
|
-
with pytest.raises(DuplicateUsernameError) as excinfo:
|
|
1117
|
-
register_user(existing_username, "password123", "new@example.com")
|
|
1118
|
-
|
|
1119
|
-
assert "Username already exists" in str(excinfo.value)
|
|
1120
|
-
```
|
|
1121
|
-
|
|
1122
|
-
### Test Organization
|
|
1123
|
-
|
|
1124
|
-
**DO NOT**
|
|
1125
|
-
```python
|
|
1126
|
-
def test_payment():
|
|
1127
|
-
# Multiple things tested in one test
|
|
1128
|
-
payment = Payment(100, "USD", "credit_card")
|
|
1129
|
-
assert payment.amount == 100
|
|
1130
|
-
assert payment.validate() is True
|
|
1131
|
-
|
|
1132
|
-
processed = payment.process()
|
|
1133
|
-
assert processed is True
|
|
1134
|
-
|
|
1135
|
-
refunded = payment.refund()
|
|
1136
|
-
assert refunded is True
|
|
1137
|
-
```
|
|
1138
|
-
|
|
1139
|
-
**DO**
|
|
1140
|
-
```python
|
|
1141
|
-
class TestPaymentCreation:
|
|
1142
|
-
"""Tests for payment object creation and validation."""
|
|
1143
|
-
|
|
1144
|
-
def test_payment_initialized_with_correct_amount(self):
|
|
1145
|
-
payment = Payment(100, "USD", "credit_card")
|
|
1146
|
-
assert payment.amount == 100
|
|
1147
|
-
assert payment.currency == "USD"
|
|
1148
|
-
assert payment.method == "credit_card"
|
|
1149
|
-
|
|
1150
|
-
def test_payment_validates_with_valid_data(self):
|
|
1151
|
-
payment = Payment(100, "USD", "credit_card")
|
|
1152
|
-
assert payment.validate() is True
|
|
1153
|
-
|
|
1154
|
-
def test_payment_validation_fails_with_negative_amount(self):
|
|
1155
|
-
payment = Payment(-50, "USD", "credit_card")
|
|
1156
|
-
assert payment.validate() is False
|
|
1157
|
-
assert "amount must be positive" in payment.validation_errors
|
|
1158
|
-
|
|
1159
|
-
class TestPaymentProcessing:
|
|
1160
|
-
"""Tests for payment processing operations."""
|
|
1161
|
-
|
|
1162
|
-
def setup_method(self):
|
|
1163
|
-
"""Set up a valid payment for each test."""
|
|
1164
|
-
self.payment = Payment(100, "USD", "credit_card")
|
|
1165
|
-
self.payment.card_number = "4111111111111111"
|
|
1166
|
-
self.payment.expiry = "12/25"
|
|
1167
|
-
self.payment.cvv = "123"
|
|
1168
|
-
|
|
1169
|
-
def test_valid_payment_processes_successfully(self):
|
|
1170
|
-
assert self.payment.process() is True
|
|
1171
|
-
assert self.payment.status == "processed"
|
|
1172
|
-
assert self.payment.transaction_id is not None
|
|
1173
|
-
```
|
|
1174
|
-
|
|
1175
|
-
## Optimization Rules
|
|
1176
|
-
1. Optimize for readability first, performance second.
|
|
1177
|
-
2. Profile before optimizing.
|
|
1178
|
-
3. Comment on non-obvious optimization techniques.
|
|
1179
|
-
4. Keep optimized (less readable) code isolated.
|
|
1180
|
-
5. Document performance goals and constraints.
|
|
1181
|
-
|
|
1182
|
-
### Basic Optimization
|
|
1183
|
-
|
|
1184
|
-
**DO NOT**
|
|
1185
|
-
```python
|
|
1186
|
-
# Unnecessarily complex optimization without explanation
|
|
1187
|
-
def find_closest_points(points, target, k=5):
|
|
1188
|
-
return sorted(points, key=lambda p: (p[0]-target[0])**2+(p[1]-target[1])**2)[:k]
|
|
1189
|
-
```
|
|
1190
|
-
|
|
1191
|
-
**DO**
|
|
1192
|
-
```python
|
|
1193
|
-
def find_closest_points(points, target, k=5):
|
|
1194
|
-
"""Find k points closest to target point using Euclidean distance.
|
|
1195
|
-
|
|
1196
|
-
Implementation notes:
|
|
1197
|
-
- We avoid using sqrt() in the distance calculation as it's unnecessary
|
|
1198
|
-
for comparison and improves performance by ~40%
|
|
1199
|
-
- For large point sets (>10000), consider using a KD-tree instead
|
|
1200
|
-
which would change time complexity from O(n log n) to O(k log n)
|
|
1201
|
-
"""
|
|
1202
|
-
def squared_distance(p):
|
|
1203
|
-
# Avoid unnecessary sqrt calculation for performance
|
|
1204
|
-
return (p[0] - target[0])**2 + (p[1] - target[1])**2
|
|
1205
|
-
|
|
1206
|
-
# Sort by squared distance and return k closest points
|
|
1207
|
-
return sorted(points, key=squared_distance)[:k]
|
|
1208
|
-
```
|
|
1209
|
-
|
|
1210
|
-
### Premature Optimization
|
|
1211
|
-
|
|
1212
|
-
**DO NOT**
|
|
1213
|
-
```python
|
|
1214
|
-
def calculate_statistics(values):
|
|
1215
|
-
"""Calculate mean, median, and mode of a dataset."""
|
|
1216
|
-
# Premature micro-optimization with complex one-liners
|
|
1217
|
-
# and unnecessary caching that reduces readability
|
|
1218
|
-
_len = len(values) # Cache length to avoid multiple calls
|
|
1219
|
-
_sorted = sorted(values) if _len > 0 else [] # Pre-sort once for both median and mode
|
|
1220
|
-
|
|
1221
|
-
# Complex one-liner for mean
|
|
1222
|
-
mean = sum(values) / _len if _len > 0 else 0
|
|
1223
|
-
|
|
1224
|
-
# Complex calculation of median to avoid creating temporary lists
|
|
1225
|
-
median = (_sorted[_len//2] if _len % 2 == 1 else
|
|
1226
|
-
(_sorted[_len//2-1] + _sorted[_len//2]) / 2) if _len > 0 else 0
|
|
1227
|
-
|
|
1228
|
-
# Manual frequency counting to avoid Counter overhead
|
|
1229
|
-
_freq = {}
|
|
1230
|
-
for v in values:
|
|
1231
|
-
_freq[v] = _freq.get(v, 0) + 1
|
|
1232
|
-
|
|
1233
|
-
# Find mode with max() for performance
|
|
1234
|
-
mode = max(_freq.items(), key=lambda x: x[1])[0] if _freq else None
|
|
1235
|
-
|
|
1236
|
-
return {"mean": mean, "median": median, "mode": mode}
|
|
1237
|
-
|
|
1238
|
-
```
|
|
1239
|
-
|
|
1240
|
-
**DO**
|
|
1241
|
-
```python
|
|
1242
|
-
def calculate_statistics(values):
|
|
1243
|
-
"""Calculate mean, median, and mode of a dataset.
|
|
1244
|
-
|
|
1245
|
-
This implementation prioritizes readability over micro-optimizations.
|
|
1246
|
-
Performance testing showed it handles datasets of up to 100,000 elements
|
|
1247
|
-
in under 50ms, which is sufficient for our current needs.
|
|
1248
|
-
|
|
1249
|
-
For larger datasets, consider using NumPy's statistical functions which
|
|
1250
|
-
are implemented in optimized C code.
|
|
1251
|
-
|
|
1252
|
-
Args:
|
|
1253
|
-
values: List of numeric values
|
|
1254
|
-
|
|
1255
|
-
Returns:
|
|
1256
|
-
Dict containing mean, median, and mode
|
|
1257
|
-
"""
|
|
1258
|
-
if not values:
|
|
1259
|
-
return {"mean": 0, "median": 0, "mode": None}
|
|
1260
|
-
|
|
1261
|
-
# Calculate mean
|
|
1262
|
-
mean = sum(values) / len(values)
|
|
1263
|
-
|
|
1264
|
-
# Calculate median
|
|
1265
|
-
sorted_values = sorted(values)
|
|
1266
|
-
n = len(sorted_values)
|
|
1267
|
-
|
|
1268
|
-
if n % 2 == 1:
|
|
1269
|
-
# Odd number of values
|
|
1270
|
-
median = sorted_values[n // 2]
|
|
1271
|
-
else:
|
|
1272
|
-
# Even number of values
|
|
1273
|
-
middle_right = n // 2
|
|
1274
|
-
middle_left = middle_right - 1
|
|
1275
|
-
median = (sorted_values[middle_left] + sorted_values[middle_right]) / 2
|
|
1276
|
-
|
|
1277
|
-
# Calculate mode using Counter
|
|
1278
|
-
from collections import Counter
|
|
1279
|
-
value_counts = Counter(values)
|
|
1280
|
-
mode_value, mode_count = value_counts.most_common(1)[0]
|
|
1281
|
-
|
|
1282
|
-
# If all values appear the same number of times, there's no mode
|
|
1283
|
-
if mode_count == 1 and len(values) > 1:
|
|
1284
|
-
mode = None
|
|
1285
|
-
else:
|
|
1286
|
-
mode = mode_value
|
|
1287
|
-
|
|
1288
|
-
return {"mean": mean, "median": median, "mode": mode}
|
|
1289
|
-
```
|
|
1290
|
-
|
|
1291
|
-
## Key Takeaways
|
|
1292
|
-
|
|
1293
|
-
1. **Optimize for human understanding**: Write code for people first, computers second. The primary measure of code quality is how quickly another developer can understand it.
|
|
1294
|
-
|
|
1295
|
-
2. **Meaningful names reveal intent**: Choose descriptive, specific names for variables, functions, and classes. Good names act as documentation and make code self-explanatory.
|
|
1296
|
-
|
|
1297
|
-
3. **Consistent formatting enhances readability**: Use consistent spacing, indentation, and line breaks to visually organize code into logical groups.
|
|
1298
|
-
|
|
1299
|
-
4. **Comments explain "why" not "what"**: Focus on explaining reasoning, edge cases, and non-obvious constraints rather than restating what the code does.
|
|
1300
|
-
|
|
1301
|
-
5. **Simple is better than clever**: Avoid complex expressions and "clever" tricks. Break complexity into simpler components with clear names.
|
|
1302
|
-
|
|
1303
|
-
6. **Functions should do one thing well**: Keep functions small, focused, and operating at a single level of abstraction. Extract unrelated operations into separate functions.
|
|
1304
|
-
|
|
1305
|
-
7. **Early returns reduce nesting**: Use guard clauses and early returns to handle edge cases first, keeping the main logic path clean and less nested.
|
|
1306
|
-
|
|
1307
|
-
8. **Strong typing prevents errors**: Use typed data structures, validation, and assertions to catch errors early and make expectations explicit.
|
|
1308
|
-
|
|
1309
|
-
9. **Organize code by logical layers**: Separate concerns by grouping related functionality. Structure code from high-level to low-level within each file.
|
|
1310
|
-
|
|
1311
|
-
10. **Specific error handling is actionable**: Handle error cases explicitly with descriptive messages that guide toward resolution.
|
|
1312
|
-
|
|
1313
|
-
11. **Test interfaces, not implementations**: Write tests that verify behavior from the user's perspective rather than internal implementation details.
|
|
1314
|
-
|
|
1315
|
-
12. **Prioritize readability over premature optimization**: Focus on making code correct and clear first. Only optimize after profiling identifies actual bottlenecks.
|
|
1316
|
-
|
|
1317
|
-
<!-- EOF -->
|