umberto 7.0.2 → 8.0.1
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/CHANGELOG.md +29 -1798
- package/LICENSE.md +44 -5
- package/README.md +194 -9
- package/package.json +4 -8
- package/scripts/filter/after-post-render/gloria/append-copy-heading-buttons.js +90 -0
- package/scripts/filter/after-post-render/gloria/apply-design-doc-classes.js +145 -0
- package/scripts/filter/after-post-render/gloria/wrap-table-into-wrappers.js +30 -0
- package/scripts/filter/after-post-render/img-linker.js +1 -1
- package/scripts/filter/after-post-render/insert-error-codes.js +1 -1
- package/scripts/filter/after-post-render/linker.js +1 -1
- package/scripts/filter/after-post-render/parseicontag.js +1 -1
- package/scripts/filter/after-post-render/snippets.js +5 -1
- package/scripts/filter/after-render/gloria/inline-svg.js +14 -0
- package/scripts/filter/after-render/gloria/spritesheet-svg.js +14 -0
- package/scripts/filter/before-post-render/add-project-info-to-page.js +1 -1
- package/scripts/filter/before-post-render/code-switcher.js +4 -0
- package/scripts/filter/before-post-render/execute-and-insert-function-results.js +3 -1
- package/scripts/filter/before-post-render/gloria/add-breadcrumbs-data-to-page.js +276 -0
- package/scripts/filter/before-post-render/gloria/prerender-admonitions.js +27 -0
- package/scripts/filter/before-post-render/gloria/prerender-xml-pug-components.js +352 -0
- package/scripts/filter/before-post-render/gloria/render-post-render-pug-components.js +102 -0
- package/scripts/filter/before-post-render/set-layout.js +4 -2
- package/scripts/helper/parse-href.js +28 -0
- package/scripts/helper/u-capitalize.js +13 -0
- package/scripts/helper/u-extract-and-cache-title.js +36 -0
- package/scripts/helper/u-random-id.js +16 -0
- package/scripts/helper/u-remove-indentation.js +13 -0
- package/scripts/helper/u-toc.js +2 -63
- package/scripts/utils/add-indention.js +16 -0
- package/scripts/utils/capitalize.js +17 -0
- package/scripts/utils/concat-url-parts.js +19 -0
- package/scripts/utils/decode-html-entities.js +25 -0
- package/scripts/utils/drop-init-slash.js +14 -0
- package/scripts/utils/drop-trailing-slash.js +14 -0
- package/scripts/utils/drop-url-protocol.js +10 -0
- package/scripts/utils/inline-svg.js +152 -0
- package/scripts/utils/measure-call.js +16 -0
- package/scripts/utils/parse-href.js +37 -0
- package/scripts/utils/parseicontag.js +1 -1
- package/scripts/utils/parselinks.js +27 -6
- package/scripts/utils/parser-cursor.js +280 -0
- package/scripts/utils/pipe.js +17 -0
- package/scripts/utils/pug-renderer/create-prerender-pug-template.js +185 -0
- package/scripts/utils/pug-renderer/render-pug-component.js +73 -0
- package/scripts/utils/pug-to-xml-binding/parser/walk-xml-tree.js +150 -0
- package/scripts/utils/pug-to-xml-binding/parser/xml-components-parser.js +414 -0
- package/scripts/utils/pug-to-xml-binding/render-xml-pug-components-in-markdown.js +193 -0
- package/scripts/utils/pug-to-xml-binding/transform-xml-tree-to-pug.js +144 -0
- package/scripts/utils/random-id.js +75 -0
- package/scripts/utils/remove-indentation.js +48 -0
- package/scripts/utils/spritesheet-svg.js +183 -0
- package/scripts/utils/toc.js +71 -0
- package/scripts/utils/transform-markdown-admonitions.js +98 -0
- package/scripts/utils/uniq-by-last.js +32 -0
- package/src/api-builder/api-builder.js +49 -18
- package/src/api-builder/classes/description-parser.js +61 -10
- package/src/api-builder/classes/doc-data-factory.js +2 -2
- package/src/helpers/github-url.js +1 -1
- package/src/helpers/templates/scripts/default.js +1 -1
- package/src/helpers/templates/scripts/group.js +1 -1
- package/src/hexo/filter/project-locals.js +12 -0
- package/src/hexo/get-repo-urls.js +1 -1
- package/src/hexo/project-globals.js +4 -0
- package/src/hexo-manager.js +7 -2
- package/src/sdk-builder/sdk-builder.js +4 -4
- package/src/tasks/build-api-docs.js +6 -6
- package/src/tasks/build-documentation.js +57 -24
- package/src/tasks/cache-files.js +2 -2
- package/src/tasks/compile-sass.js +12 -0
- package/src/tasks/copy-assets.js +4 -0
- package/src/tasks/copy-project-icons.js +1 -1
- package/src/tasks/get-extra-files.js +1 -1
- package/src/tasks/get-project-config.js +1 -1
- package/src/tasks/overwrite-api-guides.js +1 -1
- package/src/tasks/validate-links.js +211 -39
- package/themes/umberto/layout/gloria/404.pug +25 -16
- package/themes/umberto/layout/gloria/_api-docs/_header/_style.scss +31 -0
- package/themes/umberto/layout/gloria/_api-docs/_header/index.pug +50 -0
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_api-see-source.pug +1 -4
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_api-tree-item.pug +42 -26
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_class-item.pug +20 -13
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_dev-names.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_error.pug +10 -5
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_hierarchy-list.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_link-or-text.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_method.pug +45 -39
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_property.pug +26 -20
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_related.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_toc-list-item.pug +11 -0
- package/themes/umberto/layout/gloria/_api-docs/_partial/api-subheader.pug +0 -11
- package/themes/umberto/layout/gloria/_api-docs/_partial/api-toc.pug +33 -0
- package/themes/umberto/layout/gloria/_api-docs/_partial/classes.pug +5 -4
- package/themes/umberto/layout/gloria/_api-docs/_partial/config-options.pug +5 -4
- package/themes/umberto/layout/gloria/_api-docs/_partial/constants.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_partial/description.pug +2 -2
- package/themes/umberto/layout/gloria/_api-docs/_partial/events.pug +5 -4
- package/themes/umberto/layout/gloria/_api-docs/_partial/functions.pug +5 -4
- package/themes/umberto/layout/gloria/_api-docs/_partial/interfaces.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_partial/methods.pug +14 -13
- package/themes/umberto/layout/gloria/_api-docs/_partial/namespaces.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_partial/navtree.pug +4 -11
- package/themes/umberto/layout/gloria/_api-docs/_partial/properties.pug +14 -13
- package/themes/umberto/layout/gloria/_api-docs/_partial/type-parameters.pug +15 -12
- package/themes/umberto/layout/gloria/_api-docs/_partial/typedefs.pug +5 -4
- package/themes/umberto/layout/gloria/_api-docs/_subheader/_style.scss +5 -0
- package/themes/umberto/layout/gloria/_api-docs/_subheader/index.pug +10 -0
- package/themes/umberto/layout/gloria/_api-docs/_toc/_style.scss +229 -0
- package/themes/umberto/layout/gloria/_api-docs/_toc/index.pug +11 -0
- package/themes/umberto/layout/gloria/_api-docs/api-base.pug +24 -24
- package/themes/umberto/layout/gloria/_api-docs/class.pug +4 -4
- package/themes/umberto/layout/gloria/_api-docs/errors.pug +3 -3
- package/themes/umberto/layout/gloria/_api-docs/index.pug +3 -0
- package/themes/umberto/layout/gloria/_api-docs/interface.pug +4 -4
- package/themes/umberto/layout/gloria/_api-docs/mixin.pug +4 -4
- package/themes/umberto/layout/gloria/_api-docs/module.pug +4 -4
- package/themes/umberto/layout/gloria/_api-docs/namespace.pug +4 -4
- package/themes/umberto/layout/gloria/_api-docs/typedef.pug +22 -22
- package/themes/umberto/layout/gloria/_components/badge/_style.scss +27 -0
- package/themes/umberto/layout/gloria/_components/badge/index.pug +30 -0
- package/themes/umberto/layout/gloria/_components/banner/_style.scss +133 -0
- package/themes/umberto/layout/gloria/_components/banner/index.pug +3 -0
- package/themes/umberto/layout/gloria/_components/button/_style.scss +183 -0
- package/themes/umberto/layout/gloria/_components/button/index.pug +140 -0
- package/themes/umberto/layout/gloria/_components/callout/_style.scss +56 -0
- package/themes/umberto/layout/gloria/_components/callout/index.pug +87 -0
- package/themes/umberto/layout/gloria/_components/card/_style.scss +101 -0
- package/themes/umberto/layout/gloria/_components/card/index.pug +131 -0
- package/themes/umberto/layout/gloria/_components/card-learn-more-links/_style.scss +9 -0
- package/themes/umberto/layout/gloria/_components/card-learn-more-links/index.pug +56 -0
- package/themes/umberto/layout/gloria/_components/checkbox/_style.scss +117 -0
- package/themes/umberto/layout/gloria/_components/checkbox/index.pug +35 -0
- package/themes/umberto/layout/gloria/_components/cke5-code-switcher/index.pug +39 -0
- package/themes/umberto/layout/gloria/_components/code-block/_style.scss +111 -0
- package/themes/umberto/layout/gloria/_components/code-block/index.pug +75 -0
- package/themes/umberto/layout/gloria/_components/code-switcher/_style.scss +36 -0
- package/themes/umberto/layout/gloria/_components/code-switcher/index.pug +31 -0
- package/themes/umberto/layout/gloria/_components/columns/_style.scss +54 -0
- package/themes/umberto/layout/gloria/_components/columns/index.pug +30 -0
- package/themes/umberto/layout/gloria/_components/divider/_style.scss +6 -0
- package/themes/umberto/layout/gloria/_components/divider/index.pug +13 -0
- package/themes/umberto/layout/gloria/_components/dropdown/_style.scss +88 -0
- package/themes/umberto/layout/gloria/_components/dropdown/index.pug +77 -0
- package/themes/umberto/layout/gloria/_components/fake-devtools/_style.scss +233 -0
- package/themes/umberto/layout/gloria/_components/fake-devtools/index.pug +27 -0
- package/themes/umberto/layout/gloria/_components/heading-badge/index.pug +17 -0
- package/themes/umberto/layout/gloria/_components/heading-link/_style.scss +47 -0
- package/themes/umberto/layout/gloria/_components/heading-link/index.pug +26 -0
- package/themes/umberto/layout/gloria/_components/icon/_style.scss +12 -0
- package/themes/umberto/layout/gloria/_components/icon/index.pug +75 -0
- package/themes/umberto/layout/gloria/_components/icon-message/_style.scss +13 -0
- package/themes/umberto/layout/gloria/_components/icon-message/index.pug +17 -0
- package/themes/umberto/layout/gloria/_components/iframe/_style.scss +10 -0
- package/themes/umberto/layout/gloria/_components/iframe/index.pug +22 -0
- package/themes/umberto/layout/gloria/_components/img/index.pug +17 -0
- package/themes/umberto/layout/gloria/_components/index.pug +32 -0
- package/themes/umberto/layout/gloria/_components/input/_style.scss +82 -0
- package/themes/umberto/layout/gloria/_components/input/index.pug +34 -0
- package/themes/umberto/layout/gloria/_components/json-ld/index.pug +3 -0
- package/themes/umberto/layout/gloria/_components/keyboard-shortcut/_style.scss +49 -0
- package/themes/umberto/layout/gloria/_components/keyboard-shortcut/index.pug +23 -0
- package/themes/umberto/layout/gloria/_components/menu-dropdown/_style.scss +27 -0
- package/themes/umberto/layout/gloria/_components/menu-dropdown/index.pug +40 -0
- package/themes/umberto/layout/gloria/_components/mobile-overlay/_style.scss +70 -0
- package/themes/umberto/layout/gloria/_components/mobile-overlay/index.pug +37 -0
- package/themes/umberto/layout/gloria/_components/nav-tree/_style.scss +104 -0
- package/themes/umberto/layout/gloria/_components/nav-tree/index.pug +6 -0
- package/themes/umberto/layout/gloria/_components/nav-tree/nav-tree-item.pug +27 -0
- package/themes/umberto/layout/gloria/_components/nav-tree/nav-tree-level.pug +58 -0
- package/themes/umberto/layout/gloria/_components/skeleton/_style.scss +22 -0
- package/themes/umberto/layout/gloria/_components/skeleton/index.pug +16 -0
- package/themes/umberto/layout/gloria/_components/snippet-footer/_style.scss +26 -0
- package/themes/umberto/layout/gloria/_components/snippet-footer/index.pug +10 -0
- package/themes/umberto/layout/gloria/_components/spacer/_style.scss +9 -0
- package/themes/umberto/layout/gloria/_components/spacer/index.pug +19 -0
- package/themes/umberto/layout/gloria/_components/svg/index.pug +70 -0
- package/themes/umberto/layout/gloria/_components/tabs/_style.scss +80 -0
- package/themes/umberto/layout/gloria/_components/tabs/index.pug +81 -0
- package/themes/umberto/layout/gloria/_components/tag/_style.scss +79 -0
- package/themes/umberto/layout/gloria/_components/tag/index.pug +17 -0
- package/themes/umberto/layout/gloria/_components/tooltip-popover/_style.scss +194 -0
- package/themes/umberto/layout/gloria/_components/tooltip-popover/index.pug +38 -0
- package/themes/umberto/layout/gloria/_head/head-preloads.pug +32 -0
- package/themes/umberto/layout/gloria/{_partial → _head}/head.pug +8 -4
- package/themes/umberto/layout/gloria/_head/index.pug +1 -0
- package/themes/umberto/layout/gloria/_modules/algolia-search/_style.scss +202 -0
- package/themes/umberto/layout/gloria/_modules/algolia-search/_third-party.scss +1 -0
- package/themes/umberto/layout/gloria/_modules/algolia-search/index.pug +39 -0
- package/themes/umberto/layout/gloria/_modules/breadcrumbs/_style.scss +68 -0
- package/themes/umberto/layout/gloria/_modules/breadcrumbs/index.pug +18 -0
- package/themes/umberto/layout/gloria/_modules/footer/_style.scss +40 -0
- package/themes/umberto/layout/gloria/_modules/footer/index.pug +87 -0
- package/themes/umberto/layout/gloria/_modules/header/_style.scss +181 -0
- package/themes/umberto/layout/gloria/_modules/header/index.pug +70 -0
- package/themes/umberto/layout/gloria/_modules/header/nav-link.pug +19 -0
- package/themes/umberto/layout/gloria/_modules/header/nav-links.pug +11 -0
- package/themes/umberto/layout/gloria/_modules/header/nav-project-select-dropdown.pug +16 -0
- package/themes/umberto/layout/gloria/_modules/header/nav-suffix-links.pug +20 -0
- package/themes/umberto/layout/gloria/_modules/header-bar/_style.scss +56 -0
- package/themes/umberto/layout/gloria/_modules/header-bar/index.pug +40 -0
- package/themes/umberto/layout/gloria/_modules/header-legacy-warning/index.pug +11 -0
- package/themes/umberto/layout/gloria/_modules/header-nightly-info/index.pug +21 -0
- package/themes/umberto/layout/gloria/_modules/header-promobar/index.pug +18 -0
- package/themes/umberto/layout/gloria/_modules/index.pug +14 -0
- package/themes/umberto/layout/gloria/_modules/main/_style.scss +54 -0
- package/themes/umberto/layout/gloria/_modules/main/index.pug +10 -0
- package/themes/umberto/layout/gloria/_modules/mobile-nav/_style.scss +106 -0
- package/themes/umberto/layout/gloria/_modules/mobile-nav/index.pug +121 -0
- package/themes/umberto/layout/gloria/_modules/mobile-nav/slide-parts.pug +67 -0
- package/themes/umberto/layout/gloria/_modules/not-found/_style.scss +38 -0
- package/themes/umberto/layout/gloria/_modules/not-found/index.pug +16 -0
- package/themes/umberto/layout/gloria/_modules/sidebar/_style.scss +147 -0
- package/themes/umberto/layout/gloria/_modules/sidebar/index.pug +24 -0
- package/themes/umberto/layout/gloria/_modules/sidebar-api/_style.scss +2 -0
- package/themes/umberto/layout/gloria/_modules/sidebar-api/index.pug +6 -0
- package/themes/umberto/layout/gloria/_modules/toc/_style.scss +201 -0
- package/themes/umberto/layout/gloria/_modules/toc/index.pug +10 -0
- package/themes/umberto/layout/gloria/_trackers/google-tag-manager.pug +14 -0
- package/themes/umberto/layout/gloria/_trackers/index.pug +2 -0
- package/themes/umberto/layout/gloria/api.pug +42 -20
- package/themes/umberto/layout/gloria/base.pug +23 -32
- package/themes/umberto/layout/gloria/index.pug +19 -13
- package/themes/umberto/layout/gloria/page.pug +30 -11
- package/themes/umberto/layout/gloria/sdk.pug +1 -1
- package/themes/umberto/layout/gloria/theme.pug +304 -0
- package/themes/umberto/layout/umberto/404.pug +0 -1
- package/themes/umberto/layout/umberto/_partial/report-issue-widget.pug +0 -3
- package/themes/umberto/source/gloria/assets/_fonts/Lato/Lato-Bold.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Lato/Lato-Bold.woff2 +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Lato/Lato-BoldItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Lato/Lato-BoldItalic.woff2 +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Lato/Lato-Italic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Lato/Lato-Italic.woff2 +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Lato/Lato-Regular.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Lato/Lato-Regular.woff2 +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Menlo/Menlo-Regular.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Menlo/Menlo-Regular.woff +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/Mulish-Italic-VariableFont_wght.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/Mulish-Italic-VariableFont_wght.woff2 +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/Mulish-VariableFont_wght.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/Mulish-VariableFont_wght.woff2 +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Black.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-BlackItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Bold.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-BoldItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-ExtraBold.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-ExtraBoldItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-ExtraLight.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-ExtraLightItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Italic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Light.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-LightItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Medium.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-MediumItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-Regular.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-SemiBold.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Mulish/static/Mulish-SemiBoldItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/PublicSans-Italic-VariableFont_wght.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/PublicSans-Italic-VariableFont_wght.woff2 +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/PublicSans-VariableFont_wght.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/PublicSans-VariableFont_wght.woff2 +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Black.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-BlackItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Bold.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-BoldItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ExtraBold.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ExtraBoldItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ExtraLight.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ExtraLightItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Italic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Light.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-LightItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Medium.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-MediumItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Regular.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-SemiBold.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-SemiBoldItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-Thin.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_fonts/Public_Sans/static/PublicSans-ThinItalic.ttf +0 -0
- package/themes/umberto/source/gloria/assets/_img/404-billboard.svg +181 -0
- package/themes/umberto/source/gloria/assets/_img/ckeditor-logo.svg +15 -0
- package/themes/umberto/source/gloria/assets/_img/hex-bg-2.svg +10 -0
- package/themes/umberto/source/gloria/assets/_img/hex-bg.svg +10 -0
- package/themes/umberto/source/gloria/assets/_img/icons/api-class.svg +10 -0
- package/themes/umberto/source/gloria/assets/_img/icons/api-folder.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/api-interface.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/api-module.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/api-package.svg +4 -0
- package/themes/umberto/source/gloria/assets/_img/icons/api-typedef.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/bulb.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/check-circle.svg +4 -0
- package/themes/umberto/source/gloria/assets/_img/icons/check.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/chevron-down.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/chevron-right.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/close-circle.svg +4 -0
- package/themes/umberto/source/gloria/assets/_img/icons/close.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/copy.svg +10 -0
- package/themes/umberto/source/gloria/assets/_img/icons/dislike.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/download.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/edit.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/exclamation-circle.svg +4 -0
- package/themes/umberto/source/gloria/assets/_img/icons/experiment.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/export.svg +4 -0
- package/themes/umberto/source/gloria/assets/_img/icons/eye.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/filter.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/github.svg +10 -0
- package/themes/umberto/source/gloria/assets/_img/icons/info-circle.svg +4 -0
- package/themes/umberto/source/gloria/assets/_img/icons/like.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/link.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/lock.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/menu-fold.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/menu-list.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/menu.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/more.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/notification.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/number.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/premium.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/right.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/search.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/sparkles.svg +1 -0
- package/themes/umberto/source/gloria/assets/_img/icons/status.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/trash.svg +3 -0
- package/themes/umberto/source/gloria/assets/_img/icons/unordered-list.svg +5 -0
- package/themes/umberto/source/gloria/assets/_img/icons/warning.svg +10 -0
- package/themes/umberto/src/gloria/css/_fonts.scss +90 -0
- package/themes/umberto/src/gloria/css/_layers.scss +1 -0
- package/themes/umberto/src/gloria/css/_normalize.scss +118 -0
- package/themes/umberto/src/gloria/css/a11y/_focusable.scss +7 -0
- package/themes/umberto/src/gloria/css/a11y/_index.scss +4 -0
- package/themes/umberto/src/gloria/css/a11y/_mixins.scss +32 -0
- package/themes/umberto/src/gloria/css/a11y/_reduce-motion.scss +9 -0
- package/themes/umberto/src/gloria/css/a11y/_screen-reader.scss +15 -0
- package/themes/umberto/src/gloria/css/base/_buttons.scss +13 -0
- package/themes/umberto/src/gloria/css/base/_descriptions-list.scss +33 -0
- package/themes/umberto/src/gloria/css/base/_details.scss +7 -0
- package/themes/umberto/src/gloria/css/base/_headings.scss +111 -0
- package/themes/umberto/src/gloria/css/base/_iframes.scss +7 -0
- package/themes/umberto/src/gloria/css/base/_index.scss +12 -0
- package/themes/umberto/src/gloria/css/base/_inline-code.scss +16 -0
- package/themes/umberto/src/gloria/css/base/_links.scss +31 -0
- package/themes/umberto/src/gloria/css/base/_lists.scss +58 -0
- package/themes/umberto/src/gloria/css/base/_mixins.scss +3 -0
- package/themes/umberto/src/gloria/css/base/_paragraphs.scss +15 -0
- package/themes/umberto/src/gloria/css/base/_tables.scss +64 -0
- package/themes/umberto/src/gloria/css/base/_typography.scss +62 -0
- package/themes/umberto/src/gloria/css/components/_api-collapsing-list.scss +152 -0
- package/themes/umberto/src/gloria/css/components/_api-filter-dropdown.scss +17 -0
- package/themes/umberto/src/gloria/css/components/_api-item-heading.scss +58 -0
- package/themes/umberto/src/gloria/css/components/_api-tree.scss +202 -0
- package/themes/umberto/src/gloria/css/components/_hierarchy-list.scss +35 -0
- package/themes/umberto/src/gloria/css/components/_image-zoom.scss +13 -0
- package/themes/umberto/src/gloria/css/components/_index.scss +56 -0
- package/themes/umberto/src/gloria/css/components/_notification.scss +36 -0
- package/themes/umberto/src/gloria/css/components/_utils.scss +5 -0
- package/themes/umberto/src/gloria/css/doc/_details.scss +11 -0
- package/themes/umberto/src/gloria/css/doc/_editor-icons.scss +21 -0
- package/themes/umberto/src/gloria/css/doc/_images.scss +9 -0
- package/themes/umberto/src/gloria/css/doc/_index.scss +5 -0
- package/themes/umberto/src/gloria/css/doc/_snippets.scss +127 -0
- package/themes/umberto/src/gloria/css/doc/_typography.scss +5 -0
- package/themes/umberto/src/gloria/css/layout/_base.scss +17 -0
- package/themes/umberto/src/gloria/css/layout/_breakpoints.scss +88 -0
- package/themes/umberto/src/gloria/css/layout/_container.scss +38 -0
- package/themes/umberto/src/gloria/css/layout/_index.scss +6 -0
- package/themes/umberto/src/gloria/css/layout/_layout.scss +64 -0
- package/themes/umberto/src/gloria/css/layout/_mixins.scss +34 -0
- package/themes/umberto/src/gloria/css/layout/_zindex.scss +12 -0
- package/themes/umberto/src/gloria/css/modules/_index.scss +29 -0
- package/themes/umberto/src/gloria/css/modules/_utils.scss +7 -0
- package/themes/umberto/src/gloria/css/styles.scss +11 -117
- package/themes/umberto/src/gloria/css/theme/_light.scss +344 -0
- package/themes/umberto/src/gloria/css/utilities/_animation.scss +32 -0
- package/themes/umberto/src/gloria/css/utilities/_colors.scss +14 -0
- package/themes/umberto/src/gloria/css/utilities/_display.scss +13 -0
- package/themes/umberto/src/gloria/css/utilities/_flex.scss +33 -0
- package/themes/umberto/src/gloria/css/utilities/_gap.scss +8 -0
- package/themes/umberto/src/gloria/css/utilities/_index.scss +11 -0
- package/themes/umberto/src/gloria/css/utilities/_radius.scss +21 -0
- package/themes/umberto/src/gloria/css/utilities/_rotation.scss +8 -0
- package/themes/umberto/src/gloria/css/utilities/_shadows.scss +13 -0
- package/themes/umberto/src/gloria/css/utilities/_spacing.scss +97 -0
- package/themes/umberto/src/gloria/css/utilities/_stop-scrolling.scss +9 -0
- package/themes/umberto/src/gloria/css/utilities/_text.scss +42 -0
- package/themes/umberto/src/gloria/js/app.js +92 -54
- package/themes/umberto/src/gloria/js/components/api-nav-tree.js +171 -0
- package/themes/umberto/src/gloria/js/components/api-toggle.js +92 -0
- package/themes/umberto/src/gloria/js/components/base-component.js +41 -0
- package/themes/umberto/src/gloria/js/components/breadcrumbs.js +115 -0
- package/themes/umberto/src/gloria/js/components/code-block.js +229 -0
- package/themes/umberto/src/gloria/js/components/code-switcher.js +177 -0
- package/themes/umberto/src/gloria/js/components/dropdown.js +516 -0
- package/themes/umberto/src/gloria/js/components/expandable.js +79 -0
- package/themes/umberto/src/gloria/js/components/fake-devtools.js +722 -0
- package/themes/umberto/src/gloria/js/components/hash-link.js +60 -0
- package/themes/umberto/src/gloria/js/components/heading-link.js +135 -0
- package/themes/umberto/src/gloria/js/components/iframe.js +158 -0
- package/themes/umberto/src/gloria/js/{_imageModal.js → components/image-zoom.js} +1 -1
- package/themes/umberto/src/gloria/js/components/mobile-overlay.js +315 -0
- package/themes/umberto/src/gloria/js/components/nav-tree.js +164 -0
- package/themes/umberto/src/gloria/js/components/tabs.js +284 -0
- package/themes/umberto/src/gloria/js/components/tooltip-popover.js +576 -0
- package/themes/umberto/src/gloria/js/helpers/after-dom-ready.js +16 -0
- package/themes/umberto/src/gloria/js/helpers/animate-element.js +78 -0
- package/themes/umberto/src/gloria/js/helpers/body-scroll.js +22 -0
- package/themes/umberto/src/gloria/js/helpers/clamp.js +16 -0
- package/themes/umberto/src/gloria/js/helpers/classnames.js +64 -0
- package/themes/umberto/src/gloria/js/helpers/copy-to-clipboard.js +19 -0
- package/themes/umberto/src/gloria/js/helpers/create-anchor-positioning-watcher.js +46 -0
- package/themes/umberto/src/gloria/js/helpers/create-cleanup-registry.js +88 -0
- package/themes/umberto/src/gloria/js/helpers/create-hover-manager.js +93 -0
- package/themes/umberto/src/gloria/js/helpers/create-keyboard-blur-watcher.js +90 -0
- package/themes/umberto/src/gloria/js/helpers/create-keyboard-focus-cycler.js +251 -0
- package/themes/umberto/src/gloria/js/helpers/create-mutation-observer.js +49 -0
- package/themes/umberto/src/gloria/js/helpers/create-outside-click-watcher.js +39 -0
- package/themes/umberto/src/gloria/js/helpers/cubic-bezier.js +55 -0
- package/themes/umberto/src/gloria/js/helpers/date-time.js +21 -0
- package/themes/umberto/src/gloria/js/helpers/decode-html-entities.js +23 -0
- package/themes/umberto/src/gloria/js/helpers/escape-handler.js +59 -0
- package/themes/umberto/src/gloria/js/helpers/fetch-stylesheet.js +25 -0
- package/themes/umberto/src/gloria/js/helpers/find-code-lang.js +85 -0
- package/themes/umberto/src/gloria/js/helpers/focus-first-interactive.js +50 -0
- package/themes/umberto/src/gloria/js/helpers/format-html.js +181 -0
- package/themes/umberto/src/gloria/js/helpers/get-all-scrollable-parents.js +34 -0
- package/themes/umberto/src/gloria/js/helpers/get-parents-until.js +26 -0
- package/themes/umberto/src/gloria/js/helpers/highlight-code.js +18 -0
- package/themes/umberto/src/gloria/js/helpers/html-builder.js +69 -0
- package/themes/umberto/src/gloria/js/helpers/identity.js +8 -0
- package/themes/umberto/src/gloria/js/helpers/inject-resource-preload.js +51 -0
- package/themes/umberto/src/gloria/js/helpers/inject-script.js +79 -0
- package/themes/umberto/src/gloria/js/helpers/inject-stylesheet.js +108 -0
- package/themes/umberto/src/gloria/js/helpers/is-element-attached.js +28 -0
- package/themes/umberto/src/gloria/js/helpers/is-focusable.js +14 -0
- package/themes/umberto/src/gloria/js/helpers/is-hidden-element.js +8 -0
- package/themes/umberto/src/gloria/js/helpers/is-mobile.js +8 -0
- package/themes/umberto/src/gloria/js/helpers/is-unsafe-key.js +14 -0
- package/themes/umberto/src/gloria/js/helpers/lerp.js +27 -0
- package/themes/umberto/src/gloria/js/helpers/local-storage-helper.js +133 -0
- package/themes/umberto/src/gloria/js/helpers/pipe.js +8 -0
- package/themes/umberto/src/gloria/js/helpers/prefers-reduced-motion.js +13 -0
- package/themes/umberto/src/gloria/js/helpers/random-id.js +51 -0
- package/themes/umberto/src/gloria/js/helpers/sanitize-text.js +27 -0
- package/themes/umberto/src/gloria/js/helpers/scroll-to-hash.js +31 -0
- package/themes/umberto/src/gloria/js/helpers/take-last.js +19 -0
- package/themes/umberto/src/gloria/js/helpers/tap.js +11 -0
- package/themes/umberto/src/gloria/js/helpers/throttle.js +46 -0
- package/themes/umberto/src/gloria/js/helpers/timeout.js +14 -0
- package/themes/umberto/src/gloria/js/helpers/toggle-height.js +46 -0
- package/themes/umberto/src/gloria/js/helpers/tween.js +100 -0
- package/themes/umberto/src/gloria/js/helpers/wrap-around.js +39 -0
- package/themes/umberto/src/gloria/js/modules/algolia-search.js +168 -0
- package/themes/umberto/src/gloria/js/modules/api-filter.js +189 -0
- package/themes/umberto/src/gloria/js/modules/header-bar.js +154 -0
- package/themes/umberto/src/gloria/js/modules/header.js +242 -0
- package/themes/umberto/src/gloria/js/modules/links-prefetch.js +196 -0
- package/themes/umberto/src/gloria/js/modules/mobile-nav.js +327 -0
- package/themes/umberto/src/gloria/js/modules/sidebar.js +114 -0
- package/themes/umberto/src/gloria/js/modules/table-of-contents-api.js +214 -0
- package/themes/umberto/src/gloria/js/modules/table-of-contents.js +287 -0
- package/themes/umberto/src/gloria/js/public-api.js +75 -0
- package/themes/umberto/src/gloria/js/web-components/svg-icon.js +117 -0
- package/themes/umberto/src/umberto/js/_codeswitcherbuttons.js +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_api-title.pug +0 -17
- package/themes/umberto/layout/gloria/_mixin/nav-tree-item.pug +0 -13
- package/themes/umberto/layout/gloria/_mixin/nav-tree-level.pug +0 -38
- package/themes/umberto/layout/gloria/_partial/docsearch.pug +0 -21
- package/themes/umberto/layout/gloria/_partial/dropdown.pug +0 -12
- package/themes/umberto/layout/gloria/_partial/feedback-widget.pug +0 -20
- package/themes/umberto/layout/gloria/_partial/footer.pug +0 -6
- package/themes/umberto/layout/gloria/_partial/gh-contribute.pug +0 -8
- package/themes/umberto/layout/gloria/_partial/google-tag-manager.pug +0 -18
- package/themes/umberto/layout/gloria/_partial/header.pug +0 -64
- package/themes/umberto/layout/gloria/_partial/nav-tree.pug +0 -9
- package/themes/umberto/layout/gloria/_partial/report-issue-widget.pug +0 -26
- package/themes/umberto/layout/gloria/_partial/rwd-breadcrumbs.pug +0 -13
- package/themes/umberto/layout/gloria/_partial/search-box.pug +0 -6
- package/themes/umberto/layout/gloria/_partial/vwo.pug +0 -11
- package/themes/umberto/source/gloria/assets/_img/arrows.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/book.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/box-brown.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/box-orange.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/box-red.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/bulb.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/clipboard.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/cog.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/data.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/documentation.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/download.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/edit.svg +0 -2
- package/themes/umberto/source/gloria/assets/_img/exclamation-circle.svg +0 -2
- package/themes/umberto/source/gloria/assets/_img/eye.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/filter.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/filtering.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/folder.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/github.svg +0 -6
- package/themes/umberto/source/gloria/assets/_img/header-info-configs.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/header-info-events.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/header-info-methods.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/header-info-properties.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/heart.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/info-circle.svg +0 -4
- package/themes/umberto/source/gloria/assets/_img/info.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/list-nest.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/loupe.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/menu.svg +0 -4
- package/themes/umberto/source/gloria/assets/_img/plug.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/star-in-circle.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/tick.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/triangle-down.svg +0 -1
- package/themes/umberto/source/gloria/assets/_img/triangle-right.svg +0 -1
- package/themes/umberto/src/gloria/css/_api-content.scss +0 -32
- package/themes/umberto/src/gloria/css/_api-info-box.scss +0 -86
- package/themes/umberto/src/gloria/css/_api-props-filter.scss +0 -106
- package/themes/umberto/src/gloria/css/_api-see-source.scss +0 -35
- package/themes/umberto/src/gloria/css/_api-subheader.scss +0 -167
- package/themes/umberto/src/gloria/css/_api-tree.scss +0 -121
- package/themes/umberto/src/gloria/css/_badge.scss +0 -74
- package/themes/umberto/src/gloria/css/_code-switcher.scss +0 -61
- package/themes/umberto/src/gloria/css/_collapsinglist.scss +0 -262
- package/themes/umberto/src/gloria/css/_content.scss +0 -236
- package/themes/umberto/src/gloria/css/_docsearch.scss +0 -109
- package/themes/umberto/src/gloria/css/_dropdown.scss +0 -63
- package/themes/umberto/src/gloria/css/_editor-icon.scss +0 -26
- package/themes/umberto/src/gloria/css/_feedback-widget.scss +0 -11
- package/themes/umberto/src/gloria/css/_font-external.scss +0 -8
- package/themes/umberto/src/gloria/css/_footer.scss +0 -40
- package/themes/umberto/src/gloria/css/_formatted.scss +0 -285
- package/themes/umberto/src/gloria/css/_guide-content.scss +0 -37
- package/themes/umberto/src/gloria/css/_guide-sdk-tree.scss +0 -14
- package/themes/umberto/src/gloria/css/_loading-spinner.scss +0 -33
- package/themes/umberto/src/gloria/css/_main.scss +0 -59
- package/themes/umberto/src/gloria/css/_navigation.scss +0 -35
- package/themes/umberto/src/gloria/css/_notice.scss +0 -116
- package/themes/umberto/src/gloria/css/_print.scss +0 -20
- package/themes/umberto/src/gloria/css/_prism.scss +0 -223
- package/themes/umberto/src/gloria/css/_rwd-breadcrumbs.scss +0 -28
- package/themes/umberto/src/gloria/css/_rwd-menu.scss +0 -89
- package/themes/umberto/src/gloria/css/_secondary-navigation.scss +0 -152
- package/themes/umberto/src/gloria/css/_theme-dark.scss +0 -175
- package/themes/umberto/src/gloria/css/_toggler.scss +0 -46
- package/themes/umberto/src/gloria/css/_top.scss +0 -350
- package/themes/umberto/src/gloria/css/_tree.scss +0 -218
- package/themes/umberto/src/gloria/css/_warning-banner.scss +0 -46
- package/themes/umberto/src/gloria/css/components/_lightbox.scss +0 -12
- package/themes/umberto/src/gloria/css/helpers/_color.scss +0 -49
- package/themes/umberto/src/gloria/css/helpers/_font.scss +0 -60
- package/themes/umberto/src/gloria/css/helpers/_globals.scss +0 -129
- package/themes/umberto/src/gloria/css/helpers/_reset.scss +0 -52
- package/themes/umberto/src/gloria/css/helpers/_spacing.scss +0 -21
- package/themes/umberto/src/gloria/css/pages/_sdk.scss +0 -111
- package/themes/umberto/src/gloria/js/_anchors.js +0 -57
- package/themes/umberto/src/gloria/js/_apisearch.js +0 -126
- package/themes/umberto/src/gloria/js/_apitree.js +0 -67
- package/themes/umberto/src/gloria/js/_attachpermalinklistener.js +0 -50
- package/themes/umberto/src/gloria/js/_codeswitcherbuttons.js +0 -146
- package/themes/umberto/src/gloria/js/_collapsables.js +0 -135
- package/themes/umberto/src/gloria/js/_copymobileapinavigation.js +0 -26
- package/themes/umberto/src/gloria/js/_devnames.js +0 -37
- package/themes/umberto/src/gloria/js/_dropdowns.js +0 -55
- package/themes/umberto/src/gloria/js/_filtering.js +0 -139
- package/themes/umberto/src/gloria/js/_pagenavigation.js +0 -93
- package/themes/umberto/src/gloria/js/_prism.js +0 -104
- package/themes/umberto/src/gloria/js/_rwdmenu.js +0 -15
- package/themes/umberto/src/gloria/js/_samplecode.js +0 -23
- package/themes/umberto/src/gloria/js/_sidenavigation.js +0 -59
- package/themes/umberto/src/gloria/js/_toc.js +0 -93
- package/themes/umberto/src/gloria/js/_tooltips.js +0 -39
- package/themes/umberto/src/gloria/js/_warningbanner.js +0 -18
- package/themes/umberto/src/gloria/js/vendor/prism.js +0 -45
- /package/themes/umberto/layout/gloria/_api-docs/_partial/{api-info-box.pug → api-hierarchy.pug} +0 -0
- /package/themes/umberto/layout/gloria/{_partial → _trackers}/google-analytics.pug +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
const transformXMLTreeToPug = require( './transform-xml-tree-to-pug.js' );
|
|
9
|
+
const XMLComponentsParser = require( './parser/xml-components-parser.js' );
|
|
10
|
+
const { walkXMLTree, TreeWalkActions } = require( './parser/walk-xml-tree.js' );
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Slices XML components from Markdown content and transforms them to Pug format.
|
|
14
|
+
*
|
|
15
|
+
* This function takes text containing XML-like components mixed with regular content,
|
|
16
|
+
* parses it into a tree structure, and then walks through the tree to transform
|
|
17
|
+
* XML elements into Pug mixin calls while preserving text content.
|
|
18
|
+
*
|
|
19
|
+
* @param xml - The input text containing XML components and regular content
|
|
20
|
+
* @param options - Configuration options for parsing and transformation
|
|
21
|
+
* @param options.hexo - The Hexo instance for context (required)
|
|
22
|
+
* @param options.sourceName - The name of the source file (for error reporting)
|
|
23
|
+
* @param options.mixinContextVars - Additional attributes to pass to the Pug mixin
|
|
24
|
+
* @param [options.parserConfig={}] - Configuration passed to XMLComponentsParser
|
|
25
|
+
* @param [options.pugTransformerConfig={}] - Configuration passed to transformXMLTreeToPug
|
|
26
|
+
* @returns The transformed content with XML components converted to Pug syntax
|
|
27
|
+
*/
|
|
28
|
+
function renderXMLPugComponentsInMarkdown( xml, options ) {
|
|
29
|
+
const {
|
|
30
|
+
sourceName,
|
|
31
|
+
mixinContextVars,
|
|
32
|
+
hexo,
|
|
33
|
+
basePath,
|
|
34
|
+
patternElements = [],
|
|
35
|
+
replaceFn = createReplacementBase64Tag
|
|
36
|
+
} = options;
|
|
37
|
+
|
|
38
|
+
const parser = XMLComponentsParser.parseText( xml, {
|
|
39
|
+
trimRootText: false,
|
|
40
|
+
patternElements
|
|
41
|
+
} );
|
|
42
|
+
|
|
43
|
+
const markdown = walkXMLTree( parser.tree, {
|
|
44
|
+
enter( node, depth ) {
|
|
45
|
+
switch ( node.type ) {
|
|
46
|
+
case 'text':
|
|
47
|
+
return TreeWalkActions.replace( node.content );
|
|
48
|
+
|
|
49
|
+
case 'element': {
|
|
50
|
+
const { patternElement } = node;
|
|
51
|
+
|
|
52
|
+
if ( patternElement.renderer ) {
|
|
53
|
+
return TreeWalkActions.replace(
|
|
54
|
+
patternElement.renderer( node )
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Hexo rendering engine is a little bit clumsy and rendered markdown within
|
|
59
|
+
// pug mixins often results in broken HTML. It's easier to do it manually, after
|
|
60
|
+
// the whole tree is rendered.
|
|
61
|
+
const postfixTexts = [];
|
|
62
|
+
const content = transformXMLTreeToPug( node, depth, {
|
|
63
|
+
fallbackGlobalRequire: '_components/index',
|
|
64
|
+
parseText: ( node, str ) => {
|
|
65
|
+
if ( !str.trim().length ) {
|
|
66
|
+
return '';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Handle the text inside the pug.
|
|
70
|
+
if ( !node.patternElement?.allowMarkdownContent ) {
|
|
71
|
+
return str;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// If the content is a markdown text, we'll postprocess it after rendering whole tree.
|
|
75
|
+
postfixTexts.push( str );
|
|
76
|
+
return `__MARKDOWN_TEXT_${ postfixTexts.length - 1 }__`;
|
|
77
|
+
}
|
|
78
|
+
} );
|
|
79
|
+
|
|
80
|
+
// Let's render the mixin.
|
|
81
|
+
const locals = Object.assign(
|
|
82
|
+
{},
|
|
83
|
+
hexo.locals.toObject(),
|
|
84
|
+
hexo.extend.helper.list(),
|
|
85
|
+
{
|
|
86
|
+
...mixinContextVars,
|
|
87
|
+
config: hexo.config,
|
|
88
|
+
mixinContextVars: patternElement.mixinContextVars
|
|
89
|
+
}
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
// Render component wrapper
|
|
93
|
+
let finalReplacement = null;
|
|
94
|
+
|
|
95
|
+
try {
|
|
96
|
+
finalReplacement = hexo.render.renderSync(
|
|
97
|
+
{
|
|
98
|
+
engine: 'pug',
|
|
99
|
+
text: content,
|
|
100
|
+
path: basePath
|
|
101
|
+
},
|
|
102
|
+
locals
|
|
103
|
+
).trim();
|
|
104
|
+
} catch ( error ) {
|
|
105
|
+
console.error( error );
|
|
106
|
+
console.error( `Error rendering component "${ node.name }" in file ${ sourceName }` );
|
|
107
|
+
console.error( content );
|
|
108
|
+
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Render markdown content inside the mixin, if present.
|
|
113
|
+
for ( let i = 0; i < postfixTexts.length; i++ ) {
|
|
114
|
+
const renderedInnerText = hexo.render.renderSync(
|
|
115
|
+
{
|
|
116
|
+
text: postfixTexts[ i ],
|
|
117
|
+
engine: 'markdown'
|
|
118
|
+
}
|
|
119
|
+
).trim();
|
|
120
|
+
|
|
121
|
+
finalReplacement = finalReplacement.replace(
|
|
122
|
+
`__MARKDOWN_TEXT_${ i }__`,
|
|
123
|
+
renderedInnerText
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Leave magic base64 tag that will be replaced AFTER processing the whole markdown document.
|
|
128
|
+
return TreeWalkActions.replace(
|
|
129
|
+
replaceFn( finalReplacement )
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
} ).join( '' );
|
|
135
|
+
|
|
136
|
+
return markdown;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Creates a Base64-encoded replacement tag for component content.
|
|
141
|
+
*
|
|
142
|
+
* This function encodes the provided content into a Base64 string and wraps it
|
|
143
|
+
* in an HTML comment marker that can be later extracted and replaced with the
|
|
144
|
+
* original content.
|
|
145
|
+
*
|
|
146
|
+
* @param content - The HTML/text content to be encoded and wrapped
|
|
147
|
+
* @returns A comment tag containing the Base64-encoded content
|
|
148
|
+
*/
|
|
149
|
+
function createReplacementBase64Tag( content ) {
|
|
150
|
+
const encodedContent = Buffer.from( content ).toString( 'base64' );
|
|
151
|
+
|
|
152
|
+
return `<!-- COMPONENT:${ encodedContent } -->`;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Extracts and decodes Base64-encoded component markers from page content.
|
|
157
|
+
*
|
|
158
|
+
* This function finds HTML comment markers containing Base64-encoded content,
|
|
159
|
+
* decodes them back to their original form, and replaces the markers with the
|
|
160
|
+
* decoded content. It processes the content iteratively to handle nested
|
|
161
|
+
* components and includes a maximum iteration limit to prevent infinite loops.
|
|
162
|
+
*
|
|
163
|
+
* @param options - Configuration object
|
|
164
|
+
* @param options.page - The page object containing the content to process
|
|
165
|
+
* @param options.maxIterations - Maximum number of processing iterations to prevent infinite loops
|
|
166
|
+
* @returns The processed content with all component markers replaced
|
|
167
|
+
*/
|
|
168
|
+
function extractReplacementBase64Tag( { page, maxIterations = 5 } ) {
|
|
169
|
+
let content = page.content;
|
|
170
|
+
let previousContent;
|
|
171
|
+
|
|
172
|
+
const markerRegex = /<!-- COMPONENT:(.*?) -->/g;
|
|
173
|
+
|
|
174
|
+
do {
|
|
175
|
+
previousContent = content;
|
|
176
|
+
content = content.replace(
|
|
177
|
+
/<!-- COMPONENT:([a-zA-Z0-9+/=]+) -->/g,
|
|
178
|
+
( match, encodedContent ) => {
|
|
179
|
+
try {
|
|
180
|
+
return Buffer.from( encodedContent, 'base64' ).toString();
|
|
181
|
+
} catch ( error ) {
|
|
182
|
+
console.error( `Error decoding component marker in file ${ page.source }`, error );
|
|
183
|
+
return match;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
);
|
|
187
|
+
} while ( content !== previousContent && markerRegex.test( content ) && maxIterations-- > 0 );
|
|
188
|
+
|
|
189
|
+
return content;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
exports.renderXMLPugComponentsInMarkdown = renderXMLPugComponentsInMarkdown;
|
|
193
|
+
exports.extractReplacementBase64Tag = extractReplacementBase64Tag;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Transforms XML tree structure to Pug mixin format.
|
|
8
|
+
* This module converts parsed XML nodes into Pug template syntax with proper indentation and attribute handling.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
const { TreeWalkActions, walkXMLTree } = require( './parser/walk-xml-tree' );
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Transforms an XML tree structure into Pug mixin syntax.
|
|
17
|
+
*
|
|
18
|
+
* @param tree - The XML tree object to transform
|
|
19
|
+
* @param nesting - Base nesting level for indentation
|
|
20
|
+
* @param options - Configuration options
|
|
21
|
+
* @param options.nestingCharacter - Character used for indentation (default: '\t')
|
|
22
|
+
* @returns The transformed Pug mixin string
|
|
23
|
+
*/
|
|
24
|
+
function transformXMLTreeToPug( tree, nesting, options = {} ) {
|
|
25
|
+
const {
|
|
26
|
+
nestingCharacter = '\t',
|
|
27
|
+
parseText = str => str,
|
|
28
|
+
fallbackGlobalRequire
|
|
29
|
+
} = options;
|
|
30
|
+
|
|
31
|
+
let hasMissingImports = false;
|
|
32
|
+
|
|
33
|
+
// Walk through the XML tree and transform each node
|
|
34
|
+
const requireTags = new Set( [] );
|
|
35
|
+
const result = walkXMLTree( tree, {
|
|
36
|
+
leave( node, depth, parents ) {
|
|
37
|
+
// Calculate indentation based on nesting level and current depth
|
|
38
|
+
const indent = nestingCharacter.repeat( nesting + depth );
|
|
39
|
+
|
|
40
|
+
switch ( node.type ) {
|
|
41
|
+
case 'text': {
|
|
42
|
+
const parent = parents[ parents.length - 1 ];
|
|
43
|
+
let mappedContent = node.content;
|
|
44
|
+
|
|
45
|
+
if ( parent && parent.type === 'element' ) {
|
|
46
|
+
mappedContent = parseText( parent, mappedContent );
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if ( !mappedContent ) {
|
|
50
|
+
return TreeWalkActions.remove();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return TreeWalkActions.replace( `${ indent }| ${ mappedContent }\n` );
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
case 'element': {
|
|
57
|
+
if ( !node.patternElement?.requires?.length ) {
|
|
58
|
+
hasMissingImports = true;
|
|
59
|
+
} else if ( !hasMissingImports ) {
|
|
60
|
+
for ( const requirePath of node.patternElement.requires ) {
|
|
61
|
+
requireTags.add( requirePath );
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const mappedAttributes = (
|
|
66
|
+
node.patternElement?.attributesMapper ?
|
|
67
|
+
node.patternElement.attributesMapper( node ) :
|
|
68
|
+
node.attributes
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return TreeWalkActions.replace( [
|
|
72
|
+
`${ indent }+${ node.patternElement.mixinName || node.name }(${ serializeMixinAttributes( mappedAttributes ) })`,
|
|
73
|
+
...( node.children || [] )
|
|
74
|
+
].join( '\n' ) );
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
} );
|
|
79
|
+
|
|
80
|
+
// There is no need to duplicate requires if the fallback global require is already included.
|
|
81
|
+
if ( hasMissingImports ) {
|
|
82
|
+
requireTags.clear();
|
|
83
|
+
requireTags.add( fallbackGlobalRequire );
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return [
|
|
87
|
+
...Array.from( requireTags ).map( requirePath => `include ${ requirePath }` ),
|
|
88
|
+
result
|
|
89
|
+
].join( '\n' );
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Serializes XML attributes into JSON format for Pug mixin parameters.
|
|
94
|
+
* Normalizes attribute names and values according to Pug conventions.
|
|
95
|
+
*
|
|
96
|
+
* @param attributes - Object containing XML attributes
|
|
97
|
+
* @returns JSON string representation of normalized attributes
|
|
98
|
+
*/
|
|
99
|
+
function serializeMixinAttributes( attributes ) {
|
|
100
|
+
const entries = Object.fromEntries(
|
|
101
|
+
Object
|
|
102
|
+
.entries( attributes )
|
|
103
|
+
.map( ( [ key, value ] ) => {
|
|
104
|
+
const normalizedKey = normalizeMixinAttributeName( key );
|
|
105
|
+
const normalizedValue = normalizeMixinAttributeValue( value );
|
|
106
|
+
|
|
107
|
+
return [ normalizedKey, normalizedValue ];
|
|
108
|
+
} )
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
return JSON.stringify( entries );
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Normalizes XML attribute values to appropriate JavaScript types.
|
|
116
|
+
* Converts string representations of booleans to actual boolean values.
|
|
117
|
+
*
|
|
118
|
+
* @param value - The XML attribute value to normalize
|
|
119
|
+
* @returns Normalized value (boolean for 'true'/'false', string otherwise)
|
|
120
|
+
*/
|
|
121
|
+
function normalizeMixinAttributeValue( value ) {
|
|
122
|
+
if ( value === 'true' || value === '' ) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if ( value === 'false' ) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return value;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Normalizes attribute names from kebab-case to camelCase.
|
|
135
|
+
* e.g., data-foo-bar -> dataFooBar
|
|
136
|
+
*
|
|
137
|
+
* @param name - The kebab-case attribute name
|
|
138
|
+
* @returns The camelCase attribute name
|
|
139
|
+
*/
|
|
140
|
+
function normalizeMixinAttributeName( name ) {
|
|
141
|
+
return name.replace( /-([a-z])/g, g => g[ 1 ].toUpperCase() );
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
module.exports = transformXMLTreeToPug;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
const crypto = require( 'crypto' );
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Generates a random ID with a single segment. If a prefix is provided, it will be prepended to the ID.
|
|
12
|
+
*
|
|
13
|
+
* The `gen-` prefix is always used to easier extract the generated IDs from the output.
|
|
14
|
+
*
|
|
15
|
+
* @param [prefix] Optional prefix to add to the ID
|
|
16
|
+
* @param [maskable=true] Whether the ID should be replaceable by regenerateRandomIds.
|
|
17
|
+
* @return The generated ID with optional prefix
|
|
18
|
+
*/
|
|
19
|
+
function randomId( prefix, maskable = true ) {
|
|
20
|
+
const shortId = crypto.randomBytes( 3 ).toString( 'hex' ).substring( 0, 5 );
|
|
21
|
+
|
|
22
|
+
let id = prefix ? `${ prefix }-${ shortId }` : shortId;
|
|
23
|
+
|
|
24
|
+
if ( maskable ) {
|
|
25
|
+
id = `gen-${ id }`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return id;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Checks if the given ID is a masked ID.
|
|
33
|
+
*/
|
|
34
|
+
function isMaskedID( id ) {
|
|
35
|
+
return id.startsWith( 'gen-' );
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Regenerates random IDs in a string.
|
|
40
|
+
*
|
|
41
|
+
* It finds all occurrences of IDs generated by `randomId()` and replaces them with new random IDs.
|
|
42
|
+
* If an ID is repeated in the input string, it will be replaced with the same new ID.
|
|
43
|
+
* It preserves the prefix of the original ID.
|
|
44
|
+
*
|
|
45
|
+
* @param str The string to process.
|
|
46
|
+
* @returns The string with regenerated IDs.
|
|
47
|
+
*/
|
|
48
|
+
function regenerateRandomIds( str ) {
|
|
49
|
+
const idCache = new Map();
|
|
50
|
+
const idRegex = /(gen-(?:[a-zA-Z0-9]+-)*[a-f0-9]{5})/g;
|
|
51
|
+
|
|
52
|
+
return str.replace( idRegex, oldId => {
|
|
53
|
+
if ( idCache.has( oldId ) ) {
|
|
54
|
+
return idCache.get( oldId );
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Everything after 'gen-'.
|
|
58
|
+
const idContent = oldId.substring( 4 );
|
|
59
|
+
const parts = idContent.split( '-' );
|
|
60
|
+
|
|
61
|
+
// The ID has 1 segment at the end. If there are more parts, it means a prefix is present.
|
|
62
|
+
const prefix = parts.length > 1 ? parts.slice( 0, -1 ).join( '-' ) : undefined;
|
|
63
|
+
const newId = randomId( prefix );
|
|
64
|
+
|
|
65
|
+
idCache.set( oldId, newId );
|
|
66
|
+
|
|
67
|
+
return newId;
|
|
68
|
+
} );
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
module.exports = {
|
|
72
|
+
isMaskedID,
|
|
73
|
+
randomId,
|
|
74
|
+
regenerateRandomIds
|
|
75
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Removes indentation from content preserving the relative indentation within the content.
|
|
10
|
+
* @param content The content to remove indentation from
|
|
11
|
+
* @returns Content with common indentation removed
|
|
12
|
+
*/
|
|
13
|
+
module.exports = function removeIndentation( content ) {
|
|
14
|
+
// Remove unwanted indentation.
|
|
15
|
+
const lines = content.split( /\n/ );
|
|
16
|
+
|
|
17
|
+
// Skip empty lines when detecting indentation level
|
|
18
|
+
let indentationLine = 1;
|
|
19
|
+
while ( indentationLine < lines.length && !lines[ indentationLine ].trim() ) {
|
|
20
|
+
indentationLine++;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Get the indentation of the first non-empty line, or empty string if no valid lines
|
|
24
|
+
const indentation = indentationLine < lines.length ? lines[ indentationLine ].match( /^\s*/ )[ 0 ] : '';
|
|
25
|
+
|
|
26
|
+
if ( !indentation ) {
|
|
27
|
+
return content.trim();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let pattern;
|
|
31
|
+
|
|
32
|
+
// When using spaces as indentation, some editors may mix them with tabs.
|
|
33
|
+
// In such case, let's try to remove tabs as well. 4 spaces are treat as a single tab character.
|
|
34
|
+
if ( indentation[ 0 ] === ' ' ) {
|
|
35
|
+
pattern = new RegExp( `^${ indentation }|${ '\\t'.repeat( Math.ceil( indentation.length / 4 ) ) }` );
|
|
36
|
+
} else {
|
|
37
|
+
pattern = new RegExp( `^${ indentation }` );
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Process each line to remove common indentation
|
|
41
|
+
content = lines.map( line => line.replace( pattern, '' ) ).join( '\n' );
|
|
42
|
+
|
|
43
|
+
// Remove first linebreak and last linebreak.
|
|
44
|
+
content = content.replace( /^\n/, '' );
|
|
45
|
+
content = content.replace( /\n$/, '' );
|
|
46
|
+
|
|
47
|
+
return content;
|
|
48
|
+
};
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2017-2025, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
const cheerio = require( 'cheerio' );
|
|
9
|
+
const fs = require( 'fs' );
|
|
10
|
+
const path = require( 'path' );
|
|
11
|
+
|
|
12
|
+
const HexoManager = require( '../../src/hexo-manager' );
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Cache for parsed SVG elements.
|
|
16
|
+
*/
|
|
17
|
+
const SVG_CACHE = new Map();
|
|
18
|
+
|
|
19
|
+
module.exports = function spritesheetSvg( str, isDocument = true ) {
|
|
20
|
+
const $ = cheerio.load( str, null, isDocument );
|
|
21
|
+
const elements = $( '[data-spritesheet-svg]' );
|
|
22
|
+
|
|
23
|
+
// Skip if there are no elements with data-spritesheet-svg
|
|
24
|
+
if ( elements.length === 0 ) {
|
|
25
|
+
return str;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Collect all unique SVG files to include in the spritesheet
|
|
29
|
+
const svgFiles = new Map();
|
|
30
|
+
|
|
31
|
+
// Helper function to extract SVG file information
|
|
32
|
+
function collectSvgFileInfo( element ) {
|
|
33
|
+
const svgPath = element.attr( 'data-spritesheet-svg' );
|
|
34
|
+
const iconId = element.attr( 'data-spritesheet-id' );
|
|
35
|
+
|
|
36
|
+
if ( !svgFiles.has( iconId ) ) {
|
|
37
|
+
svgFiles.set( iconId, svgPath );
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Process normal SVG elements
|
|
42
|
+
elements.each( function() {
|
|
43
|
+
const $element = $( this );
|
|
44
|
+
|
|
45
|
+
collectSvgFileInfo( $element );
|
|
46
|
+
} );
|
|
47
|
+
|
|
48
|
+
// Process and remove preload elements
|
|
49
|
+
const preloadElements = $( '[data-spritesheet-preload="true"]' );
|
|
50
|
+
preloadElements.each( function() {
|
|
51
|
+
const $element = $( this );
|
|
52
|
+
|
|
53
|
+
collectSvgFileInfo( $element );
|
|
54
|
+
$element.remove();
|
|
55
|
+
} );
|
|
56
|
+
|
|
57
|
+
if ( svgFiles.size === 0 ) {
|
|
58
|
+
return str;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Create spritesheet and get viewBox data
|
|
62
|
+
const { spritesheetElement, iconViewBoxes } = createSpritesheet( $, svgFiles );
|
|
63
|
+
|
|
64
|
+
// Add spritesheet to the beginning of the body
|
|
65
|
+
if ( $( 'body' ).length ) {
|
|
66
|
+
$( 'body' ).prepend( spritesheetElement );
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Set viewBox for original SVG elements
|
|
70
|
+
elements.each( function() {
|
|
71
|
+
const element = $( this );
|
|
72
|
+
const iconId = element.attr( 'data-spritesheet-id' );
|
|
73
|
+
const viewBox = iconViewBoxes.get( iconId );
|
|
74
|
+
|
|
75
|
+
if ( viewBox && this.tagName.toLowerCase() === 'svg' ) {
|
|
76
|
+
element.attr( 'viewBox', viewBox );
|
|
77
|
+
}
|
|
78
|
+
} );
|
|
79
|
+
|
|
80
|
+
$( '[data-spritesheet-svg]' ).removeAttr( 'data-spritesheet-svg' );
|
|
81
|
+
$( '[data-spritesheet-id]' ).removeAttr( 'data-spritesheet-id' );
|
|
82
|
+
|
|
83
|
+
return $.html();
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Creates an SVG spritesheet from the provided SVG files.
|
|
88
|
+
* Returns an object containing the spritesheet element and a map of icon IDs to their viewBox strings.
|
|
89
|
+
*/
|
|
90
|
+
function createSpritesheet( $, svgFiles ) {
|
|
91
|
+
const symbols = [];
|
|
92
|
+
const iconViewBoxes = new Map();
|
|
93
|
+
|
|
94
|
+
for ( const [ iconId, svgPath ] of svgFiles.entries() ) {
|
|
95
|
+
const absolutePath = path.join( HexoManager.hexo.theme_dir, svgPath );
|
|
96
|
+
|
|
97
|
+
if ( !fs.existsSync( absolutePath ) ) {
|
|
98
|
+
console.warn( `SVG file not found: ${ absolutePath }` );
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Check if we have the SVG in cache
|
|
103
|
+
if ( !SVG_CACHE.has( absolutePath ) ) {
|
|
104
|
+
try {
|
|
105
|
+
const svgContent = fs.readFileSync( absolutePath, 'utf8' );
|
|
106
|
+
const $svg = cheerio.load( svgContent, { xmlMode: true } )( 'svg' );
|
|
107
|
+
SVG_CACHE.set( absolutePath, $svg );
|
|
108
|
+
} catch ( error ) {
|
|
109
|
+
console.error( `Error reading SVG file: ${ absolutePath }`, error );
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const $svg = SVG_CACHE.get( absolutePath ).clone();
|
|
115
|
+
|
|
116
|
+
// Create symbol element from SVG
|
|
117
|
+
const $symbol = $( '<symbol></symbol>' );
|
|
118
|
+
$symbol.attr( 'id', iconId );
|
|
119
|
+
|
|
120
|
+
// Copy viewBox and other relevant attributes
|
|
121
|
+
let viewBoxValue;
|
|
122
|
+
if ( $svg.attr( 'viewBox' ) ) {
|
|
123
|
+
viewBoxValue = $svg.attr( 'viewBox' );
|
|
124
|
+
} else if ( $svg.attr( 'width' ) && $svg.attr( 'height' ) ) {
|
|
125
|
+
viewBoxValue = `0 0 ${ $svg.attr( 'width' ) } ${ $svg.attr( 'height' ) }`;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if ( viewBoxValue ) {
|
|
129
|
+
$symbol.attr( 'viewBox', viewBoxValue );
|
|
130
|
+
iconViewBoxes.set( iconId, viewBoxValue );
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Copy all child elements from SVG to symbol
|
|
134
|
+
$svg.children().each( function() {
|
|
135
|
+
const $child = $( this );
|
|
136
|
+
// Skip title elements as they'll be provided by the consuming SVG
|
|
137
|
+
if ( $child[ 0 ].tagName.toLowerCase() !== 'title' ) {
|
|
138
|
+
$symbol.append( $child.clone() );
|
|
139
|
+
}
|
|
140
|
+
} );
|
|
141
|
+
|
|
142
|
+
symbols.push(
|
|
143
|
+
resetFillColor( $, $symbol )
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Create the spritesheet container
|
|
148
|
+
const $spritesheet = $( '<svg></svg>' );
|
|
149
|
+
$spritesheet.attr( {
|
|
150
|
+
'class': 'svg-spritesheet',
|
|
151
|
+
'xmlns': 'http://www.w3.org/2000/svg',
|
|
152
|
+
'style': 'display: none;',
|
|
153
|
+
'aria-hidden': 'true'
|
|
154
|
+
} );
|
|
155
|
+
|
|
156
|
+
// Add all symbols to the spritesheet
|
|
157
|
+
symbols.forEach( $symbol => {
|
|
158
|
+
$spritesheet.append( $symbol );
|
|
159
|
+
} );
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
spritesheetElement: $spritesheet,
|
|
163
|
+
iconViewBoxes
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Resets the fill color of an SVG element to 'currentColor'.
|
|
169
|
+
* This is useful for ensuring that the SVG inherits the text color from its parent.
|
|
170
|
+
*/
|
|
171
|
+
function resetFillColor( $, $svg ) {
|
|
172
|
+
// Replace all fill attributes with the specified color.
|
|
173
|
+
$svg.find( '[fill]' ).each( function() {
|
|
174
|
+
$( this ).attr( 'fill', 'currentColor' );
|
|
175
|
+
} );
|
|
176
|
+
|
|
177
|
+
// Also check the root SVG for fill attribute.
|
|
178
|
+
if ( $svg.attr( 'fill' ) ) {
|
|
179
|
+
$svg.attr( 'fill', 'currentColor' );
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return $svg;
|
|
183
|
+
}
|