@ncukondo/search-hub 0.12.0 → 0.12.2
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.
- package/dist/_virtual/_commonjsHelpers.js +30 -0
- package/dist/_virtual/_commonjsHelpers.js.map +1 -0
- package/dist/_virtual/aliases.js +5 -0
- package/dist/_virtual/aliases.js.map +1 -0
- package/dist/_virtual/attributes.js +5 -0
- package/dist/_virtual/attributes.js.map +1 -0
- package/dist/_virtual/back.js +5 -0
- package/dist/_virtual/back.js.map +1 -0
- package/dist/_virtual/comment.js +5 -0
- package/dist/_virtual/comment.js.map +1 -0
- package/dist/_virtual/compile.js +5 -0
- package/dist/_virtual/compile.js.map +1 -0
- package/dist/_virtual/compile2.js +5 -0
- package/dist/_virtual/compile2.js.map +1 -0
- package/dist/_virtual/decode-data-html.js +5 -0
- package/dist/_virtual/decode-data-html.js.map +1 -0
- package/dist/_virtual/decode-data-xml.js +5 -0
- package/dist/_virtual/decode-data-xml.js.map +1 -0
- package/dist/_virtual/decode.js +5 -0
- package/dist/_virtual/decode.js.map +1 -0
- package/dist/_virtual/decode_codepoint.js +5 -0
- package/dist/_virtual/decode_codepoint.js.map +1 -0
- package/dist/_virtual/encode-html.js +5 -0
- package/dist/_virtual/encode-html.js.map +1 -0
- package/dist/_virtual/encode.js +5 -0
- package/dist/_virtual/encode.js.map +1 -0
- package/dist/_virtual/escape.js +5 -0
- package/dist/_virtual/escape.js.map +1 -0
- package/dist/_virtual/feeds.js +5 -0
- package/dist/_virtual/feeds.js.map +1 -0
- package/dist/_virtual/filters.js +5 -0
- package/dist/_virtual/filters.js.map +1 -0
- package/dist/_virtual/foreignNames.js +5 -0
- package/dist/_virtual/foreignNames.js.map +1 -0
- package/dist/_virtual/general.js +5 -0
- package/dist/_virtual/general.js.map +1 -0
- package/dist/_virtual/he.js +5 -0
- package/dist/_virtual/he.js.map +1 -0
- package/dist/_virtual/helpers.js +5 -0
- package/dist/_virtual/helpers.js.map +1 -0
- package/dist/_virtual/html.js +5 -0
- package/dist/_virtual/html.js.map +1 -0
- package/dist/_virtual/index.js +6 -0
- package/dist/_virtual/index.js.map +1 -0
- package/dist/_virtual/index10.js +5 -0
- package/dist/_virtual/index10.js.map +1 -0
- package/dist/_virtual/index11.js +5 -0
- package/dist/_virtual/index11.js.map +1 -0
- package/dist/_virtual/index2.js +5 -0
- package/dist/_virtual/index2.js.map +1 -0
- package/dist/_virtual/index3.js +5 -0
- package/dist/_virtual/index3.js.map +1 -0
- package/dist/_virtual/index4.js +5 -0
- package/dist/_virtual/index4.js.map +1 -0
- package/dist/_virtual/index5.js +7 -0
- package/dist/_virtual/index5.js.map +1 -0
- package/dist/_virtual/index6.js +5 -0
- package/dist/_virtual/index6.js.map +1 -0
- package/dist/_virtual/index7.js +5 -0
- package/dist/_virtual/index7.js.map +1 -0
- package/dist/_virtual/index8.js +5 -0
- package/dist/_virtual/index8.js.map +1 -0
- package/dist/_virtual/index9.js +5 -0
- package/dist/_virtual/index9.js.map +1 -0
- package/dist/_virtual/legacy.js +5 -0
- package/dist/_virtual/legacy.js.map +1 -0
- package/dist/_virtual/manipulation.js +5 -0
- package/dist/_virtual/manipulation.js.map +1 -0
- package/dist/_virtual/matcher.js +5 -0
- package/dist/_virtual/matcher.js.map +1 -0
- package/dist/_virtual/node.js +5 -0
- package/dist/_virtual/node.js.map +1 -0
- package/dist/_virtual/node2.js +5 -0
- package/dist/_virtual/node2.js.map +1 -0
- package/dist/_virtual/parse.js +5 -0
- package/dist/_virtual/parse.js.map +1 -0
- package/dist/_virtual/parse2.js +5 -0
- package/dist/_virtual/parse2.js.map +1 -0
- package/dist/_virtual/pseudos.js +5 -0
- package/dist/_virtual/pseudos.js.map +1 -0
- package/dist/_virtual/querying.js +5 -0
- package/dist/_virtual/querying.js.map +1 -0
- package/dist/_virtual/sort.js +5 -0
- package/dist/_virtual/sort.js.map +1 -0
- package/dist/_virtual/stringify.js +5 -0
- package/dist/_virtual/stringify.js.map +1 -0
- package/dist/_virtual/subselects.js +5 -0
- package/dist/_virtual/subselects.js.map +1 -0
- package/dist/_virtual/text.js +5 -0
- package/dist/_virtual/text.js.map +1 -0
- package/dist/_virtual/traversal.js +5 -0
- package/dist/_virtual/traversal.js.map +1 -0
- package/dist/_virtual/type.js +5 -0
- package/dist/_virtual/type.js.map +1 -0
- package/dist/_virtual/valid.js +5 -0
- package/dist/_virtual/valid.js.map +1 -0
- package/dist/_virtual/void-tag.js +5 -0
- package/dist/_virtual/void-tag.js.map +1 -0
- package/dist/cli/commands/fulltext/attach.js +1 -1
- package/dist/cli/commands/fulltext/attach.js.map +1 -1
- package/dist/cli/commands/fulltext/check.d.ts +1 -2
- package/dist/cli/commands/fulltext/check.d.ts.map +1 -1
- package/dist/cli/commands/fulltext/check.js +4 -2
- package/dist/cli/commands/fulltext/check.js.map +1 -1
- package/dist/cli/commands/fulltext/convert.d.ts.map +1 -1
- package/dist/cli/commands/fulltext/convert.js +8 -8
- package/dist/cli/commands/fulltext/convert.js.map +1 -1
- package/dist/cli/commands/fulltext/fetch.d.ts.map +1 -1
- package/dist/cli/commands/fulltext/fetch.js +10 -6
- package/dist/cli/commands/fulltext/fetch.js.map +1 -1
- package/dist/cli/commands/fulltext/index.d.ts.map +1 -1
- package/dist/cli/commands/fulltext/index.js +2 -0
- package/dist/cli/commands/fulltext/index.js.map +1 -1
- package/dist/cli/commands/fulltext/init.d.ts.map +1 -1
- package/dist/cli/commands/fulltext/init.js +6 -5
- package/dist/cli/commands/fulltext/init.js.map +1 -1
- package/dist/cli/commands/fulltext/pending.d.ts +1 -1
- package/dist/cli/commands/fulltext/pending.d.ts.map +1 -1
- package/dist/cli/commands/fulltext/pending.js +4 -2
- package/dist/cli/commands/fulltext/pending.js.map +1 -1
- package/dist/cli/commands/fulltext/status.d.ts.map +1 -1
- package/dist/cli/commands/fulltext/status.js +4 -2
- package/dist/cli/commands/fulltext/status.js.map +1 -1
- package/dist/cli/commands/fulltext/sync.d.ts.map +1 -1
- package/dist/cli/commands/fulltext/sync.js +6 -2
- package/dist/cli/commands/fulltext/sync.js.map +1 -1
- package/dist/cli/commands/review/types.d.ts +1 -1
- package/dist/cli/commands/review/types.d.ts.map +1 -1
- package/dist/cli/commands/review/types.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/schema.d.ts +2 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +6 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/{fulltext → integration}/attach-shared.d.ts +2 -2
- package/dist/integration/attach-shared.d.ts.map +1 -0
- package/dist/integration/attach-shared.js.map +1 -0
- package/dist/integration/fulltext-attach.js +1 -1
- package/dist/integration/fulltext-attach.js.map +1 -1
- package/dist/{fulltext → node_modules/@ncukondo/academic-fulltext/dist}/citation-key.js +1 -1
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/citation-key.js.map +1 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/convert/arxiv-html-parser.js +434 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/convert/arxiv-html-parser.js.map +1 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/convert/index.js +93 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/convert/index.js.map +1 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/convert/jats-parser.js +1060 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/convert/jats-parser.js.map +1 -0
- package/dist/{fulltext → node_modules/@ncukondo/academic-fulltext/dist}/convert/markdown-writer.js +146 -117
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/convert/markdown-writer.js.map +1 -0
- package/dist/{fulltext → node_modules/@ncukondo/academic-fulltext/dist}/discovery/arxiv.js +8 -1
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/discovery/arxiv.js.map +1 -0
- package/dist/{fulltext → node_modules/@ncukondo/academic-fulltext/dist}/discovery/core.js +6 -3
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/discovery/core.js.map +1 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/discovery/index.js +139 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/discovery/index.js.map +1 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/discovery/ncbi-id-converter.js +46 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/discovery/ncbi-id-converter.js.map +1 -0
- package/dist/{fulltext → node_modules/@ncukondo/academic-fulltext/dist}/discovery/pmc.js +8 -4
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/discovery/pmc.js.map +1 -0
- package/dist/{fulltext → node_modules/@ncukondo/academic-fulltext/dist}/discovery/unpaywall.js +43 -9
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/discovery/unpaywall.js.map +1 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/download/arxiv-html.js +48 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/download/arxiv-html.js.map +1 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/download/downloader.js +64 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/download/downloader.js.map +1 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/download/orchestrator.js +236 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/download/orchestrator.js.map +1 -0
- package/dist/{fulltext → node_modules/@ncukondo/academic-fulltext/dist}/download/pmc-xml.js +2 -1
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/download/pmc-xml.js.map +1 -0
- package/dist/{fulltext → node_modules/@ncukondo/academic-fulltext/dist}/meta.js +15 -10
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/meta.js.map +1 -0
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/paths.js.map +1 -0
- package/dist/{fulltext → node_modules/@ncukondo/academic-fulltext/dist}/readme.js +8 -4
- package/dist/node_modules/@ncukondo/academic-fulltext/dist/readme.js.map +1 -0
- package/dist/node_modules/boolbase/index.js +19 -0
- package/dist/node_modules/boolbase/index.js.map +1 -0
- package/dist/node_modules/css-select/lib/attributes.js +203 -0
- package/dist/node_modules/css-select/lib/attributes.js.map +1 -0
- package/dist/node_modules/css-select/lib/compile.js +141 -0
- package/dist/node_modules/css-select/lib/compile.js.map +1 -0
- package/dist/node_modules/css-select/lib/general.js +154 -0
- package/dist/node_modules/css-select/lib/general.js.map +1 -0
- package/dist/node_modules/css-select/lib/index.js +128 -0
- package/dist/node_modules/css-select/lib/index.js.map +1 -0
- package/dist/node_modules/css-select/lib/pseudo-selectors/aliases.js +40 -0
- package/dist/node_modules/css-select/lib/pseudo-selectors/aliases.js.map +1 -0
- package/dist/node_modules/css-select/lib/pseudo-selectors/filters.js +163 -0
- package/dist/node_modules/css-select/lib/pseudo-selectors/filters.js.map +1 -0
- package/dist/node_modules/css-select/lib/pseudo-selectors/index.js +71 -0
- package/dist/node_modules/css-select/lib/pseudo-selectors/index.js.map +1 -0
- package/dist/node_modules/css-select/lib/pseudo-selectors/pseudos.js +93 -0
- package/dist/node_modules/css-select/lib/pseudo-selectors/pseudos.js.map +1 -0
- package/dist/node_modules/css-select/lib/pseudo-selectors/subselects.js +111 -0
- package/dist/node_modules/css-select/lib/pseudo-selectors/subselects.js.map +1 -0
- package/dist/node_modules/css-select/lib/sort.js +78 -0
- package/dist/node_modules/css-select/lib/sort.js.map +1 -0
- package/dist/node_modules/css-what/lib/es/index.js +12 -0
- package/dist/node_modules/css-what/lib/es/index.js.map +1 -0
- package/dist/node_modules/css-what/lib/es/parse.js +349 -0
- package/dist/node_modules/css-what/lib/es/parse.js.map +1 -0
- package/dist/node_modules/css-what/lib/es/stringify.js +102 -0
- package/dist/node_modules/css-what/lib/es/stringify.js.map +1 -0
- package/dist/node_modules/css-what/lib/es/types.js +37 -0
- package/dist/node_modules/css-what/lib/es/types.js.map +1 -0
- package/dist/node_modules/dom-serializer/lib/foreignNames.js +117 -0
- package/dist/node_modules/dom-serializer/lib/foreignNames.js.map +1 -0
- package/dist/node_modules/dom-serializer/lib/index.js +207 -0
- package/dist/node_modules/dom-serializer/lib/index.js.map +1 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/decode.js +368 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/decode.js.map +1 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/decode_codepoint.js +70 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/decode_codepoint.js.map +1 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/encode.js +61 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/encode.js.map +1 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/escape.js +79 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/escape.js.map +1 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-html.js +18 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-html.js.map +1 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-xml.js +18 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/decode-data-xml.js.map +1 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/encode-html.js +19 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/generated/encode-html.js.map +1 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/index.js +139 -0
- package/dist/node_modules/dom-serializer/node_modules/entities/lib/index.js.map +1 -0
- package/dist/node_modules/domelementtype/lib/index.js +40 -0
- package/dist/node_modules/domelementtype/lib/index.js.map +1 -0
- package/dist/node_modules/domhandler/lib/index.js +167 -0
- package/dist/node_modules/domhandler/lib/index.js.map +1 -0
- package/dist/node_modules/domhandler/lib/node.js +439 -0
- package/dist/node_modules/domhandler/lib/node.js.map +1 -0
- package/dist/node_modules/domutils/lib/feeds.js +146 -0
- package/dist/node_modules/domutils/lib/feeds.js.map +1 -0
- package/dist/node_modules/domutils/lib/helpers.js +97 -0
- package/dist/node_modules/domutils/lib/helpers.js.map +1 -0
- package/dist/node_modules/domutils/lib/index.js +65 -0
- package/dist/node_modules/domutils/lib/index.js.map +1 -0
- package/dist/node_modules/domutils/lib/legacy.js +124 -0
- package/dist/node_modules/domutils/lib/legacy.js.map +1 -0
- package/dist/node_modules/domutils/lib/manipulation.js +107 -0
- package/dist/node_modules/domutils/lib/manipulation.js.map +1 -0
- package/dist/node_modules/domutils/lib/querying.js +102 -0
- package/dist/node_modules/domutils/lib/querying.js.map +1 -0
- package/dist/node_modules/domutils/lib/stringify.js +65 -0
- package/dist/node_modules/domutils/lib/stringify.js.map +1 -0
- package/dist/node_modules/domutils/lib/traversal.js +69 -0
- package/dist/node_modules/domutils/lib/traversal.js.map +1 -0
- package/dist/node_modules/he/he.js +256 -0
- package/dist/node_modules/he/he.js.map +1 -0
- package/dist/node_modules/node-html-parser/dist/back.js +16 -0
- package/dist/node_modules/node-html-parser/dist/back.js.map +1 -0
- package/dist/node_modules/node-html-parser/dist/index.js +48 -0
- package/dist/node_modules/node-html-parser/dist/index.js.map +1 -0
- package/dist/node_modules/node-html-parser/dist/matcher.js +112 -0
- package/dist/node_modules/node-html-parser/dist/matcher.js.map +1 -0
- package/dist/node_modules/node-html-parser/dist/nodes/comment.js +41 -0
- package/dist/node_modules/node-html-parser/dist/nodes/comment.js.map +1 -0
- package/dist/node_modules/node-html-parser/dist/nodes/html.js +1048 -0
- package/dist/node_modules/node-html-parser/dist/nodes/html.js.map +1 -0
- package/dist/node_modules/node-html-parser/dist/nodes/node.js +49 -0
- package/dist/node_modules/node-html-parser/dist/nodes/node.js.map +1 -0
- package/dist/node_modules/node-html-parser/dist/nodes/text.js +106 -0
- package/dist/node_modules/node-html-parser/dist/nodes/text.js.map +1 -0
- package/dist/node_modules/node-html-parser/dist/nodes/type.js +19 -0
- package/dist/node_modules/node-html-parser/dist/nodes/type.js.map +1 -0
- package/dist/node_modules/node-html-parser/dist/parse.js +20 -0
- package/dist/node_modules/node-html-parser/dist/parse.js.map +1 -0
- package/dist/node_modules/node-html-parser/dist/valid.js +19 -0
- package/dist/node_modules/node-html-parser/dist/valid.js.map +1 -0
- package/dist/node_modules/node-html-parser/dist/void-tag.js +36 -0
- package/dist/node_modules/node-html-parser/dist/void-tag.js.map +1 -0
- package/dist/node_modules/nth-check/lib/compile.js +76 -0
- package/dist/node_modules/nth-check/lib/compile.js.map +1 -0
- package/dist/node_modules/nth-check/lib/index.js +36 -0
- package/dist/node_modules/nth-check/lib/index.js.map +1 -0
- package/dist/node_modules/nth-check/lib/parse.js +69 -0
- package/dist/node_modules/nth-check/lib/parse.js.map +1 -0
- package/package.json +2 -2
- package/dist/fulltext/attach-shared.d.ts.map +0 -1
- package/dist/fulltext/attach-shared.js.map +0 -1
- package/dist/fulltext/citation-key.d.ts +0 -15
- package/dist/fulltext/citation-key.d.ts.map +0 -1
- package/dist/fulltext/citation-key.js.map +0 -1
- package/dist/fulltext/convert/index.d.ts +0 -20
- package/dist/fulltext/convert/index.d.ts.map +0 -1
- package/dist/fulltext/convert/index.js +0 -50
- package/dist/fulltext/convert/index.js.map +0 -1
- package/dist/fulltext/convert/jats-parser.d.ts +0 -36
- package/dist/fulltext/convert/jats-parser.d.ts.map +0 -1
- package/dist/fulltext/convert/jats-parser.js +0 -887
- package/dist/fulltext/convert/jats-parser.js.map +0 -1
- package/dist/fulltext/convert/markdown-writer.d.ts +0 -6
- package/dist/fulltext/convert/markdown-writer.d.ts.map +0 -1
- package/dist/fulltext/convert/markdown-writer.js.map +0 -1
- package/dist/fulltext/convert/types.d.ts +0 -141
- package/dist/fulltext/convert/types.d.ts.map +0 -1
- package/dist/fulltext/discovery/arxiv.d.ts +0 -11
- package/dist/fulltext/discovery/arxiv.d.ts.map +0 -1
- package/dist/fulltext/discovery/arxiv.js.map +0 -1
- package/dist/fulltext/discovery/core.d.ts +0 -11
- package/dist/fulltext/discovery/core.d.ts.map +0 -1
- package/dist/fulltext/discovery/core.js.map +0 -1
- package/dist/fulltext/discovery/index.d.ts +0 -28
- package/dist/fulltext/discovery/index.d.ts.map +0 -1
- package/dist/fulltext/discovery/index.js +0 -75
- package/dist/fulltext/discovery/index.js.map +0 -1
- package/dist/fulltext/discovery/pmc.d.ts +0 -19
- package/dist/fulltext/discovery/pmc.d.ts.map +0 -1
- package/dist/fulltext/discovery/pmc.js.map +0 -1
- package/dist/fulltext/discovery/unpaywall.d.ts +0 -11
- package/dist/fulltext/discovery/unpaywall.d.ts.map +0 -1
- package/dist/fulltext/discovery/unpaywall.js.map +0 -1
- package/dist/fulltext/download/downloader.d.ts +0 -21
- package/dist/fulltext/download/downloader.d.ts.map +0 -1
- package/dist/fulltext/download/downloader.js +0 -59
- package/dist/fulltext/download/downloader.js.map +0 -1
- package/dist/fulltext/download/orchestrator.d.ts +0 -33
- package/dist/fulltext/download/orchestrator.d.ts.map +0 -1
- package/dist/fulltext/download/orchestrator.js +0 -125
- package/dist/fulltext/download/orchestrator.js.map +0 -1
- package/dist/fulltext/download/pmc-xml.d.ts +0 -13
- package/dist/fulltext/download/pmc-xml.d.ts.map +0 -1
- package/dist/fulltext/download/pmc-xml.js.map +0 -1
- package/dist/fulltext/meta.d.ts +0 -25
- package/dist/fulltext/meta.d.ts.map +0 -1
- package/dist/fulltext/meta.js.map +0 -1
- package/dist/fulltext/paths.d.ts +0 -12
- package/dist/fulltext/paths.d.ts.map +0 -1
- package/dist/fulltext/paths.js.map +0 -1
- package/dist/fulltext/readme.d.ts +0 -4
- package/dist/fulltext/readme.d.ts.map +0 -1
- package/dist/fulltext/readme.js.map +0 -1
- package/dist/fulltext/types.d.ts +0 -90
- package/dist/fulltext/types.d.ts.map +0 -1
- /package/dist/{fulltext → integration}/attach-shared.js +0 -0
- /package/dist/{fulltext → node_modules/@ncukondo/academic-fulltext/dist}/paths.js +0 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { mkdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { loadMeta, saveMeta } from "../meta.js";
|
|
4
|
+
import { getArticleDir } from "../paths.js";
|
|
5
|
+
import { downloadArxivHtml } from "./arxiv-html.js";
|
|
6
|
+
import { downloadPdf } from "./downloader.js";
|
|
7
|
+
import { downloadPmcXml } from "./pmc-xml.js";
|
|
8
|
+
const SOURCE_PRIORITY = ["pmc", "arxiv", "unpaywall", "core", "publisher"];
|
|
9
|
+
function sortByPriority(locations) {
|
|
10
|
+
return [...locations].sort((a, b) => {
|
|
11
|
+
const aIdx = SOURCE_PRIORITY.indexOf(a.source);
|
|
12
|
+
const bIdx = SOURCE_PRIORITY.indexOf(b.source);
|
|
13
|
+
return (aIdx === -1 ? 999 : aIdx) - (bIdx === -1 ? 999 : bIdx);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function getPdfLocations(locations) {
|
|
17
|
+
return locations.filter((loc) => loc.urlType === "pdf");
|
|
18
|
+
}
|
|
19
|
+
function applySourceFilter(locations, sourceFilter) {
|
|
20
|
+
if (sourceFilter && sourceFilter.length > 0) {
|
|
21
|
+
return locations.filter((loc) => sourceFilter.includes(loc.source));
|
|
22
|
+
}
|
|
23
|
+
return locations;
|
|
24
|
+
}
|
|
25
|
+
function buildFileInfo(filename, source, size) {
|
|
26
|
+
const info = {
|
|
27
|
+
filename,
|
|
28
|
+
source,
|
|
29
|
+
retrievedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
30
|
+
};
|
|
31
|
+
if (size !== void 0)
|
|
32
|
+
info.size = size;
|
|
33
|
+
return info;
|
|
34
|
+
}
|
|
35
|
+
async function tryDownloadPdf(pdfLocations, articleDir, options) {
|
|
36
|
+
const pdfPath = join(articleDir, "fulltext.pdf");
|
|
37
|
+
const attempts = [];
|
|
38
|
+
for (const loc of pdfLocations) {
|
|
39
|
+
const result = await downloadPdf(loc.url, pdfPath, {
|
|
40
|
+
retries: options?.retries ?? 3,
|
|
41
|
+
retryDelay: options?.retryDelay ?? 1e3
|
|
42
|
+
});
|
|
43
|
+
if (result.success) {
|
|
44
|
+
return { fileInfo: buildFileInfo("fulltext.pdf", loc.source, result.size), attempts };
|
|
45
|
+
}
|
|
46
|
+
attempts.push({
|
|
47
|
+
source: loc.source,
|
|
48
|
+
url: loc.url,
|
|
49
|
+
fileType: "pdf",
|
|
50
|
+
error: result.error ?? "Unknown error"
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return { attempts };
|
|
54
|
+
}
|
|
55
|
+
async function tryDownloadXml(pmcid, articleDir) {
|
|
56
|
+
if (!pmcid)
|
|
57
|
+
return {};
|
|
58
|
+
const xmlPath = join(articleDir, "fulltext.xml");
|
|
59
|
+
const result = await downloadPmcXml(pmcid, xmlPath);
|
|
60
|
+
if (result.success) {
|
|
61
|
+
return { fileInfo: buildFileInfo("fulltext.xml", "pmc", result.size) };
|
|
62
|
+
}
|
|
63
|
+
const numericId = pmcid.replace(/^PMC/i, "");
|
|
64
|
+
return {
|
|
65
|
+
attempt: {
|
|
66
|
+
source: "pmc",
|
|
67
|
+
url: `https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pmc&id=${numericId}&rettype=xml`,
|
|
68
|
+
fileType: "xml",
|
|
69
|
+
error: result.error ?? "Unknown error"
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async function tryDownloadArxivHtml(arxivId, articleDir) {
|
|
74
|
+
if (!arxivId)
|
|
75
|
+
return {};
|
|
76
|
+
const htmlPath = join(articleDir, "fulltext.html");
|
|
77
|
+
const id = arxivId.replace(/^arXiv:/i, "");
|
|
78
|
+
const result = await downloadArxivHtml(arxivId, htmlPath);
|
|
79
|
+
if (result.success) {
|
|
80
|
+
return { fileInfo: buildFileInfo("fulltext.html", "arxiv", result.size) };
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
attempt: {
|
|
84
|
+
source: "arxiv",
|
|
85
|
+
url: `https://arxiv.org/html/${id}`,
|
|
86
|
+
fileType: "html",
|
|
87
|
+
error: result.error ?? "Unknown error"
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function buildDetailedError(attempts) {
|
|
92
|
+
if (attempts.length === 0)
|
|
93
|
+
return "No download sources available";
|
|
94
|
+
const details = attempts.map((a) => `${a.source} (${a.fileType}): ${a.error}`).join("; ");
|
|
95
|
+
return `All download sources failed: ${details}`;
|
|
96
|
+
}
|
|
97
|
+
function classifyFailure(attempts) {
|
|
98
|
+
if (attempts.length === 0)
|
|
99
|
+
return "no_sources";
|
|
100
|
+
const hasBlock = attempts.some((a) => a.error.includes("HTTP 403") || a.error.includes("HTTP 401"));
|
|
101
|
+
if (hasBlock)
|
|
102
|
+
return "publisher_block";
|
|
103
|
+
return "network_error";
|
|
104
|
+
}
|
|
105
|
+
function collectSuggestedUrls(oaLocations, attempts) {
|
|
106
|
+
const blockedUrls = new Set(attempts.filter((a) => a.error.includes("HTTP 403") || a.error.includes("HTTP 401")).map((a) => a.url));
|
|
107
|
+
const sorted = sortByPriority(oaLocations);
|
|
108
|
+
const urls = [];
|
|
109
|
+
const seen = /* @__PURE__ */ new Set();
|
|
110
|
+
for (const loc of sorted) {
|
|
111
|
+
if (loc.urlType === "html" && !seen.has(loc.url)) {
|
|
112
|
+
urls.push(loc.url);
|
|
113
|
+
seen.add(loc.url);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const loc of sorted) {
|
|
117
|
+
if (loc.urlType === "pdf" && blockedUrls.has(loc.url) && !seen.has(loc.url)) {
|
|
118
|
+
urls.push(loc.url);
|
|
119
|
+
seen.add(loc.url);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return urls;
|
|
123
|
+
}
|
|
124
|
+
function collectDownloadedFiles(pdfResult, xmlResult, htmlResult) {
|
|
125
|
+
const files = [];
|
|
126
|
+
if (pdfResult.fileInfo)
|
|
127
|
+
files.push(pdfResult.fileInfo.filename);
|
|
128
|
+
if (xmlResult.fileInfo)
|
|
129
|
+
files.push(xmlResult.fileInfo.filename);
|
|
130
|
+
if (htmlResult.fileInfo)
|
|
131
|
+
files.push(htmlResult.fileInfo.filename);
|
|
132
|
+
return files;
|
|
133
|
+
}
|
|
134
|
+
function collectAttempts(pdfResult, xmlResult, htmlResult) {
|
|
135
|
+
const attempts = [...pdfResult.attempts];
|
|
136
|
+
if (xmlResult.attempt)
|
|
137
|
+
attempts.push(xmlResult.attempt);
|
|
138
|
+
if (htmlResult.attempt)
|
|
139
|
+
attempts.push(htmlResult.attempt);
|
|
140
|
+
return attempts;
|
|
141
|
+
}
|
|
142
|
+
async function handleAllFailed(dirName, meta, metaPath, oaLocations, allAttempts) {
|
|
143
|
+
const failureType = classifyFailure(allAttempts);
|
|
144
|
+
const suggestedUrls = collectSuggestedUrls(oaLocations, allAttempts);
|
|
145
|
+
const failResult = {
|
|
146
|
+
dirName,
|
|
147
|
+
status: "failed",
|
|
148
|
+
error: buildDetailedError(allAttempts),
|
|
149
|
+
failureType
|
|
150
|
+
};
|
|
151
|
+
if (allAttempts.length > 0)
|
|
152
|
+
failResult.attempts = allAttempts;
|
|
153
|
+
if (suggestedUrls.length > 0)
|
|
154
|
+
failResult.suggestedUrls = suggestedUrls;
|
|
155
|
+
if (suggestedUrls.length > 0) {
|
|
156
|
+
const updatedMeta = {
|
|
157
|
+
...meta,
|
|
158
|
+
pendingDownload: { suggestedUrls, addedAt: (/* @__PURE__ */ new Date()).toISOString() }
|
|
159
|
+
};
|
|
160
|
+
await saveMeta(metaPath, updatedMeta);
|
|
161
|
+
}
|
|
162
|
+
return failResult;
|
|
163
|
+
}
|
|
164
|
+
async function fetchFulltext(article, sessionDir, options) {
|
|
165
|
+
const articleDir = getArticleDir(sessionDir, article.dirName);
|
|
166
|
+
const metaPath = join(articleDir, "meta.json");
|
|
167
|
+
let meta;
|
|
168
|
+
try {
|
|
169
|
+
meta = await loadMeta(metaPath);
|
|
170
|
+
} catch {
|
|
171
|
+
return { dirName: article.dirName, status: "failed", error: "meta.json not found" };
|
|
172
|
+
}
|
|
173
|
+
if (meta.files.pdf) {
|
|
174
|
+
return { dirName: article.dirName, status: "skipped" };
|
|
175
|
+
}
|
|
176
|
+
await mkdir(articleDir, { recursive: true });
|
|
177
|
+
const locations = applySourceFilter(article.oaLocations, options?.sourceFilter);
|
|
178
|
+
const pdfLocations = sortByPriority(getPdfLocations(locations));
|
|
179
|
+
const pdfResult = await tryDownloadPdf(pdfLocations, articleDir, options);
|
|
180
|
+
const xmlResult = await tryDownloadXml(article.pmcid, articleDir);
|
|
181
|
+
const htmlResult = await tryDownloadArxivHtml(article.arxivId, articleDir);
|
|
182
|
+
const filesDownloaded = collectDownloadedFiles(pdfResult, xmlResult, htmlResult);
|
|
183
|
+
const allAttempts = collectAttempts(pdfResult, xmlResult, htmlResult);
|
|
184
|
+
if (filesDownloaded.length === 0) {
|
|
185
|
+
return handleAllFailed(article.dirName, meta, metaPath, article.oaLocations, allAttempts);
|
|
186
|
+
}
|
|
187
|
+
const updatedMeta = {
|
|
188
|
+
...meta,
|
|
189
|
+
files: {
|
|
190
|
+
...meta.files,
|
|
191
|
+
...pdfResult.fileInfo ? { pdf: pdfResult.fileInfo } : {},
|
|
192
|
+
...xmlResult.fileInfo ? { xml: xmlResult.fileInfo } : {},
|
|
193
|
+
...htmlResult.fileInfo ? { html: htmlResult.fileInfo } : {}
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
await saveMeta(metaPath, updatedMeta);
|
|
197
|
+
const successResult = {
|
|
198
|
+
dirName: article.dirName,
|
|
199
|
+
status: "downloaded",
|
|
200
|
+
filesDownloaded
|
|
201
|
+
};
|
|
202
|
+
if (allAttempts.length > 0)
|
|
203
|
+
successResult.attempts = allAttempts;
|
|
204
|
+
return successResult;
|
|
205
|
+
}
|
|
206
|
+
async function fetchAllFulltexts(articles, sessionDir, options) {
|
|
207
|
+
const concurrency = options?.concurrency ?? 3;
|
|
208
|
+
const results = new Array(articles.length);
|
|
209
|
+
let nextIndex = 0;
|
|
210
|
+
let completed = 0;
|
|
211
|
+
async function worker() {
|
|
212
|
+
while (nextIndex < articles.length) {
|
|
213
|
+
const index = nextIndex++;
|
|
214
|
+
const article = articles[index];
|
|
215
|
+
if (!article)
|
|
216
|
+
continue;
|
|
217
|
+
results[index] = await fetchFulltext(article, sessionDir, options);
|
|
218
|
+
completed++;
|
|
219
|
+
if (options?.onProgress) {
|
|
220
|
+
options.onProgress({
|
|
221
|
+
completed,
|
|
222
|
+
total: articles.length,
|
|
223
|
+
dirName: article.dirName
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const workers = Array.from({ length: Math.min(concurrency, articles.length) }, () => worker());
|
|
229
|
+
await Promise.all(workers);
|
|
230
|
+
return results;
|
|
231
|
+
}
|
|
232
|
+
export {
|
|
233
|
+
fetchAllFulltexts,
|
|
234
|
+
fetchFulltext
|
|
235
|
+
};
|
|
236
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sources":["../../../../../../node_modules/@ncukondo/academic-fulltext/dist/download/orchestrator.js"],"sourcesContent":["/**\n * Fulltext fetch orchestrator.\n * Coordinates downloads from multiple OA sources with priority-based selection.\n */\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { loadMeta, saveMeta } from \"../meta.js\";\nimport { getArticleDir } from \"../paths.js\";\nimport { downloadArxivHtml } from \"./arxiv-html.js\";\nimport { downloadPdf } from \"./downloader.js\";\nimport { downloadPmcXml } from \"./pmc-xml.js\";\n/** Source priority order (lower index = higher priority) */\nconst SOURCE_PRIORITY = [\"pmc\", \"arxiv\", \"unpaywall\", \"core\", \"publisher\"];\n/** Sort OA locations by source priority */\nfunction sortByPriority(locations) {\n return [...locations].sort((a, b) => {\n const aIdx = SOURCE_PRIORITY.indexOf(a.source);\n const bIdx = SOURCE_PRIORITY.indexOf(b.source);\n return (aIdx === -1 ? 999 : aIdx) - (bIdx === -1 ? 999 : bIdx);\n });\n}\n/** Get only PDF-type locations */\nfunction getPdfLocations(locations) {\n return locations.filter((loc) => loc.urlType === \"pdf\");\n}\n/** Filter locations by source if a filter is specified */\nfunction applySourceFilter(locations, sourceFilter) {\n if (sourceFilter && sourceFilter.length > 0) {\n return locations.filter((loc) => sourceFilter.includes(loc.source));\n }\n return locations;\n}\n/** Build a FileInfo object from a download result */\nfunction buildFileInfo(filename, source, size) {\n const info = {\n filename,\n source,\n retrievedAt: new Date().toISOString(),\n };\n if (size !== undefined)\n info.size = size;\n return info;\n}\n/**\n * Try downloading a PDF from prioritized OA locations.\n * Returns FileInfo on success plus all failed attempts.\n */\nasync function tryDownloadPdf(pdfLocations, articleDir, options) {\n const pdfPath = join(articleDir, \"fulltext.pdf\");\n const attempts = [];\n for (const loc of pdfLocations) {\n const result = await downloadPdf(loc.url, pdfPath, {\n retries: options?.retries ?? 3,\n retryDelay: options?.retryDelay ?? 1000,\n });\n if (result.success) {\n return { fileInfo: buildFileInfo(\"fulltext.pdf\", loc.source, result.size), attempts };\n }\n attempts.push({\n source: loc.source,\n url: loc.url,\n fileType: \"pdf\",\n error: result.error ?? \"Unknown error\",\n });\n }\n return { attempts };\n}\n/**\n * Try downloading PMC XML for a given PMCID.\n * Returns FileInfo on success plus the failed attempt if applicable.\n */\nasync function tryDownloadXml(pmcid, articleDir) {\n if (!pmcid)\n return {};\n const xmlPath = join(articleDir, \"fulltext.xml\");\n const result = await downloadPmcXml(pmcid, xmlPath);\n if (result.success) {\n return { fileInfo: buildFileInfo(\"fulltext.xml\", \"pmc\", result.size) };\n }\n const numericId = pmcid.replace(/^PMC/i, \"\");\n return {\n attempt: {\n source: \"pmc\",\n url: `https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pmc&id=${numericId}&rettype=xml`,\n fileType: \"xml\",\n error: result.error ?? \"Unknown error\",\n },\n };\n}\n/**\n * Try downloading arXiv HTML for a given arXiv ID.\n * Returns FileInfo on success plus the failed attempt if applicable.\n */\nasync function tryDownloadArxivHtml(arxivId, articleDir) {\n if (!arxivId)\n return {};\n const htmlPath = join(articleDir, \"fulltext.html\");\n const id = arxivId.replace(/^arXiv:/i, \"\");\n const result = await downloadArxivHtml(arxivId, htmlPath);\n if (result.success) {\n return { fileInfo: buildFileInfo(\"fulltext.html\", \"arxiv\", result.size) };\n }\n return {\n attempt: {\n source: \"arxiv\",\n url: `https://arxiv.org/html/${id}`,\n fileType: \"html\",\n error: result.error ?? \"Unknown error\",\n },\n };\n}\n/** Build a detailed error message from download attempts */\nfunction buildDetailedError(attempts) {\n if (attempts.length === 0)\n return \"No download sources available\";\n const details = attempts.map((a) => `${a.source} (${a.fileType}): ${a.error}`).join(\"; \");\n return `All download sources failed: ${details}`;\n}\n/** Classify the type of failure based on download attempts */\nfunction classifyFailure(attempts) {\n if (attempts.length === 0)\n return \"no_sources\";\n const hasBlock = attempts.some((a) => a.error.includes(\"HTTP 403\") || a.error.includes(\"HTTP 401\"));\n if (hasBlock)\n return \"publisher_block\";\n return \"network_error\";\n}\n/** Collect suggested URLs for manual download from OA locations and failed attempts */\nfunction collectSuggestedUrls(oaLocations, attempts) {\n const blockedUrls = new Set(attempts\n .filter((a) => a.error.includes(\"HTTP 403\") || a.error.includes(\"HTTP 401\"))\n .map((a) => a.url));\n const sorted = sortByPriority(oaLocations);\n const urls = [];\n const seen = new Set();\n for (const loc of sorted) {\n if (loc.urlType === \"html\" && !seen.has(loc.url)) {\n urls.push(loc.url);\n seen.add(loc.url);\n }\n }\n for (const loc of sorted) {\n if (loc.urlType === \"pdf\" && blockedUrls.has(loc.url) && !seen.has(loc.url)) {\n urls.push(loc.url);\n seen.add(loc.url);\n }\n }\n return urls;\n}\n/** Collect downloaded file names from results. */\nfunction collectDownloadedFiles(pdfResult, xmlResult, htmlResult) {\n const files = [];\n if (pdfResult.fileInfo)\n files.push(pdfResult.fileInfo.filename);\n if (xmlResult.fileInfo)\n files.push(xmlResult.fileInfo.filename);\n if (htmlResult.fileInfo)\n files.push(htmlResult.fileInfo.filename);\n return files;\n}\n/** Collect all failed download attempts. */\nfunction collectAttempts(pdfResult, xmlResult, htmlResult) {\n const attempts = [...pdfResult.attempts];\n if (xmlResult.attempt)\n attempts.push(xmlResult.attempt);\n if (htmlResult.attempt)\n attempts.push(htmlResult.attempt);\n return attempts;\n}\n/** Handle the case where all downloads failed. */\nasync function handleAllFailed(dirName, meta, metaPath, oaLocations, allAttempts) {\n const failureType = classifyFailure(allAttempts);\n const suggestedUrls = collectSuggestedUrls(oaLocations, allAttempts);\n const failResult = {\n dirName,\n status: \"failed\",\n error: buildDetailedError(allAttempts),\n failureType,\n };\n if (allAttempts.length > 0)\n failResult.attempts = allAttempts;\n if (suggestedUrls.length > 0)\n failResult.suggestedUrls = suggestedUrls;\n if (suggestedUrls.length > 0) {\n const updatedMeta = {\n ...meta,\n pendingDownload: { suggestedUrls, addedAt: new Date().toISOString() },\n };\n await saveMeta(metaPath, updatedMeta);\n }\n return failResult;\n}\n/**\n * Fetch fulltext for a single article.\n * Downloads PDF from the best available source, plus PMC XML and arXiv HTML if available.\n */\nexport async function fetchFulltext(article, sessionDir, options) {\n const articleDir = getArticleDir(sessionDir, article.dirName);\n const metaPath = join(articleDir, \"meta.json\");\n let meta;\n try {\n meta = await loadMeta(metaPath);\n }\n catch {\n return { dirName: article.dirName, status: \"failed\", error: \"meta.json not found\" };\n }\n if (meta.files.pdf) {\n return { dirName: article.dirName, status: \"skipped\" };\n }\n await mkdir(articleDir, { recursive: true });\n const locations = applySourceFilter(article.oaLocations, options?.sourceFilter);\n const pdfLocations = sortByPriority(getPdfLocations(locations));\n const pdfResult = await tryDownloadPdf(pdfLocations, articleDir, options);\n const xmlResult = await tryDownloadXml(article.pmcid, articleDir);\n const htmlResult = await tryDownloadArxivHtml(article.arxivId, articleDir);\n const filesDownloaded = collectDownloadedFiles(pdfResult, xmlResult, htmlResult);\n const allAttempts = collectAttempts(pdfResult, xmlResult, htmlResult);\n if (filesDownloaded.length === 0) {\n return handleAllFailed(article.dirName, meta, metaPath, article.oaLocations, allAttempts);\n }\n const updatedMeta = {\n ...meta,\n files: {\n ...meta.files,\n ...(pdfResult.fileInfo ? { pdf: pdfResult.fileInfo } : {}),\n ...(xmlResult.fileInfo ? { xml: xmlResult.fileInfo } : {}),\n ...(htmlResult.fileInfo ? { html: htmlResult.fileInfo } : {}),\n },\n };\n await saveMeta(metaPath, updatedMeta);\n const successResult = {\n dirName: article.dirName,\n status: \"downloaded\",\n filesDownloaded,\n };\n if (allAttempts.length > 0)\n successResult.attempts = allAttempts;\n return successResult;\n}\n/**\n * Fetch fulltexts for multiple articles with concurrency control.\n */\nexport async function fetchAllFulltexts(articles, sessionDir, options) {\n const concurrency = options?.concurrency ?? 3;\n const results = new Array(articles.length);\n let nextIndex = 0;\n let completed = 0;\n async function worker() {\n while (nextIndex < articles.length) {\n const index = nextIndex++;\n const article = articles[index];\n if (!article)\n continue;\n results[index] = await fetchFulltext(article, sessionDir, options);\n completed++;\n if (options?.onProgress) {\n options.onProgress({\n completed,\n total: articles.length,\n dirName: article.dirName,\n });\n }\n }\n }\n const workers = Array.from({ length: Math.min(concurrency, articles.length) }, () => worker());\n await Promise.all(workers);\n return results;\n}\n//# sourceMappingURL=orchestrator.js.map"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -4,7 +4,8 @@ const PMC_EFETCH_URL = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcg
|
|
|
4
4
|
const VALID_XML_TYPES = ["text/xml", "application/xml"];
|
|
5
5
|
const USER_AGENT = "search-hub/0.8.0 (https://github.com/ncukondo/search-hub)";
|
|
6
6
|
function isValidXmlContentType(contentType) {
|
|
7
|
-
if (!contentType)
|
|
7
|
+
if (!contentType)
|
|
8
|
+
return false;
|
|
8
9
|
const base = (contentType.split(";")[0] ?? "").trim().toLowerCase();
|
|
9
10
|
return VALID_XML_TYPES.includes(base);
|
|
10
11
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pmc-xml.js","sources":["../../../../../../node_modules/@ncukondo/academic-fulltext/dist/download/pmc-xml.js"],"sourcesContent":["/**\n * PMC XML downloader via E-utilities.\n */\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nconst PMC_EFETCH_URL = \"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi\";\n/** Content types accepted as valid XML responses */\nconst VALID_XML_TYPES = [\"text/xml\", \"application/xml\"];\nconst USER_AGENT = \"search-hub/0.8.0 (https://github.com/ncukondo/search-hub)\";\nfunction isValidXmlContentType(contentType) {\n if (!contentType)\n return false;\n const base = (contentType.split(\";\")[0] ?? \"\").trim().toLowerCase();\n return VALID_XML_TYPES.includes(base);\n}\n/** Strip \"PMC\" prefix if present, returning numeric ID */\nfunction normalizePmcid(pmcid) {\n return pmcid.replace(/^PMC/i, \"\");\n}\n/**\n * Download PMC XML for a given PMCID via E-utilities efetch.\n */\nexport async function downloadPmcXml(pmcid, destPath) {\n const numericId = normalizePmcid(pmcid);\n const url = `${PMC_EFETCH_URL}?db=pmc&id=${numericId}&rettype=xml`;\n try {\n const response = await fetch(url, {\n headers: { \"User-Agent\": USER_AGENT },\n });\n if (!response.ok) {\n return {\n success: false,\n error: `HTTP ${response.status} ${response.statusText}`,\n };\n }\n const contentType = response.headers.get(\"content-type\");\n if (!isValidXmlContentType(contentType)) {\n return {\n success: false,\n error: `Unexpected Content-Type: ${contentType ?? \"none\"} (expected XML)`,\n };\n }\n const text = await response.text();\n await mkdir(dirname(destPath), { recursive: true });\n await writeFile(destPath, text, \"utf-8\");\n return { success: true, size: Buffer.byteLength(text) };\n }\n catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n//# sourceMappingURL=pmc-xml.js.map"],"names":[],"mappings":";;AAKA,MAAM,iBAAiB;AAEvB,MAAM,kBAAkB,CAAC,YAAY,iBAAiB;AACtD,MAAM,aAAa;AACnB,SAAS,sBAAsB,aAAa;AACxC,MAAI,CAAC;AACD,WAAO;AACX,QAAM,QAAQ,YAAY,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,KAAI,EAAG,YAAW;AACjE,SAAO,gBAAgB,SAAS,IAAI;AACxC;AAEA,SAAS,eAAe,OAAO;AAC3B,SAAO,MAAM,QAAQ,SAAS,EAAE;AACpC;AAIO,eAAe,eAAe,OAAO,UAAU;AAClD,QAAM,YAAY,eAAe,KAAK;AACtC,QAAM,MAAM,GAAG,cAAc,cAAc,SAAS;AACpD,MAAI;AACA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAC9B,SAAS,EAAE,cAAc,WAAU;AAAA,IAC/C,CAAS;AACD,QAAI,CAAC,SAAS,IAAI;AACd,aAAO;AAAA,QACH,SAAS;AAAA,QACT,OAAO,QAAQ,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,MACrE;AAAA,IACQ;AACA,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,QAAI,CAAC,sBAAsB,WAAW,GAAG;AACrC,aAAO;AAAA,QACH,SAAS;AAAA,QACT,OAAO,4BAA4B,eAAe,MAAM;AAAA,MACxE;AAAA,IACQ;AACA,UAAM,OAAO,MAAM,SAAS,KAAI;AAChC,UAAM,MAAM,QAAQ,QAAQ,GAAG,EAAE,WAAW,MAAM;AAClD,UAAM,UAAU,UAAU,MAAM,OAAO;AACvC,WAAO,EAAE,SAAS,MAAM,MAAM,OAAO,WAAW,IAAI,EAAC;AAAA,EACzD,SACO,KAAK;AACR,WAAO;AAAA,MACH,SAAS;AAAA,MACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAClE;AAAA,EACI;AACJ;","x_google_ignoreList":[0]}
|
|
@@ -9,12 +9,18 @@ function createMeta(options) {
|
|
|
9
9
|
oaStatus: "unchecked",
|
|
10
10
|
files: {}
|
|
11
11
|
};
|
|
12
|
-
if (options.doi !== void 0)
|
|
13
|
-
|
|
14
|
-
if (options.
|
|
15
|
-
|
|
16
|
-
if (options.
|
|
17
|
-
|
|
12
|
+
if (options.doi !== void 0)
|
|
13
|
+
meta.doi = options.doi;
|
|
14
|
+
if (options.pmid !== void 0)
|
|
15
|
+
meta.pmid = options.pmid;
|
|
16
|
+
if (options.pmcid !== void 0)
|
|
17
|
+
meta.pmcid = options.pmcid;
|
|
18
|
+
if (options.arxivId !== void 0)
|
|
19
|
+
meta.arxivId = options.arxivId;
|
|
20
|
+
if (options.authors !== void 0)
|
|
21
|
+
meta.authors = options.authors;
|
|
22
|
+
if (options.year !== void 0)
|
|
23
|
+
meta.year = options.year;
|
|
18
24
|
return meta;
|
|
19
25
|
}
|
|
20
26
|
async function loadMeta(path) {
|
|
@@ -23,16 +29,15 @@ async function loadMeta(path) {
|
|
|
23
29
|
}
|
|
24
30
|
async function saveMeta(path, meta) {
|
|
25
31
|
const json = JSON.stringify(meta, null, 2);
|
|
26
|
-
await writeFile(path, json
|
|
32
|
+
await writeFile(path, `${json}
|
|
33
|
+
`, "utf-8");
|
|
27
34
|
}
|
|
28
35
|
function updateMetaFiles(meta, files) {
|
|
29
36
|
return {
|
|
30
37
|
...meta,
|
|
31
38
|
files: {
|
|
32
39
|
...meta.files,
|
|
33
|
-
...Object.fromEntries(
|
|
34
|
-
Object.entries(files).filter(([, v]) => v !== void 0)
|
|
35
|
-
)
|
|
40
|
+
...Object.fromEntries(Object.entries(files).filter(([, v]) => v !== void 0))
|
|
36
41
|
}
|
|
37
42
|
};
|
|
38
43
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","sources":["../../../../../node_modules/@ncukondo/academic-fulltext/dist/meta.js"],"sourcesContent":["/**\n * Meta.json management for fulltext article directories.\n */\nimport { readFile, writeFile } from \"node:fs/promises\";\n/** Create a new FulltextMeta object. */\nexport function createMeta(options) {\n const uuid8 = options.uuid.slice(0, 8);\n const meta = {\n dirName: `${options.citationKey}-${uuid8}`,\n citationKey: options.citationKey,\n uuid: options.uuid,\n title: options.title,\n oaStatus: \"unchecked\",\n files: {},\n };\n if (options.doi !== undefined)\n meta.doi = options.doi;\n if (options.pmid !== undefined)\n meta.pmid = options.pmid;\n if (options.pmcid !== undefined)\n meta.pmcid = options.pmcid;\n if (options.arxivId !== undefined)\n meta.arxivId = options.arxivId;\n if (options.authors !== undefined)\n meta.authors = options.authors;\n if (options.year !== undefined)\n meta.year = options.year;\n return meta;\n}\n/** Load and parse a meta.json file. */\nexport async function loadMeta(path) {\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw);\n}\n/** Save a FulltextMeta to a meta.json file with 2-space indentation. */\nexport async function saveMeta(path, meta) {\n const json = JSON.stringify(meta, null, 2);\n await writeFile(path, `${json}\\n`, \"utf-8\");\n}\n/** Update the files section of a FulltextMeta, preserving existing files. */\nexport function updateMetaFiles(meta, files) {\n return {\n ...meta,\n files: {\n ...meta.files,\n ...Object.fromEntries(Object.entries(files).filter(([, v]) => v !== undefined)),\n },\n };\n}\n//# sourceMappingURL=meta.js.map"],"names":[],"mappings":";AAKO,SAAS,WAAW,SAAS;AAChC,QAAM,QAAQ,QAAQ,KAAK,MAAM,GAAG,CAAC;AACrC,QAAM,OAAO;AAAA,IACT,SAAS,GAAG,QAAQ,WAAW,IAAI,KAAK;AAAA,IACxC,aAAa,QAAQ;AAAA,IACrB,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,IACf,UAAU;AAAA,IACV,OAAO,CAAA;AAAA,EACf;AACI,MAAI,QAAQ,QAAQ;AAChB,SAAK,MAAM,QAAQ;AACvB,MAAI,QAAQ,SAAS;AACjB,SAAK,OAAO,QAAQ;AACxB,MAAI,QAAQ,UAAU;AAClB,SAAK,QAAQ,QAAQ;AACzB,MAAI,QAAQ,YAAY;AACpB,SAAK,UAAU,QAAQ;AAC3B,MAAI,QAAQ,YAAY;AACpB,SAAK,UAAU,QAAQ;AAC3B,MAAI,QAAQ,SAAS;AACjB,SAAK,OAAO,QAAQ;AACxB,SAAO;AACX;AAEO,eAAe,SAAS,MAAM;AACjC,QAAM,MAAM,MAAM,SAAS,MAAM,OAAO;AACxC,SAAO,KAAK,MAAM,GAAG;AACzB;AAEO,eAAe,SAAS,MAAM,MAAM;AACvC,QAAM,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AACzC,QAAM,UAAU,MAAM,GAAG,IAAI;AAAA,GAAM,OAAO;AAC9C;AAEO,SAAS,gBAAgB,MAAM,OAAO;AACzC,SAAO;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,MACH,GAAG,KAAK;AAAA,MACR,GAAG,OAAO,YAAY,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAA,EAAG,CAAC,MAAM,MAAM,MAAS,CAAC;AAAA,IAC1F;AAAA,EACA;AACA;","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sources":["../../../../../node_modules/@ncukondo/academic-fulltext/dist/paths.js"],"sourcesContent":["/**\n * Path resolution utilities for fulltext directories.\n */\nimport { join } from \"node:path\";\n/** Get the fulltext root directory for a session. */\nexport function getFulltextDir(sessionDir) {\n return join(sessionDir, \"fulltext\");\n}\n/** Get an article's fulltext directory. */\nexport function getArticleDir(sessionDir, dirName) {\n return join(sessionDir, \"fulltext\", dirName);\n}\n/** Get the meta.json path for an article. */\nexport function getMetaPath(sessionDir, dirName) {\n return join(sessionDir, \"fulltext\", dirName, \"meta.json\");\n}\n/** Get the README.md path for an article. */\nexport function getReadmePath(sessionDir, dirName) {\n return join(sessionDir, \"fulltext\", dirName, \"README.md\");\n}\n//# sourceMappingURL=paths.js.map"],"names":[],"mappings":";AAKO,SAAS,eAAe,YAAY;AACvC,SAAO,KAAK,YAAY,UAAU;AACtC;AAEO,SAAS,cAAc,YAAY,SAAS;AAC/C,SAAO,KAAK,YAAY,YAAY,OAAO;AAC/C;AAEO,SAAS,YAAY,YAAY,SAAS;AAC7C,SAAO,KAAK,YAAY,YAAY,SAAS,WAAW;AAC5D;AAEO,SAAS,cAAc,YAAY,SAAS;AAC/C,SAAO,KAAK,YAAY,YAAY,SAAS,WAAW;AAC5D;","x_google_ignoreList":[0]}
|
|
@@ -10,10 +10,14 @@ function generateReadme(meta) {
|
|
|
10
10
|
lines.push(`**Year**: ${meta.year}`);
|
|
11
11
|
}
|
|
12
12
|
const identifiers = [];
|
|
13
|
-
if (meta.doi)
|
|
14
|
-
|
|
15
|
-
if (meta.
|
|
16
|
-
|
|
13
|
+
if (meta.doi)
|
|
14
|
+
identifiers.push(`- DOI: ${meta.doi}`);
|
|
15
|
+
if (meta.pmid)
|
|
16
|
+
identifiers.push(`- PMID: ${meta.pmid}`);
|
|
17
|
+
if (meta.pmcid)
|
|
18
|
+
identifiers.push(`- PMC: ${meta.pmcid}`);
|
|
19
|
+
if (meta.arxivId)
|
|
20
|
+
identifiers.push(`- arXiv: ${meta.arxivId}`);
|
|
17
21
|
if (identifiers.length > 0) {
|
|
18
22
|
lines.push("");
|
|
19
23
|
lines.push("## Identifiers");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readme.js","sources":["../../../../../node_modules/@ncukondo/academic-fulltext/dist/readme.js"],"sourcesContent":["/**\n * README.md template generation for article fulltext directories.\n */\n/** Generate a README.md for an article's fulltext directory. */\nexport function generateReadme(meta) {\n const lines = [];\n // Heading\n lines.push(`# ${meta.citationKey}`);\n lines.push(\"\");\n lines.push(`**Title**: ${meta.title}`);\n if (meta.authors) {\n lines.push(`**Authors**: ${meta.authors}`);\n }\n if (meta.year) {\n lines.push(`**Year**: ${meta.year}`);\n }\n // Identifiers\n const identifiers = [];\n if (meta.doi)\n identifiers.push(`- DOI: ${meta.doi}`);\n if (meta.pmid)\n identifiers.push(`- PMID: ${meta.pmid}`);\n if (meta.pmcid)\n identifiers.push(`- PMC: ${meta.pmcid}`);\n if (meta.arxivId)\n identifiers.push(`- arXiv: ${meta.arxivId}`);\n if (identifiers.length > 0) {\n lines.push(\"\");\n lines.push(\"## Identifiers\");\n lines.push(\"\");\n lines.push(...identifiers);\n }\n // Download URLs\n const urls = [];\n if (meta.doi) {\n urls.push(`- Publisher: https://doi.org/${meta.doi}`);\n }\n if (meta.pmcid) {\n const pmcNum = meta.pmcid.replace(/^PMC/i, \"\");\n urls.push(`- PMC PDF: https://www.ncbi.nlm.nih.gov/pmc/articles/${meta.pmcid}/pdf/`);\n urls.push(`- PMC XML: https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pmc&id=${pmcNum}`);\n }\n if (meta.arxivId) {\n urls.push(`- arXiv PDF: https://arxiv.org/pdf/${meta.arxivId}.pdf`);\n }\n if (urls.length > 0) {\n lines.push(\"\");\n lines.push(\"## Download URLs\");\n lines.push(\"\");\n lines.push(...urls);\n }\n // Instructions\n lines.push(\"\");\n lines.push(\"## Instructions\");\n lines.push(\"\");\n lines.push(\"Place fulltext files in this directory:\");\n lines.push(\"- `fulltext.pdf` - PDF version\");\n lines.push(\"- `fulltext.md` - Markdown version (optional)\");\n lines.push(\"\");\n lines.push(\"After adding files, run:\");\n lines.push(\"```\");\n lines.push(\"search-hub fulltext sync <session-id>\");\n lines.push(\"```\");\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n//# sourceMappingURL=readme.js.map"],"names":[],"mappings":"AAIO,SAAS,eAAe,MAAM;AACjC,QAAM,QAAQ,CAAA;AAEd,QAAM,KAAK,KAAK,KAAK,WAAW,EAAE;AAClC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,cAAc,KAAK,KAAK,EAAE;AACrC,MAAI,KAAK,SAAS;AACd,UAAM,KAAK,gBAAgB,KAAK,OAAO,EAAE;AAAA,EAC7C;AACA,MAAI,KAAK,MAAM;AACX,UAAM,KAAK,aAAa,KAAK,IAAI,EAAE;AAAA,EACvC;AAEA,QAAM,cAAc,CAAA;AACpB,MAAI,KAAK;AACL,gBAAY,KAAK,UAAU,KAAK,GAAG,EAAE;AACzC,MAAI,KAAK;AACL,gBAAY,KAAK,WAAW,KAAK,IAAI,EAAE;AAC3C,MAAI,KAAK;AACL,gBAAY,KAAK,UAAU,KAAK,KAAK,EAAE;AAC3C,MAAI,KAAK;AACL,gBAAY,KAAK,YAAY,KAAK,OAAO,EAAE;AAC/C,MAAI,YAAY,SAAS,GAAG;AACxB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,gBAAgB;AAC3B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,GAAG,WAAW;AAAA,EAC7B;AAEA,QAAM,OAAO,CAAA;AACb,MAAI,KAAK,KAAK;AACV,SAAK,KAAK,gCAAgC,KAAK,GAAG,EAAE;AAAA,EACxD;AACA,MAAI,KAAK,OAAO;AACZ,UAAM,SAAS,KAAK,MAAM,QAAQ,SAAS,EAAE;AAC7C,SAAK,KAAK,wDAAwD,KAAK,KAAK,OAAO;AACnF,SAAK,KAAK,kFAAkF,MAAM,EAAE;AAAA,EACxG;AACA,MAAI,KAAK,SAAS;AACd,SAAK,KAAK,sCAAsC,KAAK,OAAO,MAAM;AAAA,EACtE;AACA,MAAI,KAAK,SAAS,GAAG;AACjB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,kBAAkB;AAC7B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,GAAG,IAAI;AAAA,EACtB;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,iBAAiB;AAC5B,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,yCAAyC;AACpD,QAAM,KAAK,gCAAgC;AAC3C,QAAM,KAAK,+CAA+C;AAC1D,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,0BAA0B;AACrC,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,uCAAuC;AAClD,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AAC1B;","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
var boolbase;
|
|
2
|
+
var hasRequiredBoolbase;
|
|
3
|
+
function requireBoolbase() {
|
|
4
|
+
if (hasRequiredBoolbase) return boolbase;
|
|
5
|
+
hasRequiredBoolbase = 1;
|
|
6
|
+
boolbase = {
|
|
7
|
+
trueFunc: function trueFunc() {
|
|
8
|
+
return true;
|
|
9
|
+
},
|
|
10
|
+
falseFunc: function falseFunc() {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
return boolbase;
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
requireBoolbase as __require
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../node_modules/boolbase/index.js"],"sourcesContent":["module.exports = {\n\ttrueFunc: function trueFunc(){\n\t\treturn true;\n\t},\n\tfalseFunc: function falseFunc(){\n\t\treturn false;\n\t}\n};"],"names":[],"mappings":";;;;;AAAA,aAAiB;AAAA,IAChB,UAAU,SAAS,WAAU;AAC5B,aAAO;AAAA,IACT;AAAA,IACC,WAAW,SAAS,YAAW;AAC9B,aAAO;AAAA,IACT;AAAA;;;","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { __exports as attributes } from "../../../_virtual/attributes.js";
|
|
2
|
+
import { __require as requireBoolbase } from "../../boolbase/index.js";
|
|
3
|
+
var hasRequiredAttributes;
|
|
4
|
+
function requireAttributes() {
|
|
5
|
+
if (hasRequiredAttributes) return attributes;
|
|
6
|
+
hasRequiredAttributes = 1;
|
|
7
|
+
var __importDefault = attributes && attributes.__importDefault || function(mod) {
|
|
8
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(attributes, "__esModule", { value: true });
|
|
11
|
+
attributes.attributeRules = void 0;
|
|
12
|
+
var boolbase_1 = __importDefault(requireBoolbase());
|
|
13
|
+
var reChars = /[-[\]{}()*+?.,\\^$|#\s]/g;
|
|
14
|
+
function escapeRegex(value) {
|
|
15
|
+
return value.replace(reChars, "\\$&");
|
|
16
|
+
}
|
|
17
|
+
var caseInsensitiveAttributes = /* @__PURE__ */ new Set([
|
|
18
|
+
"accept",
|
|
19
|
+
"accept-charset",
|
|
20
|
+
"align",
|
|
21
|
+
"alink",
|
|
22
|
+
"axis",
|
|
23
|
+
"bgcolor",
|
|
24
|
+
"charset",
|
|
25
|
+
"checked",
|
|
26
|
+
"clear",
|
|
27
|
+
"codetype",
|
|
28
|
+
"color",
|
|
29
|
+
"compact",
|
|
30
|
+
"declare",
|
|
31
|
+
"defer",
|
|
32
|
+
"dir",
|
|
33
|
+
"direction",
|
|
34
|
+
"disabled",
|
|
35
|
+
"enctype",
|
|
36
|
+
"face",
|
|
37
|
+
"frame",
|
|
38
|
+
"hreflang",
|
|
39
|
+
"http-equiv",
|
|
40
|
+
"lang",
|
|
41
|
+
"language",
|
|
42
|
+
"link",
|
|
43
|
+
"media",
|
|
44
|
+
"method",
|
|
45
|
+
"multiple",
|
|
46
|
+
"nohref",
|
|
47
|
+
"noresize",
|
|
48
|
+
"noshade",
|
|
49
|
+
"nowrap",
|
|
50
|
+
"readonly",
|
|
51
|
+
"rel",
|
|
52
|
+
"rev",
|
|
53
|
+
"rules",
|
|
54
|
+
"scope",
|
|
55
|
+
"scrolling",
|
|
56
|
+
"selected",
|
|
57
|
+
"shape",
|
|
58
|
+
"target",
|
|
59
|
+
"text",
|
|
60
|
+
"type",
|
|
61
|
+
"valign",
|
|
62
|
+
"valuetype",
|
|
63
|
+
"vlink"
|
|
64
|
+
]);
|
|
65
|
+
function shouldIgnoreCase(selector, options) {
|
|
66
|
+
return typeof selector.ignoreCase === "boolean" ? selector.ignoreCase : selector.ignoreCase === "quirks" ? !!options.quirksMode : !options.xmlMode && caseInsensitiveAttributes.has(selector.name);
|
|
67
|
+
}
|
|
68
|
+
attributes.attributeRules = {
|
|
69
|
+
equals: function(next, data, options) {
|
|
70
|
+
var adapter = options.adapter;
|
|
71
|
+
var name = data.name;
|
|
72
|
+
var value = data.value;
|
|
73
|
+
if (shouldIgnoreCase(data, options)) {
|
|
74
|
+
value = value.toLowerCase();
|
|
75
|
+
return function(elem) {
|
|
76
|
+
var attr = adapter.getAttributeValue(elem, name);
|
|
77
|
+
return attr != null && attr.length === value.length && attr.toLowerCase() === value && next(elem);
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return function(elem) {
|
|
81
|
+
return adapter.getAttributeValue(elem, name) === value && next(elem);
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
hyphen: function(next, data, options) {
|
|
85
|
+
var adapter = options.adapter;
|
|
86
|
+
var name = data.name;
|
|
87
|
+
var value = data.value;
|
|
88
|
+
var len = value.length;
|
|
89
|
+
if (shouldIgnoreCase(data, options)) {
|
|
90
|
+
value = value.toLowerCase();
|
|
91
|
+
return function hyphenIC(elem) {
|
|
92
|
+
var attr = adapter.getAttributeValue(elem, name);
|
|
93
|
+
return attr != null && (attr.length === len || attr.charAt(len) === "-") && attr.substr(0, len).toLowerCase() === value && next(elem);
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return function hyphen(elem) {
|
|
97
|
+
var attr = adapter.getAttributeValue(elem, name);
|
|
98
|
+
return attr != null && (attr.length === len || attr.charAt(len) === "-") && attr.substr(0, len) === value && next(elem);
|
|
99
|
+
};
|
|
100
|
+
},
|
|
101
|
+
element: function(next, data, options) {
|
|
102
|
+
var adapter = options.adapter;
|
|
103
|
+
var name = data.name, value = data.value;
|
|
104
|
+
if (/\s/.test(value)) {
|
|
105
|
+
return boolbase_1.default.falseFunc;
|
|
106
|
+
}
|
|
107
|
+
var regex = new RegExp("(?:^|\\s)".concat(escapeRegex(value), "(?:$|\\s)"), shouldIgnoreCase(data, options) ? "i" : "");
|
|
108
|
+
return function element(elem) {
|
|
109
|
+
var attr = adapter.getAttributeValue(elem, name);
|
|
110
|
+
return attr != null && attr.length >= value.length && regex.test(attr) && next(elem);
|
|
111
|
+
};
|
|
112
|
+
},
|
|
113
|
+
exists: function(next, _a, _b) {
|
|
114
|
+
var name = _a.name;
|
|
115
|
+
var adapter = _b.adapter;
|
|
116
|
+
return function(elem) {
|
|
117
|
+
return adapter.hasAttrib(elem, name) && next(elem);
|
|
118
|
+
};
|
|
119
|
+
},
|
|
120
|
+
start: function(next, data, options) {
|
|
121
|
+
var adapter = options.adapter;
|
|
122
|
+
var name = data.name;
|
|
123
|
+
var value = data.value;
|
|
124
|
+
var len = value.length;
|
|
125
|
+
if (len === 0) {
|
|
126
|
+
return boolbase_1.default.falseFunc;
|
|
127
|
+
}
|
|
128
|
+
if (shouldIgnoreCase(data, options)) {
|
|
129
|
+
value = value.toLowerCase();
|
|
130
|
+
return function(elem) {
|
|
131
|
+
var attr = adapter.getAttributeValue(elem, name);
|
|
132
|
+
return attr != null && attr.length >= len && attr.substr(0, len).toLowerCase() === value && next(elem);
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return function(elem) {
|
|
136
|
+
var _a;
|
|
137
|
+
return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.startsWith(value)) && next(elem);
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
end: function(next, data, options) {
|
|
141
|
+
var adapter = options.adapter;
|
|
142
|
+
var name = data.name;
|
|
143
|
+
var value = data.value;
|
|
144
|
+
var len = -value.length;
|
|
145
|
+
if (len === 0) {
|
|
146
|
+
return boolbase_1.default.falseFunc;
|
|
147
|
+
}
|
|
148
|
+
if (shouldIgnoreCase(data, options)) {
|
|
149
|
+
value = value.toLowerCase();
|
|
150
|
+
return function(elem) {
|
|
151
|
+
var _a;
|
|
152
|
+
return ((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.substr(len).toLowerCase()) === value && next(elem);
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
return function(elem) {
|
|
156
|
+
var _a;
|
|
157
|
+
return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.endsWith(value)) && next(elem);
|
|
158
|
+
};
|
|
159
|
+
},
|
|
160
|
+
any: function(next, data, options) {
|
|
161
|
+
var adapter = options.adapter;
|
|
162
|
+
var name = data.name, value = data.value;
|
|
163
|
+
if (value === "") {
|
|
164
|
+
return boolbase_1.default.falseFunc;
|
|
165
|
+
}
|
|
166
|
+
if (shouldIgnoreCase(data, options)) {
|
|
167
|
+
var regex_1 = new RegExp(escapeRegex(value), "i");
|
|
168
|
+
return function anyIC(elem) {
|
|
169
|
+
var attr = adapter.getAttributeValue(elem, name);
|
|
170
|
+
return attr != null && attr.length >= value.length && regex_1.test(attr) && next(elem);
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
return function(elem) {
|
|
174
|
+
var _a;
|
|
175
|
+
return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.includes(value)) && next(elem);
|
|
176
|
+
};
|
|
177
|
+
},
|
|
178
|
+
not: function(next, data, options) {
|
|
179
|
+
var adapter = options.adapter;
|
|
180
|
+
var name = data.name;
|
|
181
|
+
var value = data.value;
|
|
182
|
+
if (value === "") {
|
|
183
|
+
return function(elem) {
|
|
184
|
+
return !!adapter.getAttributeValue(elem, name) && next(elem);
|
|
185
|
+
};
|
|
186
|
+
} else if (shouldIgnoreCase(data, options)) {
|
|
187
|
+
value = value.toLowerCase();
|
|
188
|
+
return function(elem) {
|
|
189
|
+
var attr = adapter.getAttributeValue(elem, name);
|
|
190
|
+
return (attr == null || attr.length !== value.length || attr.toLowerCase() !== value) && next(elem);
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return function(elem) {
|
|
194
|
+
return adapter.getAttributeValue(elem, name) !== value && next(elem);
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
return attributes;
|
|
199
|
+
}
|
|
200
|
+
export {
|
|
201
|
+
requireAttributes as __require
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=attributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attributes.js","sources":["../../../../node_modules/css-select/lib/attributes.js"],"sourcesContent":["\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attributeRules = void 0;\nvar boolbase_1 = __importDefault(require(\"boolbase\"));\n/**\n * All reserved characters in a regex, used for escaping.\n *\n * Taken from XRegExp, (c) 2007-2020 Steven Levithan under the MIT license\n * https://github.com/slevithan/xregexp/blob/95eeebeb8fac8754d54eafe2b4743661ac1cf028/src/xregexp.js#L794\n */\nvar reChars = /[-[\\]{}()*+?.,\\\\^$|#\\s]/g;\nfunction escapeRegex(value) {\n return value.replace(reChars, \"\\\\$&\");\n}\n/**\n * Attributes that are case-insensitive in HTML.\n *\n * @private\n * @see https://html.spec.whatwg.org/multipage/semantics-other.html#case-sensitivity-of-selectors\n */\nvar caseInsensitiveAttributes = new Set([\n \"accept\",\n \"accept-charset\",\n \"align\",\n \"alink\",\n \"axis\",\n \"bgcolor\",\n \"charset\",\n \"checked\",\n \"clear\",\n \"codetype\",\n \"color\",\n \"compact\",\n \"declare\",\n \"defer\",\n \"dir\",\n \"direction\",\n \"disabled\",\n \"enctype\",\n \"face\",\n \"frame\",\n \"hreflang\",\n \"http-equiv\",\n \"lang\",\n \"language\",\n \"link\",\n \"media\",\n \"method\",\n \"multiple\",\n \"nohref\",\n \"noresize\",\n \"noshade\",\n \"nowrap\",\n \"readonly\",\n \"rel\",\n \"rev\",\n \"rules\",\n \"scope\",\n \"scrolling\",\n \"selected\",\n \"shape\",\n \"target\",\n \"text\",\n \"type\",\n \"valign\",\n \"valuetype\",\n \"vlink\",\n]);\nfunction shouldIgnoreCase(selector, options) {\n return typeof selector.ignoreCase === \"boolean\"\n ? selector.ignoreCase\n : selector.ignoreCase === \"quirks\"\n ? !!options.quirksMode\n : !options.xmlMode && caseInsensitiveAttributes.has(selector.name);\n}\n/**\n * Attribute selectors\n */\nexports.attributeRules = {\n equals: function (next, data, options) {\n var adapter = options.adapter;\n var name = data.name;\n var value = data.value;\n if (shouldIgnoreCase(data, options)) {\n value = value.toLowerCase();\n return function (elem) {\n var attr = adapter.getAttributeValue(elem, name);\n return (attr != null &&\n attr.length === value.length &&\n attr.toLowerCase() === value &&\n next(elem));\n };\n }\n return function (elem) {\n return adapter.getAttributeValue(elem, name) === value && next(elem);\n };\n },\n hyphen: function (next, data, options) {\n var adapter = options.adapter;\n var name = data.name;\n var value = data.value;\n var len = value.length;\n if (shouldIgnoreCase(data, options)) {\n value = value.toLowerCase();\n return function hyphenIC(elem) {\n var attr = adapter.getAttributeValue(elem, name);\n return (attr != null &&\n (attr.length === len || attr.charAt(len) === \"-\") &&\n attr.substr(0, len).toLowerCase() === value &&\n next(elem));\n };\n }\n return function hyphen(elem) {\n var attr = adapter.getAttributeValue(elem, name);\n return (attr != null &&\n (attr.length === len || attr.charAt(len) === \"-\") &&\n attr.substr(0, len) === value &&\n next(elem));\n };\n },\n element: function (next, data, options) {\n var adapter = options.adapter;\n var name = data.name, value = data.value;\n if (/\\s/.test(value)) {\n return boolbase_1.default.falseFunc;\n }\n var regex = new RegExp(\"(?:^|\\\\s)\".concat(escapeRegex(value), \"(?:$|\\\\s)\"), shouldIgnoreCase(data, options) ? \"i\" : \"\");\n return function element(elem) {\n var attr = adapter.getAttributeValue(elem, name);\n return (attr != null &&\n attr.length >= value.length &&\n regex.test(attr) &&\n next(elem));\n };\n },\n exists: function (next, _a, _b) {\n var name = _a.name;\n var adapter = _b.adapter;\n return function (elem) { return adapter.hasAttrib(elem, name) && next(elem); };\n },\n start: function (next, data, options) {\n var adapter = options.adapter;\n var name = data.name;\n var value = data.value;\n var len = value.length;\n if (len === 0) {\n return boolbase_1.default.falseFunc;\n }\n if (shouldIgnoreCase(data, options)) {\n value = value.toLowerCase();\n return function (elem) {\n var attr = adapter.getAttributeValue(elem, name);\n return (attr != null &&\n attr.length >= len &&\n attr.substr(0, len).toLowerCase() === value &&\n next(elem));\n };\n }\n return function (elem) {\n var _a;\n return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.startsWith(value)) &&\n next(elem);\n };\n },\n end: function (next, data, options) {\n var adapter = options.adapter;\n var name = data.name;\n var value = data.value;\n var len = -value.length;\n if (len === 0) {\n return boolbase_1.default.falseFunc;\n }\n if (shouldIgnoreCase(data, options)) {\n value = value.toLowerCase();\n return function (elem) {\n var _a;\n return ((_a = adapter\n .getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.substr(len).toLowerCase()) === value && next(elem);\n };\n }\n return function (elem) {\n var _a;\n return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.endsWith(value)) &&\n next(elem);\n };\n },\n any: function (next, data, options) {\n var adapter = options.adapter;\n var name = data.name, value = data.value;\n if (value === \"\") {\n return boolbase_1.default.falseFunc;\n }\n if (shouldIgnoreCase(data, options)) {\n var regex_1 = new RegExp(escapeRegex(value), \"i\");\n return function anyIC(elem) {\n var attr = adapter.getAttributeValue(elem, name);\n return (attr != null &&\n attr.length >= value.length &&\n regex_1.test(attr) &&\n next(elem));\n };\n }\n return function (elem) {\n var _a;\n return !!((_a = adapter.getAttributeValue(elem, name)) === null || _a === void 0 ? void 0 : _a.includes(value)) &&\n next(elem);\n };\n },\n not: function (next, data, options) {\n var adapter = options.adapter;\n var name = data.name;\n var value = data.value;\n if (value === \"\") {\n return function (elem) {\n return !!adapter.getAttributeValue(elem, name) && next(elem);\n };\n }\n else if (shouldIgnoreCase(data, options)) {\n value = value.toLowerCase();\n return function (elem) {\n var attr = adapter.getAttributeValue(elem, name);\n return ((attr == null ||\n attr.length !== value.length ||\n attr.toLowerCase() !== value) &&\n next(elem));\n };\n }\n return function (elem) {\n return adapter.getAttributeValue(elem, name) !== value && next(elem);\n };\n },\n};\n//# sourceMappingURL=attributes.js.map"],"names":["this","require$$0"],"mappings":"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","x_google_ignoreList":[0]}
|