From 99a154cf7159f62457dc86a0a932e764782a77eb Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Mon, 4 Sep 2023 03:27:40 +0530 Subject: [PATCH 01/24] Integrating Nuclia Widget --- .github/workflows/nuclia_sync.yml | 37 + breadmaker.py | 56 + .../heading_to_breadcrumb_mapping.json | 1189 +++++++++++++++++ docs/_static/nuclia_sync.json | 279 ++++ docs/_static/searchtester.js | 143 ++ docs/_templates/components/search-field.html | 33 - docs/_templates/search.html | 116 +- requirements.txt | 2 + searchtester.py | 56 + upload.py | 104 ++ 10 files changed, 1945 insertions(+), 70 deletions(-) create mode 100644 .github/workflows/nuclia_sync.yml create mode 100644 breadmaker.py create mode 100644 docs/_static/heading_to_breadcrumb_mapping.json create mode 100644 docs/_static/nuclia_sync.json create mode 100644 docs/_static/searchtester.js create mode 100644 searchtester.py create mode 100644 upload.py diff --git a/.github/workflows/nuclia_sync.yml b/.github/workflows/nuclia_sync.yml new file mode 100644 index 000000000..90e95c7d4 --- /dev/null +++ b/.github/workflows/nuclia_sync.yml @@ -0,0 +1,37 @@ +name: Nuclia Sync + +on: [push] +jobs: + sync: + runs-on: ubuntu-latest + + steps: + - name: Check out code + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.10" + + - name: Install requirements + run: | + pip install -q -r requirements-initial.txt + pip install -q -r requirements.txt + + - name: Run Nuclia Sync + run: | + python3 upload.py + + - name: Run Breadcrumb Json maker + run: | + python3 breadmaker.py + + - name: Commit changes + run: | + git config --global user.name github-actions + git config --global user.email github-actions@github.com + git add . + git commit -m "Nuclia Sync: Updated docs" + git push + \ No newline at end of file diff --git a/breadmaker.py b/breadmaker.py new file mode 100644 index 000000000..d1b6153df --- /dev/null +++ b/breadmaker.py @@ -0,0 +1,56 @@ +import json +import os +from upload import extract_first_heading, PUBLIC_URL + +# Load nuclia_sync.json +try: + with open("./docs/_static/nuclia_sync.json", "r") as sync_info: + nuclia_sync_data = json.load(sync_info) +except FileNotFoundError: + print("Error: nuclia_sync.json not found.") +except json.JSONDecodeError as e: + print(f"Error decoding JSON: {e}") + + +def normalize_path(path): + return path.replace('.md', '').replace('./docs', '').lstrip('/') + + +def create_url(origin_url, url_path): + return f"{origin_url.rstrip('/')}/{url_path}" + + +def generate_breadcrumb_for_path(path): + breadcrumb = {} + temp_path = "./" + path_items = path.split('/')[1:] + + for path_item in path_items: + temp_path = os.path.join(temp_path, path_item) + if temp_path.endswith(".md"): + heading = extract_first_heading(temp_path) + breadcrumb[heading] = create_url( + PUBLIC_URL, normalize_path(temp_path)) + else: + index_md_path = os.path.join(temp_path, "index.md") + if os.path.exists(index_md_path): + heading = extract_first_heading(index_md_path) + breadcrumb[heading] = create_url( + PUBLIC_URL, normalize_path(temp_path)) + temp_path = os.path.join(temp_path, "") + return breadcrumb + + +result = {"heading_to_breadcrumb": {}} +for md_path in nuclia_sync_data["docs"]: + heading = extract_first_heading(md_path) + breadcrumb = generate_breadcrumb_for_path(md_path) + result["heading_to_breadcrumb"][heading] = breadcrumb + + +try: + with open("./docs/_static/heading_to_breadcrumb_mapping.json", "w") as mapping_file: # noqa + json.dump(result, mapping_file, indent=4) + print("Data written to heading_to_breadcrumb_mapping.json.") +except Exception as e: + print(f"Error writing JSON: {e}") diff --git a/docs/_static/heading_to_breadcrumb_mapping.json b/docs/_static/heading_to_breadcrumb_mapping.json new file mode 100644 index 000000000..cddfaf801 --- /dev/null +++ b/docs/_static/heading_to_breadcrumb_mapping.json @@ -0,0 +1,1189 @@ +{ + "heading_to_breadcrumb": { + "Glossary": { + "Plone Training": "https://training.plone.org/", + "Glossary": "https://training.plone.org/glossary" + }, + "Plone Training": { + "Plone Training": "https://training.plone.org/index" + }, + "Authors Guide": { + "Plone Training": "https://training.plone.org/", + "Contributing to Plone Training": "https://training.plone.org/contributing", + "Authors Guide": "https://training.plone.org/contributing/authors" + }, + "Contributing to Plone Training": { + "Plone Training": "https://training.plone.org/", + "Contributing to Plone Training": "https://training.plone.org/contributing/index" + }, + "Building and Checking the Quality of Documentation": { + "Plone Training": "https://training.plone.org/", + "Contributing to Plone Training": "https://training.plone.org/contributing", + "Building and Checking the Quality of Documentation": "https://training.plone.org/contributing/setup-build" + }, + "General Guide to Writing Documentation": { + "Plone Training": "https://training.plone.org/", + "Contributing to Plone Training": "https://training.plone.org/contributing", + "General Guide to Writing Documentation": "https://training.plone.org/contributing/writing-docs-guide" + }, + "About Effective Volto": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "About Effective Volto": "https://training.plone.org/effective-volto/about_effective_volto" + }, + "Add-ons": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Add-ons": "https://training.plone.org/effective-volto/addons" + }, + "Architecture": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Architecture": "https://training.plone.org/effective-volto/architecture" + }, + "Backend": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Backend": "https://training.plone.org/effective-volto/backend" + }, + "Deployment": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Deployment": "https://training.plone.org/effective-volto/deployment" + }, + "Development tools": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Development tools": "https://training.plone.org/effective-volto/development" + }, + "Getting Started": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Getting Started": "https://training.plone.org/effective-volto/getting-started" + }, + "Effective Volto": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto/index" + }, + "Testing": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Testing": "https://training.plone.org/effective-volto/testing" + }, + "Integrate with Volto\u2019s asyncConnect for SSR": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Integrate with Volto\u2019s asyncConnect for SSR": "https://training.plone.org/effective-volto/addons/asyncconnect" + }, + "Block Extensions": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Block Extensions": "https://training.plone.org/effective-volto/addons/block-extensions" + }, + "Block Styling": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Block Styling": "https://training.plone.org/effective-volto/addons/block-styling" + }, + "Create a block using BlockDataForm": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Create a block using BlockDataForm": "https://training.plone.org/effective-volto/addons/blockdataform" + }, + "Blocks Layout": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Blocks Layout": "https://training.plone.org/effective-volto/addons/blockslayout" + }, + "Bootstrap an add-on": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Bootstrap an add-on": "https://training.plone.org/effective-volto/addons/bootstrap" + }, + "Create a custom Listing block variation": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Create a custom Listing block variation": "https://training.plone.org/effective-volto/addons/customlistingtemplate" + }, + "Add-on dependencies": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Add-on dependencies": "https://training.plone.org/effective-volto/addons/dependencies" + }, + "How does a Volto add-on works?": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "How does a Volto add-on works?": "https://training.plone.org/effective-volto/addons/how-an-add-on-works" + }, + "Add-on Internationalization": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Add-on Internationalization": "https://training.plone.org/effective-volto/addons/i18n" + }, + "Add-on and project configuration pipeline": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Add-on and project configuration pipeline": "https://training.plone.org/effective-volto/addons/pipeline" + }, + "Extending Semantic UI": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Extending Semantic UI": "https://training.plone.org/effective-volto/addons/semanticui" + }, + "Create a theme add-on": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Create a theme add-on": "https://training.plone.org/effective-volto/addons/theme" + }, + "Configure a released Volto Add-on in your project": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Configure a released Volto Add-on in your project": "https://training.plone.org/effective-volto/addons/use-released-addon" + }, + "Configure an unreleased add-on from an existing repository": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Configure an unreleased add-on from an existing repository": "https://training.plone.org/effective-volto/addons/use-repo-addon" + }, + "Volto views": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Volto views": "https://training.plone.org/effective-volto/addons/views" + }, + "Extend Webpack setup from an add-on with razzle.extend.js": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Extend Webpack setup from an add-on with razzle.extend.js": "https://training.plone.org/effective-volto/addons/webpack" + }, + "What is a Volto add-on": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "What is a Volto add-on": "https://training.plone.org/effective-volto/addons/what-is-an-addon" + }, + "Inside Volto": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Inside Volto": "https://training.plone.org/effective-volto/architecture/anatomy" + }, + "Babel": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Babel": "https://training.plone.org/effective-volto/architecture/babel" + }, + "Volto Blocks": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Volto Blocks": "https://training.plone.org/effective-volto/architecture/blocks" + }, + "Bootstrap Volto": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Bootstrap Volto": "https://training.plone.org/effective-volto/architecture/bootstrap-volto" + }, + "Volto Client - Server duality": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Volto Client - Server duality": "https://training.plone.org/effective-volto/architecture/client-ssr" + }, + "Configuration Registry": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Configuration Registry": "https://training.plone.org/effective-volto/architecture/configuration" + }, + "CORS": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "CORS": "https://training.plone.org/effective-volto/architecture/CORS" + }, + "Multilingual": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Multilingual": "https://training.plone.org/effective-volto/architecture/multilingual" + }, + "Razzle": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Razzle": "https://training.plone.org/effective-volto/architecture/razzle" + }, + "Redux": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Redux": "https://training.plone.org/effective-volto/architecture/redux" + }, + "Webpack loaders": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Webpack loaders": "https://training.plone.org/effective-volto/architecture/webpack-loaders" + }, + "Webpack": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Webpack": "https://training.plone.org/effective-volto/architecture/webpack" + }, + "Block field contribute to searchableText": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Block field contribute to searchableText": "https://training.plone.org/effective-volto/backend/block-field-as-searchableText" + }, + "Link integrity for blocks": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Link integrity for blocks": "https://training.plone.org/effective-volto/backend/block-linkintegrity" + }, + "Writing Express middleware": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Writing Express middleware": "https://training.plone.org/effective-volto/backend/express-middleware" + }, + "Plone REST API endpoints": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Plone REST API endpoints": "https://training.plone.org/effective-volto/backend/plone-restapi-endpoints" + }, + "Writing a block transform": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Writing a block transform": "https://training.plone.org/effective-volto/backend/writing-block-transforms" + }, + "Writing a content expansion endpoint": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Writing a content expansion endpoint": "https://training.plone.org/effective-volto/backend/writing-content-expansion" + }, + "Writing an endpoint": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Writing an endpoint": "https://training.plone.org/effective-volto/backend/writing-endpoint" + }, + "Writing a serializer or a deserializer": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Writing a serializer or a deserializer": "https://training.plone.org/effective-volto/backend/writing-serializer-deserializer" + }, + "Docker": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Docker": "https://training.plone.org/effective-volto/deployment/docker" + }, + "release-it": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "release-it": "https://training.plone.org/effective-volto/deployment/releaseit" + }, + "Seamless mode": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Seamless mode": "https://training.plone.org/effective-volto/deployment/seamlessmode" + }, + "Simple deployment": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Simple deployment": "https://training.plone.org/effective-volto/deployment/simple" + }, + "Bundle analyzing": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Bundle analyzing": "https://training.plone.org/effective-volto/development/bundle-analyzing" + }, + "Component Registry": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Component Registry": "https://training.plone.org/effective-volto/development/component-registry" + }, + "critical.css": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "critical.css": "https://training.plone.org/effective-volto/development/criticalCSS" + }, + "Debugging with Volto": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Debugging with Volto": "https://training.plone.org/effective-volto/development/debugging" + }, + "Environment variables": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Environment variables": "https://training.plone.org/effective-volto/development/environmentvariables" + }, + "Husky and lint-staged": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Husky and lint-staged": "https://training.plone.org/effective-volto/development/husky-lint-staged" + }, + "Internationalization": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Internationalization": "https://training.plone.org/effective-volto/development/i18n" + }, + "Icons": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Icons": "https://training.plone.org/effective-volto/development/icons" + }, + "Lazyloading components, injectLazyLibs for libraries": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Lazyloading components, injectLazyLibs for libraries": "https://training.plone.org/effective-volto/development/lazyloading" + }, + "Linters": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Linters": "https://training.plone.org/effective-volto/development/linters" + }, + "How to setup your development environment using environment variables": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "How to setup your development environment using environment variables": "https://training.plone.org/effective-volto/development/setup" + }, + "Shortcuts": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Shortcuts": "https://training.plone.org/effective-volto/development/shortcuts" + }, + "vim and neovim integration": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "vim and neovim integration": "https://training.plone.org/effective-volto/development/vim" + }, + "VSCode extensions/helpers": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "VSCode extensions/helpers": "https://training.plone.org/effective-volto/development/vscode" + }, + "Bootstrapping an Add-on": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Bootstrapping an Add-on": "https://training.plone.org/effective-volto/getting-started/add-on" + }, + "Bootstrapping a full Plone 6 project": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Bootstrapping a full Plone 6 project": "https://training.plone.org/effective-volto/getting-started/project" + }, + "Developer roadmap": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Developer roadmap": "https://training.plone.org/effective-volto/getting-started/roadmap" + }, + "Acceptance testing": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Acceptance testing": "https://training.plone.org/testing/acceptance" + }, + "Testing add-ons": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Testing add-ons": "https://training.plone.org/effective-volto/testing/addons" + }, + "Jest": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Jest": "https://training.plone.org/effective-volto/testing/jest" + }, + "Storybook": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Storybook": "https://training.plone.org/effective-volto/testing/storybook" + }, + "Unit testing": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Unit testing": "https://training.plone.org/effective-volto/testing/unit" + }, + "About Mastering Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "About Mastering Plone": "https://training.plone.org/mastering-plone-5/about_mastering" + }, + "Extending Plone With Add-on Packages": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Extending Plone With Add-on Packages": "https://training.plone.org/mastering-plone/add-ons" + }, + "Programming Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Programming Plone": "https://training.plone.org/mastering-plone-5/api" + }, + "Behaviors": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Behaviors": "https://training.plone.org/mastering-plone-5/behaviors_1" + }, + "Complex Behaviors": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Complex Behaviors": "https://training.plone.org/mastering-plone/behaviors_2" + }, + "The Case Study": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "The Case Study": "https://training.plone.org/mastering-plone-5/case" + }, + "Using the code for the training": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Using the code for the training": "https://training.plone.org/mastering-plone-5/code" + }, + "Configuring and Customizing Plone \"Through The Web\"": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Configuring and Customizing Plone \"Through The Web\"": "https://training.plone.org/mastering-plone-5/configuring_customizing" + }, + "Custom Search": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Custom Search": "https://training.plone.org/mastering-plone-5/custom_search" + }, + "Releasing Your Code": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Releasing Your Code": "https://training.plone.org/mastering-plone-5/deployment_code" + }, + "Buildout II: Getting Ready for Deployment": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Buildout II: Getting Ready for Deployment": "https://training.plone.org/mastering-plone-5/deployment_sites" + }, + "Dexterity I: Content types": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Dexterity I: Content types": "https://training.plone.org/mastering-plone/dexterity" + }, + "Dexterity II: Talks": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Dexterity II: Talks": "https://training.plone.org/mastering-plone/dexterity_2_talk" + }, + "Dexterity Types III: Sponsors": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Dexterity Types III: Sponsors": "https://training.plone.org/mastering-plone/dexterity_3" + }, + "Dexterity: Reference": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Dexterity: Reference": "https://training.plone.org/mastering-plone-5/dexterity_reference" + }, + "Write Your Own Python Add-On to Customize Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Write Your Own Python Add-On to Customize Plone": "https://training.plone.org/mastering-plone/eggs1" + }, + "Reusable Features packaged in add-ons": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Reusable Features packaged in add-ons": "https://training.plone.org/mastering-plone/eggs2" + }, + "Using starzel.votable_behavior in ploneconf.site": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Using starzel.votable_behavior in ploneconf.site": "https://training.plone.org/mastering-plone-5/embed" + }, + "REST API Endpoints": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "REST API Endpoints": "https://training.plone.org/mastering-plone/endpoints" + }, + "Turning Talks into Events": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Turning Talks into Events": "https://training.plone.org/mastering-plone-5/events" + }, + "Extending Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Extending Plone": "https://training.plone.org/mastering-plone-5/extending" + }, + "The Features of Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "The Features of Plone": "https://training.plone.org/mastering-plone-5/features" + }, + "Creating a Dynamic Front Page": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Creating a Dynamic Front Page": "https://training.plone.org/mastering-plone-5/frontpage" + }, + "IDEs and Editors": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "IDEs and Editors": "https://training.plone.org/mastering-plone-5/ide" + }, + "Mastering Plone 6 Development": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone/index" + }, + "Set up Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Set up Plone": "https://training.plone.org/mastering-plone/installation" + }, + "Set up Plone for the Training": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Set up Plone for the Training": "https://training.plone.org/mastering-plone/instructions" + }, + "Introduction": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Introduction": "https://training.plone.org/voltohandson/intro" + }, + "Mastering Plone 6": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Mastering Plone 6": "https://training.plone.org/mastering-plone/mastering_plone_6" + }, + "What's New in Plone?": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "What's New in Plone?": "https://training.plone.org/mastering-plone/plone_versions" + }, + "Vocabularies, Registry-Settings and Control Panels": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Vocabularies, Registry-Settings and Control Panels": "https://training.plone.org/mastering-plone/registry" + }, + "Relations": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Relations": "https://training.plone.org/mastering-plone-5/relations" + }, + "Using plone.restapi without Volto": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Using plone.restapi without Volto": "https://training.plone.org/mastering-plone/restapi" + }, + "Permissions": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Permissions": "https://training.plone.org/mastering-plone/reusable" + }, + "Theming": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Theming": "https://training.plone.org/voltohandson/starttheming" + }, + "Using Third-Party Behaviors": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Using Third-Party Behaviors": "https://training.plone.org/mastering-plone-5/thirdparty_behaviors" + }, + "Timetable": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Timetable": "https://training.plone.org/mastering-plone-5/timing" + }, + "TODOs documentation Mastering Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "TODOs documentation Mastering Plone": "https://training.plone.org/mastering-plone/todos_documentation_mastering_plone_6" + }, + "Trainer: Preparation": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Trainer: Preparation": "https://training.plone.org/mastering-plone/trainer" + }, + "Upgrade-steps": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Upgrade-steps": "https://training.plone.org/mastering-plone/upgrade_steps" + }, + "Workflow, Roles and Permissions": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Workflow, Roles and Permissions": "https://training.plone.org/mastering-plone/user_generated_content" + }, + "Watch the Training Video": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Watch the Training Video": "https://training.plone.org/mastering-plone/video" + }, + "Writing Viewlets": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Writing Viewlets": "https://training.plone.org/mastering-plone-5/viewlets_1" + }, + "A Viewlet for the Votable Behavior": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "A Viewlet for the Votable Behavior": "https://training.plone.org/mastering-plone-5/viewlets_2" + }, + "Advanced Viewlets": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Advanced Viewlets": "https://training.plone.org/mastering-plone/viewlets_advanced_classic" + }, + "Views I": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Views I": "https://training.plone.org/mastering-plone-5/views_1" + }, + "Views II: A Default View for \"Talk\"": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Views II: A Default View for \"Talk\"": "https://training.plone.org/mastering-plone-5/views_2" + }, + "Views III: A Talk List": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Views III: A Talk List": "https://training.plone.org/mastering-plone-5/views_3" + }, + "Volto Actions and Component State": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Volto Actions and Component State": "https://training.plone.org/mastering-plone/volto_actions" + }, + "Using Volto add-ons": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Using Volto add-ons": "https://training.plone.org/mastering-plone/volto_addon" + }, + "The Sponsors Component": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "The Sponsors Component": "https://training.plone.org/mastering-plone/volto_components_sponsors" + }, + "Extending Volto With Custom Add-on Package": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Extending Volto With Custom Add-on Package": "https://training.plone.org/mastering-plone/volto_custom_addon" + }, + "Extending Volto With a FAQ Block Type": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Extending Volto With a FAQ Block Type": "https://training.plone.org/mastering-plone/volto_custom_addon2" + }, + "Volto App Development": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Volto App Development": "https://training.plone.org/mastering-plone/volto_development" + }, + "Creating a dynamic frontpage with Volto blocks": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Creating a dynamic frontpage with Volto blocks": "https://training.plone.org/mastering-plone/volto_frontpage" + }, + "Customizing Volto Components": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Customizing Volto Components": "https://training.plone.org/mastering-plone/volto_overrides" + }, + "Rich Text Editor Settings in DraftJS editor": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Rich Text Editor Settings in DraftJS editor": "https://training.plone.org/mastering-plone/volto_richtexteditor" + }, + "Semantic UI": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Semantic UI": "https://training.plone.org/mastering-plone/volto_semantic_ui" + }, + "Volto View Component: A Default View for a \"Talk\"": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Volto View Component: A Default View for a \"Talk\"": "https://training.plone.org/mastering-plone/volto_talkview" + }, + "Testing in Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Testing in Plone": "https://training.plone.org/mastering-plone-5/testing" + }, + "Theming in Volto": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Theming in Volto": "https://training.plone.org/mastering-plone/volto_theming" + }, + "What is Plone?": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "What is Plone?": "https://training.plone.org/mastering-plone-5/what_is_plone" + }, + "Page Templates": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Page Templates": "https://training.plone.org/mastering-plone-5/zpt" + }, + "Extend Plone With Add-On Packages": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Extend Plone With Add-On Packages": "https://training.plone.org/mastering-plone-5/add-ons" + }, + "The Anatomy of Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "The Anatomy of Plone": "https://training.plone.org/mastering-plone-5/anatomy" + }, + "More Complex Behaviors": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "More Complex Behaviors": "https://training.plone.org/mastering-plone-5/behaviors_2" + }, + "Buildout I": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Buildout I": "https://training.plone.org/mastering-plone-5/buildout_1" + }, + "Dexterity I: \"Through The Web\"": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Dexterity I: \"Through The Web\"": "https://training.plone.org/mastering-plone-5/dexterity" + }, + "Dexterity Types II: Growing Up": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Dexterity Types II: Growing Up": "https://training.plone.org/mastering-plone-5/dexterity_2" + }, + "Dexterity Types III: Python": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Dexterity Types III: Python": "https://training.plone.org/mastering-plone-5/dexterity_3" + }, + "Write Your Own Add-Ons to Customize Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Write Your Own Add-Ons to Customize Plone": "https://training.plone.org/mastering-plone-5/eggs1" + }, + "Creating Reusable Packages": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Creating Reusable Packages": "https://training.plone.org/mastering-plone-5/eggs2" + }, + "Return to Dexterity: Moving contenttypes into Code": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Return to Dexterity: Moving contenttypes into Code": "https://training.plone.org/mastering-plone-5/export_code" + }, + "The Future of Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "The Future of Plone": "https://training.plone.org/mastering-plone-5/future_of_plone" + }, + "Mastering Plone 5 Development": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5/index" + }, + "Installation & Setup": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Installation & Setup": "https://training.plone.org/mastering-plone-5/installation" + }, + "Optional": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Optional": "https://training.plone.org/mastering-plone-5/optional" + }, + "What's New in Plone 5, 5.1 and Plone 5.2": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "What's New in Plone 5, 5.1 and Plone 5.2": "https://training.plone.org/mastering-plone-5/plone5" + }, + "Manage Settings with Registry, Control Panels and Vocabularies": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Manage Settings with Registry, Control Panels and Vocabularies": "https://training.plone.org/mastering-plone-5/registry" + }, + "Resources": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Resources": "https://training.plone.org/mastering-plone-5/resources" + }, + "Plone REST API": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Plone REST API": "https://training.plone.org/mastering-plone-5/restapi" + }, + "Making Our Package Reusable": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Making Our Package Reusable": "https://training.plone.org/mastering-plone-5/reusable" + }, + "TODOs documentation Mastering Plone 5": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "TODOs documentation Mastering Plone 5": "https://training.plone.org/mastering-plone-5/todos_documentation_mastering_plone_5" + }, + "User Generated Content": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "User Generated Content": "https://training.plone.org/mastering-plone-5/user_generated_content" + }, + "Customizing Existing Templates": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Customizing Existing Templates": "https://training.plone.org/mastering-plone-5/zpt_2" + }, + "Migrating with collective.exportimport": { + "Plone Training": "https://training.plone.org/", + "Migration best practices": "https://training.plone.org/migrations", + "Migrating with collective.exportimport": "https://training.plone.org/migrations/exportimport" + }, + "Migration best practices": { + "Plone Training": "https://training.plone.org/", + "Migration best practices": "https://training.plone.org/migrations/index" + }, + "In-place migrations": { + "Plone Training": "https://training.plone.org/", + "Migration best practices": "https://training.plone.org/migrations", + "In-place migrations": "https://training.plone.org/migrations/inplace" + }, + "Migrating from third party systems to Plone": { + "Plone Training": "https://training.plone.org/", + "Migration best practices": "https://training.plone.org/migrations", + "Migrating from third party systems to Plone": "https://training.plone.org/migrations/migrate-to-plone" + }, + "Migrating Plone": { + "Plone Training": "https://training.plone.org/", + "Migration best practices": "https://training.plone.org/migrations", + "Migrating Plone": "https://training.plone.org/migrations/migrations" + }, + "Migrate to Volto": { + "Plone Training": "https://training.plone.org/", + "Migration best practices": "https://training.plone.org/migrations", + "Migrate to Volto": "https://training.plone.org/migrations/volto" + }, + "Deploy": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Deploy": "https://training.plone.org/plone-deployment/deploy" + }, + "Editing your project": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Editing your project": "https://training.plone.org/plone-deployment/edit-project" + }, + "Plone Deployment": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment/index" + }, + "Create a Project": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Create a Project": "https://training.plone.org/plone-deployment/new-project" + }, + "Plone Docker Images": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Plone Docker Images": "https://training.plone.org/plone-deployment/plone-docker-images" + }, + "Introduction to Plone stack": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Introduction to Plone stack": "https://training.plone.org/plone-deployment/plone-stack" + }, + "Server Setup": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Server Setup": "https://training.plone.org/plone-deployment/provision" + }, + "Training setup": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Training setup": "https://training.plone.org/plone-deployment/setup" + }, + "Installing Plone for the Training": { + "Plone Training": "https://training.plone.org/", + "Installing Plone for the Training": "https://training.plone.org/plone_training_config/instructions_plone5" + }, + "What Vagrant is and does": { + "Plone Training": "https://training.plone.org/", + "What Vagrant is and does": "https://training.plone.org/plone_training_config/what_vagrant_does" + }, + "After the training: Aftercare, keep in touch, learn, improve": { + "Plone Training": "https://training.plone.org/", + "Teaching": "https://training.plone.org/teaching", + "After the training: Aftercare, keep in touch, learn, improve": "https://training.plone.org/teaching/after" + }, + "Before the training: Create material, invite trainees, preparation": { + "Plone Training": "https://training.plone.org/", + "Teaching": "https://training.plone.org/teaching", + "Before the training: Create material, invite trainees, preparation": "https://training.plone.org/teaching/before" + }, + "During training day(s): what to expect, do's and don'ts": { + "Plone Training": "https://training.plone.org/", + "Teaching": "https://training.plone.org/teaching", + "During training day(s): what to expect, do's and don'ts": "https://training.plone.org/teaching/during" + }, + "Teaching": { + "Plone Training": "https://training.plone.org/", + "Teaching": "https://training.plone.org/teaching/index" + }, + "Training theory: education, how people learn and process information": { + "Plone Training": "https://training.plone.org/", + "Teaching": "https://training.plone.org/teaching", + "Training theory: education, how people learn and process information": "https://training.plone.org/teaching/theory" + }, + "Continuous Integration": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Continuous Integration": "https://training.plone.org/testing/continuous_integration" + }, + "Testing Plone": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing/index" + }, + "Intro to tests": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Intro to tests": "https://training.plone.org/testing/intro_to_tests" + }, + "How to test a Plone add-on": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "How to test a Plone add-on": "https://training.plone.org/testing/start" + }, + "Summary": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Summary": "https://training.plone.org/testing/summary" + }, + "Testing a Dexterity content type": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Testing a Dexterity content type": "https://training.plone.org/testing/testing_dexterity" + }, + "Robot tests": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Robot tests": "https://training.plone.org/testing/testing_robot" + }, + "Testing setup": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Testing setup": "https://training.plone.org/testing/testing_setup" + }, + "Testing a view": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Testing a view": "https://training.plone.org/testing/testing_view" + }, + "Some theory": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Some theory": "https://training.plone.org/testing/theory" + }, + "Unit tests": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Unit tests": "https://training.plone.org/testing/unittest" + }, + "Diazo notes": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming", + "Diazo notes": "https://training.plone.org/theming/diazo-notes" + }, + "Plone 6 Classic UI Theming": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming/index" + }, + "Preparation for the theming training": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming", + "Preparation for the theming training": "https://training.plone.org/theming/preparation" + }, + "Create a theme based on Barceloneta": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming", + "Create a theme based on Barceloneta": "https://training.plone.org/theming/theme_barceloneta" + }, + "Create a theme based on Diazo": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming", + "Create a theme based on Diazo": "https://training.plone.org/theming/theme_diazo" + }, + "Create a Theme from scratch": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming", + "Create a Theme from scratch": "https://training.plone.org/theming/theme_scratch" + }, + "TTW Customizations": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming", + "TTW Customizations": "https://training.plone.org/theming/ttw_customizations" + }, + "Volto add-ons development": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Volto add-ons development": "https://training.plone.org/voltoaddons/01-addon-basics" + }, + "Basic working block": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Basic working block": "https://training.plone.org/voltoaddons/02-block-edit" + }, + "Improve the block view": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Improve the block view": "https://training.plone.org/voltoaddons/03-block-view" + }, + "Block editing with a form": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Block editing with a form": "https://training.plone.org/voltoaddons/04-block-edit-options" + }, + "Customizable columns": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Customizable columns": "https://training.plone.org/voltoaddons/05-objectwidget-block-edit" + }, + "Make the block extensible": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Make the block extensible": "https://training.plone.org/voltoaddons/06-cell-renderer" + }, + "Add-ons - advanced topics": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Add-ons - advanced topics": "https://training.plone.org/voltoaddons/07-misc-addons" + }, + "Plone integration with Volto blocks": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Plone integration with Volto blocks": "https://training.plone.org/voltoaddons/blocksrestapi" + }, + "Volto Add-ons Development": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons/index" + }, + "Developer integration with text editors": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "About": "https://training.plone.org/voltoaddons/about", + "Developer integration with text editors": "https://training.plone.org/voltoaddons/about/devenvironment" + }, + "About": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "About": "https://training.plone.org/voltoaddons/about/index" + }, + "Really short primer on Javascript enhancements": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "About": "https://training.plone.org/voltoaddons/about", + "Really short primer on Javascript enhancements": "https://training.plone.org/voltoaddons/about/jsbasics" + }, + "Configurable Downloadlink Block": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Configurable Downloadlink Block": "https://training.plone.org/voltohandson/blocksdownload" + }, + "Blocks - Edit components": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Blocks - Edit components": "https://training.plone.org/voltohandson/blocksedit" + }, + "Breadcrumbs": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Breadcrumbs": "https://training.plone.org/voltohandson/breadcrumbs" + }, + "Edit config and site cleanup": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Edit config and site cleanup": "https://training.plone.org/voltohandson/configandcleanup" + }, + "Content types Views": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Content types Views": "https://training.plone.org/voltohandson/contenttypesviews" + }, + "Sprint content type": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Sprint content type": "https://training.plone.org/voltohandson/contenttypeview" + }, + "Events listing template": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Events listing template": "https://training.plone.org/voltohandson/eventlistingtemplate" + }, + "Footer": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Footer": "https://training.plone.org/voltohandson/footer" + }, + "Header": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Header": "https://training.plone.org/voltohandson/header" + }, + "Blocks - Highlight Block": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Blocks - Highlight Block": "https://training.plone.org/voltohandson/highlight" + }, + "Blocks - Highlights": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Blocks - Highlights": "https://training.plone.org/voltohandson/highlightsblock" + }, + "Volto Hands-On": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson/index" + }, + "Brief introduction to Volto blocks": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Brief introduction to Volto blocks": "https://training.plone.org/voltohandson/introtoblocks" + }, + "Inner workings of Volto": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Inner workings of Volto": "https://training.plone.org/voltohandson/introtovolto" + }, + "Quick Start": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Quick Start": "https://training.plone.org/voltohandson/quickstart" + }, + "Project requirements": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Project requirements": "https://training.plone.org/voltohandson/requirements" + }, + "Dynamic Roles": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Dynamic Roles": "https://training.plone.org/workflow/dynamic-roles" + }, + "Using GenericSetup to Manage Plone Workflows": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Using GenericSetup to Manage Plone Workflows": "https://training.plone.org/workflow/generic-setup-export-import" + }, + "Plone Workflow": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow/index" + }, + "Introduction To Workflows": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Introduction To Workflows": "https://training.plone.org/workflow/introduction" + }, + "Local Roles": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Local Roles": "https://training.plone.org/workflow/local-roles" + }, + "Placeful Workflow": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Placeful Workflow": "https://training.plone.org/workflow/placeful-workflow" + }, + "Basic Roles and Permissions": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Basic Roles and Permissions": "https://training.plone.org/workflow/roles-and-permissions" + }, + "Multi-chain Workflows": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Multi-chain Workflows": "https://training.plone.org/workflow/workflow-chains" + }, + "Workflow Variables": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Workflow Variables": "https://training.plone.org/workflow/workflow-variables" + } + } +} diff --git a/docs/_static/nuclia_sync.json b/docs/_static/nuclia_sync.json new file mode 100644 index 000000000..9487b64bf --- /dev/null +++ b/docs/_static/nuclia_sync.json @@ -0,0 +1,279 @@ +{ + "docs": { + "./docs/glossary.md": "ac82d407c63f43fc25ffff9d82ee5e9b", + "./docs/index.md": "6adbda62e51355f1e560b0d34bea1ad2", + "./docs/contributing/authors.md": "2f11a756c8c1751cf89c2b95c617a524", + "./docs/contributing/index.md": "43a6848fc1a74dde31bfa730047c1293", + "./docs/contributing/setup-build.md": "50b423b082ea013ab4cf63bd12452211", + "./docs/contributing/writing-docs-guide.md": "5d45a141948675d1f18321c43b1aa053", + "./docs/effective-volto/about_effective_volto.md": "fcb5d0d832f25bbbdc29d43af382ec01", + "./docs/effective-volto/addons.md": "3c19f5218854ba905e7eac8234bc3a85", + "./docs/effective-volto/architecture.md": "72d9e92bf956af7be087046a1b7f4147", + "./docs/effective-volto/backend.md": "739ae1469c3e4ee23aeb6a777d9edbbf", + "./docs/effective-volto/deployment.md": "4715c93e5f52286f4d95247300fbe516", + "./docs/effective-volto/development.md": "6df1650ff09f4e845d45bedaf924886f", + "./docs/effective-volto/getting-started.md": "e9a4fce1ec7c0137fe01a8ff17ef1035", + "./docs/effective-volto/index.md": "892588a9c259434f434f2ca7bc8729f3", + "./docs/effective-volto/testing.md": "35844140ce905816244a40eca6481619", + "./docs/effective-volto/addons/asyncconnect.md": "39cef99b3c54c7032fffb6ae436f2186", + "./docs/effective-volto/addons/block-extensions.md": "84bb102c7d918e17fc1fa71917614ee4", + "./docs/effective-volto/addons/block-styling.md": "047f9948faeb9c7dbea14f2924c82f57", + "./docs/effective-volto/addons/blockdataform.md": "43924be023ff6dd3beacfa81db0d8381", + "./docs/effective-volto/addons/blockslayout.md": "952c29aa3051b6e4add7016e116c2525", + "./docs/effective-volto/addons/bootstrap.md": "a722d9f1e3a10a82a045ba03548091b4", + "./docs/effective-volto/addons/customlistingtemplate.md": "9b9872e252688d72a7b06a8050b0c454", + "./docs/effective-volto/addons/dependencies.md": "84ab118df1cbdc826bae2e738c17713c", + "./docs/effective-volto/addons/how-an-add-on-works.md": "9c56ad21f35da90d0e7820a345511826", + "./docs/effective-volto/addons/i18n.md": "35211a71c5a32cb21402d0fbf421dd41", + "./docs/effective-volto/addons/pipeline.md": "40c01d0a641f4aba53aec6c6002a3a86", + "./docs/effective-volto/addons/semanticui.md": "54aa961e31d4b6bf79a2767b8a389f3c", + "./docs/effective-volto/addons/theme.md": "f76c0b79240c36af6820d3839f484713", + "./docs/effective-volto/addons/use-released-addon.md": "bfe030ca30225b11bc1d58449cc70abd", + "./docs/effective-volto/addons/use-repo-addon.md": "7267a7cf116401b031bead939a1816c6", + "./docs/effective-volto/addons/views.md": "0bfcebde02b0edcd6f2bace3ed0edbf5", + "./docs/effective-volto/addons/webpack.md": "586b62b86261ed466ac31d8081111848", + "./docs/effective-volto/addons/what-is-an-addon.md": "8ad0869cee75c4a84107cb0f726a7e86", + "./docs/effective-volto/architecture/anatomy.md": "353775bec0015dc0865dc41a05abe2c2", + "./docs/effective-volto/architecture/babel.md": "1979cb87b59cef21e3ad81ede9da0ecf", + "./docs/effective-volto/architecture/blocks.md": "212fdd71531f289d564c30ac46416fcc", + "./docs/effective-volto/architecture/bootstrap-volto.md": "4baa7d74c81c409d32c2133eb91c4864", + "./docs/effective-volto/architecture/client-ssr.md": "d8475f64cdc6ced0f543b861bde50c2c", + "./docs/effective-volto/architecture/configuration.md": "7dd3f9242590cbdc63a23df899aee228", + "./docs/effective-volto/architecture/CORS.md": "a1580a3f025ea523773e0762e33d4d86", + "./docs/effective-volto/architecture/multilingual.md": "29abd9dd3b71d63078969fe7738906b9", + "./docs/effective-volto/architecture/razzle.md": "a248e61fe7dfbc0e377a5a4d56496385", + "./docs/effective-volto/architecture/redux.md": "2c67f4a131644baa7eb080b9e5b294d8", + "./docs/effective-volto/architecture/webpack-loaders.md": "2de22206f0a3ebd00aeb1c4aee9429c5", + "./docs/effective-volto/architecture/webpack.md": "01f8899af44a1f0359ba41aa6c8469be", + "./docs/effective-volto/backend/block-field-as-searchableText.md": "28123d5b598f8dcc017fdebac1e42b27", + "./docs/effective-volto/backend/block-linkintegrity.md": "c6f2093cc30323fbf802672056d02d6d", + "./docs/effective-volto/backend/express-middleware.md": "1467c1700caff650d768b0ec48e3632f", + "./docs/effective-volto/backend/plone-restapi-endpoints.md": "d61a983c0b6a5ea019ec6650ba5c7492", + "./docs/effective-volto/backend/writing-block-transforms.md": "5b444a2add2aa76645191b4aa4abd85c", + "./docs/effective-volto/backend/writing-content-expansion.md": "b239fa46edd16234c9a080de56861bef", + "./docs/effective-volto/backend/writing-endpoint.md": "957a2c159e95ad6940c2b48db3f4339e", + "./docs/effective-volto/backend/writing-serializer-deserializer.md": "ff6fe3f5c5ffc6d57fd9a339bd3f6683", + "./docs/effective-volto/deployment/docker.md": "2668d234ba8a9361306b1f31dbc3e27a", + "./docs/effective-volto/deployment/releaseit.md": "4e0204631b61e3bc212778c7e808977e", + "./docs/effective-volto/deployment/seamlessmode.md": "98b9d635cc6e7739dd3a7f6fafb30a77", + "./docs/effective-volto/deployment/simple.md": "c6825dfad7297bf4467590e67e8f7852", + "./docs/effective-volto/development/bundle-analyzing.md": "3bb769560efee39bccd169a948e7353b", + "./docs/effective-volto/development/component-registry.md": "54ab1fb3fc50c9b66b51f98e22a57b92", + "./docs/effective-volto/development/criticalCSS.md": "f5f9e3f3b1baf28305c174ea1a63ac79", + "./docs/effective-volto/development/debugging.md": "12ee478c6fd02f3413090a6435b76a3e", + "./docs/effective-volto/development/environmentvariables.md": "8e81556f3532f202cfbf1ae036746d28", + "./docs/effective-volto/development/husky-lint-staged.md": "af161a74d9ec4c841ad95832d7a87443", + "./docs/effective-volto/development/i18n.md": "b92c83534bb0f427aa6923f6ae3276a8", + "./docs/effective-volto/development/icons.md": "38fc9218fbbc4ca91f8b8db4861a717a", + "./docs/effective-volto/development/lazyloading.md": "3badb3529229e0f52cc4e2fdeebd33e0", + "./docs/effective-volto/development/linters.md": "a6a312307b0e97c9044dd8fc6c6aaddc", + "./docs/effective-volto/development/setup.md": "b00fc778f7e6211706a028d43eebffbe", + "./docs/effective-volto/development/shortcuts.md": "3baab4e08ea6df5fb8fa479121316889", + "./docs/effective-volto/development/vim.md": "c1d0c2602dbf0a94caf4328fae565c04", + "./docs/effective-volto/development/vscode.md": "0bc687a23c5c6cf0949c6632f711816b", + "./docs/effective-volto/getting-started/add-on.md": "04d1a848be62452f631ed4f0c5c268be", + "./docs/effective-volto/getting-started/project.md": "080e76726917a221b713ea732a45380b", + "./docs/effective-volto/getting-started/roadmap.md": "3ba32464d37d24a9f7c0c39d3a4fb779", + "./docs/effective-volto/testing/acceptance.md": "2ddf1ad4051b688129bb00a79f6a86b7", + "./docs/effective-volto/testing/addons.md": "dfac81046eebf034850b72f02e1576e0", + "./docs/effective-volto/testing/jest.md": "f3068c156d6308d130eb7308c689e583", + "./docs/effective-volto/testing/storybook.md": "645be5af958f04324f4ecfb581ac9961", + "./docs/effective-volto/testing/unit.md": "515b58ca4e3f06c0e6e52146511a1061", + "./docs/mastering-plone/about_mastering.md": "44517deb5e1c1911b716e1028ad9762b", + "./docs/mastering-plone/add-ons.md": "64dc04bce9f5612b41dfea4f92f2f4f7", + "./docs/mastering-plone/api.md": "24b85fc71a6500cb7c1af5001265974d", + "./docs/mastering-plone/behaviors_1.md": "1d441b399cbbc11286637684e66d3c38", + "./docs/mastering-plone/behaviors_2.md": "0728c0b1ff646638ee88f4e4eda1f2f7", + "./docs/mastering-plone/case.md": "8e8da5692014b4f0f149cbd04f8f3f94", + "./docs/mastering-plone/code.md": "218135228aa78ddf29d9a478e9c4b118", + "./docs/mastering-plone/configuring_customizing.md": "0b50c7b7939472f7cca87860fad0a934", + "./docs/mastering-plone/custom_search.md": "eae02a4ec30ab667e3c72a13d49e9c77", + "./docs/mastering-plone/deployment_code.md": "d9fe11408081b668d4b885b485475c1a", + "./docs/mastering-plone/deployment_sites.md": "a32d5870f894842164896daf25e1e78a", + "./docs/mastering-plone/dexterity.md": "d98a41e7be47eddf1208e00f45fc9486", + "./docs/mastering-plone/dexterity_2_talk.md": "31ca9022206050de63f6eba5be3cfbe2", + "./docs/mastering-plone/dexterity_3.md": "0343ad6376359cc7b4b1b2b23d6cfd41", + "./docs/mastering-plone/dexterity_reference.md": "6ab8a9e18080820be97cb2b768d6d5c6", + "./docs/mastering-plone/eggs1.md": "5a247a4c790285baf9e1d1ca09df6da0", + "./docs/mastering-plone/eggs2.md": "41a7a1264c5557b5bbe701bbf23dbca6", + "./docs/mastering-plone/embed.md": "96c2c083f90f561bd355b77a31ea4661", + "./docs/mastering-plone/endpoints.md": "0fe9fa877a93552b066126ba5a0bde79", + "./docs/mastering-plone/events.md": "99015576e09224b5499dc0482a5d2f3d", + "./docs/mastering-plone/events_classic.md": "290a33637af979b1f84e2d2deb91332a", + "./docs/mastering-plone/extending.md": "cf7951cc48e4b518446ec00a4877dce3", + "./docs/mastering-plone/features.md": "0a7cd69df795068867c18f326d86dcfe", + "./docs/mastering-plone/frontpage.md": "ae66f578e36a72ba67d6fed2923f2c56", + "./docs/mastering-plone/ide.md": "281621981aded663f0e1b91803c2bb29", + "./docs/mastering-plone/index.md": "2d0416d4c42fec9e7eafa1a418a4f25c", + "./docs/mastering-plone/installation.md": "548c734e24e2be31718d8c75845e4db2", + "./docs/mastering-plone/instructions.md": "7004bf4b12c9ead6fc519156dfaf0cd9", + "./docs/mastering-plone/intro.md": "ef1b346a247b6cc256b559360fa8adb4", + "./docs/mastering-plone/mastering_plone_6.md": "635319087cbe4aea5e76b4c70ff79788", + "./docs/mastering-plone/plone_versions.md": "5b7d4d2b6d174169434f35b5853ac1b4", + "./docs/mastering-plone/registry.md": "918a3754f7b7610cbcff6d44718a9eff", + "./docs/mastering-plone/relations.md": "9cc71f35c4501d15576af9047f1a8d7e", + "./docs/mastering-plone/restapi.md": "0fe58ce4173057207b4dfed86ba04313", + "./docs/mastering-plone/reusable.md": "997eddaf9d877591d6d42cb938009fef", + "./docs/mastering-plone/theming.md": "68d624bfc6efb7ab688ade88cfd1d21d", + "./docs/mastering-plone/thirdparty_behaviors.md": "ec95b6a9733ed42a866fb9338dbdd952", + "./docs/mastering-plone/timing.md": "a71dd953783c9d528f1d0b5b0895b027", + "./docs/mastering-plone/todos_documentation_mastering_plone_6.md": "9cffb2074f8036eacc13f0dcf0cd098f", + "./docs/mastering-plone/trainer.md": "f85196997cdef4e195735a08cc932555", + "./docs/mastering-plone/upgrade_steps.md": "18ccfbdd6ce75cda00a96c3245e633fd", + "./docs/mastering-plone/user_generated_content.md": "0bcfd1a1865bb9221e2c095162c90b89", + "./docs/mastering-plone/video.md": "a64c3b0b66168f8b7b5ab6efe32458b5", + "./docs/mastering-plone/viewlets_1.md": "1bdcb73d17b18816629d12b5eca6a10e", + "./docs/mastering-plone/viewlets_2.md": "72137b278b84e19161f0255c396da076", + "./docs/mastering-plone/viewlets_advanced_classic.md": "1c8af71e1a7e9c15d92b366da38b1896", + "./docs/mastering-plone/views_1.md": "44872681545022e57b5f10a405007613", + "./docs/mastering-plone/views_2.md": "224267d8bdc4ff6af0b841711f1283b4", + "./docs/mastering-plone/views_3.md": "fbd4fe9fa6a85a2e8064c0aeaac3bdd5", + "./docs/mastering-plone/volto_actions.md": "04e94626e98561fc52a299eb3f5332d0", + "./docs/mastering-plone/volto_addon.md": "7fbb02c7a5064474fe6cabaa0d8119bd", + "./docs/mastering-plone/volto_components_sponsors.md": "5965947134bf928738a14a53d794818e", + "./docs/mastering-plone/volto_custom_addon.md": "9e75a378204c526b7db6a9c3354619dd", + "./docs/mastering-plone/volto_custom_addon2.md": "08ad5b4cf58befc91dbf8114bff2efee", + "./docs/mastering-plone/volto_development.md": "5a5a45a5d6d2702a8127a3b701d534cf", + "./docs/mastering-plone/volto_frontpage.md": "aaa283c76f8847971a6e28b884580cfc", + "./docs/mastering-plone/volto_overrides.md": "08d90f8bfa04546bd22084b1e7f487aa", + "./docs/mastering-plone/volto_richtexteditor.md": "b2aab4af844098ef23fed0daedbb8272", + "./docs/mastering-plone/volto_semantic_ui.md": "2a4d716fc202f6b66e4c1d6d9d364c7a", + "./docs/mastering-plone/volto_talkview.md": "3ba36b2c63161e0f283a100f308af81a", + "./docs/mastering-plone/volto_testing.md": "8f4a245f63ebcdb17607ee5f13714519", + "./docs/mastering-plone/volto_theming.md": "686ad1471dffd813e0b34757e5dc4001", + "./docs/mastering-plone/what_is_plone.md": "9f1a8f7a16672f34ac6d88548fcae6f2", + "./docs/mastering-plone/zpt.md": "d95387911aa925afa1c72e8953a7a938", + "./docs/mastering-plone-5/about_mastering.md": "cf02fcc663e1fc5e925d5d9b25c0b1bd", + "./docs/mastering-plone-5/add-ons.md": "9f0e68fef36d340f83710f49aa310430", + "./docs/mastering-plone-5/anatomy.md": "d60d7abe9d83d877f791a6bd4a083f0f", + "./docs/mastering-plone-5/api.md": "a52bd88e26f1438bd7749e2a76eba053", + "./docs/mastering-plone-5/behaviors_1.md": "a0f126b4980c95d10dc3e72c0df94cb1", + "./docs/mastering-plone-5/behaviors_2.md": "9235327e1940f90361d8f4f1ad67ec00", + "./docs/mastering-plone-5/buildout_1.md": "4a36a2e0902aed59b5beea0552988336", + "./docs/mastering-plone-5/case.md": "7dc2abd7581fafe4bc5c78bd310ef9ad", + "./docs/mastering-plone-5/code.md": "8f613cd7c79053fae8f43d6b510f1ae1", + "./docs/mastering-plone-5/configuring_customizing.md": "830a2beae389b0cca25f6deb1d63a4c1", + "./docs/mastering-plone-5/custom_search.md": "287a4263699dfc8b6baed19c4699789b", + "./docs/mastering-plone-5/deployment_code.md": "62fcb4499c40063c4015abe1671cab4e", + "./docs/mastering-plone-5/deployment_sites.md": "89c9f6f8c9a5461b5fcf9ee47eda312e", + "./docs/mastering-plone-5/dexterity.md": "e270428024a25370d354723d6fd003d4", + "./docs/mastering-plone-5/dexterity_2.md": "cd645b77128c3fd838ad5014d6ff8a76", + "./docs/mastering-plone-5/dexterity_3.md": "2368f99fc2a811fe07e425b25b5a07a0", + "./docs/mastering-plone-5/dexterity_reference.md": "7fbcd1c570bf2252ba75f502df29764c", + "./docs/mastering-plone-5/eggs1.md": "77a016f4bbdea4786fdf3f0d8c26060d", + "./docs/mastering-plone-5/eggs2.md": "0ee5f606be4c780efcaf311af98308d3", + "./docs/mastering-plone-5/embed.md": "5b702b09965edef4ebb9eb4beda4367a", + "./docs/mastering-plone-5/events.md": "0f5b190342f6217eb5ebd609c8d7b3b7", + "./docs/mastering-plone-5/export_code.md": "f7343012d0601587133d49e3b3a460dd", + "./docs/mastering-plone-5/extending.md": "8bdbdbd7e931352f8bd7362ecd0d9b98", + "./docs/mastering-plone-5/features.md": "5e33db59e7bda77408c6311e3ce7bed5", + "./docs/mastering-plone-5/frontpage.md": "de415031acbe627a31f96d97980b100e", + "./docs/mastering-plone-5/future_of_plone.md": "fd5a784ae16ca73201f249a777d567f7", + "./docs/mastering-plone-5/ide.md": "75c78c8c1eecce2f0e14965465cc2b23", + "./docs/mastering-plone-5/index.md": "92ca015f20111b12def0e12e5c7b54b9", + "./docs/mastering-plone-5/installation.md": "bf135fb41e7141e387651d5e90f1c973", + "./docs/mastering-plone-5/intro.md": "30fb84c0bae092603e3247994c963b4f", + "./docs/mastering-plone-5/optional.md": "3a8ca8473ad25f1a4f537ff2cb4244dc", + "./docs/mastering-plone-5/plone5.md": "558fe6c1db92474bc4d3e63607421f7a", + "./docs/mastering-plone-5/registry.md": "37513d55ff0ae563499d6610ac7f446b", + "./docs/mastering-plone-5/relations.md": "a6fcfc1bd7f1f5d49a1daddc1515e766", + "./docs/mastering-plone-5/resources.md": "06a20f9c3a0c0de5ba63b44dd4bd06da", + "./docs/mastering-plone-5/restapi.md": "e538b0940a4a83a121515272e5560d7f", + "./docs/mastering-plone-5/reusable.md": "6c952f134d2f0a9fc8feb5e25182431a", + "./docs/mastering-plone-5/testing.md": "bd3b098ad0afbafd26b3b4a84e3aa14d", + "./docs/mastering-plone-5/theming.md": "d17600d391988356806f595affd783bf", + "./docs/mastering-plone-5/thirdparty_behaviors.md": "fb0c069f55d218fb32ebd6b15ee20caa", + "./docs/mastering-plone-5/timing.md": "64d7caadd10a9782d5ae676696232bf8", + "./docs/mastering-plone-5/todos_documentation_mastering_plone_5.md": "436a03be23273df6bde13161e3aff4fe", + "./docs/mastering-plone-5/user_generated_content.md": "5a3f72228c627990544fb000e6646824", + "./docs/mastering-plone-5/viewlets_1.md": "89bd8b6f88da27a5e2847c4837c018bf", + "./docs/mastering-plone-5/viewlets_2.md": "f9f725a687d33b75b2aca1f4d7c97188", + "./docs/mastering-plone-5/views_1.md": "ff54ca076352e63b9055f469cec59f79", + "./docs/mastering-plone-5/views_2.md": "b8280695fbfe0d95530516af7e79587e", + "./docs/mastering-plone-5/views_3.md": "291d0bd2692b05f18bd92e14d726caed", + "./docs/mastering-plone-5/what_is_plone.md": "d3daf0a5b0adb9a733774a180abd762f", + "./docs/mastering-plone-5/zpt.md": "043f5e6a791e2c3ce634697844cf0787", + "./docs/mastering-plone-5/zpt_2.md": "b69e1b08ccfdc5eabfae4045ba443ef8", + "./docs/migrations/exportimport.md": "b7a4e3bfe1387a207d98f00253b0111e", + "./docs/migrations/index.md": "9083d3b7fbe32c1f86e811b025f8b8ad", + "./docs/migrations/inplace.md": "276011eef09dffb22b40684daa2b6b19", + "./docs/migrations/migrate-to-plone.md": "b4f384d36804f8a26227e12bf9e8a380", + "./docs/migrations/migrations.md": "2f4d2a75c48734d6fbb4309990caa091", + "./docs/migrations/volto.md": "4c6bd895c419c7c8cb913d26fb0ee498", + "./docs/plone-deployment/deploy.md": "d1a2e0bbc52066066039598ea0206a21", + "./docs/plone-deployment/edit-project.md": "1d44a8ab05a0dc05deed0eb84466aa65", + "./docs/plone-deployment/index.md": "7a04bea1d5f87b2b9d83a43b19164389", + "./docs/plone-deployment/intro.md": "c83cf1eba8549a018d89a866913e7324", + "./docs/plone-deployment/new-project.md": "b4a732d2aa0b37d853ae088332b741fd", + "./docs/plone-deployment/plone-docker-images.md": "4d916aa83fb2c1ec5b3263d78d3b3b4d", + "./docs/plone-deployment/plone-stack.md": "0fc06c46f4cba8786e6feef2f7d16a9a", + "./docs/plone-deployment/provision.md": "7f975fa16b866a16fd0f0c207d821960", + "./docs/plone-deployment/setup.md": "2ddcb6cf42073e47ddecc26633d06edb", + "./docs/plone_training_config/instructions_plone5.md": "4b168f98d36cfd0713b0fa38fd6be89e", + "./docs/plone_training_config/what_vagrant_does.md": "906ef1be9ae94982b53e53a7e8eee7a1", + "./docs/teaching/after.md": "a8eab431332ee473e9442a9b53f0ec48", + "./docs/teaching/before.md": "93836de1ae408ca305b2bce1052c559d", + "./docs/teaching/during.md": "cd02b859831dea6236a91bfb08f701cf", + "./docs/teaching/index.md": "a365bf34081a940f041ea4921b771045", + "./docs/teaching/theory.md": "79117c89dd9a7f1a5c2cba19ba923698", + "./docs/testing/acceptance.md": "feeace111cdeb9a2004ac77257139fb7", + "./docs/testing/continuous_integration.md": "2753422fad1fdb4c6a761e5072bf8cf6", + "./docs/testing/index.md": "7aa4aed4fa957755c5e11e21bb6c3ad8", + "./docs/testing/intro_to_tests.md": "04b44d8c18dcb171ad010b4d615798a3", + "./docs/testing/start.md": "0d539e287d6553754729aedfe0297f75", + "./docs/testing/summary.md": "6ba974a8c3773280cc3e181d6a6d9f69", + "./docs/testing/testing_dexterity.md": "540f9dd22ab78b5e662fab9ce69d19a9", + "./docs/testing/testing_robot.md": "5d95e43cf997600392d3722d41a8d973", + "./docs/testing/testing_setup.md": "b2b384a8db0d25cac83d9faa45713b0a", + "./docs/testing/testing_view.md": "d4cfd7fdd6686ecdc6874a41dce65371", + "./docs/testing/theory.md": "861ffc6eee3f5a5d3a85e2db4fdf76d0", + "./docs/testing/unittest.md": "dcf6089ffcccbf1ca910a68cecb1facd", + "./docs/theming/diazo-notes.md": "95b51108b3c1478ef17292ba3f436d0f", + "./docs/theming/index.md": "ab5d01df87af5cc817ba98eda046f4de", + "./docs/theming/preparation.md": "9ad9575d54217243c11b9d09da4dbc77", + "./docs/theming/theme_barceloneta.md": "4ea839ba463540b09bf8ddfadb5ca17a", + "./docs/theming/theme_diazo.md": "7a5e3f6dfc49d6897f463e526f6e3ec6", + "./docs/theming/theme_scratch.md": "46c9c5f42e5e642d243b39d5fe83d863", + "./docs/theming/ttw_customizations.md": "ab1ee873621910ac27c39014e4000058", + "./docs/voltoaddons/01-addon-basics.md": "d17c6b0939992021bff3708dd40377d3", + "./docs/voltoaddons/02-block-edit.md": "41a2d87ed69158f21e1cb981c39f3925", + "./docs/voltoaddons/03-block-view.md": "c8cfc6feefae9b63d4337c5fc791cdf9", + "./docs/voltoaddons/04-block-edit-options.md": "2c01e10996b98154b110bc924f37ae67", + "./docs/voltoaddons/05-objectwidget-block-edit.md": "97f7e466239f2c74f5317a4130a5855a", + "./docs/voltoaddons/06-cell-renderer.md": "f403914bc90d8b71b0fb6a50077bdb30", + "./docs/voltoaddons/07-misc-addons.md": "bc9c2ca352f824f2ea8a1a3a8833f8da", + "./docs/voltoaddons/blocksrestapi.md": "a05ae8a09514581af343c2b18790f4d2", + "./docs/voltoaddons/index.md": "71321e5b11ccc486fa03fcb944c204bc", + "./docs/voltoaddons/intro.md": "dc26ccd0e889219a7926f538047932e6", + "./docs/voltoaddons/about/devenvironment.md": "a52f64a539e328d96a44b74fc5c9d9a5", + "./docs/voltoaddons/about/index.md": "4dd5c25fb4e2483fdd4cd5d5c0af66e2", + "./docs/voltoaddons/about/jsbasics.md": "c12965ab8badc97102af97f613b847c7", + "./docs/voltohandson/blocksdownload.md": "7c39c826686962138e81228cbdc5374f", + "./docs/voltohandson/blocksedit.md": "b0f3f10957c634a41caf4b77e3f23e91", + "./docs/voltohandson/breadcrumbs.md": "5d6b8c600c2d22410cc262fe5a22fd3b", + "./docs/voltohandson/configandcleanup.md": "b9e9d0ce72f5b7799b66a121ff14247b", + "./docs/voltohandson/contenttypesviews.md": "c5252e0a622bf41fae9ee3cc99adb991", + "./docs/voltohandson/contenttypeview.md": "f15aa7214a37a7639696d3df82dbb468", + "./docs/voltohandson/eventlistingtemplate.md": "11567d15de9940eeede088b49a44da53", + "./docs/voltohandson/footer.md": "a9af790f1779cfb942a9bb5633eff95c", + "./docs/voltohandson/header.md": "9f859a158067d7587fcf87e1f5acee57", + "./docs/voltohandson/highlight.md": "1dc0d44f216a67e75f7c33c3ac8407d0", + "./docs/voltohandson/highlightsblock.md": "fc2a7c00ec7fd7277cf9c022b3eff6a9", + "./docs/voltohandson/index.md": "7f9911793073bad0449982f0c7d4f7f0", + "./docs/voltohandson/intro.md": "4f5ea0ae0eb799c7f884c5c8728b379a", + "./docs/voltohandson/introtoblocks.md": "8c424c30d2a0b626fa00da430d0a2b41", + "./docs/voltohandson/introtovolto.md": "9c29881f166f336c6d1eae6b5f6bf12e", + "./docs/voltohandson/quickstart.md": "e53ec781cf7eb9de92dad60db3ae0694", + "./docs/voltohandson/requirements.md": "fd336d75544872c59bbf870b301f3591", + "./docs/voltohandson/starttheming.md": "5f5fb7f49574db13b4532229751f5251", + "./docs/workflow/dynamic-roles.md": "57b92e35cbfa939d89f601fba40143a0", + "./docs/workflow/generic-setup-export-import.md": "348e5b73b8899d08db70bee91d8249e4", + "./docs/workflow/index.md": "ffbf81f0522cbcec4da70761041d6962", + "./docs/workflow/introduction.md": "9f1ce35c92b5e440ba2a6560e0ef8b74", + "./docs/workflow/local-roles.md": "0bd36013d7dbb84dccae563f83e03895", + "./docs/workflow/placeful-workflow.md": "594adff13e97e0175c918f85a6bc4d48", + "./docs/workflow/roles-and-permissions.md": "ea6f4618f75ee840a09d58c971f57da7", + "./docs/workflow/workflow-chains.md": "6749fe390fa1b0b448329ad23ed595e4", + "./docs/workflow/workflow-variables.md": "51514bc22f1201a3168438f11c29079f" + } +} diff --git a/docs/_static/searchtester.js b/docs/_static/searchtester.js new file mode 100644 index 000000000..012a66b1d --- /dev/null +++ b/docs/_static/searchtester.js @@ -0,0 +1,143 @@ +let breadcrumbMapping; // Storing the fetched JSON here +let resultHeadings = []; // Store the result headings once fetched +let counter = 0; + +// Function to load JSON into script +async function fetchBreadcrumbMapping() { + try { + const response = await fetch("/_static/heading_to_breadcrumb_mapping.json"); + breadcrumbMapping = await response.json(); + } catch (error) { + console.error("Error fetching mapping:", error); + } +} + +fetchBreadcrumbMapping(); + +// Function to create breadcrumbs so that we can just put in title of results +async function createBreadcrumbs(resultHeading) { + try { + // Check if the heading exists in the mapping + const breadcrumbs = + breadcrumbMapping["heading_to_breadcrumb"][resultHeading]; + if (!breadcrumbs) { + throw new Error("No breadcrumbs found for the heading: ", resultHeading); + } + return breadcrumbs; + } catch (error) { + console.error("Error fetching mapping:", error); + return []; + } +} + +// Function to add breadcrumbs above each result heading +function addBreadcrumbsToResults() { + // select the tag being populated with results + const nucliaResult = document.querySelector("nuclia-search-results"); + + if (!nucliaResult) { + return; // Exit if nuclia-search-results tag is not found + } + + // need to acces the shadow root + const shadowRoot = nucliaResult.shadowRoot; + + // Observe changes in the shadow root of nuclia-search-results element + const observer = new MutationObserver((mutationsList) => { + for (const mutation of mutationsList) { + if (mutation.type === "childList") { + // Check if the mutation involves the addition of nodes + if (mutation.addedNodes.length > 0) { + // Iterate through added nodes and process them + mutation.addedNodes.forEach((addedNode) => { + // Check if the added node has the 'result-container' class + if ( + addedNode.classList && + addedNode.classList.contains("result-container") + ) { + // Find all h3 tags with the specified class within the result container and adding to resultHeadings + resultHeadings = Array.from(mutation.addedNodes).flatMap( + (addedNode) => + Array.from( + addedNode.querySelectorAll( + "h3.ellipsis.title-m.svelte-1yttzcg" + ) + ) + ); + + resultHeadings.forEach((resultHeading) => { + // Check if the result heading already has breadcrumbs + if (!resultHeading.dataset.breadcrumbsAdded) { + // If Not, Then Mark the element as having breadcrumbs + resultHeading.dataset.breadcrumbsAdded = true; + // Create breadcrumbs for the result item + createBreadcrumbs(resultHeading.innerHTML) + .then((breadcrumbObj) => { + // Create a container with class breadcrumbs + const breadcrumbContainer = document.createElement("div"); + breadcrumbContainer.className = "breadcrumbs"; + + const breadcrumbNames = Object.keys(breadcrumbObj); + const lastBreadcrumb = breadcrumbNames.pop(); + + breadcrumbNames.forEach((breadcrumbName, index) => { + // Create anchor + const breadcrumbLink = document.createElement("a"); + breadcrumbLink.href = breadcrumbObj[breadcrumbName]; // URL from JSON + breadcrumbLink.textContent = breadcrumbName; + + // Create a span for this anchor + const breadcrumbElement = + document.createElement("span"); + breadcrumbElement.className = "breadcrumb-item"; // Apply the breadcrumb-item class + + breadcrumbElement.appendChild(breadcrumbLink); + + // Add the separator " > " between elements + if ( + breadcrumbNames.length > 1 && + counter < breadcrumbNames.length - 1 + ) { + counter = counter + 1; + const separator = document.createElement("span"); + separator.textContent = " > "; + separator.className = "pathseparator"; + breadcrumbContainer.appendChild(separator); + } + + breadcrumbContainer.appendChild(breadcrumbElement); + }); + + // Add the last breadcrumb as a non-clickable span + const lastBreadcrumbElement = + document.createElement("span"); + lastBreadcrumbElement.className = "last-breadcrumb"; + lastBreadcrumbElement.textContent = lastBreadcrumb; + + breadcrumbContainer.appendChild(lastBreadcrumbElement); + + resultHeading.insertAdjacentElement( + "beforebegin", + breadcrumbContainer + ); + }) + .catch((error) => { + console.error("Error creating breadcrumbs:", error); + }); + } + }); + } + }); + } + } + } + }); + + // Start observing the shadow root of each nuclia-search-results element + observer.observe(shadowRoot, { + childList: true, + subtree: true, + }); + // Need To stop Observing when the Nuclia results are populated + // but I guess they keep updating so need to observe continously. +} diff --git a/docs/_templates/components/search-field.html b/docs/_templates/components/search-field.html index 6ccbda150..dd353e8f7 100644 --- a/docs/_templates/components/search-field.html +++ b/docs/_templates/components/search-field.html @@ -16,37 +16,4 @@ spellcheck="false"/> Ctrl+K -
- -
-
- -
diff --git a/docs/_templates/search.html b/docs/_templates/search.html index 4d4561159..c57bc5869 100644 --- a/docs/_templates/search.html +++ b/docs/_templates/search.html @@ -1,39 +1,81 @@ -{%- extends "page.html" %} -{# Over-ride the body to be custom search structure we want #} -{% block docs_body %} -{% set title = _('Search') %} -
-

{{ _("Search") }}

- - {% block searchtext %} -
- {% trans %}Searching for multiple words only shows matches that contain - all words.{% endtrans %} -
- {% endblock %} - {% include "components/search-field.html" %} -
+{%- extends "page.html" %} {# Over-ride the body to be custom search structure +we want #} {% block docs_body %} +
+

{{ _("Search") }}

+ + {% block searchtext %} +
+ {% trans %}Searching for multiple words only shows matches that contain all + words.{% endtrans %}
- -{% endblock docs_body %} - -{# Manually include the search JS that Sphinx includes #} -{% block scripts -%} - {{ super() }} - - - + {% endblock %} +
+ + + + + + + + + + + + + +{% endblock docs_body %} {# Below sections just re-create the behavior of Sphinx +default search #} {# Page metadata #} {%- block htmltitle -%} +{{ _("Search") }} - {{ title or docstitle }} +{%- endblock htmltitle -%} {# Manually include the search JS that Sphinx +includes #} {% block scripts -%} {{ super() }} + + + {%- endblock scripts %} diff --git a/requirements.txt b/requirements.txt index 3b5e757cb..4442ed5bd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,3 +13,5 @@ sphinx-sitemap sphinx-togglebutton sphinxcontrib-spelling sphinxext-opengraph +nuclia +nucliadb-sdk \ No newline at end of file diff --git a/searchtester.py b/searchtester.py new file mode 100644 index 000000000..d1b6153df --- /dev/null +++ b/searchtester.py @@ -0,0 +1,56 @@ +import json +import os +from upload import extract_first_heading, PUBLIC_URL + +# Load nuclia_sync.json +try: + with open("./docs/_static/nuclia_sync.json", "r") as sync_info: + nuclia_sync_data = json.load(sync_info) +except FileNotFoundError: + print("Error: nuclia_sync.json not found.") +except json.JSONDecodeError as e: + print(f"Error decoding JSON: {e}") + + +def normalize_path(path): + return path.replace('.md', '').replace('./docs', '').lstrip('/') + + +def create_url(origin_url, url_path): + return f"{origin_url.rstrip('/')}/{url_path}" + + +def generate_breadcrumb_for_path(path): + breadcrumb = {} + temp_path = "./" + path_items = path.split('/')[1:] + + for path_item in path_items: + temp_path = os.path.join(temp_path, path_item) + if temp_path.endswith(".md"): + heading = extract_first_heading(temp_path) + breadcrumb[heading] = create_url( + PUBLIC_URL, normalize_path(temp_path)) + else: + index_md_path = os.path.join(temp_path, "index.md") + if os.path.exists(index_md_path): + heading = extract_first_heading(index_md_path) + breadcrumb[heading] = create_url( + PUBLIC_URL, normalize_path(temp_path)) + temp_path = os.path.join(temp_path, "") + return breadcrumb + + +result = {"heading_to_breadcrumb": {}} +for md_path in nuclia_sync_data["docs"]: + heading = extract_first_heading(md_path) + breadcrumb = generate_breadcrumb_for_path(md_path) + result["heading_to_breadcrumb"][heading] = breadcrumb + + +try: + with open("./docs/_static/heading_to_breadcrumb_mapping.json", "w") as mapping_file: # noqa + json.dump(result, mapping_file, indent=4) + print("Data written to heading_to_breadcrumb_mapping.json.") +except Exception as e: + print(f"Error writing JSON: {e}") diff --git a/upload.py b/upload.py new file mode 100644 index 000000000..7ca5a1090 --- /dev/null +++ b/upload.py @@ -0,0 +1,104 @@ +from nuclia import sdk +from nucliadb_sdk.v2.exceptions import NotFoundError +import json +import glob +import hashlib +import os +import re + + +# that's actually an API key, not a NUA one +# but that's the name of the variable on our GitHub repo +API_KEY = "" +KB = "" +PUBLIC_URL = "https://training.plone.org/" + + +def generate_nuclia_sync(): + result = {"docs": {}} + for doc in glob.glob("./docs/**/*.md", recursive=True): + hash = hashlib.md5(open(doc, "rb").read()).hexdigest() + result["docs"][doc] = hash + return result + + +def extract_first_heading(file_path): + with open(file_path, 'r', encoding='utf-8') as file: + content = file.read() + + # The pattern matches lines starting with one or more hash symbols followed by any non-empty text + pattern = r'^\s*#+\s+(.+)$' + match = re.search(pattern, content, re.MULTILINE) + + if match: + # Removing backticks + heading = match.group(1).replace('`', '').strip() + return heading + + # If no heading is found + return None + + +# re.sub() is used to perform substitution +# r'[\W_]+' matches any non-word characters (including underscores),and replaces them with a single hyphen '-' +# strip('-') removes any leading or trailing hyphens from the resulting string +get_slug = lambda path: re.sub(r'[\W_]+', '-', path.lower().strip()).strip('-') + + +def upload_doc(path): + slug = get_slug(path) + title = extract_first_heading(path) + origin_url = f"{PUBLIC_URL}{path.replace('.md', '').replace('./docs/', '')}" # noqa + sdk.NucliaUpload().text( + path=path, + format="MARKDOWN", + slug=slug, + title=title, + url=KB, + api_key=API_KEY, + origin={"url": origin_url}, + ) + + +def delete_doc(path): + slug = get_slug(path) + print(f"Deleting {slug}") + kb = sdk.NucliaKB() + try: + res = kb.get_resource_by_slug(slug=slug, url=KB, api_key=API_KEY) + kb.delete( + rid=res.id, + url=KB, + api_key=API_KEY, + ) + except NotFoundError: + pass + + +def sync(): + # Get all pages uploaded and last sync + with open("./docs/_static/nuclia_sync.json", "r") as sync_info: + old_data = json.load(sync_info) + new_data = generate_nuclia_sync() + + to_delete = [] + for doc, _ in old_data["docs"].items(): + if doc not in new_data["docs"]: + to_delete.append(doc) + + for doc, hash in new_data["docs"].items(): + if doc not in old_data["docs"]: + upload_doc(doc) + elif hash != old_data["docs"][doc]: + upload_doc(doc) + + for doc in to_delete: + delete_doc(doc) + + with open("./docs/_static/nuclia_sync.json", "w") as sync_info: + json.dump(new_data, sync_info) + print("Remember to do a make upload-sync to make sure we update status") + + +if __name__ == "__main__": + sync() From 520b294226ccf3c95e91129f1573ff7536541979 Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Mon, 4 Sep 2023 03:39:08 +0530 Subject: [PATCH 02/24] removing redundant searchtester script --- searchtester.py | 56 ------------------------------------------------- 1 file changed, 56 deletions(-) delete mode 100644 searchtester.py diff --git a/searchtester.py b/searchtester.py deleted file mode 100644 index d1b6153df..000000000 --- a/searchtester.py +++ /dev/null @@ -1,56 +0,0 @@ -import json -import os -from upload import extract_first_heading, PUBLIC_URL - -# Load nuclia_sync.json -try: - with open("./docs/_static/nuclia_sync.json", "r") as sync_info: - nuclia_sync_data = json.load(sync_info) -except FileNotFoundError: - print("Error: nuclia_sync.json not found.") -except json.JSONDecodeError as e: - print(f"Error decoding JSON: {e}") - - -def normalize_path(path): - return path.replace('.md', '').replace('./docs', '').lstrip('/') - - -def create_url(origin_url, url_path): - return f"{origin_url.rstrip('/')}/{url_path}" - - -def generate_breadcrumb_for_path(path): - breadcrumb = {} - temp_path = "./" - path_items = path.split('/')[1:] - - for path_item in path_items: - temp_path = os.path.join(temp_path, path_item) - if temp_path.endswith(".md"): - heading = extract_first_heading(temp_path) - breadcrumb[heading] = create_url( - PUBLIC_URL, normalize_path(temp_path)) - else: - index_md_path = os.path.join(temp_path, "index.md") - if os.path.exists(index_md_path): - heading = extract_first_heading(index_md_path) - breadcrumb[heading] = create_url( - PUBLIC_URL, normalize_path(temp_path)) - temp_path = os.path.join(temp_path, "") - return breadcrumb - - -result = {"heading_to_breadcrumb": {}} -for md_path in nuclia_sync_data["docs"]: - heading = extract_first_heading(md_path) - breadcrumb = generate_breadcrumb_for_path(md_path) - result["heading_to_breadcrumb"][heading] = breadcrumb - - -try: - with open("./docs/_static/heading_to_breadcrumb_mapping.json", "w") as mapping_file: # noqa - json.dump(result, mapping_file, indent=4) - print("Data written to heading_to_breadcrumb_mapping.json.") -except Exception as e: - print(f"Error writing JSON: {e}") From b4533eabcd8bc5f00866f037bbc373b6bb4a36d3 Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Sat, 16 Sep 2023 16:33:17 +0530 Subject: [PATCH 03/24] Merged with main --- __pycache__/upload.cpython-310.pyc | Bin 0 -> 3741 bytes docs/_static/__pycache__/upload.cpython-310.pyc | Bin 0 -> 3739 bytes lib64 | 1 + package.json | 12 ++++++++++++ 4 files changed, 13 insertions(+) create mode 100644 __pycache__/upload.cpython-310.pyc create mode 100644 docs/_static/__pycache__/upload.cpython-310.pyc create mode 120000 lib64 create mode 100644 package.json diff --git a/__pycache__/upload.cpython-310.pyc b/__pycache__/upload.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9bf5db948743619b3b74390e4dd188e5c18337fd GIT binary patch literal 3741 zcmZWsTW{mW73NJBd%fOEHfc85q6V6_@h)UhvSrI@kkpoJnYKt-*3Du!Who9NQQ}1& zj&6hu1lR(73JUZ!C}2PKFY&ccdGAXC6zLgicjIJ9%Hm=5_HlZe> zHmN3&pst{px{BiJJ(NJnzcK0>T0yJO-beS)8no-^K3a$N0eXNQLi-RsLXV++WIjgk z4LMvgAH8B=N4^%7%_rZ1Ud$#N@;(|ub6@euu{U_mDJ2PL?OZ!J+EI&5TXEC@@PIBOQLjb3L$%Zn+F2?H+iOM>>)Q3{l|xnsaNBmr6mUntdmRajAT(>dq{aJt%fKU+Zj1HB9&Hqu3DnlZXG-2mIN|E zw}76dJ(Y`cAP2^j;^>|n55-{AX?BW4IvqFriapfl6_Oc9+mn-RGjJTm?n?Q}fwHHY z^?I{=CH0Po?@Gt5Sz%@uck{*6zS%mjh}hEYY-VT_3Rs&~D#PJmBA#}$t!fQVFRvzI zZO`;h{NABcG6$WGOmmj zBWwGlTTEHX>A1F?IVo=!9o!!Ilc1FA_UeuPSr6yh2U20I;vKDCbxEl)@atlJ7^Eh- zOf@xe)vT-gsqty4R5?*oLs#of&CAl!aMv#es+gA!TIV~ZiR1JxOGoELMJzV!M(X%V*3Me{?Q>-} zXLgXG=sU6_j>=L)ktbqN+`sZp4{B}~pLFD-_F4Nxon_IPSJj+UMx0g(17e&yk?;*yWWIWG%@X#8Bm9Czu~*!U zaLe4XH?dphnpsx8srk_7gKi_gt9fITvHjOd% zt%(_OxU(4#g`Vwo!bD&9`?l2yc?ab}0U&Tg0h>AsSNi4*Sv}Jyn|v6@ra!hx$b;BW zpgjL(@I%o1hkV*`N!mz{eG~g>WZHJRX!=9qjndKCfx*L8`VAoIF;I21HJXP{dZue) zotWAZa?PK+#v=*{O;1VoG5aCA&I&Ak3`2v3>dixuOG1gzv!O#6iUq~(8~z__*X)A5 zVJSu}NLd2BuOMN$$qeIvFoiTm-!@Gs!ZlC08-BqrIKmBtTmD*D2zX~9+{91}aE_xm zO5Acc36K?A#321pl#@!x;vhCA-BcccO`5LZA+U9@{+E~j^WVOB>A(1N>&50L-%*u+ zVE-Bd3#LcH_n-pw%`onpIyU;@irgsIrLv?Pg|Qy?#-lKS&5^AeW*GAcwnkv5m9Ax* z+DIq;P@vr~VR$YvT@ogMNKEX8F-IpLEzt+Nfg+J%mKB9FeBYb_{07mw7WRqudeu{y z@+q_r*;V%0kAm=!6}S&LffacC36Ot=I6cbS`}zz9gt=iU;tS@6yJc>8xR?A5kGNYF z5aN{}{^yr1?W-3*u&GS}e+UeatjC=&W_wc;<6i>-pcCk+eyMHpb6a;hNdF=Qi+uVm z@{GZo(ELmxNb$@Hl;{eaLx*00S1fgxs0D+53lvZZlmrv<;8M_j%lwN2ql1BOnL!*b zjj&+B_z99ku?26jDE>`?e%rty5=y{>@8Dm7@F4Npp~9qmaB)_ww3Lt^V|z1!KZWTq z-t{opAQXIi+zVsGBDRTN(3u285N&AA!#H?B&vG|c!eq}R8eJH{9Il=>4$D$OYh08u zMHbT|higg{h8mH#gaQE*hTPdw6mi&ph|bf6ePSwIaZe&XrR_FAzfWMod&)r z!cw2wBgrP&XHd91Z=7BI9_L~59jM=W+e?`J32FqMMj?F#UPV2L`dsj20lu_gNsPo1 z_YHpy-Ze-p_(3wFfQPaS^~)OgC0UuL-uNS>OqoqV308`xZ4$W18=L&{fD}rch6+Lv zk1Z5oyCkgQ4A8^a2wN^$VwYTE2WUZvAsU1(Z;TC7>&%z1=cu$@$`yxrWfF*pAd-gU zyQqfT5TYV5zk}wIiK6)>@c17=m4rw|u>>E2mtwm1zqMGL<$lBmFl|72`y` zF!lS8od#cCn2zamOuRw74diX;8;(9SHmx{oDDsBLgpgUs&Io@7`)?+~6}p3Fxm_H{RAkhaHrsA zeVyc1*)?t*R;+PYrb3gN=D=5mrft3##+PU<@Bc^30qSV*f3!8pZkaQ~91+WN{pgls z8ZBk#!4Ntzs@7!|qLPf)zw-qjsb)9&~O{UX3o&PjgmcxY^! kU(n3q{~oF}W(^MV<`rVpQIdQznS28E19+dVvcix52V@B0XaE2J literal 0 HcmV?d00001 diff --git a/docs/_static/__pycache__/upload.cpython-310.pyc b/docs/_static/__pycache__/upload.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da8ea947b87ed4b784429def7ac815be29920ec6 GIT binary patch literal 3739 zcmZWs*>B^<8RwWz-ZGp-mNT3wtS>%T3eE3+9G9Hm&I<%QXER6#6upA zExg?)kp?=J#EscmMt>15f1_|3UwH zz%c)&gS!t0gFiy?{|*&m5Nk6ItFkQZb2jJjDj)TETTlg<CI8B(YiI?nLVF+GLu=5kqx)zb+6U+XdI;@9^awqM_L2D*y*K1= z$$a#RffM;!R5qV{19CB&Y{>g)2+e)PBgfv@MMaD~tmwZH7{;8Rist2^Rk2RbnwhFq z&Y$)>C4-J@jX=sMmgGwg8L4?`S8|oUJkB78Kor$3ha|h?TlnmT6;)oE3Jko7up#)D3VI6Jy$JJY`2b`a!Uf9AX`B1 z(w@o%IgkTmN^x{gj)!6}>NGnABAt$#eZ?N?^9sofr0vPcwi!5%Vt1we%AvBSoAr9L zdnNUX#CN6R)+|4>3%mP;)PdPLuZY;v?QCXfaSHJMeb#c}@wwuTuNteZg?VbHV(lh6JlGziin=Qu)s4J8+dJ20?R+&=ywFN` zHW!VdH#@+W+WFDm)qG&r^5WTea8MmicFxSoE?aWTjQQ#?LUm>aOvyruZ z(k-Mc<#b%z&YYCD3l46N{7F#Cb$j(j|Ez~|?L#R)R`HHjuezkv82EK@e;A}DxlA=R zan-D=`>FA1sZ=>pQ$ttlP0hkBog?^yg#c zxY^%6^$NA))@4S|?&Xf{((zbss@3u2sw6p8rCutY7ZkD3tQ)E0D_J{h9kkDt-JID$ zhNADtjyNhy4Mm=a1@Yj@J3XwqU3}7!i|w=ai8{-oGq0*Ssf;+S29RmI~}*{zdYz2(T}>6z#h8mW_(IURSk{+TtqQjezFg;7P^zLG9? z%)V9{%NK!>tu_bQ{!X=d(VKg%t861E_X!#KpQY307<(f#mDzH~hHdFvhV6|}S|3^I zNhUq)q_f>_cK1NsP3?)mnKGx+!|H-dG`wcOs;$o5=w z%fr32L4(%YhlfraN*;<|fC{k|W3kr^VFnOn5s!q|T!H!W$u&#Z8;4NDGi8o3|cLxFwTj{reEalRCq7w^X}X4oK=Hx)pI`dVfBE92|KiiF7n`4a zLq-0U{YwZWm|h9rg9=n(hH>B2vC$7#8FjD@8 zN8Bw72=Ph~|I^Es_T`Ij+0>?h=~0lm$DJ@{ds7qRpTh(|C(v8{SlZ<0w(fM0{>5)$ zlTSZPo-ue6njZ)R`JP#U5}Cj`bf^iuVyW*$EhzMBm;sSMNKhdU{sryV%s)6#Iw<&- z8N|V8gar%APmm;vEqIGX@z)9Zp#zslC;<FN_h3*d~5KR}v6Tw4pf<MdP?n*7Sp&Z$EA!M_f21>0W>Zjtm4a!T1Ppm&lV4ttLW$E* zL0saog(7U16RS7_^I>d+Etf2@OD?ekv>?O~4dR$L#)heN=1bUfl-n+)ibL=+34}*r zN#pZfR6}kEArgpxg65KlqWOEE@jrqp36Y9o2|ffb#dPg|Yq2=XeTNTW*?{uyNkH!% zo*Z}M3*jj<SR zuLY8Lv$q||FM#~(k^D)Trf%V4Ke@r=2RDF!1bSBFY;h%ccqa>N4SdhV?*UMlI(o=X zgFjrDj_Gtvyg|GT*=bN(2c8&kT5AiHeP#549cSECpl3Y2vy z&?FQkmM~@!)A7T&K7vGuBJ+=Q26=VtjPPf0{$?Uvp(kjT+x5bvXCntWJ0r_0_7 z@wBB`;Ppsg4a0BNGGE?_!~*3~h6VpQRBPNC1l~9&a8KAZ2*TV~Phe&hj0jBWt0cF| zu5s(IV~xWyWt!A92fi^hZS%b_zC>$j@EOQld43d=BPYO-J7no1%?43WihSyODBd0K>W-;tcN~JIYaAt+ Date: Sat, 16 Sep 2023 16:41:11 +0530 Subject: [PATCH 04/24] Merged with main --- __pycache__/upload.cpython-310.pyc | Bin 3741 -> 0 bytes docs/_static/__pycache__/upload.cpython-310.pyc | Bin 3739 -> 0 bytes package.json | 12 ------------ 3 files changed, 12 deletions(-) delete mode 100644 __pycache__/upload.cpython-310.pyc delete mode 100644 docs/_static/__pycache__/upload.cpython-310.pyc delete mode 100644 package.json diff --git a/__pycache__/upload.cpython-310.pyc b/__pycache__/upload.cpython-310.pyc deleted file mode 100644 index 9bf5db948743619b3b74390e4dd188e5c18337fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3741 zcmZWsTW{mW73NJBd%fOEHfc85q6V6_@h)UhvSrI@kkpoJnYKt-*3Du!Who9NQQ}1& zj&6hu1lR(73JUZ!C}2PKFY&ccdGAXC6zLgicjIJ9%Hm=5_HlZe> zHmN3&pst{px{BiJJ(NJnzcK0>T0yJO-beS)8no-^K3a$N0eXNQLi-RsLXV++WIjgk z4LMvgAH8B=N4^%7%_rZ1Ud$#N@;(|ub6@euu{U_mDJ2PL?OZ!J+EI&5TXEC@@PIBOQLjb3L$%Zn+F2?H+iOM>>)Q3{l|xnsaNBmr6mUntdmRajAT(>dq{aJt%fKU+Zj1HB9&Hqu3DnlZXG-2mIN|E zw}76dJ(Y`cAP2^j;^>|n55-{AX?BW4IvqFriapfl6_Oc9+mn-RGjJTm?n?Q}fwHHY z^?I{=CH0Po?@Gt5Sz%@uck{*6zS%mjh}hEYY-VT_3Rs&~D#PJmBA#}$t!fQVFRvzI zZO`;h{NABcG6$WGOmmj zBWwGlTTEHX>A1F?IVo=!9o!!Ilc1FA_UeuPSr6yh2U20I;vKDCbxEl)@atlJ7^Eh- zOf@xe)vT-gsqty4R5?*oLs#of&CAl!aMv#es+gA!TIV~ZiR1JxOGoELMJzV!M(X%V*3Me{?Q>-} zXLgXG=sU6_j>=L)ktbqN+`sZp4{B}~pLFD-_F4Nxon_IPSJj+UMx0g(17e&yk?;*yWWIWG%@X#8Bm9Czu~*!U zaLe4XH?dphnpsx8srk_7gKi_gt9fITvHjOd% zt%(_OxU(4#g`Vwo!bD&9`?l2yc?ab}0U&Tg0h>AsSNi4*Sv}Jyn|v6@ra!hx$b;BW zpgjL(@I%o1hkV*`N!mz{eG~g>WZHJRX!=9qjndKCfx*L8`VAoIF;I21HJXP{dZue) zotWAZa?PK+#v=*{O;1VoG5aCA&I&Ak3`2v3>dixuOG1gzv!O#6iUq~(8~z__*X)A5 zVJSu}NLd2BuOMN$$qeIvFoiTm-!@Gs!ZlC08-BqrIKmBtTmD*D2zX~9+{91}aE_xm zO5Acc36K?A#321pl#@!x;vhCA-BcccO`5LZA+U9@{+E~j^WVOB>A(1N>&50L-%*u+ zVE-Bd3#LcH_n-pw%`onpIyU;@irgsIrLv?Pg|Qy?#-lKS&5^AeW*GAcwnkv5m9Ax* z+DIq;P@vr~VR$YvT@ogMNKEX8F-IpLEzt+Nfg+J%mKB9FeBYb_{07mw7WRqudeu{y z@+q_r*;V%0kAm=!6}S&LffacC36Ot=I6cbS`}zz9gt=iU;tS@6yJc>8xR?A5kGNYF z5aN{}{^yr1?W-3*u&GS}e+UeatjC=&W_wc;<6i>-pcCk+eyMHpb6a;hNdF=Qi+uVm z@{GZo(ELmxNb$@Hl;{eaLx*00S1fgxs0D+53lvZZlmrv<;8M_j%lwN2ql1BOnL!*b zjj&+B_z99ku?26jDE>`?e%rty5=y{>@8Dm7@F4Npp~9qmaB)_ww3Lt^V|z1!KZWTq z-t{opAQXIi+zVsGBDRTN(3u285N&AA!#H?B&vG|c!eq}R8eJH{9Il=>4$D$OYh08u zMHbT|higg{h8mH#gaQE*hTPdw6mi&ph|bf6ePSwIaZe&XrR_FAzfWMod&)r z!cw2wBgrP&XHd91Z=7BI9_L~59jM=W+e?`J32FqMMj?F#UPV2L`dsj20lu_gNsPo1 z_YHpy-Ze-p_(3wFfQPaS^~)OgC0UuL-uNS>OqoqV308`xZ4$W18=L&{fD}rch6+Lv zk1Z5oyCkgQ4A8^a2wN^$VwYTE2WUZvAsU1(Z;TC7>&%z1=cu$@$`yxrWfF*pAd-gU zyQqfT5TYV5zk}wIiK6)>@c17=m4rw|u>>E2mtwm1zqMGL<$lBmFl|72`y` zF!lS8od#cCn2zamOuRw74diX;8;(9SHmx{oDDsBLgpgUs&Io@7`)?+~6}p3Fxm_H{RAkhaHrsA zeVyc1*)?t*R;+PYrb3gN=D=5mrft3##+PU<@Bc^30qSV*f3!8pZkaQ~91+WN{pgls z8ZBk#!4Ntzs@7!|qLPf)zw-qjsb)9&~O{UX3o&PjgmcxY^! kU(n3q{~oF}W(^MV<`rVpQIdQznS28E19+dVvcix52V@B0XaE2J diff --git a/docs/_static/__pycache__/upload.cpython-310.pyc b/docs/_static/__pycache__/upload.cpython-310.pyc deleted file mode 100644 index da8ea947b87ed4b784429def7ac815be29920ec6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3739 zcmZWs*>B^<8RwWz-ZGp-mNT3wtS>%T3eE3+9G9Hm&I<%QXER6#6upA zExg?)kp?=J#EscmMt>15f1_|3UwH zz%c)&gS!t0gFiy?{|*&m5Nk6ItFkQZb2jJjDj)TETTlg<CI8B(YiI?nLVF+GLu=5kqx)zb+6U+XdI;@9^awqM_L2D*y*K1= z$$a#RffM;!R5qV{19CB&Y{>g)2+e)PBgfv@MMaD~tmwZH7{;8Rist2^Rk2RbnwhFq z&Y$)>C4-J@jX=sMmgGwg8L4?`S8|oUJkB78Kor$3ha|h?TlnmT6;)oE3Jko7up#)D3VI6Jy$JJY`2b`a!Uf9AX`B1 z(w@o%IgkTmN^x{gj)!6}>NGnABAt$#eZ?N?^9sofr0vPcwi!5%Vt1we%AvBSoAr9L zdnNUX#CN6R)+|4>3%mP;)PdPLuZY;v?QCXfaSHJMeb#c}@wwuTuNteZg?VbHV(lh6JlGziin=Qu)s4J8+dJ20?R+&=ywFN` zHW!VdH#@+W+WFDm)qG&r^5WTea8MmicFxSoE?aWTjQQ#?LUm>aOvyruZ z(k-Mc<#b%z&YYCD3l46N{7F#Cb$j(j|Ez~|?L#R)R`HHjuezkv82EK@e;A}DxlA=R zan-D=`>FA1sZ=>pQ$ttlP0hkBog?^yg#c zxY^%6^$NA))@4S|?&Xf{((zbss@3u2sw6p8rCutY7ZkD3tQ)E0D_J{h9kkDt-JID$ zhNADtjyNhy4Mm=a1@Yj@J3XwqU3}7!i|w=ai8{-oGq0*Ssf;+S29RmI~}*{zdYz2(T}>6z#h8mW_(IURSk{+TtqQjezFg;7P^zLG9? z%)V9{%NK!>tu_bQ{!X=d(VKg%t861E_X!#KpQY307<(f#mDzH~hHdFvhV6|}S|3^I zNhUq)q_f>_cK1NsP3?)mnKGx+!|H-dG`wcOs;$o5=w z%fr32L4(%YhlfraN*;<|fC{k|W3kr^VFnOn5s!q|T!H!W$u&#Z8;4NDGi8o3|cLxFwTj{reEalRCq7w^X}X4oK=Hx)pI`dVfBE92|KiiF7n`4a zLq-0U{YwZWm|h9rg9=n(hH>B2vC$7#8FjD@8 zN8Bw72=Ph~|I^Es_T`Ij+0>?h=~0lm$DJ@{ds7qRpTh(|C(v8{SlZ<0w(fM0{>5)$ zlTSZPo-ue6njZ)R`JP#U5}Cj`bf^iuVyW*$EhzMBm;sSMNKhdU{sryV%s)6#Iw<&- z8N|V8gar%APmm;vEqIGX@z)9Zp#zslC;<FN_h3*d~5KR}v6Tw4pf<MdP?n*7Sp&Z$EA!M_f21>0W>Zjtm4a!T1Ppm&lV4ttLW$E* zL0saog(7U16RS7_^I>d+Etf2@OD?ekv>?O~4dR$L#)heN=1bUfl-n+)ibL=+34}*r zN#pZfR6}kEArgpxg65KlqWOEE@jrqp36Y9o2|ffb#dPg|Yq2=XeTNTW*?{uyNkH!% zo*Z}M3*jj<SR zuLY8Lv$q||FM#~(k^D)Trf%V4Ke@r=2RDF!1bSBFY;h%ccqa>N4SdhV?*UMlI(o=X zgFjrDj_Gtvyg|GT*=bN(2c8&kT5AiHeP#549cSECpl3Y2vy z&?FQkmM~@!)A7T&K7vGuBJ+=Q26=VtjPPf0{$?Uvp(kjT+x5bvXCntWJ0r_0_7 z@wBB`;Ppsg4a0BNGGE?_!~*3~h6VpQRBPNC1l~9&a8KAZ2*TV~Phe&hj0jBWt0cF| zu5s(IV~xWyWt!A92fi^hZS%b_zC>$j@EOQld43d=BPYO-J7no1%?43WihSyODBd0K>W-;tcN~JIYaAt+ Date: Sat, 16 Sep 2023 16:42:31 +0530 Subject: [PATCH 05/24] Revert "Merged with main" This reverts commit b4533eabcd8bc5f00866f037bbc373b6bb4a36d3. --- lib64 | 1 - 1 file changed, 1 deletion(-) delete mode 120000 lib64 diff --git a/lib64 b/lib64 deleted file mode 120000 index 7951405f8..000000000 --- a/lib64 +++ /dev/null @@ -1 +0,0 @@ -lib \ No newline at end of file From a6aca936e33be2f79bbc73b332e32ed87ee65a02 Mon Sep 17 00:00:00 2001 From: Daksh Sharma <82373462+justdaksh@users.noreply.github.com> Date: Sat, 16 Sep 2023 20:26:51 +0530 Subject: [PATCH 06/24] Updated nuclia_sync.yml Removed run on requirements-initial.txt --- .github/workflows/nuclia_sync.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/nuclia_sync.yml b/.github/workflows/nuclia_sync.yml index 90e95c7d4..6ac4165ed 100644 --- a/.github/workflows/nuclia_sync.yml +++ b/.github/workflows/nuclia_sync.yml @@ -16,7 +16,6 @@ jobs: - name: Install requirements run: | - pip install -q -r requirements-initial.txt pip install -q -r requirements.txt - name: Run Nuclia Sync @@ -34,4 +33,4 @@ jobs: git add . git commit -m "Nuclia Sync: Updated docs" git push - \ No newline at end of file + From aa591bf1532e1637be2dcb1306abd51e9a3b5671 Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Sun, 17 Sep 2023 22:26:54 +0530 Subject: [PATCH 07/24] Updated Environment varibles --- .github/workflows/nuclia_sync.yml | 5 +++++ upload.py | 36 +++++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nuclia_sync.yml b/.github/workflows/nuclia_sync.yml index 90e95c7d4..c677abde5 100644 --- a/.github/workflows/nuclia_sync.yml +++ b/.github/workflows/nuclia_sync.yml @@ -1,6 +1,11 @@ name: Nuclia Sync on: [push] + +env: + DEPLOY_NUCLIA_URL : ${{ secrets.DEPLOY_NUCLIA_URL }} + DEPLOY_NUCLIA_TOKEN : ${{ secrets.DEPLOY_NUCLIA_TOKEN }} + jobs: sync: runs-on: ubuntu-latest diff --git a/upload.py b/upload.py index 7ca5a1090..6460a1ca8 100644 --- a/upload.py +++ b/upload.py @@ -9,8 +9,8 @@ # that's actually an API key, not a NUA one # but that's the name of the variable on our GitHub repo -API_KEY = "" -KB = "" +API_KEY = os.environ["DEPLOY_NUCLIA_TOKEN"] +KB = os.environ["DEPLOY_NUCLIA_URL"] PUBLIC_URL = "https://training.plone.org/" @@ -45,6 +45,37 @@ def extract_first_heading(file_path): get_slug = lambda path: re.sub(r'[\W_]+', '-', path.lower().strip()).strip('-') +def normalize_path(path): + return path.replace('.md', '').replace('./docs', '').lstrip('/') + + +def create_url(origin_url, url_path): + return f"{origin_url.rstrip('/')}/{url_path}" + + +def generate_breadcrumb_for_path(path): + breadcrumb = [] + temp_path = "./" + path_items = path.split('/')[1:] + + for path_item in path_items: + temp_path = os.path.join(temp_path, path_item) + if temp_path.endswith(".md"): + heading = extract_first_heading(temp_path) + new_data = {"url":create_url( + PUBLIC_URL, normalize_path(temp_path)),"label":heading} + breadcrumb.append(new_data) + else: + index_md_path = os.path.join(temp_path, "index.md") + if os.path.exists(index_md_path): + heading = extract_first_heading(index_md_path) + new_data = {"url":create_url( + PUBLIC_URL, normalize_path(temp_path)),"label":heading} + temp_path = os.path.join(temp_path, "") + breadcrumb.append(new_data) + return {"breadcrumbs":breadcrumb} + + def upload_doc(path): slug = get_slug(path) title = extract_first_heading(path) @@ -57,6 +88,7 @@ def upload_doc(path): url=KB, api_key=API_KEY, origin={"url": origin_url}, + extra={"metadata": generate_breadcrumb_for_path(path)}, ) From c20299a1c63b3a90ab45153cb72b79c811c175a7 Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Sun, 17 Sep 2023 22:41:54 +0530 Subject: [PATCH 08/24] Updating env varibale to upload job --- .github/workflows/nuclia_sync.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/nuclia_sync.yml b/.github/workflows/nuclia_sync.yml index ca676fb83..7db02e03e 100644 --- a/.github/workflows/nuclia_sync.yml +++ b/.github/workflows/nuclia_sync.yml @@ -1,11 +1,6 @@ name: Nuclia Sync on: [push] - -env: - DEPLOY_NUCLIA_URL : ${{ secrets.DEPLOY_NUCLIA_URL }} - DEPLOY_NUCLIA_TOKEN : ${{ secrets.DEPLOY_NUCLIA_TOKEN }} - jobs: sync: runs-on: ubuntu-latest @@ -24,6 +19,9 @@ jobs: pip install -q -r requirements.txt - name: Run Nuclia Sync + env: + DEPLOY_NUCLIA_URL: ${{secrets.DEPLOY_NUCLIA_URL}} + DEPLOY_NUCLIA_TOKEN: ${{secrets.DEPLOY_NUCLIA_TOKEN}} run: | python3 upload.py From 00dda2077f9aa35d9cbd1f89fcd6804149316dab Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Mon, 18 Sep 2023 10:14:43 +0530 Subject: [PATCH 09/24] Functioning breadcrumbs,Debugging CI --- docs/_static/nuclia_sync.json | 112 ++++++--------- docs/_static/searchtester.js | 257 ++++++++++++++++++---------------- docs/_templates/search.html | 11 +- upload.py | 4 +- 4 files changed, 188 insertions(+), 196 deletions(-) diff --git a/docs/_static/nuclia_sync.json b/docs/_static/nuclia_sync.json index 9487b64bf..db7766670 100644 --- a/docs/_static/nuclia_sync.json +++ b/docs/_static/nuclia_sync.json @@ -1,11 +1,11 @@ { "docs": { "./docs/glossary.md": "ac82d407c63f43fc25ffff9d82ee5e9b", - "./docs/index.md": "6adbda62e51355f1e560b0d34bea1ad2", + "./docs/index.md": "f2f1a67ccca3c66e8b33ec43f241a3ed", "./docs/contributing/authors.md": "2f11a756c8c1751cf89c2b95c617a524", "./docs/contributing/index.md": "43a6848fc1a74dde31bfa730047c1293", "./docs/contributing/setup-build.md": "50b423b082ea013ab4cf63bd12452211", - "./docs/contributing/writing-docs-guide.md": "5d45a141948675d1f18321c43b1aa053", + "./docs/contributing/writing-docs-guide.md": "ad0f07c384d2ea7746a1bc3932586f2d", "./docs/effective-volto/about_effective_volto.md": "fcb5d0d832f25bbbdc29d43af382ec01", "./docs/effective-volto/addons.md": "3c19f5218854ba905e7eac8234bc3a85", "./docs/effective-volto/architecture.md": "72d9e92bf956af7be087046a1b7f4147", @@ -79,70 +79,48 @@ "./docs/effective-volto/testing/jest.md": "f3068c156d6308d130eb7308c689e583", "./docs/effective-volto/testing/storybook.md": "645be5af958f04324f4ecfb581ac9961", "./docs/effective-volto/testing/unit.md": "515b58ca4e3f06c0e6e52146511a1061", - "./docs/mastering-plone/about_mastering.md": "44517deb5e1c1911b716e1028ad9762b", - "./docs/mastering-plone/add-ons.md": "64dc04bce9f5612b41dfea4f92f2f4f7", - "./docs/mastering-plone/api.md": "24b85fc71a6500cb7c1af5001265974d", - "./docs/mastering-plone/behaviors_1.md": "1d441b399cbbc11286637684e66d3c38", - "./docs/mastering-plone/behaviors_2.md": "0728c0b1ff646638ee88f4e4eda1f2f7", - "./docs/mastering-plone/case.md": "8e8da5692014b4f0f149cbd04f8f3f94", - "./docs/mastering-plone/code.md": "218135228aa78ddf29d9a478e9c4b118", - "./docs/mastering-plone/configuring_customizing.md": "0b50c7b7939472f7cca87860fad0a934", + "./docs/mastering-plone/about_mastering.md": "f4841c767143d52343af9db47a9e45a3", + "./docs/mastering-plone/add-ons.md": "c7bfba484d8b838592c757edd554bf19", + "./docs/mastering-plone/api.md": "11b334d91891c38bb27173ddbd782c7a", + "./docs/mastering-plone/behaviors_1.md": "eae048f9de778b303f5678c6838d91f8", + "./docs/mastering-plone/case.md": "ec932ec5d0c73752951eb129101480f4", + "./docs/mastering-plone/code.md": "bb95da54d3e014a87a0251243cf9f10d", + "./docs/mastering-plone/configuring_customizing.md": "faf6db17d260109cf98314eea3f7ac8c", "./docs/mastering-plone/custom_search.md": "eae02a4ec30ab667e3c72a13d49e9c77", - "./docs/mastering-plone/deployment_code.md": "d9fe11408081b668d4b885b485475c1a", - "./docs/mastering-plone/deployment_sites.md": "a32d5870f894842164896daf25e1e78a", - "./docs/mastering-plone/dexterity.md": "d98a41e7be47eddf1208e00f45fc9486", - "./docs/mastering-plone/dexterity_2_talk.md": "31ca9022206050de63f6eba5be3cfbe2", - "./docs/mastering-plone/dexterity_3.md": "0343ad6376359cc7b4b1b2b23d6cfd41", - "./docs/mastering-plone/dexterity_reference.md": "6ab8a9e18080820be97cb2b768d6d5c6", - "./docs/mastering-plone/eggs1.md": "5a247a4c790285baf9e1d1ca09df6da0", - "./docs/mastering-plone/eggs2.md": "41a7a1264c5557b5bbe701bbf23dbca6", - "./docs/mastering-plone/embed.md": "96c2c083f90f561bd355b77a31ea4661", - "./docs/mastering-plone/endpoints.md": "0fe9fa877a93552b066126ba5a0bde79", - "./docs/mastering-plone/events.md": "99015576e09224b5499dc0482a5d2f3d", - "./docs/mastering-plone/events_classic.md": "290a33637af979b1f84e2d2deb91332a", - "./docs/mastering-plone/extending.md": "cf7951cc48e4b518446ec00a4877dce3", - "./docs/mastering-plone/features.md": "0a7cd69df795068867c18f326d86dcfe", - "./docs/mastering-plone/frontpage.md": "ae66f578e36a72ba67d6fed2923f2c56", - "./docs/mastering-plone/ide.md": "281621981aded663f0e1b91803c2bb29", - "./docs/mastering-plone/index.md": "2d0416d4c42fec9e7eafa1a418a4f25c", - "./docs/mastering-plone/installation.md": "548c734e24e2be31718d8c75845e4db2", - "./docs/mastering-plone/instructions.md": "7004bf4b12c9ead6fc519156dfaf0cd9", - "./docs/mastering-plone/intro.md": "ef1b346a247b6cc256b559360fa8adb4", - "./docs/mastering-plone/mastering_plone_6.md": "635319087cbe4aea5e76b4c70ff79788", - "./docs/mastering-plone/plone_versions.md": "5b7d4d2b6d174169434f35b5853ac1b4", + "./docs/mastering-plone/deployment_code.md": "1736cf02104ed7e039d341e54b474a72", + "./docs/mastering-plone/dexterity.md": "65a8b1c7e8357981b8ce73a1103d94e1", + "./docs/mastering-plone/dexterity_2_talk.md": "1fc5066a15a6a2d2ec5e3142a07ad4f8", + "./docs/mastering-plone/dexterity_3.md": "af2a0edf4f45fc981b223213824519da", + "./docs/mastering-plone/dexterity_reference.md": "3967a24d152d74a173b21706458e9fab", + "./docs/mastering-plone/events.md": "3b9b1cc7befcf1f80fe02167242ea320", + "./docs/mastering-plone/extending.md": "8f02caaa9e72db6a597733168f52aaba", + "./docs/mastering-plone/features.md": "67faf311c170cf3f15eed023165b50cb", + "./docs/mastering-plone/index.md": "903d8520c71bb29078094a21d0134c65", + "./docs/mastering-plone/installation.md": "d82a8615f66b54cc211808f540a21ed1", + "./docs/mastering-plone/intro.md": "5047099b23595a68f33c5507da12df34", "./docs/mastering-plone/registry.md": "918a3754f7b7610cbcff6d44718a9eff", - "./docs/mastering-plone/relations.md": "9cc71f35c4501d15576af9047f1a8d7e", - "./docs/mastering-plone/restapi.md": "0fe58ce4173057207b4dfed86ba04313", - "./docs/mastering-plone/reusable.md": "997eddaf9d877591d6d42cb938009fef", - "./docs/mastering-plone/theming.md": "68d624bfc6efb7ab688ade88cfd1d21d", + "./docs/mastering-plone/relations.md": "ebf4df445828039f376a25df4c08d4e5", "./docs/mastering-plone/thirdparty_behaviors.md": "ec95b6a9733ed42a866fb9338dbdd952", - "./docs/mastering-plone/timing.md": "a71dd953783c9d528f1d0b5b0895b027", - "./docs/mastering-plone/todos_documentation_mastering_plone_6.md": "9cffb2074f8036eacc13f0dcf0cd098f", + "./docs/mastering-plone/timing.md": "c77d9ee424b5935e136d1df2047d5169", + "./docs/mastering-plone/todos_documentation_mastering_plone_6.md": "46b9d9ae4a54327d5c9d97ed89158415", "./docs/mastering-plone/trainer.md": "f85196997cdef4e195735a08cc932555", - "./docs/mastering-plone/upgrade_steps.md": "18ccfbdd6ce75cda00a96c3245e633fd", - "./docs/mastering-plone/user_generated_content.md": "0bcfd1a1865bb9221e2c095162c90b89", - "./docs/mastering-plone/video.md": "a64c3b0b66168f8b7b5ab6efe32458b5", - "./docs/mastering-plone/viewlets_1.md": "1bdcb73d17b18816629d12b5eca6a10e", - "./docs/mastering-plone/viewlets_2.md": "72137b278b84e19161f0255c396da076", - "./docs/mastering-plone/viewlets_advanced_classic.md": "1c8af71e1a7e9c15d92b366da38b1896", - "./docs/mastering-plone/views_1.md": "44872681545022e57b5f10a405007613", - "./docs/mastering-plone/views_2.md": "224267d8bdc4ff6af0b841711f1283b4", - "./docs/mastering-plone/views_3.md": "fbd4fe9fa6a85a2e8064c0aeaac3bdd5", - "./docs/mastering-plone/volto_actions.md": "04e94626e98561fc52a299eb3f5332d0", - "./docs/mastering-plone/volto_addon.md": "7fbb02c7a5064474fe6cabaa0d8119bd", - "./docs/mastering-plone/volto_components_sponsors.md": "5965947134bf928738a14a53d794818e", - "./docs/mastering-plone/volto_custom_addon.md": "9e75a378204c526b7db6a9c3354619dd", - "./docs/mastering-plone/volto_custom_addon2.md": "08ad5b4cf58befc91dbf8114bff2efee", - "./docs/mastering-plone/volto_development.md": "5a5a45a5d6d2702a8127a3b701d534cf", - "./docs/mastering-plone/volto_frontpage.md": "aaa283c76f8847971a6e28b884580cfc", - "./docs/mastering-plone/volto_overrides.md": "08d90f8bfa04546bd22084b1e7f487aa", - "./docs/mastering-plone/volto_richtexteditor.md": "b2aab4af844098ef23fed0daedbb8272", - "./docs/mastering-plone/volto_semantic_ui.md": "2a4d716fc202f6b66e4c1d6d9d364c7a", - "./docs/mastering-plone/volto_talkview.md": "3ba36b2c63161e0f283a100f308af81a", - "./docs/mastering-plone/volto_testing.md": "8f4a245f63ebcdb17607ee5f13714519", - "./docs/mastering-plone/volto_theming.md": "686ad1471dffd813e0b34757e5dc4001", - "./docs/mastering-plone/what_is_plone.md": "9f1a8f7a16672f34ac6d88548fcae6f2", - "./docs/mastering-plone/zpt.md": "d95387911aa925afa1c72e8953a7a938", + "./docs/mastering-plone/upgrade_steps.md": "9fe20d545aa1fc85bec15a0e197b0dda", + "./docs/mastering-plone/user_generated_content.md": "5e72a122e88ea51ec865c6832a1c23c6", + "./docs/mastering-plone/volto_addon.md": "26bc3b538158231bf3530fa35ace8de6", + "./docs/mastering-plone/volto_components_sponsors.md": "51a9553c737fe40b25e6294cd5a468b8", + "./docs/mastering-plone/volto_custom_addon.md": "26075ce01695c794333bd662bfd62f8b", + "./docs/mastering-plone/volto_custom_addon2.md": "76d205f727b8d45d9519bec995906f41", + "./docs/mastering-plone/volto_development.md": "fb33c404a22bfce3ba1f9bcecc0906a7", + "./docs/mastering-plone/volto_frontpage.md": "22499531714bb100019641655dd6bce7", + "./docs/mastering-plone/volto_overrides.md": "192b249342349aa4c3b34a19522c0f9e", + "./docs/mastering-plone/volto_talkview.md": "a3350724d45ee9a46ff41d92eb2dcfec", + "./docs/mastering-plone/volto_testing.md": "15a16b7acc14687a29df31b6befbdf3b", + "./docs/mastering-plone/what_is_plone.md": "8262738d4969226f93b3aea97942b8f5", + "./docs/mastering-plone/voting-story/behaviors_2.md": "028637fae520f17f318fcd9e2a4ad5f9", + "./docs/mastering-plone/voting-story/endpoints.md": "ae9e03c5d73b072803b487595077ba02", + "./docs/mastering-plone/voting-story/index.md": "3a94515a4542cff55055eac60793e862", + "./docs/mastering-plone/voting-story/permissions.md": "e59f55cffa917a42cff2b85ad38b8cf1", + "./docs/mastering-plone/voting-story/volto_actions.md": "af90cea46e7ca78d578a9388f5e4ee19", "./docs/mastering-plone-5/about_mastering.md": "cf02fcc663e1fc5e925d5d9b25c0b1bd", "./docs/mastering-plone-5/add-ons.md": "9f0e68fef36d340f83710f49aa310430", "./docs/mastering-plone-5/anatomy.md": "d60d7abe9d83d877f791a6bd4a083f0f", @@ -175,7 +153,7 @@ "./docs/mastering-plone-5/intro.md": "30fb84c0bae092603e3247994c963b4f", "./docs/mastering-plone-5/optional.md": "3a8ca8473ad25f1a4f537ff2cb4244dc", "./docs/mastering-plone-5/plone5.md": "558fe6c1db92474bc4d3e63607421f7a", - "./docs/mastering-plone-5/registry.md": "37513d55ff0ae563499d6610ac7f446b", + "./docs/mastering-plone-5/registry.md": "951f2b7d5ff7998b343c372e86b46b92", "./docs/mastering-plone-5/relations.md": "a6fcfc1bd7f1f5d49a1daddc1515e766", "./docs/mastering-plone-5/resources.md": "06a20f9c3a0c0de5ba63b44dd4bd06da", "./docs/mastering-plone-5/restapi.md": "e538b0940a4a83a121515272e5560d7f", @@ -194,11 +172,11 @@ "./docs/mastering-plone-5/what_is_plone.md": "d3daf0a5b0adb9a733774a180abd762f", "./docs/mastering-plone-5/zpt.md": "043f5e6a791e2c3ce634697844cf0787", "./docs/mastering-plone-5/zpt_2.md": "b69e1b08ccfdc5eabfae4045ba443ef8", - "./docs/migrations/exportimport.md": "b7a4e3bfe1387a207d98f00253b0111e", + "./docs/migrations/exportimport.md": "f8abf533430cacf926d58d20b90110f8", "./docs/migrations/index.md": "9083d3b7fbe32c1f86e811b025f8b8ad", "./docs/migrations/inplace.md": "276011eef09dffb22b40684daa2b6b19", "./docs/migrations/migrate-to-plone.md": "b4f384d36804f8a26227e12bf9e8a380", - "./docs/migrations/migrations.md": "2f4d2a75c48734d6fbb4309990caa091", + "./docs/migrations/migrations.md": "743034c9f9a1b06a8f5e41a00c3e46a7", "./docs/migrations/volto.md": "4c6bd895c419c7c8cb913d26fb0ee498", "./docs/plone-deployment/deploy.md": "d1a2e0bbc52066066039598ea0206a21", "./docs/plone-deployment/edit-project.md": "1d44a8ab05a0dc05deed0eb84466aa65", @@ -209,8 +187,6 @@ "./docs/plone-deployment/plone-stack.md": "0fc06c46f4cba8786e6feef2f7d16a9a", "./docs/plone-deployment/provision.md": "7f975fa16b866a16fd0f0c207d821960", "./docs/plone-deployment/setup.md": "2ddcb6cf42073e47ddecc26633d06edb", - "./docs/plone_training_config/instructions_plone5.md": "4b168f98d36cfd0713b0fa38fd6be89e", - "./docs/plone_training_config/what_vagrant_does.md": "906ef1be9ae94982b53e53a7e8eee7a1", "./docs/teaching/after.md": "a8eab431332ee473e9442a9b53f0ec48", "./docs/teaching/before.md": "93836de1ae408ca305b2bce1052c559d", "./docs/teaching/during.md": "cd02b859831dea6236a91bfb08f701cf", @@ -255,7 +231,7 @@ "./docs/voltohandson/contenttypesviews.md": "c5252e0a622bf41fae9ee3cc99adb991", "./docs/voltohandson/contenttypeview.md": "f15aa7214a37a7639696d3df82dbb468", "./docs/voltohandson/eventlistingtemplate.md": "11567d15de9940eeede088b49a44da53", - "./docs/voltohandson/footer.md": "a9af790f1779cfb942a9bb5633eff95c", + "./docs/voltohandson/footer.md": "87487bf9e1c141cf1a74156331cf24bc", "./docs/voltohandson/header.md": "9f859a158067d7587fcf87e1f5acee57", "./docs/voltohandson/highlight.md": "1dc0d44f216a67e75f7c33c3ac8407d0", "./docs/voltohandson/highlightsblock.md": "fc2a7c00ec7fd7277cf9c022b3eff6a9", diff --git a/docs/_static/searchtester.js b/docs/_static/searchtester.js index 012a66b1d..91778c831 100644 --- a/docs/_static/searchtester.js +++ b/docs/_static/searchtester.js @@ -1,143 +1,156 @@ -let breadcrumbMapping; // Storing the fetched JSON here -let resultHeadings = []; // Store the result headings once fetched -let counter = 0; +const { switchMap } = rxjs; +const nucliaResult = document.querySelector("nuclia-search-results"); +const shadowRoot = nucliaResult.shadowRoot; -// Function to load JSON into script -async function fetchBreadcrumbMapping() { +const nuclia = new window.NucliaSDK.Nuclia({ + backend: "https://nuclia.cloud/api", + zone: "europe-1", + knowledgeBox: "62407006-2711-4631-9c03-761d156de289", +}); + +function createBreadcrumbs(Container) { + + // Container hash gets the md5 value of resource but i am unable to find resource by passing that hash + // let ContainerHash = Container.querySelector( + // "div > div.sw-field-metadata > div > div:nth-child(2) > span.title-xxs" + // ).innerText; + + let ContainerHeading = Container.querySelector("div"); + + // One of The hash that works 79e4d894189842acb0902b5d879c2fe6 try { - const response = await fetch("/_static/heading_to_breadcrumb_mapping.json"); - breadcrumbMapping = await response.json(); + nuclia.db + .getKnowledgeBox() + .pipe( + switchMap((knowledgeBox) => + knowledgeBox.getResource("79e4d894189842acb0902b5d879c2fe6", [ + "extra", + ]) + ) + ) + .subscribe( + (resource) => { + insertBreadcrumbDiv(resource, ContainerHeading); + }, + (error) => { + console.error("Error fetching resource:", error); + } + ); } catch (error) { - console.error("Error fetching mapping:", error); + console.error("Error in createBreadcrumbs:", error); } } -fetchBreadcrumbMapping(); +function insertBreadcrumbDiv(resource, ContainerHeading) { + let array = resource.extra.metadata["breadcrumbs"]; + if (!ContainerHeading.querySelector("div.breadcrumbs")) { + let breadcrumbContainer = document.createElement("div"); + breadcrumbContainer.className = "breadcrumbs"; + for (let i = 0; i < array.length; i++) { + let dict = array[i]; + + // Create a span element for each breadcrumb + let breadcrumbSpan = document.createElement("span"); + + // Create a breadcrumb link or span based on whether it's the last breadcrumb + if (i < array.length - 1) { + let breadcrumbLink = document.createElement("a"); + breadcrumbLink.href = dict.url; + breadcrumbLink.textContent = dict.label; + breadcrumbLink.classList.add("breadcrumb-link"); + breadcrumbSpan.appendChild(breadcrumbLink); + + // Add a separator between breadcrumb links (e.g., '>') + let separator = document.createTextNode(" > "); + breadcrumbSpan.appendChild(separator); + } else { + // If it's the last breadcrumb, create a non-clickable span + breadcrumbSpan.textContent = dict.label; + breadcrumbSpan.classList.add("breadcrumb-last"); + } -// Function to create breadcrumbs so that we can just put in title of results -async function createBreadcrumbs(resultHeading) { - try { - // Check if the heading exists in the mapping - const breadcrumbs = - breadcrumbMapping["heading_to_breadcrumb"][resultHeading]; - if (!breadcrumbs) { - throw new Error("No breadcrumbs found for the heading: ", resultHeading); + breadcrumbContainer.appendChild(breadcrumbSpan); } - return breadcrumbs; - } catch (error) { - console.error("Error fetching mapping:", error); - return []; + ContainerHeading.insertAdjacentElement( + "afterbegin", + breadcrumbContainer + ); } } -// Function to add breadcrumbs above each result heading -function addBreadcrumbsToResults() { - // select the tag being populated with results - const nucliaResult = document.querySelector("nuclia-search-results"); - if (!nucliaResult) { - return; // Exit if nuclia-search-results tag is not found - } +function isMatch(element) { + return ( + element && + element.nodeName === "DIV" && + element.classList && + element.classList.contains("result-title-container") && + element.classList.length === 2 + ); +} - // need to acces the shadow root - const shadowRoot = nucliaResult.shadowRoot; - - // Observe changes in the shadow root of nuclia-search-results element - const observer = new MutationObserver((mutationsList) => { - for (const mutation of mutationsList) { - if (mutation.type === "childList") { - // Check if the mutation involves the addition of nodes - if (mutation.addedNodes.length > 0) { - // Iterate through added nodes and process them - mutation.addedNodes.forEach((addedNode) => { - // Check if the added node has the 'result-container' class - if ( - addedNode.classList && - addedNode.classList.contains("result-container") - ) { - // Find all h3 tags with the specified class within the result container and adding to resultHeadings - resultHeadings = Array.from(mutation.addedNodes).flatMap( - (addedNode) => - Array.from( - addedNode.querySelectorAll( - "h3.ellipsis.title-m.svelte-1yttzcg" - ) - ) - ); - - resultHeadings.forEach((resultHeading) => { - // Check if the result heading already has breadcrumbs - if (!resultHeading.dataset.breadcrumbsAdded) { - // If Not, Then Mark the element as having breadcrumbs - resultHeading.dataset.breadcrumbsAdded = true; - // Create breadcrumbs for the result item - createBreadcrumbs(resultHeading.innerHTML) - .then((breadcrumbObj) => { - // Create a container with class breadcrumbs - const breadcrumbContainer = document.createElement("div"); - breadcrumbContainer.className = "breadcrumbs"; - - const breadcrumbNames = Object.keys(breadcrumbObj); - const lastBreadcrumb = breadcrumbNames.pop(); - - breadcrumbNames.forEach((breadcrumbName, index) => { - // Create anchor - const breadcrumbLink = document.createElement("a"); - breadcrumbLink.href = breadcrumbObj[breadcrumbName]; // URL from JSON - breadcrumbLink.textContent = breadcrumbName; - - // Create a span for this anchor - const breadcrumbElement = - document.createElement("span"); - breadcrumbElement.className = "breadcrumb-item"; // Apply the breadcrumb-item class - - breadcrumbElement.appendChild(breadcrumbLink); - - // Add the separator " > " between elements - if ( - breadcrumbNames.length > 1 && - counter < breadcrumbNames.length - 1 - ) { - counter = counter + 1; - const separator = document.createElement("span"); - separator.textContent = " > "; - separator.className = "pathseparator"; - breadcrumbContainer.appendChild(separator); - } - - breadcrumbContainer.appendChild(breadcrumbElement); - }); - - // Add the last breadcrumb as a non-clickable span - const lastBreadcrumbElement = - document.createElement("span"); - lastBreadcrumbElement.className = "last-breadcrumb"; - lastBreadcrumbElement.textContent = lastBreadcrumb; - - breadcrumbContainer.appendChild(lastBreadcrumbElement); - - resultHeading.insertAdjacentElement( - "beforebegin", - breadcrumbContainer - ); - }) - .catch((error) => { - console.error("Error creating breadcrumbs:", error); - }); - } - }); - } - }); - } - } +// Function to process added nodes within the shadow DOM +function processAddedNodes(addedNodes) { + addedNodes.forEach((addedNode) => { + if (isMatch(addedNode)) { + createBreadcrumbs(addedNode); } }); +} + +function addBreadcrumbsToResults() { + if (!nucliaResult) { + console.error("Nuclia-search-result tag not found"); + return; + } + let observer = new MutationObserver(callback); - // Start observing the shadow root of each nuclia-search-results element observer.observe(shadowRoot, { childList: true, subtree: true, }); - // Need To stop Observing when the Nuclia results are populated - // but I guess they keep updating so need to observe continously. } + +const callback = function (mutationsList, observer) { + for (const mutation of mutationsList) { + if (mutation.type === "childList") { + processAddedNodes(mutation.addedNodes); + } + } +}; + +const style = document.createElement('style'); +style.textContent = ` + +/* Breadcrumb container */ +.breadcrumbs { + font-size: 16px; + margin: 10px 0; +} + +/* Breadcrumb links */ +.breadcrumbs a { + text-decoration: none; + color: #007bff; + transition: color 0.2s; +} + +/* Style for the last breadcrumb */ +.breadcrumbs span:last-child { + color: #555; +} + +/* Separator between breadcrumbs */ +.breadcrumbs .separator { + margin: 0 5px; + color: #777; +} + +/* Hover effect for breadcrumb links */ +.breadcrumbs a:hover { + color: #0056b3; +} + +`; +// Append the style element to the shadow DOM +shadowRoot.appendChild(style); diff --git a/docs/_templates/search.html b/docs/_templates/search.html index c57bc5869..5b6830abd 100644 --- a/docs/_templates/search.html +++ b/docs/_templates/search.html @@ -19,6 +19,9 @@

{{ _("Search") }}

{% endblock %}
+ + + - + features="answers,navigateToLink,displayMetadata" > diff --git a/upload.py b/upload.py index 6460a1ca8..b307a5228 100644 --- a/upload.py +++ b/upload.py @@ -79,7 +79,9 @@ def generate_breadcrumb_for_path(path): def upload_doc(path): slug = get_slug(path) title = extract_first_heading(path) + print(PUBLIC_URL) origin_url = f"{PUBLIC_URL}{path.replace('.md', '').replace('./docs/', '')}" # noqa + print(origin_url) sdk.NucliaUpload().text( path=path, format="MARKDOWN", @@ -112,7 +114,7 @@ def sync(): with open("./docs/_static/nuclia_sync.json", "r") as sync_info: old_data = json.load(sync_info) new_data = generate_nuclia_sync() - + print(new_data) to_delete = [] for doc, _ in old_data["docs"].items(): if doc not in new_data["docs"]: From cdb9d4146d5a91ca7870b80094f6ede520374e02 Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Mon, 18 Sep 2023 10:19:20 +0530 Subject: [PATCH 10/24] Removed breadmaker.py && heading_to_breadcrumb_mapping.json --- breadmaker.py | 56 - .../heading_to_breadcrumb_mapping.json | 1189 ----------------- 2 files changed, 1245 deletions(-) delete mode 100644 breadmaker.py delete mode 100644 docs/_static/heading_to_breadcrumb_mapping.json diff --git a/breadmaker.py b/breadmaker.py deleted file mode 100644 index d1b6153df..000000000 --- a/breadmaker.py +++ /dev/null @@ -1,56 +0,0 @@ -import json -import os -from upload import extract_first_heading, PUBLIC_URL - -# Load nuclia_sync.json -try: - with open("./docs/_static/nuclia_sync.json", "r") as sync_info: - nuclia_sync_data = json.load(sync_info) -except FileNotFoundError: - print("Error: nuclia_sync.json not found.") -except json.JSONDecodeError as e: - print(f"Error decoding JSON: {e}") - - -def normalize_path(path): - return path.replace('.md', '').replace('./docs', '').lstrip('/') - - -def create_url(origin_url, url_path): - return f"{origin_url.rstrip('/')}/{url_path}" - - -def generate_breadcrumb_for_path(path): - breadcrumb = {} - temp_path = "./" - path_items = path.split('/')[1:] - - for path_item in path_items: - temp_path = os.path.join(temp_path, path_item) - if temp_path.endswith(".md"): - heading = extract_first_heading(temp_path) - breadcrumb[heading] = create_url( - PUBLIC_URL, normalize_path(temp_path)) - else: - index_md_path = os.path.join(temp_path, "index.md") - if os.path.exists(index_md_path): - heading = extract_first_heading(index_md_path) - breadcrumb[heading] = create_url( - PUBLIC_URL, normalize_path(temp_path)) - temp_path = os.path.join(temp_path, "") - return breadcrumb - - -result = {"heading_to_breadcrumb": {}} -for md_path in nuclia_sync_data["docs"]: - heading = extract_first_heading(md_path) - breadcrumb = generate_breadcrumb_for_path(md_path) - result["heading_to_breadcrumb"][heading] = breadcrumb - - -try: - with open("./docs/_static/heading_to_breadcrumb_mapping.json", "w") as mapping_file: # noqa - json.dump(result, mapping_file, indent=4) - print("Data written to heading_to_breadcrumb_mapping.json.") -except Exception as e: - print(f"Error writing JSON: {e}") diff --git a/docs/_static/heading_to_breadcrumb_mapping.json b/docs/_static/heading_to_breadcrumb_mapping.json deleted file mode 100644 index cddfaf801..000000000 --- a/docs/_static/heading_to_breadcrumb_mapping.json +++ /dev/null @@ -1,1189 +0,0 @@ -{ - "heading_to_breadcrumb": { - "Glossary": { - "Plone Training": "https://training.plone.org/", - "Glossary": "https://training.plone.org/glossary" - }, - "Plone Training": { - "Plone Training": "https://training.plone.org/index" - }, - "Authors Guide": { - "Plone Training": "https://training.plone.org/", - "Contributing to Plone Training": "https://training.plone.org/contributing", - "Authors Guide": "https://training.plone.org/contributing/authors" - }, - "Contributing to Plone Training": { - "Plone Training": "https://training.plone.org/", - "Contributing to Plone Training": "https://training.plone.org/contributing/index" - }, - "Building and Checking the Quality of Documentation": { - "Plone Training": "https://training.plone.org/", - "Contributing to Plone Training": "https://training.plone.org/contributing", - "Building and Checking the Quality of Documentation": "https://training.plone.org/contributing/setup-build" - }, - "General Guide to Writing Documentation": { - "Plone Training": "https://training.plone.org/", - "Contributing to Plone Training": "https://training.plone.org/contributing", - "General Guide to Writing Documentation": "https://training.plone.org/contributing/writing-docs-guide" - }, - "About Effective Volto": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "About Effective Volto": "https://training.plone.org/effective-volto/about_effective_volto" - }, - "Add-ons": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Add-ons": "https://training.plone.org/effective-volto/addons" - }, - "Architecture": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Architecture": "https://training.plone.org/effective-volto/architecture" - }, - "Backend": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Backend": "https://training.plone.org/effective-volto/backend" - }, - "Deployment": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Deployment": "https://training.plone.org/effective-volto/deployment" - }, - "Development tools": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Development tools": "https://training.plone.org/effective-volto/development" - }, - "Getting Started": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Getting Started": "https://training.plone.org/effective-volto/getting-started" - }, - "Effective Volto": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto/index" - }, - "Testing": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Testing": "https://training.plone.org/effective-volto/testing" - }, - "Integrate with Volto\u2019s asyncConnect for SSR": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Integrate with Volto\u2019s asyncConnect for SSR": "https://training.plone.org/effective-volto/addons/asyncconnect" - }, - "Block Extensions": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Block Extensions": "https://training.plone.org/effective-volto/addons/block-extensions" - }, - "Block Styling": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Block Styling": "https://training.plone.org/effective-volto/addons/block-styling" - }, - "Create a block using BlockDataForm": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Create a block using BlockDataForm": "https://training.plone.org/effective-volto/addons/blockdataform" - }, - "Blocks Layout": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Blocks Layout": "https://training.plone.org/effective-volto/addons/blockslayout" - }, - "Bootstrap an add-on": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Bootstrap an add-on": "https://training.plone.org/effective-volto/addons/bootstrap" - }, - "Create a custom Listing block variation": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Create a custom Listing block variation": "https://training.plone.org/effective-volto/addons/customlistingtemplate" - }, - "Add-on dependencies": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Add-on dependencies": "https://training.plone.org/effective-volto/addons/dependencies" - }, - "How does a Volto add-on works?": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "How does a Volto add-on works?": "https://training.plone.org/effective-volto/addons/how-an-add-on-works" - }, - "Add-on Internationalization": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Add-on Internationalization": "https://training.plone.org/effective-volto/addons/i18n" - }, - "Add-on and project configuration pipeline": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Add-on and project configuration pipeline": "https://training.plone.org/effective-volto/addons/pipeline" - }, - "Extending Semantic UI": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Extending Semantic UI": "https://training.plone.org/effective-volto/addons/semanticui" - }, - "Create a theme add-on": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Create a theme add-on": "https://training.plone.org/effective-volto/addons/theme" - }, - "Configure a released Volto Add-on in your project": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Configure a released Volto Add-on in your project": "https://training.plone.org/effective-volto/addons/use-released-addon" - }, - "Configure an unreleased add-on from an existing repository": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Configure an unreleased add-on from an existing repository": "https://training.plone.org/effective-volto/addons/use-repo-addon" - }, - "Volto views": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Volto views": "https://training.plone.org/effective-volto/addons/views" - }, - "Extend Webpack setup from an add-on with razzle.extend.js": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Extend Webpack setup from an add-on with razzle.extend.js": "https://training.plone.org/effective-volto/addons/webpack" - }, - "What is a Volto add-on": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "What is a Volto add-on": "https://training.plone.org/effective-volto/addons/what-is-an-addon" - }, - "Inside Volto": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Inside Volto": "https://training.plone.org/effective-volto/architecture/anatomy" - }, - "Babel": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Babel": "https://training.plone.org/effective-volto/architecture/babel" - }, - "Volto Blocks": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Volto Blocks": "https://training.plone.org/effective-volto/architecture/blocks" - }, - "Bootstrap Volto": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Bootstrap Volto": "https://training.plone.org/effective-volto/architecture/bootstrap-volto" - }, - "Volto Client - Server duality": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Volto Client - Server duality": "https://training.plone.org/effective-volto/architecture/client-ssr" - }, - "Configuration Registry": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Configuration Registry": "https://training.plone.org/effective-volto/architecture/configuration" - }, - "CORS": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "CORS": "https://training.plone.org/effective-volto/architecture/CORS" - }, - "Multilingual": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Multilingual": "https://training.plone.org/effective-volto/architecture/multilingual" - }, - "Razzle": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Razzle": "https://training.plone.org/effective-volto/architecture/razzle" - }, - "Redux": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Redux": "https://training.plone.org/effective-volto/architecture/redux" - }, - "Webpack loaders": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Webpack loaders": "https://training.plone.org/effective-volto/architecture/webpack-loaders" - }, - "Webpack": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Webpack": "https://training.plone.org/effective-volto/architecture/webpack" - }, - "Block field contribute to searchableText": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Block field contribute to searchableText": "https://training.plone.org/effective-volto/backend/block-field-as-searchableText" - }, - "Link integrity for blocks": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Link integrity for blocks": "https://training.plone.org/effective-volto/backend/block-linkintegrity" - }, - "Writing Express middleware": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Writing Express middleware": "https://training.plone.org/effective-volto/backend/express-middleware" - }, - "Plone REST API endpoints": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Plone REST API endpoints": "https://training.plone.org/effective-volto/backend/plone-restapi-endpoints" - }, - "Writing a block transform": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Writing a block transform": "https://training.plone.org/effective-volto/backend/writing-block-transforms" - }, - "Writing a content expansion endpoint": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Writing a content expansion endpoint": "https://training.plone.org/effective-volto/backend/writing-content-expansion" - }, - "Writing an endpoint": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Writing an endpoint": "https://training.plone.org/effective-volto/backend/writing-endpoint" - }, - "Writing a serializer or a deserializer": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Writing a serializer or a deserializer": "https://training.plone.org/effective-volto/backend/writing-serializer-deserializer" - }, - "Docker": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Docker": "https://training.plone.org/effective-volto/deployment/docker" - }, - "release-it": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "release-it": "https://training.plone.org/effective-volto/deployment/releaseit" - }, - "Seamless mode": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Seamless mode": "https://training.plone.org/effective-volto/deployment/seamlessmode" - }, - "Simple deployment": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Simple deployment": "https://training.plone.org/effective-volto/deployment/simple" - }, - "Bundle analyzing": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Bundle analyzing": "https://training.plone.org/effective-volto/development/bundle-analyzing" - }, - "Component Registry": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Component Registry": "https://training.plone.org/effective-volto/development/component-registry" - }, - "critical.css": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "critical.css": "https://training.plone.org/effective-volto/development/criticalCSS" - }, - "Debugging with Volto": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Debugging with Volto": "https://training.plone.org/effective-volto/development/debugging" - }, - "Environment variables": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Environment variables": "https://training.plone.org/effective-volto/development/environmentvariables" - }, - "Husky and lint-staged": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Husky and lint-staged": "https://training.plone.org/effective-volto/development/husky-lint-staged" - }, - "Internationalization": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Internationalization": "https://training.plone.org/effective-volto/development/i18n" - }, - "Icons": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Icons": "https://training.plone.org/effective-volto/development/icons" - }, - "Lazyloading components, injectLazyLibs for libraries": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Lazyloading components, injectLazyLibs for libraries": "https://training.plone.org/effective-volto/development/lazyloading" - }, - "Linters": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Linters": "https://training.plone.org/effective-volto/development/linters" - }, - "How to setup your development environment using environment variables": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "How to setup your development environment using environment variables": "https://training.plone.org/effective-volto/development/setup" - }, - "Shortcuts": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Shortcuts": "https://training.plone.org/effective-volto/development/shortcuts" - }, - "vim and neovim integration": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "vim and neovim integration": "https://training.plone.org/effective-volto/development/vim" - }, - "VSCode extensions/helpers": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "VSCode extensions/helpers": "https://training.plone.org/effective-volto/development/vscode" - }, - "Bootstrapping an Add-on": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Bootstrapping an Add-on": "https://training.plone.org/effective-volto/getting-started/add-on" - }, - "Bootstrapping a full Plone 6 project": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Bootstrapping a full Plone 6 project": "https://training.plone.org/effective-volto/getting-started/project" - }, - "Developer roadmap": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Developer roadmap": "https://training.plone.org/effective-volto/getting-started/roadmap" - }, - "Acceptance testing": { - "Plone Training": "https://training.plone.org/", - "Testing Plone": "https://training.plone.org/testing", - "Acceptance testing": "https://training.plone.org/testing/acceptance" - }, - "Testing add-ons": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Testing add-ons": "https://training.plone.org/effective-volto/testing/addons" - }, - "Jest": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Jest": "https://training.plone.org/effective-volto/testing/jest" - }, - "Storybook": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Storybook": "https://training.plone.org/effective-volto/testing/storybook" - }, - "Unit testing": { - "Plone Training": "https://training.plone.org/", - "Effective Volto": "https://training.plone.org/effective-volto", - "Unit testing": "https://training.plone.org/effective-volto/testing/unit" - }, - "About Mastering Plone": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "About Mastering Plone": "https://training.plone.org/mastering-plone-5/about_mastering" - }, - "Extending Plone With Add-on Packages": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Extending Plone With Add-on Packages": "https://training.plone.org/mastering-plone/add-ons" - }, - "Programming Plone": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Programming Plone": "https://training.plone.org/mastering-plone-5/api" - }, - "Behaviors": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Behaviors": "https://training.plone.org/mastering-plone-5/behaviors_1" - }, - "Complex Behaviors": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Complex Behaviors": "https://training.plone.org/mastering-plone/behaviors_2" - }, - "The Case Study": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "The Case Study": "https://training.plone.org/mastering-plone-5/case" - }, - "Using the code for the training": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Using the code for the training": "https://training.plone.org/mastering-plone-5/code" - }, - "Configuring and Customizing Plone \"Through The Web\"": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Configuring and Customizing Plone \"Through The Web\"": "https://training.plone.org/mastering-plone-5/configuring_customizing" - }, - "Custom Search": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Custom Search": "https://training.plone.org/mastering-plone-5/custom_search" - }, - "Releasing Your Code": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Releasing Your Code": "https://training.plone.org/mastering-plone-5/deployment_code" - }, - "Buildout II: Getting Ready for Deployment": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Buildout II: Getting Ready for Deployment": "https://training.plone.org/mastering-plone-5/deployment_sites" - }, - "Dexterity I: Content types": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Dexterity I: Content types": "https://training.plone.org/mastering-plone/dexterity" - }, - "Dexterity II: Talks": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Dexterity II: Talks": "https://training.plone.org/mastering-plone/dexterity_2_talk" - }, - "Dexterity Types III: Sponsors": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Dexterity Types III: Sponsors": "https://training.plone.org/mastering-plone/dexterity_3" - }, - "Dexterity: Reference": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Dexterity: Reference": "https://training.plone.org/mastering-plone-5/dexterity_reference" - }, - "Write Your Own Python Add-On to Customize Plone": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Write Your Own Python Add-On to Customize Plone": "https://training.plone.org/mastering-plone/eggs1" - }, - "Reusable Features packaged in add-ons": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Reusable Features packaged in add-ons": "https://training.plone.org/mastering-plone/eggs2" - }, - "Using starzel.votable_behavior in ploneconf.site": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Using starzel.votable_behavior in ploneconf.site": "https://training.plone.org/mastering-plone-5/embed" - }, - "REST API Endpoints": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "REST API Endpoints": "https://training.plone.org/mastering-plone/endpoints" - }, - "Turning Talks into Events": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Turning Talks into Events": "https://training.plone.org/mastering-plone-5/events" - }, - "Extending Plone": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Extending Plone": "https://training.plone.org/mastering-plone-5/extending" - }, - "The Features of Plone": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "The Features of Plone": "https://training.plone.org/mastering-plone-5/features" - }, - "Creating a Dynamic Front Page": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Creating a Dynamic Front Page": "https://training.plone.org/mastering-plone-5/frontpage" - }, - "IDEs and Editors": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "IDEs and Editors": "https://training.plone.org/mastering-plone-5/ide" - }, - "Mastering Plone 6 Development": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone/index" - }, - "Set up Plone": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Set up Plone": "https://training.plone.org/mastering-plone/installation" - }, - "Set up Plone for the Training": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Set up Plone for the Training": "https://training.plone.org/mastering-plone/instructions" - }, - "Introduction": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Introduction": "https://training.plone.org/voltohandson/intro" - }, - "Mastering Plone 6": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Mastering Plone 6": "https://training.plone.org/mastering-plone/mastering_plone_6" - }, - "What's New in Plone?": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "What's New in Plone?": "https://training.plone.org/mastering-plone/plone_versions" - }, - "Vocabularies, Registry-Settings and Control Panels": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Vocabularies, Registry-Settings and Control Panels": "https://training.plone.org/mastering-plone/registry" - }, - "Relations": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Relations": "https://training.plone.org/mastering-plone-5/relations" - }, - "Using plone.restapi without Volto": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Using plone.restapi without Volto": "https://training.plone.org/mastering-plone/restapi" - }, - "Permissions": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Permissions": "https://training.plone.org/mastering-plone/reusable" - }, - "Theming": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Theming": "https://training.plone.org/voltohandson/starttheming" - }, - "Using Third-Party Behaviors": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Using Third-Party Behaviors": "https://training.plone.org/mastering-plone-5/thirdparty_behaviors" - }, - "Timetable": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Timetable": "https://training.plone.org/mastering-plone-5/timing" - }, - "TODOs documentation Mastering Plone": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "TODOs documentation Mastering Plone": "https://training.plone.org/mastering-plone/todos_documentation_mastering_plone_6" - }, - "Trainer: Preparation": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Trainer: Preparation": "https://training.plone.org/mastering-plone/trainer" - }, - "Upgrade-steps": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Upgrade-steps": "https://training.plone.org/mastering-plone/upgrade_steps" - }, - "Workflow, Roles and Permissions": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Workflow, Roles and Permissions": "https://training.plone.org/mastering-plone/user_generated_content" - }, - "Watch the Training Video": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Watch the Training Video": "https://training.plone.org/mastering-plone/video" - }, - "Writing Viewlets": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Writing Viewlets": "https://training.plone.org/mastering-plone-5/viewlets_1" - }, - "A Viewlet for the Votable Behavior": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "A Viewlet for the Votable Behavior": "https://training.plone.org/mastering-plone-5/viewlets_2" - }, - "Advanced Viewlets": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Advanced Viewlets": "https://training.plone.org/mastering-plone/viewlets_advanced_classic" - }, - "Views I": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Views I": "https://training.plone.org/mastering-plone-5/views_1" - }, - "Views II: A Default View for \"Talk\"": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Views II: A Default View for \"Talk\"": "https://training.plone.org/mastering-plone-5/views_2" - }, - "Views III: A Talk List": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Views III: A Talk List": "https://training.plone.org/mastering-plone-5/views_3" - }, - "Volto Actions and Component State": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Volto Actions and Component State": "https://training.plone.org/mastering-plone/volto_actions" - }, - "Using Volto add-ons": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Using Volto add-ons": "https://training.plone.org/mastering-plone/volto_addon" - }, - "The Sponsors Component": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "The Sponsors Component": "https://training.plone.org/mastering-plone/volto_components_sponsors" - }, - "Extending Volto With Custom Add-on Package": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Extending Volto With Custom Add-on Package": "https://training.plone.org/mastering-plone/volto_custom_addon" - }, - "Extending Volto With a FAQ Block Type": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Extending Volto With a FAQ Block Type": "https://training.plone.org/mastering-plone/volto_custom_addon2" - }, - "Volto App Development": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Volto App Development": "https://training.plone.org/mastering-plone/volto_development" - }, - "Creating a dynamic frontpage with Volto blocks": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Creating a dynamic frontpage with Volto blocks": "https://training.plone.org/mastering-plone/volto_frontpage" - }, - "Customizing Volto Components": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Customizing Volto Components": "https://training.plone.org/mastering-plone/volto_overrides" - }, - "Rich Text Editor Settings in DraftJS editor": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Rich Text Editor Settings in DraftJS editor": "https://training.plone.org/mastering-plone/volto_richtexteditor" - }, - "Semantic UI": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Semantic UI": "https://training.plone.org/mastering-plone/volto_semantic_ui" - }, - "Volto View Component: A Default View for a \"Talk\"": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Volto View Component: A Default View for a \"Talk\"": "https://training.plone.org/mastering-plone/volto_talkview" - }, - "Testing in Plone": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Testing in Plone": "https://training.plone.org/mastering-plone-5/testing" - }, - "Theming in Volto": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", - "Theming in Volto": "https://training.plone.org/mastering-plone/volto_theming" - }, - "What is Plone?": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "What is Plone?": "https://training.plone.org/mastering-plone-5/what_is_plone" - }, - "Page Templates": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Page Templates": "https://training.plone.org/mastering-plone-5/zpt" - }, - "Extend Plone With Add-On Packages": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Extend Plone With Add-On Packages": "https://training.plone.org/mastering-plone-5/add-ons" - }, - "The Anatomy of Plone": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "The Anatomy of Plone": "https://training.plone.org/mastering-plone-5/anatomy" - }, - "More Complex Behaviors": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "More Complex Behaviors": "https://training.plone.org/mastering-plone-5/behaviors_2" - }, - "Buildout I": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Buildout I": "https://training.plone.org/mastering-plone-5/buildout_1" - }, - "Dexterity I: \"Through The Web\"": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Dexterity I: \"Through The Web\"": "https://training.plone.org/mastering-plone-5/dexterity" - }, - "Dexterity Types II: Growing Up": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Dexterity Types II: Growing Up": "https://training.plone.org/mastering-plone-5/dexterity_2" - }, - "Dexterity Types III: Python": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Dexterity Types III: Python": "https://training.plone.org/mastering-plone-5/dexterity_3" - }, - "Write Your Own Add-Ons to Customize Plone": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Write Your Own Add-Ons to Customize Plone": "https://training.plone.org/mastering-plone-5/eggs1" - }, - "Creating Reusable Packages": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Creating Reusable Packages": "https://training.plone.org/mastering-plone-5/eggs2" - }, - "Return to Dexterity: Moving contenttypes into Code": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Return to Dexterity: Moving contenttypes into Code": "https://training.plone.org/mastering-plone-5/export_code" - }, - "The Future of Plone": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "The Future of Plone": "https://training.plone.org/mastering-plone-5/future_of_plone" - }, - "Mastering Plone 5 Development": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5/index" - }, - "Installation & Setup": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Installation & Setup": "https://training.plone.org/mastering-plone-5/installation" - }, - "Optional": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Optional": "https://training.plone.org/mastering-plone-5/optional" - }, - "What's New in Plone 5, 5.1 and Plone 5.2": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "What's New in Plone 5, 5.1 and Plone 5.2": "https://training.plone.org/mastering-plone-5/plone5" - }, - "Manage Settings with Registry, Control Panels and Vocabularies": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Manage Settings with Registry, Control Panels and Vocabularies": "https://training.plone.org/mastering-plone-5/registry" - }, - "Resources": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Resources": "https://training.plone.org/mastering-plone-5/resources" - }, - "Plone REST API": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Plone REST API": "https://training.plone.org/mastering-plone-5/restapi" - }, - "Making Our Package Reusable": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Making Our Package Reusable": "https://training.plone.org/mastering-plone-5/reusable" - }, - "TODOs documentation Mastering Plone 5": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "TODOs documentation Mastering Plone 5": "https://training.plone.org/mastering-plone-5/todos_documentation_mastering_plone_5" - }, - "User Generated Content": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "User Generated Content": "https://training.plone.org/mastering-plone-5/user_generated_content" - }, - "Customizing Existing Templates": { - "Plone Training": "https://training.plone.org/", - "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", - "Customizing Existing Templates": "https://training.plone.org/mastering-plone-5/zpt_2" - }, - "Migrating with collective.exportimport": { - "Plone Training": "https://training.plone.org/", - "Migration best practices": "https://training.plone.org/migrations", - "Migrating with collective.exportimport": "https://training.plone.org/migrations/exportimport" - }, - "Migration best practices": { - "Plone Training": "https://training.plone.org/", - "Migration best practices": "https://training.plone.org/migrations/index" - }, - "In-place migrations": { - "Plone Training": "https://training.plone.org/", - "Migration best practices": "https://training.plone.org/migrations", - "In-place migrations": "https://training.plone.org/migrations/inplace" - }, - "Migrating from third party systems to Plone": { - "Plone Training": "https://training.plone.org/", - "Migration best practices": "https://training.plone.org/migrations", - "Migrating from third party systems to Plone": "https://training.plone.org/migrations/migrate-to-plone" - }, - "Migrating Plone": { - "Plone Training": "https://training.plone.org/", - "Migration best practices": "https://training.plone.org/migrations", - "Migrating Plone": "https://training.plone.org/migrations/migrations" - }, - "Migrate to Volto": { - "Plone Training": "https://training.plone.org/", - "Migration best practices": "https://training.plone.org/migrations", - "Migrate to Volto": "https://training.plone.org/migrations/volto" - }, - "Deploy": { - "Plone Training": "https://training.plone.org/", - "Plone Deployment": "https://training.plone.org/plone-deployment", - "Deploy": "https://training.plone.org/plone-deployment/deploy" - }, - "Editing your project": { - "Plone Training": "https://training.plone.org/", - "Plone Deployment": "https://training.plone.org/plone-deployment", - "Editing your project": "https://training.plone.org/plone-deployment/edit-project" - }, - "Plone Deployment": { - "Plone Training": "https://training.plone.org/", - "Plone Deployment": "https://training.plone.org/plone-deployment/index" - }, - "Create a Project": { - "Plone Training": "https://training.plone.org/", - "Plone Deployment": "https://training.plone.org/plone-deployment", - "Create a Project": "https://training.plone.org/plone-deployment/new-project" - }, - "Plone Docker Images": { - "Plone Training": "https://training.plone.org/", - "Plone Deployment": "https://training.plone.org/plone-deployment", - "Plone Docker Images": "https://training.plone.org/plone-deployment/plone-docker-images" - }, - "Introduction to Plone stack": { - "Plone Training": "https://training.plone.org/", - "Plone Deployment": "https://training.plone.org/plone-deployment", - "Introduction to Plone stack": "https://training.plone.org/plone-deployment/plone-stack" - }, - "Server Setup": { - "Plone Training": "https://training.plone.org/", - "Plone Deployment": "https://training.plone.org/plone-deployment", - "Server Setup": "https://training.plone.org/plone-deployment/provision" - }, - "Training setup": { - "Plone Training": "https://training.plone.org/", - "Plone Deployment": "https://training.plone.org/plone-deployment", - "Training setup": "https://training.plone.org/plone-deployment/setup" - }, - "Installing Plone for the Training": { - "Plone Training": "https://training.plone.org/", - "Installing Plone for the Training": "https://training.plone.org/plone_training_config/instructions_plone5" - }, - "What Vagrant is and does": { - "Plone Training": "https://training.plone.org/", - "What Vagrant is and does": "https://training.plone.org/plone_training_config/what_vagrant_does" - }, - "After the training: Aftercare, keep in touch, learn, improve": { - "Plone Training": "https://training.plone.org/", - "Teaching": "https://training.plone.org/teaching", - "After the training: Aftercare, keep in touch, learn, improve": "https://training.plone.org/teaching/after" - }, - "Before the training: Create material, invite trainees, preparation": { - "Plone Training": "https://training.plone.org/", - "Teaching": "https://training.plone.org/teaching", - "Before the training: Create material, invite trainees, preparation": "https://training.plone.org/teaching/before" - }, - "During training day(s): what to expect, do's and don'ts": { - "Plone Training": "https://training.plone.org/", - "Teaching": "https://training.plone.org/teaching", - "During training day(s): what to expect, do's and don'ts": "https://training.plone.org/teaching/during" - }, - "Teaching": { - "Plone Training": "https://training.plone.org/", - "Teaching": "https://training.plone.org/teaching/index" - }, - "Training theory: education, how people learn and process information": { - "Plone Training": "https://training.plone.org/", - "Teaching": "https://training.plone.org/teaching", - "Training theory: education, how people learn and process information": "https://training.plone.org/teaching/theory" - }, - "Continuous Integration": { - "Plone Training": "https://training.plone.org/", - "Testing Plone": "https://training.plone.org/testing", - "Continuous Integration": "https://training.plone.org/testing/continuous_integration" - }, - "Testing Plone": { - "Plone Training": "https://training.plone.org/", - "Testing Plone": "https://training.plone.org/testing/index" - }, - "Intro to tests": { - "Plone Training": "https://training.plone.org/", - "Testing Plone": "https://training.plone.org/testing", - "Intro to tests": "https://training.plone.org/testing/intro_to_tests" - }, - "How to test a Plone add-on": { - "Plone Training": "https://training.plone.org/", - "Testing Plone": "https://training.plone.org/testing", - "How to test a Plone add-on": "https://training.plone.org/testing/start" - }, - "Summary": { - "Plone Training": "https://training.plone.org/", - "Testing Plone": "https://training.plone.org/testing", - "Summary": "https://training.plone.org/testing/summary" - }, - "Testing a Dexterity content type": { - "Plone Training": "https://training.plone.org/", - "Testing Plone": "https://training.plone.org/testing", - "Testing a Dexterity content type": "https://training.plone.org/testing/testing_dexterity" - }, - "Robot tests": { - "Plone Training": "https://training.plone.org/", - "Testing Plone": "https://training.plone.org/testing", - "Robot tests": "https://training.plone.org/testing/testing_robot" - }, - "Testing setup": { - "Plone Training": "https://training.plone.org/", - "Testing Plone": "https://training.plone.org/testing", - "Testing setup": "https://training.plone.org/testing/testing_setup" - }, - "Testing a view": { - "Plone Training": "https://training.plone.org/", - "Testing Plone": "https://training.plone.org/testing", - "Testing a view": "https://training.plone.org/testing/testing_view" - }, - "Some theory": { - "Plone Training": "https://training.plone.org/", - "Testing Plone": "https://training.plone.org/testing", - "Some theory": "https://training.plone.org/testing/theory" - }, - "Unit tests": { - "Plone Training": "https://training.plone.org/", - "Testing Plone": "https://training.plone.org/testing", - "Unit tests": "https://training.plone.org/testing/unittest" - }, - "Diazo notes": { - "Plone Training": "https://training.plone.org/", - "Plone 6 Classic UI Theming": "https://training.plone.org/theming", - "Diazo notes": "https://training.plone.org/theming/diazo-notes" - }, - "Plone 6 Classic UI Theming": { - "Plone Training": "https://training.plone.org/", - "Plone 6 Classic UI Theming": "https://training.plone.org/theming/index" - }, - "Preparation for the theming training": { - "Plone Training": "https://training.plone.org/", - "Plone 6 Classic UI Theming": "https://training.plone.org/theming", - "Preparation for the theming training": "https://training.plone.org/theming/preparation" - }, - "Create a theme based on Barceloneta": { - "Plone Training": "https://training.plone.org/", - "Plone 6 Classic UI Theming": "https://training.plone.org/theming", - "Create a theme based on Barceloneta": "https://training.plone.org/theming/theme_barceloneta" - }, - "Create a theme based on Diazo": { - "Plone Training": "https://training.plone.org/", - "Plone 6 Classic UI Theming": "https://training.plone.org/theming", - "Create a theme based on Diazo": "https://training.plone.org/theming/theme_diazo" - }, - "Create a Theme from scratch": { - "Plone Training": "https://training.plone.org/", - "Plone 6 Classic UI Theming": "https://training.plone.org/theming", - "Create a Theme from scratch": "https://training.plone.org/theming/theme_scratch" - }, - "TTW Customizations": { - "Plone Training": "https://training.plone.org/", - "Plone 6 Classic UI Theming": "https://training.plone.org/theming", - "TTW Customizations": "https://training.plone.org/theming/ttw_customizations" - }, - "Volto add-ons development": { - "Plone Training": "https://training.plone.org/", - "Volto Add-ons Development": "https://training.plone.org/voltoaddons", - "Volto add-ons development": "https://training.plone.org/voltoaddons/01-addon-basics" - }, - "Basic working block": { - "Plone Training": "https://training.plone.org/", - "Volto Add-ons Development": "https://training.plone.org/voltoaddons", - "Basic working block": "https://training.plone.org/voltoaddons/02-block-edit" - }, - "Improve the block view": { - "Plone Training": "https://training.plone.org/", - "Volto Add-ons Development": "https://training.plone.org/voltoaddons", - "Improve the block view": "https://training.plone.org/voltoaddons/03-block-view" - }, - "Block editing with a form": { - "Plone Training": "https://training.plone.org/", - "Volto Add-ons Development": "https://training.plone.org/voltoaddons", - "Block editing with a form": "https://training.plone.org/voltoaddons/04-block-edit-options" - }, - "Customizable columns": { - "Plone Training": "https://training.plone.org/", - "Volto Add-ons Development": "https://training.plone.org/voltoaddons", - "Customizable columns": "https://training.plone.org/voltoaddons/05-objectwidget-block-edit" - }, - "Make the block extensible": { - "Plone Training": "https://training.plone.org/", - "Volto Add-ons Development": "https://training.plone.org/voltoaddons", - "Make the block extensible": "https://training.plone.org/voltoaddons/06-cell-renderer" - }, - "Add-ons - advanced topics": { - "Plone Training": "https://training.plone.org/", - "Volto Add-ons Development": "https://training.plone.org/voltoaddons", - "Add-ons - advanced topics": "https://training.plone.org/voltoaddons/07-misc-addons" - }, - "Plone integration with Volto blocks": { - "Plone Training": "https://training.plone.org/", - "Volto Add-ons Development": "https://training.plone.org/voltoaddons", - "Plone integration with Volto blocks": "https://training.plone.org/voltoaddons/blocksrestapi" - }, - "Volto Add-ons Development": { - "Plone Training": "https://training.plone.org/", - "Volto Add-ons Development": "https://training.plone.org/voltoaddons/index" - }, - "Developer integration with text editors": { - "Plone Training": "https://training.plone.org/", - "Volto Add-ons Development": "https://training.plone.org/voltoaddons", - "About": "https://training.plone.org/voltoaddons/about", - "Developer integration with text editors": "https://training.plone.org/voltoaddons/about/devenvironment" - }, - "About": { - "Plone Training": "https://training.plone.org/", - "Volto Add-ons Development": "https://training.plone.org/voltoaddons", - "About": "https://training.plone.org/voltoaddons/about/index" - }, - "Really short primer on Javascript enhancements": { - "Plone Training": "https://training.plone.org/", - "Volto Add-ons Development": "https://training.plone.org/voltoaddons", - "About": "https://training.plone.org/voltoaddons/about", - "Really short primer on Javascript enhancements": "https://training.plone.org/voltoaddons/about/jsbasics" - }, - "Configurable Downloadlink Block": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Configurable Downloadlink Block": "https://training.plone.org/voltohandson/blocksdownload" - }, - "Blocks - Edit components": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Blocks - Edit components": "https://training.plone.org/voltohandson/blocksedit" - }, - "Breadcrumbs": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Breadcrumbs": "https://training.plone.org/voltohandson/breadcrumbs" - }, - "Edit config and site cleanup": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Edit config and site cleanup": "https://training.plone.org/voltohandson/configandcleanup" - }, - "Content types Views": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Content types Views": "https://training.plone.org/voltohandson/contenttypesviews" - }, - "Sprint content type": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Sprint content type": "https://training.plone.org/voltohandson/contenttypeview" - }, - "Events listing template": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Events listing template": "https://training.plone.org/voltohandson/eventlistingtemplate" - }, - "Footer": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Footer": "https://training.plone.org/voltohandson/footer" - }, - "Header": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Header": "https://training.plone.org/voltohandson/header" - }, - "Blocks - Highlight Block": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Blocks - Highlight Block": "https://training.plone.org/voltohandson/highlight" - }, - "Blocks - Highlights": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Blocks - Highlights": "https://training.plone.org/voltohandson/highlightsblock" - }, - "Volto Hands-On": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson/index" - }, - "Brief introduction to Volto blocks": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Brief introduction to Volto blocks": "https://training.plone.org/voltohandson/introtoblocks" - }, - "Inner workings of Volto": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Inner workings of Volto": "https://training.plone.org/voltohandson/introtovolto" - }, - "Quick Start": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Quick Start": "https://training.plone.org/voltohandson/quickstart" - }, - "Project requirements": { - "Plone Training": "https://training.plone.org/", - "Volto Hands-On": "https://training.plone.org/voltohandson", - "Project requirements": "https://training.plone.org/voltohandson/requirements" - }, - "Dynamic Roles": { - "Plone Training": "https://training.plone.org/", - "Plone Workflow": "https://training.plone.org/workflow", - "Dynamic Roles": "https://training.plone.org/workflow/dynamic-roles" - }, - "Using GenericSetup to Manage Plone Workflows": { - "Plone Training": "https://training.plone.org/", - "Plone Workflow": "https://training.plone.org/workflow", - "Using GenericSetup to Manage Plone Workflows": "https://training.plone.org/workflow/generic-setup-export-import" - }, - "Plone Workflow": { - "Plone Training": "https://training.plone.org/", - "Plone Workflow": "https://training.plone.org/workflow/index" - }, - "Introduction To Workflows": { - "Plone Training": "https://training.plone.org/", - "Plone Workflow": "https://training.plone.org/workflow", - "Introduction To Workflows": "https://training.plone.org/workflow/introduction" - }, - "Local Roles": { - "Plone Training": "https://training.plone.org/", - "Plone Workflow": "https://training.plone.org/workflow", - "Local Roles": "https://training.plone.org/workflow/local-roles" - }, - "Placeful Workflow": { - "Plone Training": "https://training.plone.org/", - "Plone Workflow": "https://training.plone.org/workflow", - "Placeful Workflow": "https://training.plone.org/workflow/placeful-workflow" - }, - "Basic Roles and Permissions": { - "Plone Training": "https://training.plone.org/", - "Plone Workflow": "https://training.plone.org/workflow", - "Basic Roles and Permissions": "https://training.plone.org/workflow/roles-and-permissions" - }, - "Multi-chain Workflows": { - "Plone Training": "https://training.plone.org/", - "Plone Workflow": "https://training.plone.org/workflow", - "Multi-chain Workflows": "https://training.plone.org/workflow/workflow-chains" - }, - "Workflow Variables": { - "Plone Training": "https://training.plone.org/", - "Plone Workflow": "https://training.plone.org/workflow", - "Workflow Variables": "https://training.plone.org/workflow/workflow-variables" - } - } -} From 95037a4e19ea70900d6f1dc910d6ff57c2f28947 Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Mon, 18 Sep 2023 10:22:01 +0530 Subject: [PATCH 11/24] Updated nuclia workflow --- .github/workflows/nuclia_sync.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/nuclia_sync.yml b/.github/workflows/nuclia_sync.yml index 7db02e03e..1fea7acaf 100644 --- a/.github/workflows/nuclia_sync.yml +++ b/.github/workflows/nuclia_sync.yml @@ -25,10 +25,6 @@ jobs: run: | python3 upload.py - - name: Run Breadcrumb Json maker - run: | - python3 breadmaker.py - - name: Commit changes run: | git config --global user.name github-actions From 69e165879eb1373f517761a17cfd68d1593281a7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 18 Sep 2023 04:53:05 +0000 Subject: [PATCH 12/24] Nuclia Sync: Updated docs --- docs/_static/nuclia_sync.json | 256 +--------------------------------- 1 file changed, 1 insertion(+), 255 deletions(-) diff --git a/docs/_static/nuclia_sync.json b/docs/_static/nuclia_sync.json index db7766670..6a03509cf 100644 --- a/docs/_static/nuclia_sync.json +++ b/docs/_static/nuclia_sync.json @@ -1,255 +1 @@ -{ - "docs": { - "./docs/glossary.md": "ac82d407c63f43fc25ffff9d82ee5e9b", - "./docs/index.md": "f2f1a67ccca3c66e8b33ec43f241a3ed", - "./docs/contributing/authors.md": "2f11a756c8c1751cf89c2b95c617a524", - "./docs/contributing/index.md": "43a6848fc1a74dde31bfa730047c1293", - "./docs/contributing/setup-build.md": "50b423b082ea013ab4cf63bd12452211", - "./docs/contributing/writing-docs-guide.md": "ad0f07c384d2ea7746a1bc3932586f2d", - "./docs/effective-volto/about_effective_volto.md": "fcb5d0d832f25bbbdc29d43af382ec01", - "./docs/effective-volto/addons.md": "3c19f5218854ba905e7eac8234bc3a85", - "./docs/effective-volto/architecture.md": "72d9e92bf956af7be087046a1b7f4147", - "./docs/effective-volto/backend.md": "739ae1469c3e4ee23aeb6a777d9edbbf", - "./docs/effective-volto/deployment.md": "4715c93e5f52286f4d95247300fbe516", - "./docs/effective-volto/development.md": "6df1650ff09f4e845d45bedaf924886f", - "./docs/effective-volto/getting-started.md": "e9a4fce1ec7c0137fe01a8ff17ef1035", - "./docs/effective-volto/index.md": "892588a9c259434f434f2ca7bc8729f3", - "./docs/effective-volto/testing.md": "35844140ce905816244a40eca6481619", - "./docs/effective-volto/addons/asyncconnect.md": "39cef99b3c54c7032fffb6ae436f2186", - "./docs/effective-volto/addons/block-extensions.md": "84bb102c7d918e17fc1fa71917614ee4", - "./docs/effective-volto/addons/block-styling.md": "047f9948faeb9c7dbea14f2924c82f57", - "./docs/effective-volto/addons/blockdataform.md": "43924be023ff6dd3beacfa81db0d8381", - "./docs/effective-volto/addons/blockslayout.md": "952c29aa3051b6e4add7016e116c2525", - "./docs/effective-volto/addons/bootstrap.md": "a722d9f1e3a10a82a045ba03548091b4", - "./docs/effective-volto/addons/customlistingtemplate.md": "9b9872e252688d72a7b06a8050b0c454", - "./docs/effective-volto/addons/dependencies.md": "84ab118df1cbdc826bae2e738c17713c", - "./docs/effective-volto/addons/how-an-add-on-works.md": "9c56ad21f35da90d0e7820a345511826", - "./docs/effective-volto/addons/i18n.md": "35211a71c5a32cb21402d0fbf421dd41", - "./docs/effective-volto/addons/pipeline.md": "40c01d0a641f4aba53aec6c6002a3a86", - "./docs/effective-volto/addons/semanticui.md": "54aa961e31d4b6bf79a2767b8a389f3c", - "./docs/effective-volto/addons/theme.md": "f76c0b79240c36af6820d3839f484713", - "./docs/effective-volto/addons/use-released-addon.md": "bfe030ca30225b11bc1d58449cc70abd", - "./docs/effective-volto/addons/use-repo-addon.md": "7267a7cf116401b031bead939a1816c6", - "./docs/effective-volto/addons/views.md": "0bfcebde02b0edcd6f2bace3ed0edbf5", - "./docs/effective-volto/addons/webpack.md": "586b62b86261ed466ac31d8081111848", - "./docs/effective-volto/addons/what-is-an-addon.md": "8ad0869cee75c4a84107cb0f726a7e86", - "./docs/effective-volto/architecture/anatomy.md": "353775bec0015dc0865dc41a05abe2c2", - "./docs/effective-volto/architecture/babel.md": "1979cb87b59cef21e3ad81ede9da0ecf", - "./docs/effective-volto/architecture/blocks.md": "212fdd71531f289d564c30ac46416fcc", - "./docs/effective-volto/architecture/bootstrap-volto.md": "4baa7d74c81c409d32c2133eb91c4864", - "./docs/effective-volto/architecture/client-ssr.md": "d8475f64cdc6ced0f543b861bde50c2c", - "./docs/effective-volto/architecture/configuration.md": "7dd3f9242590cbdc63a23df899aee228", - "./docs/effective-volto/architecture/CORS.md": "a1580a3f025ea523773e0762e33d4d86", - "./docs/effective-volto/architecture/multilingual.md": "29abd9dd3b71d63078969fe7738906b9", - "./docs/effective-volto/architecture/razzle.md": "a248e61fe7dfbc0e377a5a4d56496385", - "./docs/effective-volto/architecture/redux.md": "2c67f4a131644baa7eb080b9e5b294d8", - "./docs/effective-volto/architecture/webpack-loaders.md": "2de22206f0a3ebd00aeb1c4aee9429c5", - "./docs/effective-volto/architecture/webpack.md": "01f8899af44a1f0359ba41aa6c8469be", - "./docs/effective-volto/backend/block-field-as-searchableText.md": "28123d5b598f8dcc017fdebac1e42b27", - "./docs/effective-volto/backend/block-linkintegrity.md": "c6f2093cc30323fbf802672056d02d6d", - "./docs/effective-volto/backend/express-middleware.md": "1467c1700caff650d768b0ec48e3632f", - "./docs/effective-volto/backend/plone-restapi-endpoints.md": "d61a983c0b6a5ea019ec6650ba5c7492", - "./docs/effective-volto/backend/writing-block-transforms.md": "5b444a2add2aa76645191b4aa4abd85c", - "./docs/effective-volto/backend/writing-content-expansion.md": "b239fa46edd16234c9a080de56861bef", - "./docs/effective-volto/backend/writing-endpoint.md": "957a2c159e95ad6940c2b48db3f4339e", - "./docs/effective-volto/backend/writing-serializer-deserializer.md": "ff6fe3f5c5ffc6d57fd9a339bd3f6683", - "./docs/effective-volto/deployment/docker.md": "2668d234ba8a9361306b1f31dbc3e27a", - "./docs/effective-volto/deployment/releaseit.md": "4e0204631b61e3bc212778c7e808977e", - "./docs/effective-volto/deployment/seamlessmode.md": "98b9d635cc6e7739dd3a7f6fafb30a77", - "./docs/effective-volto/deployment/simple.md": "c6825dfad7297bf4467590e67e8f7852", - "./docs/effective-volto/development/bundle-analyzing.md": "3bb769560efee39bccd169a948e7353b", - "./docs/effective-volto/development/component-registry.md": "54ab1fb3fc50c9b66b51f98e22a57b92", - "./docs/effective-volto/development/criticalCSS.md": "f5f9e3f3b1baf28305c174ea1a63ac79", - "./docs/effective-volto/development/debugging.md": "12ee478c6fd02f3413090a6435b76a3e", - "./docs/effective-volto/development/environmentvariables.md": "8e81556f3532f202cfbf1ae036746d28", - "./docs/effective-volto/development/husky-lint-staged.md": "af161a74d9ec4c841ad95832d7a87443", - "./docs/effective-volto/development/i18n.md": "b92c83534bb0f427aa6923f6ae3276a8", - "./docs/effective-volto/development/icons.md": "38fc9218fbbc4ca91f8b8db4861a717a", - "./docs/effective-volto/development/lazyloading.md": "3badb3529229e0f52cc4e2fdeebd33e0", - "./docs/effective-volto/development/linters.md": "a6a312307b0e97c9044dd8fc6c6aaddc", - "./docs/effective-volto/development/setup.md": "b00fc778f7e6211706a028d43eebffbe", - "./docs/effective-volto/development/shortcuts.md": "3baab4e08ea6df5fb8fa479121316889", - "./docs/effective-volto/development/vim.md": "c1d0c2602dbf0a94caf4328fae565c04", - "./docs/effective-volto/development/vscode.md": "0bc687a23c5c6cf0949c6632f711816b", - "./docs/effective-volto/getting-started/add-on.md": "04d1a848be62452f631ed4f0c5c268be", - "./docs/effective-volto/getting-started/project.md": "080e76726917a221b713ea732a45380b", - "./docs/effective-volto/getting-started/roadmap.md": "3ba32464d37d24a9f7c0c39d3a4fb779", - "./docs/effective-volto/testing/acceptance.md": "2ddf1ad4051b688129bb00a79f6a86b7", - "./docs/effective-volto/testing/addons.md": "dfac81046eebf034850b72f02e1576e0", - "./docs/effective-volto/testing/jest.md": "f3068c156d6308d130eb7308c689e583", - "./docs/effective-volto/testing/storybook.md": "645be5af958f04324f4ecfb581ac9961", - "./docs/effective-volto/testing/unit.md": "515b58ca4e3f06c0e6e52146511a1061", - "./docs/mastering-plone/about_mastering.md": "f4841c767143d52343af9db47a9e45a3", - "./docs/mastering-plone/add-ons.md": "c7bfba484d8b838592c757edd554bf19", - "./docs/mastering-plone/api.md": "11b334d91891c38bb27173ddbd782c7a", - "./docs/mastering-plone/behaviors_1.md": "eae048f9de778b303f5678c6838d91f8", - "./docs/mastering-plone/case.md": "ec932ec5d0c73752951eb129101480f4", - "./docs/mastering-plone/code.md": "bb95da54d3e014a87a0251243cf9f10d", - "./docs/mastering-plone/configuring_customizing.md": "faf6db17d260109cf98314eea3f7ac8c", - "./docs/mastering-plone/custom_search.md": "eae02a4ec30ab667e3c72a13d49e9c77", - "./docs/mastering-plone/deployment_code.md": "1736cf02104ed7e039d341e54b474a72", - "./docs/mastering-plone/dexterity.md": "65a8b1c7e8357981b8ce73a1103d94e1", - "./docs/mastering-plone/dexterity_2_talk.md": "1fc5066a15a6a2d2ec5e3142a07ad4f8", - "./docs/mastering-plone/dexterity_3.md": "af2a0edf4f45fc981b223213824519da", - "./docs/mastering-plone/dexterity_reference.md": "3967a24d152d74a173b21706458e9fab", - "./docs/mastering-plone/events.md": "3b9b1cc7befcf1f80fe02167242ea320", - "./docs/mastering-plone/extending.md": "8f02caaa9e72db6a597733168f52aaba", - "./docs/mastering-plone/features.md": "67faf311c170cf3f15eed023165b50cb", - "./docs/mastering-plone/index.md": "903d8520c71bb29078094a21d0134c65", - "./docs/mastering-plone/installation.md": "d82a8615f66b54cc211808f540a21ed1", - "./docs/mastering-plone/intro.md": "5047099b23595a68f33c5507da12df34", - "./docs/mastering-plone/registry.md": "918a3754f7b7610cbcff6d44718a9eff", - "./docs/mastering-plone/relations.md": "ebf4df445828039f376a25df4c08d4e5", - "./docs/mastering-plone/thirdparty_behaviors.md": "ec95b6a9733ed42a866fb9338dbdd952", - "./docs/mastering-plone/timing.md": "c77d9ee424b5935e136d1df2047d5169", - "./docs/mastering-plone/todos_documentation_mastering_plone_6.md": "46b9d9ae4a54327d5c9d97ed89158415", - "./docs/mastering-plone/trainer.md": "f85196997cdef4e195735a08cc932555", - "./docs/mastering-plone/upgrade_steps.md": "9fe20d545aa1fc85bec15a0e197b0dda", - "./docs/mastering-plone/user_generated_content.md": "5e72a122e88ea51ec865c6832a1c23c6", - "./docs/mastering-plone/volto_addon.md": "26bc3b538158231bf3530fa35ace8de6", - "./docs/mastering-plone/volto_components_sponsors.md": "51a9553c737fe40b25e6294cd5a468b8", - "./docs/mastering-plone/volto_custom_addon.md": "26075ce01695c794333bd662bfd62f8b", - "./docs/mastering-plone/volto_custom_addon2.md": "76d205f727b8d45d9519bec995906f41", - "./docs/mastering-plone/volto_development.md": "fb33c404a22bfce3ba1f9bcecc0906a7", - "./docs/mastering-plone/volto_frontpage.md": "22499531714bb100019641655dd6bce7", - "./docs/mastering-plone/volto_overrides.md": "192b249342349aa4c3b34a19522c0f9e", - "./docs/mastering-plone/volto_talkview.md": "a3350724d45ee9a46ff41d92eb2dcfec", - "./docs/mastering-plone/volto_testing.md": "15a16b7acc14687a29df31b6befbdf3b", - "./docs/mastering-plone/what_is_plone.md": "8262738d4969226f93b3aea97942b8f5", - "./docs/mastering-plone/voting-story/behaviors_2.md": "028637fae520f17f318fcd9e2a4ad5f9", - "./docs/mastering-plone/voting-story/endpoints.md": "ae9e03c5d73b072803b487595077ba02", - "./docs/mastering-plone/voting-story/index.md": "3a94515a4542cff55055eac60793e862", - "./docs/mastering-plone/voting-story/permissions.md": "e59f55cffa917a42cff2b85ad38b8cf1", - "./docs/mastering-plone/voting-story/volto_actions.md": "af90cea46e7ca78d578a9388f5e4ee19", - "./docs/mastering-plone-5/about_mastering.md": "cf02fcc663e1fc5e925d5d9b25c0b1bd", - "./docs/mastering-plone-5/add-ons.md": "9f0e68fef36d340f83710f49aa310430", - "./docs/mastering-plone-5/anatomy.md": "d60d7abe9d83d877f791a6bd4a083f0f", - "./docs/mastering-plone-5/api.md": "a52bd88e26f1438bd7749e2a76eba053", - "./docs/mastering-plone-5/behaviors_1.md": "a0f126b4980c95d10dc3e72c0df94cb1", - "./docs/mastering-plone-5/behaviors_2.md": "9235327e1940f90361d8f4f1ad67ec00", - "./docs/mastering-plone-5/buildout_1.md": "4a36a2e0902aed59b5beea0552988336", - "./docs/mastering-plone-5/case.md": "7dc2abd7581fafe4bc5c78bd310ef9ad", - "./docs/mastering-plone-5/code.md": "8f613cd7c79053fae8f43d6b510f1ae1", - "./docs/mastering-plone-5/configuring_customizing.md": "830a2beae389b0cca25f6deb1d63a4c1", - "./docs/mastering-plone-5/custom_search.md": "287a4263699dfc8b6baed19c4699789b", - "./docs/mastering-plone-5/deployment_code.md": "62fcb4499c40063c4015abe1671cab4e", - "./docs/mastering-plone-5/deployment_sites.md": "89c9f6f8c9a5461b5fcf9ee47eda312e", - "./docs/mastering-plone-5/dexterity.md": "e270428024a25370d354723d6fd003d4", - "./docs/mastering-plone-5/dexterity_2.md": "cd645b77128c3fd838ad5014d6ff8a76", - "./docs/mastering-plone-5/dexterity_3.md": "2368f99fc2a811fe07e425b25b5a07a0", - "./docs/mastering-plone-5/dexterity_reference.md": "7fbcd1c570bf2252ba75f502df29764c", - "./docs/mastering-plone-5/eggs1.md": "77a016f4bbdea4786fdf3f0d8c26060d", - "./docs/mastering-plone-5/eggs2.md": "0ee5f606be4c780efcaf311af98308d3", - "./docs/mastering-plone-5/embed.md": "5b702b09965edef4ebb9eb4beda4367a", - "./docs/mastering-plone-5/events.md": "0f5b190342f6217eb5ebd609c8d7b3b7", - "./docs/mastering-plone-5/export_code.md": "f7343012d0601587133d49e3b3a460dd", - "./docs/mastering-plone-5/extending.md": "8bdbdbd7e931352f8bd7362ecd0d9b98", - "./docs/mastering-plone-5/features.md": "5e33db59e7bda77408c6311e3ce7bed5", - "./docs/mastering-plone-5/frontpage.md": "de415031acbe627a31f96d97980b100e", - "./docs/mastering-plone-5/future_of_plone.md": "fd5a784ae16ca73201f249a777d567f7", - "./docs/mastering-plone-5/ide.md": "75c78c8c1eecce2f0e14965465cc2b23", - "./docs/mastering-plone-5/index.md": "92ca015f20111b12def0e12e5c7b54b9", - "./docs/mastering-plone-5/installation.md": "bf135fb41e7141e387651d5e90f1c973", - "./docs/mastering-plone-5/intro.md": "30fb84c0bae092603e3247994c963b4f", - "./docs/mastering-plone-5/optional.md": "3a8ca8473ad25f1a4f537ff2cb4244dc", - "./docs/mastering-plone-5/plone5.md": "558fe6c1db92474bc4d3e63607421f7a", - "./docs/mastering-plone-5/registry.md": "951f2b7d5ff7998b343c372e86b46b92", - "./docs/mastering-plone-5/relations.md": "a6fcfc1bd7f1f5d49a1daddc1515e766", - "./docs/mastering-plone-5/resources.md": "06a20f9c3a0c0de5ba63b44dd4bd06da", - "./docs/mastering-plone-5/restapi.md": "e538b0940a4a83a121515272e5560d7f", - "./docs/mastering-plone-5/reusable.md": "6c952f134d2f0a9fc8feb5e25182431a", - "./docs/mastering-plone-5/testing.md": "bd3b098ad0afbafd26b3b4a84e3aa14d", - "./docs/mastering-plone-5/theming.md": "d17600d391988356806f595affd783bf", - "./docs/mastering-plone-5/thirdparty_behaviors.md": "fb0c069f55d218fb32ebd6b15ee20caa", - "./docs/mastering-plone-5/timing.md": "64d7caadd10a9782d5ae676696232bf8", - "./docs/mastering-plone-5/todos_documentation_mastering_plone_5.md": "436a03be23273df6bde13161e3aff4fe", - "./docs/mastering-plone-5/user_generated_content.md": "5a3f72228c627990544fb000e6646824", - "./docs/mastering-plone-5/viewlets_1.md": "89bd8b6f88da27a5e2847c4837c018bf", - "./docs/mastering-plone-5/viewlets_2.md": "f9f725a687d33b75b2aca1f4d7c97188", - "./docs/mastering-plone-5/views_1.md": "ff54ca076352e63b9055f469cec59f79", - "./docs/mastering-plone-5/views_2.md": "b8280695fbfe0d95530516af7e79587e", - "./docs/mastering-plone-5/views_3.md": "291d0bd2692b05f18bd92e14d726caed", - "./docs/mastering-plone-5/what_is_plone.md": "d3daf0a5b0adb9a733774a180abd762f", - "./docs/mastering-plone-5/zpt.md": "043f5e6a791e2c3ce634697844cf0787", - "./docs/mastering-plone-5/zpt_2.md": "b69e1b08ccfdc5eabfae4045ba443ef8", - "./docs/migrations/exportimport.md": "f8abf533430cacf926d58d20b90110f8", - "./docs/migrations/index.md": "9083d3b7fbe32c1f86e811b025f8b8ad", - "./docs/migrations/inplace.md": "276011eef09dffb22b40684daa2b6b19", - "./docs/migrations/migrate-to-plone.md": "b4f384d36804f8a26227e12bf9e8a380", - "./docs/migrations/migrations.md": "743034c9f9a1b06a8f5e41a00c3e46a7", - "./docs/migrations/volto.md": "4c6bd895c419c7c8cb913d26fb0ee498", - "./docs/plone-deployment/deploy.md": "d1a2e0bbc52066066039598ea0206a21", - "./docs/plone-deployment/edit-project.md": "1d44a8ab05a0dc05deed0eb84466aa65", - "./docs/plone-deployment/index.md": "7a04bea1d5f87b2b9d83a43b19164389", - "./docs/plone-deployment/intro.md": "c83cf1eba8549a018d89a866913e7324", - "./docs/plone-deployment/new-project.md": "b4a732d2aa0b37d853ae088332b741fd", - "./docs/plone-deployment/plone-docker-images.md": "4d916aa83fb2c1ec5b3263d78d3b3b4d", - "./docs/plone-deployment/plone-stack.md": "0fc06c46f4cba8786e6feef2f7d16a9a", - "./docs/plone-deployment/provision.md": "7f975fa16b866a16fd0f0c207d821960", - "./docs/plone-deployment/setup.md": "2ddcb6cf42073e47ddecc26633d06edb", - "./docs/teaching/after.md": "a8eab431332ee473e9442a9b53f0ec48", - "./docs/teaching/before.md": "93836de1ae408ca305b2bce1052c559d", - "./docs/teaching/during.md": "cd02b859831dea6236a91bfb08f701cf", - "./docs/teaching/index.md": "a365bf34081a940f041ea4921b771045", - "./docs/teaching/theory.md": "79117c89dd9a7f1a5c2cba19ba923698", - "./docs/testing/acceptance.md": "feeace111cdeb9a2004ac77257139fb7", - "./docs/testing/continuous_integration.md": "2753422fad1fdb4c6a761e5072bf8cf6", - "./docs/testing/index.md": "7aa4aed4fa957755c5e11e21bb6c3ad8", - "./docs/testing/intro_to_tests.md": "04b44d8c18dcb171ad010b4d615798a3", - "./docs/testing/start.md": "0d539e287d6553754729aedfe0297f75", - "./docs/testing/summary.md": "6ba974a8c3773280cc3e181d6a6d9f69", - "./docs/testing/testing_dexterity.md": "540f9dd22ab78b5e662fab9ce69d19a9", - "./docs/testing/testing_robot.md": "5d95e43cf997600392d3722d41a8d973", - "./docs/testing/testing_setup.md": "b2b384a8db0d25cac83d9faa45713b0a", - "./docs/testing/testing_view.md": "d4cfd7fdd6686ecdc6874a41dce65371", - "./docs/testing/theory.md": "861ffc6eee3f5a5d3a85e2db4fdf76d0", - "./docs/testing/unittest.md": "dcf6089ffcccbf1ca910a68cecb1facd", - "./docs/theming/diazo-notes.md": "95b51108b3c1478ef17292ba3f436d0f", - "./docs/theming/index.md": "ab5d01df87af5cc817ba98eda046f4de", - "./docs/theming/preparation.md": "9ad9575d54217243c11b9d09da4dbc77", - "./docs/theming/theme_barceloneta.md": "4ea839ba463540b09bf8ddfadb5ca17a", - "./docs/theming/theme_diazo.md": "7a5e3f6dfc49d6897f463e526f6e3ec6", - "./docs/theming/theme_scratch.md": "46c9c5f42e5e642d243b39d5fe83d863", - "./docs/theming/ttw_customizations.md": "ab1ee873621910ac27c39014e4000058", - "./docs/voltoaddons/01-addon-basics.md": "d17c6b0939992021bff3708dd40377d3", - "./docs/voltoaddons/02-block-edit.md": "41a2d87ed69158f21e1cb981c39f3925", - "./docs/voltoaddons/03-block-view.md": "c8cfc6feefae9b63d4337c5fc791cdf9", - "./docs/voltoaddons/04-block-edit-options.md": "2c01e10996b98154b110bc924f37ae67", - "./docs/voltoaddons/05-objectwidget-block-edit.md": "97f7e466239f2c74f5317a4130a5855a", - "./docs/voltoaddons/06-cell-renderer.md": "f403914bc90d8b71b0fb6a50077bdb30", - "./docs/voltoaddons/07-misc-addons.md": "bc9c2ca352f824f2ea8a1a3a8833f8da", - "./docs/voltoaddons/blocksrestapi.md": "a05ae8a09514581af343c2b18790f4d2", - "./docs/voltoaddons/index.md": "71321e5b11ccc486fa03fcb944c204bc", - "./docs/voltoaddons/intro.md": "dc26ccd0e889219a7926f538047932e6", - "./docs/voltoaddons/about/devenvironment.md": "a52f64a539e328d96a44b74fc5c9d9a5", - "./docs/voltoaddons/about/index.md": "4dd5c25fb4e2483fdd4cd5d5c0af66e2", - "./docs/voltoaddons/about/jsbasics.md": "c12965ab8badc97102af97f613b847c7", - "./docs/voltohandson/blocksdownload.md": "7c39c826686962138e81228cbdc5374f", - "./docs/voltohandson/blocksedit.md": "b0f3f10957c634a41caf4b77e3f23e91", - "./docs/voltohandson/breadcrumbs.md": "5d6b8c600c2d22410cc262fe5a22fd3b", - "./docs/voltohandson/configandcleanup.md": "b9e9d0ce72f5b7799b66a121ff14247b", - "./docs/voltohandson/contenttypesviews.md": "c5252e0a622bf41fae9ee3cc99adb991", - "./docs/voltohandson/contenttypeview.md": "f15aa7214a37a7639696d3df82dbb468", - "./docs/voltohandson/eventlistingtemplate.md": "11567d15de9940eeede088b49a44da53", - "./docs/voltohandson/footer.md": "87487bf9e1c141cf1a74156331cf24bc", - "./docs/voltohandson/header.md": "9f859a158067d7587fcf87e1f5acee57", - "./docs/voltohandson/highlight.md": "1dc0d44f216a67e75f7c33c3ac8407d0", - "./docs/voltohandson/highlightsblock.md": "fc2a7c00ec7fd7277cf9c022b3eff6a9", - "./docs/voltohandson/index.md": "7f9911793073bad0449982f0c7d4f7f0", - "./docs/voltohandson/intro.md": "4f5ea0ae0eb799c7f884c5c8728b379a", - "./docs/voltohandson/introtoblocks.md": "8c424c30d2a0b626fa00da430d0a2b41", - "./docs/voltohandson/introtovolto.md": "9c29881f166f336c6d1eae6b5f6bf12e", - "./docs/voltohandson/quickstart.md": "e53ec781cf7eb9de92dad60db3ae0694", - "./docs/voltohandson/requirements.md": "fd336d75544872c59bbf870b301f3591", - "./docs/voltohandson/starttheming.md": "5f5fb7f49574db13b4532229751f5251", - "./docs/workflow/dynamic-roles.md": "57b92e35cbfa939d89f601fba40143a0", - "./docs/workflow/generic-setup-export-import.md": "348e5b73b8899d08db70bee91d8249e4", - "./docs/workflow/index.md": "ffbf81f0522cbcec4da70761041d6962", - "./docs/workflow/introduction.md": "9f1ce35c92b5e440ba2a6560e0ef8b74", - "./docs/workflow/local-roles.md": "0bd36013d7dbb84dccae563f83e03895", - "./docs/workflow/placeful-workflow.md": "594adff13e97e0175c918f85a6bc4d48", - "./docs/workflow/roles-and-permissions.md": "ea6f4618f75ee840a09d58c971f57da7", - "./docs/workflow/workflow-chains.md": "6749fe390fa1b0b448329ad23ed595e4", - "./docs/workflow/workflow-variables.md": "51514bc22f1201a3168438f11c29079f" - } -} +{"docs": {"./docs/glossary.md": "ac82d407c63f43fc25ffff9d82ee5e9b", "./docs/index.md": "f2f1a67ccca3c66e8b33ec43f241a3ed", "./docs/plone-deployment/edit-project.md": "1d44a8ab05a0dc05deed0eb84466aa65", "./docs/plone-deployment/provision.md": "7f975fa16b866a16fd0f0c207d821960", "./docs/plone-deployment/plone-docker-images.md": "4d916aa83fb2c1ec5b3263d78d3b3b4d", "./docs/plone-deployment/deploy.md": "d1a2e0bbc52066066039598ea0206a21", "./docs/plone-deployment/setup.md": "2ddcb6cf42073e47ddecc26633d06edb", "./docs/plone-deployment/new-project.md": "b4a732d2aa0b37d853ae088332b741fd", "./docs/plone-deployment/index.md": "7a04bea1d5f87b2b9d83a43b19164389", "./docs/plone-deployment/plone-stack.md": "0fc06c46f4cba8786e6feef2f7d16a9a", "./docs/plone-deployment/intro.md": "c83cf1eba8549a018d89a866913e7324", "./docs/effective-volto/testing.md": "35844140ce905816244a40eca6481619", "./docs/effective-volto/architecture.md": "72d9e92bf956af7be087046a1b7f4147", "./docs/effective-volto/deployment.md": "4715c93e5f52286f4d95247300fbe516", "./docs/effective-volto/about_effective_volto.md": "fcb5d0d832f25bbbdc29d43af382ec01", "./docs/effective-volto/addons.md": "3c19f5218854ba905e7eac8234bc3a85", "./docs/effective-volto/getting-started.md": "e9a4fce1ec7c0137fe01a8ff17ef1035", "./docs/effective-volto/index.md": "892588a9c259434f434f2ca7bc8729f3", "./docs/effective-volto/backend.md": "739ae1469c3e4ee23aeb6a777d9edbbf", "./docs/effective-volto/development.md": "6df1650ff09f4e845d45bedaf924886f", "./docs/effective-volto/testing/acceptance.md": "2ddf1ad4051b688129bb00a79f6a86b7", "./docs/effective-volto/testing/storybook.md": "645be5af958f04324f4ecfb581ac9961", "./docs/effective-volto/testing/jest.md": "f3068c156d6308d130eb7308c689e583", "./docs/effective-volto/testing/unit.md": "515b58ca4e3f06c0e6e52146511a1061", "./docs/effective-volto/testing/addons.md": "dfac81046eebf034850b72f02e1576e0", "./docs/effective-volto/deployment/releaseit.md": "4e0204631b61e3bc212778c7e808977e", "./docs/effective-volto/deployment/seamlessmode.md": "98b9d635cc6e7739dd3a7f6fafb30a77", "./docs/effective-volto/deployment/docker.md": "2668d234ba8a9361306b1f31dbc3e27a", "./docs/effective-volto/deployment/simple.md": "c6825dfad7297bf4467590e67e8f7852", "./docs/effective-volto/getting-started/roadmap.md": "3ba32464d37d24a9f7c0c39d3a4fb779", "./docs/effective-volto/getting-started/add-on.md": "04d1a848be62452f631ed4f0c5c268be", "./docs/effective-volto/getting-started/project.md": "080e76726917a221b713ea732a45380b", "./docs/effective-volto/addons/block-extensions.md": "84bb102c7d918e17fc1fa71917614ee4", "./docs/effective-volto/addons/asyncconnect.md": "39cef99b3c54c7032fffb6ae436f2186", "./docs/effective-volto/addons/i18n.md": "35211a71c5a32cb21402d0fbf421dd41", "./docs/effective-volto/addons/block-styling.md": "047f9948faeb9c7dbea14f2924c82f57", "./docs/effective-volto/addons/use-repo-addon.md": "7267a7cf116401b031bead939a1816c6", "./docs/effective-volto/addons/dependencies.md": "84ab118df1cbdc826bae2e738c17713c", "./docs/effective-volto/addons/use-released-addon.md": "bfe030ca30225b11bc1d58449cc70abd", "./docs/effective-volto/addons/views.md": "0bfcebde02b0edcd6f2bace3ed0edbf5", "./docs/effective-volto/addons/bootstrap.md": "a722d9f1e3a10a82a045ba03548091b4", "./docs/effective-volto/addons/what-is-an-addon.md": "8ad0869cee75c4a84107cb0f726a7e86", "./docs/effective-volto/addons/semanticui.md": "54aa961e31d4b6bf79a2767b8a389f3c", "./docs/effective-volto/addons/theme.md": "f76c0b79240c36af6820d3839f484713", "./docs/effective-volto/addons/webpack.md": "586b62b86261ed466ac31d8081111848", "./docs/effective-volto/addons/how-an-add-on-works.md": "9c56ad21f35da90d0e7820a345511826", "./docs/effective-volto/addons/blockslayout.md": "952c29aa3051b6e4add7016e116c2525", "./docs/effective-volto/addons/blockdataform.md": "43924be023ff6dd3beacfa81db0d8381", "./docs/effective-volto/addons/customlistingtemplate.md": "9b9872e252688d72a7b06a8050b0c454", "./docs/effective-volto/addons/pipeline.md": "40c01d0a641f4aba53aec6c6002a3a86", "./docs/effective-volto/backend/express-middleware.md": "1467c1700caff650d768b0ec48e3632f", "./docs/effective-volto/backend/plone-restapi-endpoints.md": "d61a983c0b6a5ea019ec6650ba5c7492", "./docs/effective-volto/backend/writing-endpoint.md": "957a2c159e95ad6940c2b48db3f4339e", "./docs/effective-volto/backend/writing-content-expansion.md": "b239fa46edd16234c9a080de56861bef", "./docs/effective-volto/backend/block-field-as-searchableText.md": "28123d5b598f8dcc017fdebac1e42b27", "./docs/effective-volto/backend/block-linkintegrity.md": "c6f2093cc30323fbf802672056d02d6d", "./docs/effective-volto/backend/writing-block-transforms.md": "5b444a2add2aa76645191b4aa4abd85c", "./docs/effective-volto/backend/writing-serializer-deserializer.md": "ff6fe3f5c5ffc6d57fd9a339bd3f6683", "./docs/effective-volto/development/shortcuts.md": "3baab4e08ea6df5fb8fa479121316889", "./docs/effective-volto/development/criticalCSS.md": "f5f9e3f3b1baf28305c174ea1a63ac79", "./docs/effective-volto/development/husky-lint-staged.md": "af161a74d9ec4c841ad95832d7a87443", "./docs/effective-volto/development/vim.md": "c1d0c2602dbf0a94caf4328fae565c04", "./docs/effective-volto/development/i18n.md": "b92c83534bb0f427aa6923f6ae3276a8", "./docs/effective-volto/development/vscode.md": "0bc687a23c5c6cf0949c6632f711816b", "./docs/effective-volto/development/environmentvariables.md": "8e81556f3532f202cfbf1ae036746d28", "./docs/effective-volto/development/icons.md": "38fc9218fbbc4ca91f8b8db4861a717a", "./docs/effective-volto/development/lazyloading.md": "3badb3529229e0f52cc4e2fdeebd33e0", "./docs/effective-volto/development/component-registry.md": "54ab1fb3fc50c9b66b51f98e22a57b92", "./docs/effective-volto/development/debugging.md": "12ee478c6fd02f3413090a6435b76a3e", "./docs/effective-volto/development/setup.md": "b00fc778f7e6211706a028d43eebffbe", "./docs/effective-volto/development/linters.md": "a6a312307b0e97c9044dd8fc6c6aaddc", "./docs/effective-volto/development/bundle-analyzing.md": "3bb769560efee39bccd169a948e7353b", "./docs/effective-volto/architecture/webpack-loaders.md": "2de22206f0a3ebd00aeb1c4aee9429c5", "./docs/effective-volto/architecture/configuration.md": "7dd3f9242590cbdc63a23df899aee228", "./docs/effective-volto/architecture/bootstrap-volto.md": "4baa7d74c81c409d32c2133eb91c4864", "./docs/effective-volto/architecture/redux.md": "2c67f4a131644baa7eb080b9e5b294d8", "./docs/effective-volto/architecture/razzle.md": "a248e61fe7dfbc0e377a5a4d56496385", "./docs/effective-volto/architecture/blocks.md": "212fdd71531f289d564c30ac46416fcc", "./docs/effective-volto/architecture/anatomy.md": "353775bec0015dc0865dc41a05abe2c2", "./docs/effective-volto/architecture/CORS.md": "a1580a3f025ea523773e0762e33d4d86", "./docs/effective-volto/architecture/babel.md": "1979cb87b59cef21e3ad81ede9da0ecf", "./docs/effective-volto/architecture/webpack.md": "01f8899af44a1f0359ba41aa6c8469be", "./docs/effective-volto/architecture/multilingual.md": "29abd9dd3b71d63078969fe7738906b9", "./docs/effective-volto/architecture/client-ssr.md": "d8475f64cdc6ced0f543b861bde50c2c", "./docs/migrations/inplace.md": "276011eef09dffb22b40684daa2b6b19", "./docs/migrations/migrate-to-plone.md": "b4f384d36804f8a26227e12bf9e8a380", "./docs/migrations/exportimport.md": "f8abf533430cacf926d58d20b90110f8", "./docs/migrations/migrations.md": "743034c9f9a1b06a8f5e41a00c3e46a7", "./docs/migrations/volto.md": "4c6bd895c419c7c8cb913d26fb0ee498", "./docs/migrations/index.md": "9083d3b7fbe32c1f86e811b025f8b8ad", "./docs/contributing/authors.md": "2f11a756c8c1751cf89c2b95c617a524", "./docs/contributing/setup-build.md": "50b423b082ea013ab4cf63bd12452211", "./docs/contributing/index.md": "43a6848fc1a74dde31bfa730047c1293", "./docs/contributing/writing-docs-guide.md": "ad0f07c384d2ea7746a1bc3932586f2d", "./docs/testing/acceptance.md": "feeace111cdeb9a2004ac77257139fb7", "./docs/testing/continuous_integration.md": "2753422fad1fdb4c6a761e5072bf8cf6", "./docs/testing/testing_setup.md": "b2b384a8db0d25cac83d9faa45713b0a", "./docs/testing/start.md": "0d539e287d6553754729aedfe0297f75", "./docs/testing/summary.md": "6ba974a8c3773280cc3e181d6a6d9f69", "./docs/testing/testing_robot.md": "5d95e43cf997600392d3722d41a8d973", "./docs/testing/unittest.md": "dcf6089ffcccbf1ca910a68cecb1facd", "./docs/testing/intro_to_tests.md": "04b44d8c18dcb171ad010b4d615798a3", "./docs/testing/testing_view.md": "d4cfd7fdd6686ecdc6874a41dce65371", "./docs/testing/theory.md": "861ffc6eee3f5a5d3a85e2db4fdf76d0", "./docs/testing/index.md": "7aa4aed4fa957755c5e11e21bb6c3ad8", "./docs/testing/testing_dexterity.md": "540f9dd22ab78b5e662fab9ce69d19a9", "./docs/workflow/dynamic-roles.md": "57b92e35cbfa939d89f601fba40143a0", "./docs/workflow/placeful-workflow.md": "594adff13e97e0175c918f85a6bc4d48", "./docs/workflow/workflow-chains.md": "6749fe390fa1b0b448329ad23ed595e4", "./docs/workflow/local-roles.md": "0bd36013d7dbb84dccae563f83e03895", "./docs/workflow/workflow-variables.md": "51514bc22f1201a3168438f11c29079f", "./docs/workflow/introduction.md": "9f1ce35c92b5e440ba2a6560e0ef8b74", "./docs/workflow/roles-and-permissions.md": "ea6f4618f75ee840a09d58c971f57da7", "./docs/workflow/generic-setup-export-import.md": "348e5b73b8899d08db70bee91d8249e4", "./docs/workflow/index.md": "ffbf81f0522cbcec4da70761041d6962", "./docs/voltoaddons/05-objectwidget-block-edit.md": "97f7e466239f2c74f5317a4130a5855a", "./docs/voltoaddons/02-block-edit.md": "41a2d87ed69158f21e1cb981c39f3925", "./docs/voltoaddons/04-block-edit-options.md": "2c01e10996b98154b110bc924f37ae67", "./docs/voltoaddons/06-cell-renderer.md": "f403914bc90d8b71b0fb6a50077bdb30", "./docs/voltoaddons/01-addon-basics.md": "d17c6b0939992021bff3708dd40377d3", "./docs/voltoaddons/blocksrestapi.md": "a05ae8a09514581af343c2b18790f4d2", "./docs/voltoaddons/03-block-view.md": "c8cfc6feefae9b63d4337c5fc791cdf9", "./docs/voltoaddons/07-misc-addons.md": "bc9c2ca352f824f2ea8a1a3a8833f8da", "./docs/voltoaddons/index.md": "71321e5b11ccc486fa03fcb944c204bc", "./docs/voltoaddons/intro.md": "dc26ccd0e889219a7926f538047932e6", "./docs/voltoaddons/about/devenvironment.md": "a52f64a539e328d96a44b74fc5c9d9a5", "./docs/voltoaddons/about/jsbasics.md": "c12965ab8badc97102af97f613b847c7", "./docs/voltoaddons/about/index.md": "4dd5c25fb4e2483fdd4cd5d5c0af66e2", "./docs/theming/theme_barceloneta.md": "4ea839ba463540b09bf8ddfadb5ca17a", "./docs/theming/ttw_customizations.md": "ab1ee873621910ac27c39014e4000058", "./docs/theming/theme_scratch.md": "46c9c5f42e5e642d243b39d5fe83d863", "./docs/theming/diazo-notes.md": "95b51108b3c1478ef17292ba3f436d0f", "./docs/theming/index.md": "ab5d01df87af5cc817ba98eda046f4de", "./docs/theming/theme_diazo.md": "7a5e3f6dfc49d6897f463e526f6e3ec6", "./docs/theming/preparation.md": "9ad9575d54217243c11b9d09da4dbc77", "./docs/voltohandson/contenttypeview.md": "f15aa7214a37a7639696d3df82dbb468", "./docs/voltohandson/highlight.md": "1dc0d44f216a67e75f7c33c3ac8407d0", "./docs/voltohandson/contenttypesviews.md": "c5252e0a622bf41fae9ee3cc99adb991", "./docs/voltohandson/starttheming.md": "5f5fb7f49574db13b4532229751f5251", "./docs/voltohandson/quickstart.md": "e53ec781cf7eb9de92dad60db3ae0694", "./docs/voltohandson/blocksedit.md": "b0f3f10957c634a41caf4b77e3f23e91", "./docs/voltohandson/eventlistingtemplate.md": "11567d15de9940eeede088b49a44da53", "./docs/voltohandson/requirements.md": "fd336d75544872c59bbf870b301f3591", "./docs/voltohandson/blocksdownload.md": "7c39c826686962138e81228cbdc5374f", "./docs/voltohandson/breadcrumbs.md": "5d6b8c600c2d22410cc262fe5a22fd3b", "./docs/voltohandson/highlightsblock.md": "fc2a7c00ec7fd7277cf9c022b3eff6a9", "./docs/voltohandson/header.md": "9f859a158067d7587fcf87e1f5acee57", "./docs/voltohandson/introtoblocks.md": "8c424c30d2a0b626fa00da430d0a2b41", "./docs/voltohandson/index.md": "7f9911793073bad0449982f0c7d4f7f0", "./docs/voltohandson/intro.md": "4f5ea0ae0eb799c7f884c5c8728b379a", "./docs/voltohandson/introtovolto.md": "9c29881f166f336c6d1eae6b5f6bf12e", "./docs/voltohandson/configandcleanup.md": "b9e9d0ce72f5b7799b66a121ff14247b", "./docs/voltohandson/footer.md": "87487bf9e1c141cf1a74156331cf24bc", "./docs/teaching/during.md": "cd02b859831dea6236a91bfb08f701cf", "./docs/teaching/before.md": "93836de1ae408ca305b2bce1052c559d", "./docs/teaching/after.md": "a8eab431332ee473e9442a9b53f0ec48", "./docs/teaching/theory.md": "79117c89dd9a7f1a5c2cba19ba923698", "./docs/teaching/index.md": "a365bf34081a940f041ea4921b771045", "./docs/mastering-plone/dexterity_2_talk.md": "1fc5066a15a6a2d2ec5e3142a07ad4f8", "./docs/mastering-plone/upgrade_steps.md": "9fe20d545aa1fc85bec15a0e197b0dda", "./docs/mastering-plone/volto_frontpage.md": "22499531714bb100019641655dd6bce7", "./docs/mastering-plone/deployment_code.md": "1736cf02104ed7e039d341e54b474a72", "./docs/mastering-plone/add-ons.md": "c7bfba484d8b838592c757edd554bf19", "./docs/mastering-plone/configuring_customizing.md": "faf6db17d260109cf98314eea3f7ac8c", "./docs/mastering-plone/events.md": "3b9b1cc7befcf1f80fe02167242ea320", "./docs/mastering-plone/extending.md": "8f02caaa9e72db6a597733168f52aaba", "./docs/mastering-plone/volto_overrides.md": "192b249342349aa4c3b34a19522c0f9e", "./docs/mastering-plone/volto_addon.md": "26bc3b538158231bf3530fa35ace8de6", "./docs/mastering-plone/volto_testing.md": "15a16b7acc14687a29df31b6befbdf3b", "./docs/mastering-plone/dexterity_3.md": "af2a0edf4f45fc981b223213824519da", "./docs/mastering-plone/relations.md": "ebf4df445828039f376a25df4c08d4e5", "./docs/mastering-plone/todos_documentation_mastering_plone_6.md": "46b9d9ae4a54327d5c9d97ed89158415", "./docs/mastering-plone/features.md": "67faf311c170cf3f15eed023165b50cb", "./docs/mastering-plone/thirdparty_behaviors.md": "ec95b6a9733ed42a866fb9338dbdd952", "./docs/mastering-plone/custom_search.md": "eae02a4ec30ab667e3c72a13d49e9c77", "./docs/mastering-plone/user_generated_content.md": "5e72a122e88ea51ec865c6832a1c23c6", "./docs/mastering-plone/volto_talkview.md": "a3350724d45ee9a46ff41d92eb2dcfec", "./docs/mastering-plone/volto_development.md": "fb33c404a22bfce3ba1f9bcecc0906a7", "./docs/mastering-plone/about_mastering.md": "f4841c767143d52343af9db47a9e45a3", "./docs/mastering-plone/what_is_plone.md": "8262738d4969226f93b3aea97942b8f5", "./docs/mastering-plone/volto_components_sponsors.md": "51a9553c737fe40b25e6294cd5a468b8", "./docs/mastering-plone/code.md": "bb95da54d3e014a87a0251243cf9f10d", "./docs/mastering-plone/dexterity.md": "65a8b1c7e8357981b8ce73a1103d94e1", "./docs/mastering-plone/installation.md": "d82a8615f66b54cc211808f540a21ed1", "./docs/mastering-plone/dexterity_reference.md": "3967a24d152d74a173b21706458e9fab", "./docs/mastering-plone/volto_custom_addon2.md": "76d205f727b8d45d9519bec995906f41", "./docs/mastering-plone/behaviors_1.md": "eae048f9de778b303f5678c6838d91f8", "./docs/mastering-plone/volto_custom_addon.md": "26075ce01695c794333bd662bfd62f8b", "./docs/mastering-plone/index.md": "903d8520c71bb29078094a21d0134c65", "./docs/mastering-plone/case.md": "ec932ec5d0c73752951eb129101480f4", "./docs/mastering-plone/intro.md": "5047099b23595a68f33c5507da12df34", "./docs/mastering-plone/trainer.md": "f85196997cdef4e195735a08cc932555", "./docs/mastering-plone/api.md": "11b334d91891c38bb27173ddbd782c7a", "./docs/mastering-plone/timing.md": "c77d9ee424b5935e136d1df2047d5169", "./docs/mastering-plone/registry.md": "918a3754f7b7610cbcff6d44718a9eff", "./docs/mastering-plone/voting-story/volto_actions.md": "af90cea46e7ca78d578a9388f5e4ee19", "./docs/mastering-plone/voting-story/endpoints.md": "ae9e03c5d73b072803b487595077ba02", "./docs/mastering-plone/voting-story/behaviors_2.md": "028637fae520f17f318fcd9e2a4ad5f9", "./docs/mastering-plone/voting-story/index.md": "3a94515a4542cff55055eac60793e862", "./docs/mastering-plone/voting-story/permissions.md": "e59f55cffa917a42cff2b85ad38b8cf1", "./docs/mastering-plone-5/embed.md": "5b702b09965edef4ebb9eb4beda4367a", "./docs/mastering-plone-5/resources.md": "06a20f9c3a0c0de5ba63b44dd4bd06da", "./docs/mastering-plone-5/buildout_1.md": "4a36a2e0902aed59b5beea0552988336", "./docs/mastering-plone-5/testing.md": "bd3b098ad0afbafd26b3b4a84e3aa14d", "./docs/mastering-plone-5/views_2.md": "b8280695fbfe0d95530516af7e79587e", "./docs/mastering-plone-5/deployment_code.md": "62fcb4499c40063c4015abe1671cab4e", "./docs/mastering-plone-5/export_code.md": "f7343012d0601587133d49e3b3a460dd", "./docs/mastering-plone-5/zpt_2.md": "b69e1b08ccfdc5eabfae4045ba443ef8", "./docs/mastering-plone-5/add-ons.md": "9f0e68fef36d340f83710f49aa310430", "./docs/mastering-plone-5/configuring_customizing.md": "830a2beae389b0cca25f6deb1d63a4c1", "./docs/mastering-plone-5/events.md": "0f5b190342f6217eb5ebd609c8d7b3b7", "./docs/mastering-plone-5/viewlets_2.md": "f9f725a687d33b75b2aca1f4d7c97188", "./docs/mastering-plone-5/extending.md": "8bdbdbd7e931352f8bd7362ecd0d9b98", "./docs/mastering-plone-5/plone5.md": "558fe6c1db92474bc4d3e63607421f7a", "./docs/mastering-plone-5/views_1.md": "ff54ca076352e63b9055f469cec59f79", "./docs/mastering-plone-5/theming.md": "d17600d391988356806f595affd783bf", "./docs/mastering-plone-5/eggs1.md": "77a016f4bbdea4786fdf3f0d8c26060d", "./docs/mastering-plone-5/dexterity_3.md": "2368f99fc2a811fe07e425b25b5a07a0", "./docs/mastering-plone-5/relations.md": "a6fcfc1bd7f1f5d49a1daddc1515e766", "./docs/mastering-plone-5/ide.md": "75c78c8c1eecce2f0e14965465cc2b23", "./docs/mastering-plone-5/restapi.md": "e538b0940a4a83a121515272e5560d7f", "./docs/mastering-plone-5/features.md": "5e33db59e7bda77408c6311e3ce7bed5", "./docs/mastering-plone-5/eggs2.md": "0ee5f606be4c780efcaf311af98308d3", "./docs/mastering-plone-5/todos_documentation_mastering_plone_5.md": "436a03be23273df6bde13161e3aff4fe", "./docs/mastering-plone-5/thirdparty_behaviors.md": "fb0c069f55d218fb32ebd6b15ee20caa", "./docs/mastering-plone-5/custom_search.md": "287a4263699dfc8b6baed19c4699789b", "./docs/mastering-plone-5/viewlets_1.md": "89bd8b6f88da27a5e2847c4837c018bf", "./docs/mastering-plone-5/user_generated_content.md": "5a3f72228c627990544fb000e6646824", "./docs/mastering-plone-5/behaviors_2.md": "9235327e1940f90361d8f4f1ad67ec00", "./docs/mastering-plone-5/about_mastering.md": "cf02fcc663e1fc5e925d5d9b25c0b1bd", "./docs/mastering-plone-5/what_is_plone.md": "d3daf0a5b0adb9a733774a180abd762f", "./docs/mastering-plone-5/dexterity_2.md": "cd645b77128c3fd838ad5014d6ff8a76", "./docs/mastering-plone-5/anatomy.md": "d60d7abe9d83d877f791a6bd4a083f0f", "./docs/mastering-plone-5/code.md": "8f613cd7c79053fae8f43d6b510f1ae1", "./docs/mastering-plone-5/dexterity.md": "e270428024a25370d354723d6fd003d4", "./docs/mastering-plone-5/reusable.md": "6c952f134d2f0a9fc8feb5e25182431a", "./docs/mastering-plone-5/installation.md": "bf135fb41e7141e387651d5e90f1c973", "./docs/mastering-plone-5/dexterity_reference.md": "7fbcd1c570bf2252ba75f502df29764c", "./docs/mastering-plone-5/future_of_plone.md": "fd5a784ae16ca73201f249a777d567f7", "./docs/mastering-plone-5/behaviors_1.md": "a0f126b4980c95d10dc3e72c0df94cb1", "./docs/mastering-plone-5/zpt.md": "043f5e6a791e2c3ce634697844cf0787", "./docs/mastering-plone-5/index.md": "92ca015f20111b12def0e12e5c7b54b9", "./docs/mastering-plone-5/case.md": "7dc2abd7581fafe4bc5c78bd310ef9ad", "./docs/mastering-plone-5/intro.md": "30fb84c0bae092603e3247994c963b4f", "./docs/mastering-plone-5/frontpage.md": "de415031acbe627a31f96d97980b100e", "./docs/mastering-plone-5/api.md": "a52bd88e26f1438bd7749e2a76eba053", "./docs/mastering-plone-5/timing.md": "64d7caadd10a9782d5ae676696232bf8", "./docs/mastering-plone-5/registry.md": "951f2b7d5ff7998b343c372e86b46b92", "./docs/mastering-plone-5/deployment_sites.md": "89c9f6f8c9a5461b5fcf9ee47eda312e", "./docs/mastering-plone-5/optional.md": "3a8ca8473ad25f1a4f537ff2cb4244dc", "./docs/mastering-plone-5/views_3.md": "291d0bd2692b05f18bd92e14d726caed"}} \ No newline at end of file From adf5cbd7a20e6246e3bbc7dc401cac753ef2d71d Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Mon, 18 Sep 2023 10:31:33 +0530 Subject: [PATCH 13/24] remove print statements --- upload.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/upload.py b/upload.py index b307a5228..6460a1ca8 100644 --- a/upload.py +++ b/upload.py @@ -79,9 +79,7 @@ def generate_breadcrumb_for_path(path): def upload_doc(path): slug = get_slug(path) title = extract_first_heading(path) - print(PUBLIC_URL) origin_url = f"{PUBLIC_URL}{path.replace('.md', '').replace('./docs/', '')}" # noqa - print(origin_url) sdk.NucliaUpload().text( path=path, format="MARKDOWN", @@ -114,7 +112,7 @@ def sync(): with open("./docs/_static/nuclia_sync.json", "r") as sync_info: old_data = json.load(sync_info) new_data = generate_nuclia_sync() - print(new_data) + to_delete = [] for doc, _ in old_data["docs"].items(): if doc not in new_data["docs"]: From 09683d9435fa54b06a9628caa4d30f2a3c1ea26c Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Mon, 18 Sep 2023 11:46:25 +0530 Subject: [PATCH 14/24] Rerunning jobs for debugging --- upload.py | 1 + 1 file changed, 1 insertion(+) diff --git a/upload.py b/upload.py index 6460a1ca8..a29d3c112 100644 --- a/upload.py +++ b/upload.py @@ -79,6 +79,7 @@ def generate_breadcrumb_for_path(path): def upload_doc(path): slug = get_slug(path) title = extract_first_heading(path) + print(PUBLIC_URL) origin_url = f"{PUBLIC_URL}{path.replace('.md', '').replace('./docs/', '')}" # noqa sdk.NucliaUpload().text( path=path, From dfc5dfe2d3250d513c33df39afd1832a576e87c1 Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Mon, 18 Sep 2023 11:56:59 +0530 Subject: [PATCH 15/24] Updating Commit Changes Run --- .github/workflows/nuclia_sync.yml | 2 +- upload.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/nuclia_sync.yml b/.github/workflows/nuclia_sync.yml index 1fea7acaf..e4ea2c46d 100644 --- a/.github/workflows/nuclia_sync.yml +++ b/.github/workflows/nuclia_sync.yml @@ -30,6 +30,6 @@ jobs: git config --global user.name github-actions git config --global user.email github-actions@github.com git add . - git commit -m "Nuclia Sync: Updated docs" + git commit -m "Nuclia Sync: Updated docs" --allow-empty git push diff --git a/upload.py b/upload.py index a29d3c112..6460a1ca8 100644 --- a/upload.py +++ b/upload.py @@ -79,7 +79,6 @@ def generate_breadcrumb_for_path(path): def upload_doc(path): slug = get_slug(path) title = extract_first_heading(path) - print(PUBLIC_URL) origin_url = f"{PUBLIC_URL}{path.replace('.md', '').replace('./docs/', '')}" # noqa sdk.NucliaUpload().text( path=path, From 38cd5624662cd40bbbd911dfb06bdfada3a68c5f Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 18 Sep 2023 06:28:04 +0000 Subject: [PATCH 16/24] Nuclia Sync: Updated docs From 930ebfe469750b2732b6640ab7e0496b2eef58ab Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Tue, 19 Sep 2023 11:31:33 +0530 Subject: [PATCH 17/24] Reverting to using JSON for breadcrumbs insted of metadata --- .github/workflows/nuclia_sync.yml | 7 + breadmaker.py | 56 ++ docs/_static/heading_mapping.json | 1155 +++++++++++++++++++++++++++++ docs/_static/searchtester.js | 71 +- 4 files changed, 1250 insertions(+), 39 deletions(-) create mode 100644 breadmaker.py create mode 100644 docs/_static/heading_mapping.json diff --git a/.github/workflows/nuclia_sync.yml b/.github/workflows/nuclia_sync.yml index e4ea2c46d..2844b29bc 100644 --- a/.github/workflows/nuclia_sync.yml +++ b/.github/workflows/nuclia_sync.yml @@ -25,6 +25,13 @@ jobs: run: | python3 upload.py + - name: Run Breadmaker + env: + DEPLOY_NUCLIA_URL: ${{secrets.DEPLOY_NUCLIA_URL}} + DEPLOY_NUCLIA_TOKEN: ${{secrets.DEPLOY_NUCLIA_TOKEN}} + run: | + python3 breadmaker.py + - name: Commit changes run: | git config --global user.name github-actions diff --git a/breadmaker.py b/breadmaker.py new file mode 100644 index 000000000..16e472ee4 --- /dev/null +++ b/breadmaker.py @@ -0,0 +1,56 @@ +import json +import os +from upload import extract_first_heading, PUBLIC_URL + +# Load nuclia_sync.json +try: + with open("./docs/_static/nuclia_sync.json", "r") as sync_info: + nuclia_sync_data = json.load(sync_info) +except FileNotFoundError: + print("Error: nuclia_sync.json not found.") +except json.JSONDecodeError as e: + print(f"Error decoding JSON: {e}") + + +def normalize_path(path): + return path.replace('.md', '').replace('./docs', '').lstrip('/') + + +def create_url(origin_url, url_path): + return f"{origin_url.rstrip('/')}/{url_path}" + + +def generate_breadcrumb_for_path(path): + breadcrumb = {} + temp_path = "./" + path_items = path.split('/')[1:] + + for path_item in path_items: + temp_path = os.path.join(temp_path, path_item) + if temp_path.endswith(".md"): + heading = extract_first_heading(temp_path) + breadcrumb[heading] = create_url( + PUBLIC_URL, normalize_path(temp_path)) + else: + index_md_path = os.path.join(temp_path, "index.md") + if os.path.exists(index_md_path): + heading = extract_first_heading(index_md_path) + breadcrumb[heading] = create_url( + PUBLIC_URL, normalize_path(temp_path)) + temp_path = os.path.join(temp_path, "") + return breadcrumb + + +result = {"heading_to_breadcrumb": {}} +for md_path in nuclia_sync_data["docs"]: + heading = extract_first_heading(md_path) + breadcrumb = generate_breadcrumb_for_path(md_path) + result["heading_to_breadcrumb"][heading] = breadcrumb + + +try: + with open("./docs/_static/heading_mapping.json", "w") as mapping_file: # noqa + json.dump(result, mapping_file, indent=4) + print("Data written to heading_mapping.json.") +except Exception as e: + print(f"Error writing JSON: {e}") \ No newline at end of file diff --git a/docs/_static/heading_mapping.json b/docs/_static/heading_mapping.json new file mode 100644 index 000000000..85c5a78c3 --- /dev/null +++ b/docs/_static/heading_mapping.json @@ -0,0 +1,1155 @@ +{ + "heading_to_breadcrumb": { + "Glossary": { + "Plone Training": "https://training.plone.org/", + "Glossary": "https://training.plone.org/glossary" + }, + "Plone Training": { + "Plone Training": "https://training.plone.org/index" + }, + "Editing your project": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Editing your project": "https://training.plone.org/plone-deployment/edit-project" + }, + "Server Setup": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Server Setup": "https://training.plone.org/plone-deployment/provision" + }, + "Plone Docker Images": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Plone Docker Images": "https://training.plone.org/plone-deployment/plone-docker-images" + }, + "Deploy": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Deploy": "https://training.plone.org/plone-deployment/deploy" + }, + "Training setup": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Training setup": "https://training.plone.org/plone-deployment/setup" + }, + "Create a Project": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Create a Project": "https://training.plone.org/plone-deployment/new-project" + }, + "Plone Deployment": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment/index" + }, + "Introduction to Plone stack": { + "Plone Training": "https://training.plone.org/", + "Plone Deployment": "https://training.plone.org/plone-deployment", + "Introduction to Plone stack": "https://training.plone.org/plone-deployment/plone-stack" + }, + "Introduction": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Introduction": "https://training.plone.org/mastering-plone-5/intro" + }, + "Testing": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Testing": "https://training.plone.org/effective-volto/testing" + }, + "Architecture": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Architecture": "https://training.plone.org/effective-volto/architecture" + }, + "Deployment": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Deployment": "https://training.plone.org/effective-volto/deployment" + }, + "About Effective Volto": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "About Effective Volto": "https://training.plone.org/effective-volto/about_effective_volto" + }, + "Add-ons": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Add-ons": "https://training.plone.org/effective-volto/addons" + }, + "Getting Started": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Getting Started": "https://training.plone.org/effective-volto/getting-started" + }, + "Effective Volto": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto/index" + }, + "Backend": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Backend": "https://training.plone.org/effective-volto/backend" + }, + "Development tools": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Development tools": "https://training.plone.org/effective-volto/development" + }, + "Acceptance testing": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Acceptance testing": "https://training.plone.org/testing/acceptance" + }, + "Storybook": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Storybook": "https://training.plone.org/effective-volto/testing/storybook" + }, + "Jest": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Jest": "https://training.plone.org/effective-volto/testing/jest" + }, + "Unit testing": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Unit testing": "https://training.plone.org/effective-volto/testing/unit" + }, + "Testing add-ons": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Testing add-ons": "https://training.plone.org/effective-volto/testing/addons" + }, + "release-it": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "release-it": "https://training.plone.org/effective-volto/deployment/releaseit" + }, + "Seamless mode": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Seamless mode": "https://training.plone.org/effective-volto/deployment/seamlessmode" + }, + "Docker": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Docker": "https://training.plone.org/effective-volto/deployment/docker" + }, + "Simple deployment": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Simple deployment": "https://training.plone.org/effective-volto/deployment/simple" + }, + "Developer roadmap": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Developer roadmap": "https://training.plone.org/effective-volto/getting-started/roadmap" + }, + "Bootstrapping an Add-on": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Bootstrapping an Add-on": "https://training.plone.org/effective-volto/getting-started/add-on" + }, + "Bootstrapping a full Plone 6 project": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Bootstrapping a full Plone 6 project": "https://training.plone.org/effective-volto/getting-started/project" + }, + "Block Extensions": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Block Extensions": "https://training.plone.org/effective-volto/addons/block-extensions" + }, + "Integrate with Volto\u2019s asyncConnect for SSR": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Integrate with Volto\u2019s asyncConnect for SSR": "https://training.plone.org/effective-volto/addons/asyncconnect" + }, + "Add-on Internationalization": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Add-on Internationalization": "https://training.plone.org/effective-volto/addons/i18n" + }, + "Block Styling": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Block Styling": "https://training.plone.org/effective-volto/addons/block-styling" + }, + "Configure an unreleased add-on from an existing repository": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Configure an unreleased add-on from an existing repository": "https://training.plone.org/effective-volto/addons/use-repo-addon" + }, + "Add-on dependencies": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Add-on dependencies": "https://training.plone.org/effective-volto/addons/dependencies" + }, + "Configure a released Volto Add-on in your project": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Configure a released Volto Add-on in your project": "https://training.plone.org/effective-volto/addons/use-released-addon" + }, + "Volto views": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Volto views": "https://training.plone.org/effective-volto/addons/views" + }, + "Bootstrap an add-on": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Bootstrap an add-on": "https://training.plone.org/effective-volto/addons/bootstrap" + }, + "What is a Volto add-on": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "What is a Volto add-on": "https://training.plone.org/effective-volto/addons/what-is-an-addon" + }, + "Extending Semantic UI": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Extending Semantic UI": "https://training.plone.org/effective-volto/addons/semanticui" + }, + "Create a theme add-on": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Create a theme add-on": "https://training.plone.org/effective-volto/addons/theme" + }, + "Extend Webpack setup from an add-on with razzle.extend.js": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Extend Webpack setup from an add-on with razzle.extend.js": "https://training.plone.org/effective-volto/addons/webpack" + }, + "How does a Volto add-on works?": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "How does a Volto add-on works?": "https://training.plone.org/effective-volto/addons/how-an-add-on-works" + }, + "Blocks Layout": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Blocks Layout": "https://training.plone.org/effective-volto/addons/blockslayout" + }, + "Create a block using BlockDataForm": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Create a block using BlockDataForm": "https://training.plone.org/effective-volto/addons/blockdataform" + }, + "Create a custom Listing block variation": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Create a custom Listing block variation": "https://training.plone.org/effective-volto/addons/customlistingtemplate" + }, + "Add-on and project configuration pipeline": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Add-on and project configuration pipeline": "https://training.plone.org/effective-volto/addons/pipeline" + }, + "Writing Express middleware": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Writing Express middleware": "https://training.plone.org/effective-volto/backend/express-middleware" + }, + "Plone REST API endpoints": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Plone REST API endpoints": "https://training.plone.org/effective-volto/backend/plone-restapi-endpoints" + }, + "Writing an endpoint": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Writing an endpoint": "https://training.plone.org/effective-volto/backend/writing-endpoint" + }, + "Writing a content expansion endpoint": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Writing a content expansion endpoint": "https://training.plone.org/effective-volto/backend/writing-content-expansion" + }, + "Block field contribute to searchableText": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Block field contribute to searchableText": "https://training.plone.org/effective-volto/backend/block-field-as-searchableText" + }, + "Link integrity for blocks": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Link integrity for blocks": "https://training.plone.org/effective-volto/backend/block-linkintegrity" + }, + "Writing a block transform": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Writing a block transform": "https://training.plone.org/effective-volto/backend/writing-block-transforms" + }, + "Writing a serializer or a deserializer": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Writing a serializer or a deserializer": "https://training.plone.org/effective-volto/backend/writing-serializer-deserializer" + }, + "Shortcuts": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Shortcuts": "https://training.plone.org/effective-volto/development/shortcuts" + }, + "critical.css": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "critical.css": "https://training.plone.org/effective-volto/development/criticalCSS" + }, + "Husky and lint-staged": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Husky and lint-staged": "https://training.plone.org/effective-volto/development/husky-lint-staged" + }, + "vim and neovim integration": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "vim and neovim integration": "https://training.plone.org/effective-volto/development/vim" + }, + "Internationalization": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Internationalization": "https://training.plone.org/effective-volto/development/i18n" + }, + "VSCode extensions/helpers": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "VSCode extensions/helpers": "https://training.plone.org/effective-volto/development/vscode" + }, + "Environment variables": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Environment variables": "https://training.plone.org/effective-volto/development/environmentvariables" + }, + "Icons": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Icons": "https://training.plone.org/effective-volto/development/icons" + }, + "Lazyloading components, injectLazyLibs for libraries": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Lazyloading components, injectLazyLibs for libraries": "https://training.plone.org/effective-volto/development/lazyloading" + }, + "Component Registry": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Component Registry": "https://training.plone.org/effective-volto/development/component-registry" + }, + "Debugging with Volto": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Debugging with Volto": "https://training.plone.org/effective-volto/development/debugging" + }, + "How to setup your development environment using environment variables": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "How to setup your development environment using environment variables": "https://training.plone.org/effective-volto/development/setup" + }, + "Linters": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Linters": "https://training.plone.org/effective-volto/development/linters" + }, + "Bundle analyzing": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Bundle analyzing": "https://training.plone.org/effective-volto/development/bundle-analyzing" + }, + "Webpack loaders": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Webpack loaders": "https://training.plone.org/effective-volto/architecture/webpack-loaders" + }, + "Configuration Registry": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Configuration Registry": "https://training.plone.org/effective-volto/architecture/configuration" + }, + "Bootstrap Volto": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Bootstrap Volto": "https://training.plone.org/effective-volto/architecture/bootstrap-volto" + }, + "Redux": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Redux": "https://training.plone.org/effective-volto/architecture/redux" + }, + "Razzle": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Razzle": "https://training.plone.org/effective-volto/architecture/razzle" + }, + "Volto Blocks": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Volto Blocks": "https://training.plone.org/effective-volto/architecture/blocks" + }, + "Inside Volto": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Inside Volto": "https://training.plone.org/effective-volto/architecture/anatomy" + }, + "CORS": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "CORS": "https://training.plone.org/effective-volto/architecture/CORS" + }, + "Babel": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Babel": "https://training.plone.org/effective-volto/architecture/babel" + }, + "Webpack": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Webpack": "https://training.plone.org/effective-volto/architecture/webpack" + }, + "Multilingual": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Multilingual": "https://training.plone.org/effective-volto/architecture/multilingual" + }, + "Volto Client - Server duality": { + "Plone Training": "https://training.plone.org/", + "Effective Volto": "https://training.plone.org/effective-volto", + "Volto Client - Server duality": "https://training.plone.org/effective-volto/architecture/client-ssr" + }, + "In-place migrations": { + "Plone Training": "https://training.plone.org/", + "Migration best practices": "https://training.plone.org/migrations", + "In-place migrations": "https://training.plone.org/migrations/inplace" + }, + "Migrating from third party systems to Plone": { + "Plone Training": "https://training.plone.org/", + "Migration best practices": "https://training.plone.org/migrations", + "Migrating from third party systems to Plone": "https://training.plone.org/migrations/migrate-to-plone" + }, + "Migrating with collective.exportimport": { + "Plone Training": "https://training.plone.org/", + "Migration best practices": "https://training.plone.org/migrations", + "Migrating with collective.exportimport": "https://training.plone.org/migrations/exportimport" + }, + "Migrating Plone": { + "Plone Training": "https://training.plone.org/", + "Migration best practices": "https://training.plone.org/migrations", + "Migrating Plone": "https://training.plone.org/migrations/migrations" + }, + "Migrate to Volto": { + "Plone Training": "https://training.plone.org/", + "Migration best practices": "https://training.plone.org/migrations", + "Migrate to Volto": "https://training.plone.org/migrations/volto" + }, + "Migration best practices": { + "Plone Training": "https://training.plone.org/", + "Migration best practices": "https://training.plone.org/migrations/index" + }, + "Authors Guide": { + "Plone Training": "https://training.plone.org/", + "Contributing to Plone Training": "https://training.plone.org/contributing", + "Authors Guide": "https://training.plone.org/contributing/authors" + }, + "Building and Checking the Quality of Documentation": { + "Plone Training": "https://training.plone.org/", + "Contributing to Plone Training": "https://training.plone.org/contributing", + "Building and Checking the Quality of Documentation": "https://training.plone.org/contributing/setup-build" + }, + "Contributing to Plone Training": { + "Plone Training": "https://training.plone.org/", + "Contributing to Plone Training": "https://training.plone.org/contributing/index" + }, + "General Guide to Writing Documentation": { + "Plone Training": "https://training.plone.org/", + "Contributing to Plone Training": "https://training.plone.org/contributing", + "General Guide to Writing Documentation": "https://training.plone.org/contributing/writing-docs-guide" + }, + "Continuous Integration": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Continuous Integration": "https://training.plone.org/testing/continuous_integration" + }, + "Testing setup": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Testing setup": "https://training.plone.org/testing/testing_setup" + }, + "How to test a Plone add-on": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "How to test a Plone add-on": "https://training.plone.org/testing/start" + }, + "Summary": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Summary": "https://training.plone.org/testing/summary" + }, + "Robot tests": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Robot tests": "https://training.plone.org/testing/testing_robot" + }, + "Unit tests": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Unit tests": "https://training.plone.org/testing/unittest" + }, + "Intro to tests": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Intro to tests": "https://training.plone.org/testing/intro_to_tests" + }, + "Testing a view": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Testing a view": "https://training.plone.org/testing/testing_view" + }, + "Some theory": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Some theory": "https://training.plone.org/testing/theory" + }, + "Testing Plone": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing/index" + }, + "Testing a Dexterity content type": { + "Plone Training": "https://training.plone.org/", + "Testing Plone": "https://training.plone.org/testing", + "Testing a Dexterity content type": "https://training.plone.org/testing/testing_dexterity" + }, + "Dynamic Roles": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Dynamic Roles": "https://training.plone.org/workflow/dynamic-roles" + }, + "Placeful Workflow": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Placeful Workflow": "https://training.plone.org/workflow/placeful-workflow" + }, + "Multi-chain Workflows": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Multi-chain Workflows": "https://training.plone.org/workflow/workflow-chains" + }, + "Local Roles": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Local Roles": "https://training.plone.org/workflow/local-roles" + }, + "Workflow Variables": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Workflow Variables": "https://training.plone.org/workflow/workflow-variables" + }, + "Introduction To Workflows": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Introduction To Workflows": "https://training.plone.org/workflow/introduction" + }, + "Basic Roles and Permissions": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Basic Roles and Permissions": "https://training.plone.org/workflow/roles-and-permissions" + }, + "Using GenericSetup to Manage Plone Workflows": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow", + "Using GenericSetup to Manage Plone Workflows": "https://training.plone.org/workflow/generic-setup-export-import" + }, + "Plone Workflow": { + "Plone Training": "https://training.plone.org/", + "Plone Workflow": "https://training.plone.org/workflow/index" + }, + "Customizable columns": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Customizable columns": "https://training.plone.org/voltoaddons/05-objectwidget-block-edit" + }, + "Basic working block": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Basic working block": "https://training.plone.org/voltoaddons/02-block-edit" + }, + "Block editing with a form": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Block editing with a form": "https://training.plone.org/voltoaddons/04-block-edit-options" + }, + "Make the block extensible": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Make the block extensible": "https://training.plone.org/voltoaddons/06-cell-renderer" + }, + "Volto add-ons development": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Volto add-ons development": "https://training.plone.org/voltoaddons/01-addon-basics" + }, + "Plone integration with Volto blocks": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Plone integration with Volto blocks": "https://training.plone.org/voltoaddons/blocksrestapi" + }, + "Improve the block view": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Improve the block view": "https://training.plone.org/voltoaddons/03-block-view" + }, + "Add-ons - advanced topics": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "Add-ons - advanced topics": "https://training.plone.org/voltoaddons/07-misc-addons" + }, + "Volto Add-ons Development": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons/index" + }, + "Developer integration with text editors": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "About": "https://training.plone.org/voltoaddons/about", + "Developer integration with text editors": "https://training.plone.org/voltoaddons/about/devenvironment" + }, + "Really short primer on Javascript enhancements": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "About": "https://training.plone.org/voltoaddons/about", + "Really short primer on Javascript enhancements": "https://training.plone.org/voltoaddons/about/jsbasics" + }, + "About": { + "Plone Training": "https://training.plone.org/", + "Volto Add-ons Development": "https://training.plone.org/voltoaddons", + "About": "https://training.plone.org/voltoaddons/about/index" + }, + "Create a theme based on Barceloneta": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming", + "Create a theme based on Barceloneta": "https://training.plone.org/theming/theme_barceloneta" + }, + "TTW Customizations": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming", + "TTW Customizations": "https://training.plone.org/theming/ttw_customizations" + }, + "Create a Theme from scratch": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming", + "Create a Theme from scratch": "https://training.plone.org/theming/theme_scratch" + }, + "Diazo notes": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming", + "Diazo notes": "https://training.plone.org/theming/diazo-notes" + }, + "Plone 6 Classic UI Theming": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming/index" + }, + "Create a theme based on Diazo": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming", + "Create a theme based on Diazo": "https://training.plone.org/theming/theme_diazo" + }, + "Preparation for the theming training": { + "Plone Training": "https://training.plone.org/", + "Plone 6 Classic UI Theming": "https://training.plone.org/theming", + "Preparation for the theming training": "https://training.plone.org/theming/preparation" + }, + "Sprint content type": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Sprint content type": "https://training.plone.org/voltohandson/contenttypeview" + }, + "Blocks - Highlight Block": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Blocks - Highlight Block": "https://training.plone.org/voltohandson/highlight" + }, + "Content types Views": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Content types Views": "https://training.plone.org/voltohandson/contenttypesviews" + }, + "Theming": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Theming": "https://training.plone.org/mastering-plone-5/theming" + }, + "Quick Start": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Quick Start": "https://training.plone.org/voltohandson/quickstart" + }, + "Blocks - Edit components": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Blocks - Edit components": "https://training.plone.org/voltohandson/blocksedit" + }, + "Events listing template": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Events listing template": "https://training.plone.org/voltohandson/eventlistingtemplate" + }, + "Project requirements": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Project requirements": "https://training.plone.org/voltohandson/requirements" + }, + "Configurable Downloadlink Block": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Configurable Downloadlink Block": "https://training.plone.org/voltohandson/blocksdownload" + }, + "Breadcrumbs": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Breadcrumbs": "https://training.plone.org/voltohandson/breadcrumbs" + }, + "Blocks - Highlights": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Blocks - Highlights": "https://training.plone.org/voltohandson/highlightsblock" + }, + "Header": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Header": "https://training.plone.org/voltohandson/header" + }, + "Brief introduction to Volto blocks": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Brief introduction to Volto blocks": "https://training.plone.org/voltohandson/introtoblocks" + }, + "Volto Hands-On": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson/index" + }, + "Inner workings of Volto": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Inner workings of Volto": "https://training.plone.org/voltohandson/introtovolto" + }, + "Edit config and site cleanup": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Edit config and site cleanup": "https://training.plone.org/voltohandson/configandcleanup" + }, + "Footer": { + "Plone Training": "https://training.plone.org/", + "Volto Hands-On": "https://training.plone.org/voltohandson", + "Footer": "https://training.plone.org/voltohandson/footer" + }, + "During training day(s): what to expect, do's and don'ts": { + "Plone Training": "https://training.plone.org/", + "Teaching": "https://training.plone.org/teaching", + "During training day(s): what to expect, do's and don'ts": "https://training.plone.org/teaching/during" + }, + "Before the training: Create material, invite trainees, preparation": { + "Plone Training": "https://training.plone.org/", + "Teaching": "https://training.plone.org/teaching", + "Before the training: Create material, invite trainees, preparation": "https://training.plone.org/teaching/before" + }, + "After the training: Aftercare, keep in touch, learn, improve": { + "Plone Training": "https://training.plone.org/", + "Teaching": "https://training.plone.org/teaching", + "After the training: Aftercare, keep in touch, learn, improve": "https://training.plone.org/teaching/after" + }, + "Training theory: education, how people learn and process information": { + "Plone Training": "https://training.plone.org/", + "Teaching": "https://training.plone.org/teaching", + "Training theory: education, how people learn and process information": "https://training.plone.org/teaching/theory" + }, + "Teaching": { + "Plone Training": "https://training.plone.org/", + "Teaching": "https://training.plone.org/teaching/index" + }, + "Content types II: Talks": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Content types II: Talks": "https://training.plone.org/mastering-plone/dexterity_2_talk" + }, + "Upgrade-steps": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Upgrade-steps": "https://training.plone.org/mastering-plone/upgrade_steps" + }, + "Creating a dynamic frontpage with Volto blocks": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Creating a dynamic frontpage with Volto blocks": "https://training.plone.org/mastering-plone/volto_frontpage" + }, + "Releasing your code": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Releasing your code": "https://training.plone.org/mastering-plone/deployment_code" + }, + "Extending Plone with add-on packages": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Extending Plone with add-on packages": "https://training.plone.org/mastering-plone/add-ons" + }, + "Configuring and Customizing Plone \"Through The Web\"": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Configuring and Customizing Plone \"Through The Web\"": "https://training.plone.org/mastering-plone-5/configuring_customizing" + }, + "Turning Talks into Events": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Turning Talks into Events": "https://training.plone.org/mastering-plone-5/events" + }, + "Extending Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Extending Plone": "https://training.plone.org/mastering-plone-5/extending" + }, + "Customizing Volto Components": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Customizing Volto Components": "https://training.plone.org/mastering-plone/volto_overrides" + }, + "Using Volto add-ons": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Using Volto add-ons": "https://training.plone.org/mastering-plone/volto_addon" + }, + "Testing in Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Testing in Plone": "https://training.plone.org/mastering-plone-5/testing" + }, + "Dexterity Types III: Sponsors": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Dexterity Types III: Sponsors": "https://training.plone.org/mastering-plone/dexterity_3" + }, + "Relations": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Relations": "https://training.plone.org/mastering-plone-5/relations" + }, + "Proposed changes to this trainning for Plone 6": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Proposed changes to this trainning for Plone 6": "https://training.plone.org/mastering-plone/todos_documentation_mastering_plone_6" + }, + "The Features of Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "The Features of Plone": "https://training.plone.org/mastering-plone-5/features" + }, + "Using Third-Party Behaviors": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Using Third-Party Behaviors": "https://training.plone.org/mastering-plone-5/thirdparty_behaviors" + }, + "Custom Search": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Custom Search": "https://training.plone.org/mastering-plone-5/custom_search" + }, + "Workflow, Roles and Permissions": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Workflow, Roles and Permissions": "https://training.plone.org/mastering-plone/user_generated_content" + }, + "Volto View Component: A Default View for a \"Talk\"": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Volto View Component: A Default View for a \"Talk\"": "https://training.plone.org/mastering-plone/volto_talkview" + }, + "Develop": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Develop": "https://training.plone.org/mastering-plone/volto_development" + }, + "About Mastering Plone development": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "About Mastering Plone development": "https://training.plone.org/mastering-plone/about_mastering" + }, + "What is Plone?": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "What is Plone?": "https://training.plone.org/mastering-plone-5/what_is_plone" + }, + "The Sponsors Component": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "The Sponsors Component": "https://training.plone.org/mastering-plone/volto_components_sponsors" + }, + "The code for the training": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "The code for the training": "https://training.plone.org/mastering-plone/code" + }, + "Content types I": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Content types I": "https://training.plone.org/mastering-plone/dexterity" + }, + "Installation": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Installation": "https://training.plone.org/mastering-plone/installation" + }, + "Content types: Reference": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Content types: Reference": "https://training.plone.org/mastering-plone/dexterity_reference" + }, + "Extending Volto With a FAQ Block Type": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Extending Volto With a FAQ Block Type": "https://training.plone.org/mastering-plone/volto_custom_addon2" + }, + "Behaviors": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Behaviors": "https://training.plone.org/mastering-plone-5/behaviors_1" + }, + "Extending Volto with a custom add-on package": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Extending Volto with a custom add-on package": "https://training.plone.org/mastering-plone/volto_custom_addon" + }, + "Mastering Plone 6 Development": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone/index" + }, + "The Case Study": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "The Case Study": "https://training.plone.org/mastering-plone-5/case" + }, + "Trainer: Preparation": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Trainer: Preparation": "https://training.plone.org/mastering-plone/trainer" + }, + "Programming Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Programming Plone": "https://training.plone.org/mastering-plone-5/api" + }, + "Timetable": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Timetable": "https://training.plone.org/mastering-plone-5/timing" + }, + "Vocabularies, Registry-Settings and Control Panels": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Vocabularies, Registry-Settings and Control Panels": "https://training.plone.org/mastering-plone/registry" + }, + "Volto Actions and Component State [voting story]": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Roundtrip [The voting story] frontend, backend, and REST": "https://training.plone.org/mastering-plone/voting-story", + "Volto Actions and Component State [voting story]": "https://training.plone.org/mastering-plone/voting-story/volto_actions" + }, + "REST API endpoints [voting story]": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Roundtrip [The voting story] frontend, backend, and REST": "https://training.plone.org/mastering-plone/voting-story", + "REST API endpoints [voting story]": "https://training.plone.org/mastering-plone/voting-story/endpoints" + }, + "Complex Behaviors [voting story]": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Roundtrip [The voting story] frontend, backend, and REST": "https://training.plone.org/mastering-plone/voting-story", + "Complex Behaviors [voting story]": "https://training.plone.org/mastering-plone/voting-story/behaviors_2" + }, + "Roundtrip [The voting story] frontend, backend, and REST": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Roundtrip [The voting story] frontend, backend, and REST": "https://training.plone.org/mastering-plone/voting-story/index" + }, + "Permissions [voting story]": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 6 Development": "https://training.plone.org/mastering-plone", + "Roundtrip [The voting story] frontend, backend, and REST": "https://training.plone.org/mastering-plone/voting-story", + "Permissions [voting story]": "https://training.plone.org/mastering-plone/voting-story/permissions" + }, + "Using starzel.votable_behavior in ploneconf.site": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Using starzel.votable_behavior in ploneconf.site": "https://training.plone.org/mastering-plone-5/embed" + }, + "Resources": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Resources": "https://training.plone.org/mastering-plone-5/resources" + }, + "Buildout I": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Buildout I": "https://training.plone.org/mastering-plone-5/buildout_1" + }, + "Views II: A Default View for \"Talk\"": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Views II: A Default View for \"Talk\"": "https://training.plone.org/mastering-plone-5/views_2" + }, + "Releasing Your Code": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Releasing Your Code": "https://training.plone.org/mastering-plone-5/deployment_code" + }, + "Return to Dexterity: Moving contenttypes into Code": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Return to Dexterity: Moving contenttypes into Code": "https://training.plone.org/mastering-plone-5/export_code" + }, + "Customizing Existing Templates": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Customizing Existing Templates": "https://training.plone.org/mastering-plone-5/zpt_2" + }, + "Extend Plone With Add-On Packages": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Extend Plone With Add-On Packages": "https://training.plone.org/mastering-plone-5/add-ons" + }, + "A Viewlet for the Votable Behavior": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "A Viewlet for the Votable Behavior": "https://training.plone.org/mastering-plone-5/viewlets_2" + }, + "What's New in Plone 5, 5.1 and Plone 5.2": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "What's New in Plone 5, 5.1 and Plone 5.2": "https://training.plone.org/mastering-plone-5/plone5" + }, + "Views I": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Views I": "https://training.plone.org/mastering-plone-5/views_1" + }, + "Write Your Own Add-Ons to Customize Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Write Your Own Add-Ons to Customize Plone": "https://training.plone.org/mastering-plone-5/eggs1" + }, + "Dexterity Types III: Python": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Dexterity Types III: Python": "https://training.plone.org/mastering-plone-5/dexterity_3" + }, + "IDEs and Editors": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "IDEs and Editors": "https://training.plone.org/mastering-plone-5/ide" + }, + "Plone REST API": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Plone REST API": "https://training.plone.org/mastering-plone-5/restapi" + }, + "Creating Reusable Packages": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Creating Reusable Packages": "https://training.plone.org/mastering-plone-5/eggs2" + }, + "TODOs documentation Mastering Plone 5": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "TODOs documentation Mastering Plone 5": "https://training.plone.org/mastering-plone-5/todos_documentation_mastering_plone_5" + }, + "Writing Viewlets": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Writing Viewlets": "https://training.plone.org/mastering-plone-5/viewlets_1" + }, + "User Generated Content": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "User Generated Content": "https://training.plone.org/mastering-plone-5/user_generated_content" + }, + "More Complex Behaviors": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "More Complex Behaviors": "https://training.plone.org/mastering-plone-5/behaviors_2" + }, + "About Mastering Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "About Mastering Plone": "https://training.plone.org/mastering-plone-5/about_mastering" + }, + "Dexterity Types II: Growing Up": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Dexterity Types II: Growing Up": "https://training.plone.org/mastering-plone-5/dexterity_2" + }, + "The Anatomy of Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "The Anatomy of Plone": "https://training.plone.org/mastering-plone-5/anatomy" + }, + "Using the code for the training": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Using the code for the training": "https://training.plone.org/mastering-plone-5/code" + }, + "Dexterity I: \"Through The Web\"": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Dexterity I: \"Through The Web\"": "https://training.plone.org/mastering-plone-5/dexterity" + }, + "Making Our Package Reusable": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Making Our Package Reusable": "https://training.plone.org/mastering-plone-5/reusable" + }, + "Installation & Setup": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Installation & Setup": "https://training.plone.org/mastering-plone-5/installation" + }, + "Dexterity: Reference": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Dexterity: Reference": "https://training.plone.org/mastering-plone-5/dexterity_reference" + }, + "The Future of Plone": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "The Future of Plone": "https://training.plone.org/mastering-plone-5/future_of_plone" + }, + "Page Templates": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Page Templates": "https://training.plone.org/mastering-plone-5/zpt" + }, + "Mastering Plone 5 Development": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5/index" + }, + "Creating a Dynamic Front Page": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Creating a Dynamic Front Page": "https://training.plone.org/mastering-plone-5/frontpage" + }, + "Manage Settings with Registry, Control Panels and Vocabularies": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Manage Settings with Registry, Control Panels and Vocabularies": "https://training.plone.org/mastering-plone-5/registry" + }, + "Buildout II: Getting Ready for Deployment": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Buildout II: Getting Ready for Deployment": "https://training.plone.org/mastering-plone-5/deployment_sites" + }, + "Optional": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Optional": "https://training.plone.org/mastering-plone-5/optional" + }, + "Views III: A Talk List": { + "Plone Training": "https://training.plone.org/", + "Mastering Plone 5 Development": "https://training.plone.org/mastering-plone-5", + "Views III: A Talk List": "https://training.plone.org/mastering-plone-5/views_3" + } + } +} \ No newline at end of file diff --git a/docs/_static/searchtester.js b/docs/_static/searchtester.js index 91778c831..48fd0bc6e 100644 --- a/docs/_static/searchtester.js +++ b/docs/_static/searchtester.js @@ -1,62 +1,53 @@ -const { switchMap } = rxjs; +let breadcrumbMapping; // Storing the fetched JSON here +let resultHeading=""; // Store the result headings once fetched const nucliaResult = document.querySelector("nuclia-search-results"); const shadowRoot = nucliaResult.shadowRoot; -const nuclia = new window.NucliaSDK.Nuclia({ - backend: "https://nuclia.cloud/api", - zone: "europe-1", - knowledgeBox: "62407006-2711-4631-9c03-761d156de289", -}); +async function fetchBreadcrumbMapping() { + try { + const response = await fetch("/_static/heading_mapping.json"); + breadcrumbMapping = await response.json(); + } catch (error) { + console.error("Error fetching mapping:", error); + } +} -function createBreadcrumbs(Container) { +fetchBreadcrumbMapping(); - // Container hash gets the md5 value of resource but i am unable to find resource by passing that hash - // let ContainerHash = Container.querySelector( - // "div > div.sw-field-metadata > div > div:nth-child(2) > span.title-xxs" - // ).innerText; +function createBreadcrumbs(Container) { let ContainerHeading = Container.querySelector("div"); + resultHeading = ContainerHeading.querySelector("h3").innerText; - // One of The hash that works 79e4d894189842acb0902b5d879c2fe6 try { - nuclia.db - .getKnowledgeBox() - .pipe( - switchMap((knowledgeBox) => - knowledgeBox.getResource("79e4d894189842acb0902b5d879c2fe6", [ - "extra", - ]) - ) - ) - .subscribe( - (resource) => { - insertBreadcrumbDiv(resource, ContainerHeading); - }, - (error) => { - console.error("Error fetching resource:", error); - } - ); + insertBreadcrumbDiv(resultHeading, ContainerHeading); } catch (error) { console.error("Error in createBreadcrumbs:", error); } } -function insertBreadcrumbDiv(resource, ContainerHeading) { - let array = resource.extra.metadata["breadcrumbs"]; +function insertBreadcrumbDiv(resultHeading, ContainerHeading) { + const jsonData = + breadcrumbMapping["heading_to_breadcrumb"][resultHeading]; + if (!jsonData) { + throw new Error("No breadcrumbs found for the heading: ", resultHeading); + } + if (!ContainerHeading.querySelector("div.breadcrumbs")) { let breadcrumbContainer = document.createElement("div"); breadcrumbContainer.className = "breadcrumbs"; - for (let i = 0; i < array.length; i++) { - let dict = array[i]; + + let i = 0; + Object.keys(jsonData).forEach(key => { + const value = jsonData[key]; // Create a span element for each breadcrumb let breadcrumbSpan = document.createElement("span"); - // Create a breadcrumb link or span based on whether it's the last breadcrumb - if (i < array.length - 1) { + if (i < Object.keys(jsonData).length - 1) { let breadcrumbLink = document.createElement("a"); - breadcrumbLink.href = dict.url; - breadcrumbLink.textContent = dict.label; + breadcrumbLink.href = value; + breadcrumbLink.textContent = key; breadcrumbLink.classList.add("breadcrumb-link"); breadcrumbSpan.appendChild(breadcrumbLink); @@ -65,12 +56,14 @@ function insertBreadcrumbDiv(resource, ContainerHeading) { breadcrumbSpan.appendChild(separator); } else { // If it's the last breadcrumb, create a non-clickable span - breadcrumbSpan.textContent = dict.label; + breadcrumbSpan.textContent = key; breadcrumbSpan.classList.add("breadcrumb-last"); } + i++; breadcrumbContainer.appendChild(breadcrumbSpan); - } + }); + ContainerHeading.insertAdjacentElement( "afterbegin", breadcrumbContainer From dd68adf6f28562c54a2758e8853f3b9192a47826 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 19 Sep 2023 06:04:02 +0000 Subject: [PATCH 18/24] Nuclia Sync: Updated docs --- __pycache__/upload.cpython-310.pyc | Bin 0 -> 3532 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 __pycache__/upload.cpython-310.pyc diff --git a/__pycache__/upload.cpython-310.pyc b/__pycache__/upload.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62fc44fce3b03ac2a09007212e042959207188b0 GIT binary patch literal 3532 zcmZ`+TW=f372cV>a7j@Y+manQ0wSPE8`_mv7YUFyZW7=CBeKhg|(gM^=f&76!^ry^gpYjh11BLsYSxJ`cmW!SHoIUf+Io~7eZ zet-W(UH*Q~asEY}<3Enh7kG<*pb(B=sncf>W7Os;@4Jy}+ivPb9>(0%k9=DPQDEy@ zRI_y$g|fC?7v7>1HEhdAYf1!BQ`AKGXD6B#b zQJ)rP#60RVVnLimJul9QcTg|Lvtn_FtA}!7&w*C%UHi7q{{Y>c7Bg-kc2G@sa{XmK z%)||)a@C2>T)%O9{no>{bN|}<+Lid;t(!MG(W#Sz_wTHa-rdrAQ2esp)~cIiNw&E< zNb^jt=4!LuqfZ?ETr>i_*YFnCQ3#ee2^%}w*#>OF72XSe-T8Wc%ru*D?UqdVdwk;U zJNsl2&@)ElioswO4o=la_U8favj3@G5F`8LzQ{BFBp?zVsFYe(;btQX4RU}Vk z#MMSCFy3aGZX>nctLH*VQu4hP^cD#>MljcZyIT zD+}3a_70n29#gaE_85x8AHfykwUDJ~XomnGuwJ;|Hpi@F6Gp&1faQ63_F#8ec*!Zw z?!p@Bc}REeja|(rZt0d>^KEb69ebsxJ}SM5FMNO-h(Of#`J@I}e(A$P2->h?m>T&* z{dnaQpc%@nmkV6*Xy%WPiVHuw_^7z};p)ZK`#+G%FWH|AwkT3p)lnF(qzMYyRlO}! z|LXqwy|wkV&JE*ls(d&wH6;gWw$Ee;?$itvD0TKsAtO?+{;K)#f zLqX4~<9A-VFnu+TWuu_-hnK9~;)*aZL298^@1ygkGBa7O`rR}cRX6Z6EU_w`XX*ml zJyP%RM{ROus}g;yQfZ%k2gOR1e*?#~ct?GRIT%iW%b+Xfrje^;Gs)tiN==Bu-u9cS zGGcm_0+JxQM9JuMuRlbhUbO)0DFzMohKRjtSEL97~e8UB@9jD_Wi5tYu93sx4l~v zbO)e7VFLLqDRcoRwh|hzKVa%w_6L=3HprIa1OtVsAGOtcBs$FGZY;XGYo@KTabNt; zD_%Nc#Mj@5ALq(0{sfW=GC+7JxH052@Y|4adS7uCylV0p-aIi<_0_Mi>4b@p<4obT zCK91R{E2HqfUz~$@H?_zmpmMf#^3+7-J@%a-=iD(9;m1fwYY>dKv)*Ka-Os5U+yg?*{J1kfSK0Zt84GhUGnH;u0oog$=Q zsi}1bNxUPUo1k)<$hYj)YM5|S>X_D7mr71z9bA!PM$L{5GWTuxF`mXQ!*5&RY7^lZW6uGeGZsw* zB|L;@^FK{LfT^o>tm)xB`qj`n!jmIZX&VXl__x!@qL4F{$dtzHtz=-~cru{fJzx#4 zr2NWVbSS?9JI+4hV-LaKE0J6*I!_tW19yVHWxfxp(Sx<`+O+}JS_xSDTa6yw<&#fK zFeXVTk<#wC>UYOxh=l{NaP462L#w|B{b#KHU|yU62Yc%TPfwhnj=T`xvThf2M(-Us zTU_X_PI~QQS=Q=yk!K1iyrYN<4BH)jen<9Ye?zKeoiB@gxx3u&?#SiJ)K@4qqX|1! z43%8or8&5)Tqg0uqSdfD4hR;ajYmnIP27xcIZ=H~A0t<=_lM+k*dM6hpx>&QI*E^y z>~S82c`7Vbs!uT&)pZ_M)}e^742xBhWW3>#9tp@WQBYKFf(Dmf1>EEFtO+0F-^^pA z!RE-Kz6p7Qfhw`0$<;j)8pd%SIeHwo&P73mQf2q&tB%-+@n2x|>Cac?vz{F2B+m+K z-Ks;nP+p|S2Gu1hY_e06+0#S;WAX}R{loInEOnQuASbhN#zr5@KCj_9(ktusWgH(n xu06PAq407)7sFJ3M!8u*Jk@lF{tusq-+ Date: Tue, 19 Sep 2023 12:58:02 +0530 Subject: [PATCH 19/24] Updated searchhtml --- docs/_templates/search.html | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/_templates/search.html b/docs/_templates/search.html index 5b6830abd..0d325f33d 100644 --- a/docs/_templates/search.html +++ b/docs/_templates/search.html @@ -19,9 +19,6 @@

{{ _("Search") }}

{% endblock %} - - - + - - + + features="answers,navigateToLink,hideThumbnails" +> - + - + - - -{% endblock docs_body %} {# Below sections just re-create the behavior of Sphinx -default search #} {# Page metadata #} {%- block htmltitle -%} -{{ _("Search") }} - {{ title or docstitle }} -{%- endblock htmltitle -%} {# Manually include the search JS that Sphinx -includes #} {% block scripts -%} {{ super() }} - - - +{% endblock docs_body %} +{# Below sections just re-create the behavior of Sphinx default search #} +{# Page metadata #} +{%- block htmltitle -%} + {{ _("Search") }} - {{ title or docstitle }} +{%- endblock htmltitle -%} +{# Manually include the search JS that Sphinx includes #} +{% block scripts -%} + {{ super() }} + + + {%- endblock scripts %} diff --git a/requirements.txt b/requirements.txt index 4442ed5bd..9547002fc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,8 @@ jsx-lexer lesscpy linkify-it-py myst-parser +nuclia +nucliadb-sdk sphinx-autobuild sphinx-book-theme sphinx-copybutton @@ -12,6 +14,4 @@ sphinx-design sphinx-sitemap sphinx-togglebutton sphinxcontrib-spelling -sphinxext-opengraph -nuclia -nucliadb-sdk \ No newline at end of file +sphinxext-opengraph \ No newline at end of file diff --git a/upload.py b/upload.py index 6460a1ca8..20e14758c 100644 --- a/upload.py +++ b/upload.py @@ -64,16 +64,18 @@ def generate_breadcrumb_for_path(path): heading = extract_first_heading(temp_path) new_data = {"url":create_url( PUBLIC_URL, normalize_path(temp_path)),"label":heading} - breadcrumb.append(new_data) else: index_md_path = os.path.join(temp_path, "index.md") if os.path.exists(index_md_path): heading = extract_first_heading(index_md_path) new_data = {"url":create_url( PUBLIC_URL, normalize_path(temp_path)),"label":heading} - temp_path = os.path.join(temp_path, "") + else: + continue + # Check if the new_data entry already exists in the breadcrumb + if new_data not in breadcrumb: breadcrumb.append(new_data) - return {"breadcrumbs":breadcrumb} + return {"breadcrumbs": breadcrumb} def upload_doc(path): From b5c56473f0ceae2a3bf54ac092f74dbfa14db781 Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Sun, 1 Oct 2023 17:05:59 +0530 Subject: [PATCH 22/24] Added field parameter to upload script --- upload.py | 1 + 1 file changed, 1 insertion(+) diff --git a/upload.py b/upload.py index 20e14758c..583829826 100644 --- a/upload.py +++ b/upload.py @@ -86,6 +86,7 @@ def upload_doc(path): path=path, format="MARKDOWN", slug=slug, + field="page", title=title, url=KB, api_key=API_KEY, From 28b2a20dcf6943ea3481f5138f63ebab49c5a073 Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Sun, 1 Oct 2023 21:18:11 +0530 Subject: [PATCH 23/24] Style Changes on results --- docs/_static/searchtester.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/_static/searchtester.js b/docs/_static/searchtester.js index 8cb04db77..bf7608bef 100644 --- a/docs/_static/searchtester.js +++ b/docs/_static/searchtester.js @@ -123,6 +123,7 @@ style.textContent = ` --color-on-hover: #0056b3; --color-of-separator: #777; --color-of-lastbreadcrumb: #CECECE; + --font-size-title-m: 22px; } /* Breadcrumb container */ @@ -159,7 +160,8 @@ style.textContent = ` /*Heading of the results*/ h3.ellipsis.title-m{ color: var(--pst-color-primary); - } + font-size: var(--font-size-title-m); +} /*Subheading of the results*/ .sw-paragraph-result { @@ -167,7 +169,7 @@ h3.ellipsis.title-m{ } /*Gap between results*/ .results, .search-results { - gap: var(--rhythm-4); + gap: var(--rhythm-7); } /*Gap between widget and answer generation*/ .sw-initial-answer { From 6dc5fdca56c132d6dff5dee542bdb561641eefc9 Mon Sep 17 00:00:00 2001 From: Daksh Sharma Date: Sun, 1 Oct 2023 21:31:48 +0530 Subject: [PATCH 24/24] title font-size change --- docs/_static/searchtester.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_static/searchtester.js b/docs/_static/searchtester.js index bf7608bef..5286ee583 100644 --- a/docs/_static/searchtester.js +++ b/docs/_static/searchtester.js @@ -123,7 +123,7 @@ style.textContent = ` --color-on-hover: #0056b3; --color-of-separator: #777; --color-of-lastbreadcrumb: #CECECE; - --font-size-title-m: 22px; + --size-of-title-m: 22px; } /* Breadcrumb container */ @@ -160,7 +160,7 @@ style.textContent = ` /*Heading of the results*/ h3.ellipsis.title-m{ color: var(--pst-color-primary); - font-size: var(--font-size-title-m); + font-size: var(--size-of-title-m); } /*Subheading of the results*/