From 1bf2a0fca184728fc83d4473c40719e16e394883 Mon Sep 17 00:00:00 2001 From: Arvin Rolos Date: Thu, 16 Oct 2025 15:54:44 -0700 Subject: [PATCH 1/3] fix: replace gulp with vite --- Dockerfile | 33 +-- README.md | 114 +++++++- css/hotspot.css | 184 ------------ css/styles.css | 2 - docker-compose.dev.yml | 13 + docker-compose.yml | 10 +- gulp-partial-processor.mjs | 94 ------ gulpfile.mjs | 122 -------- js/beauty.js | 187 ------------ package.json | 26 +- {assets => public/assets}/.htaccess | 0 .../assets}/VentPipesPre-sessionReading.pdf | Bin 327612 -> 327442 bytes {assets => public/assets}/bcit-logo.svg | 0 .../conversion-guide-training-checklist.md | 0 {assets => public/assets}/create-mr.png | Bin 37387 -> 37386 bytes .../assets}/damaged-log-small.jpg | Bin {assets => public/assets}/damaged-log.jpg | Bin 183470 -> 183466 bytes {assets => public/assets}/example-element.png | Bin 39428 -> 39427 bytes {assets => public/assets}/examples/arrow.gif | Bin .../assets}/examples/assets/1.jpeg | Bin 209623 -> 209620 bytes .../assets}/examples/assets/cindy-mae.png | Bin 97742 -> 97740 bytes .../examples/assets/corporate-building.jpg | Bin 209623 -> 209620 bytes .../assets}/examples/assets/m3-4framework.jpg | Bin .../examples/assets/src/sample-module.psd | Bin 7843956 -> 7843313 bytes .../assets}/examples/example-business.docx | Bin 226817 -> 226814 bytes .../assets}/examples/example-business.html | 0 .../assets}/examples/example-health.docx | Bin 130405 -> 130403 bytes .../assets}/examples/example-health.html | 0 .../examples/thumb-example-business-word.jpg | Bin .../examples/thumb-example-business.png | Bin 55569 -> 55566 bytes .../examples/thumb-example-health-word.jpg | Bin .../assets}/examples/thumb-example-health.png | Bin 28076 -> 28075 bytes {assets => public/assets}/favicon.ico | Bin 13758 -> 13757 bytes .../assets}/fibre-damage-small.jpg | Bin {assets => public/assets}/fibre-damage.jpg | Bin 35573 -> 35572 bytes {assets => public/assets}/hamburger.svg | 0 {assets => public/assets}/hyperlink.png | Bin .../assets}/lumber-yard-small.jpg | Bin {assets => public/assets}/lumber-yard.jpg | Bin 4824047 -> 4823989 bytes {assets => public/assets}/mark-ready.png | Bin 221687 -> 221684 bytes .../assets}/mill-machine-small.jpg | Bin {assets => public/assets}/mill-machine.jpg | Bin 1056283 -> 1056275 bytes .../assets}/mining-pit-operations.jpeg | Bin 149300 -> 149298 bytes .../ms-word-tutorial/clear-formatting.png | Bin 14622 -> 14621 bytes .../assets}/ms-word-tutorial/comment.png | Bin 11760 -> 11758 bytes .../ms-word-tutorial/home-formatting.png | Bin 10436 -> 10435 bytes .../ms-word-tutorial/home-quick-styles.png | Bin 22111 -> 22110 bytes .../assets}/ms-word-tutorial/insert-1.png | Bin 8767 -> 8766 bytes .../assets}/ms-word-tutorial/insert-2.png | Bin 10944 -> 10943 bytes .../ms-word-tutorial/merge-formatting.png | Bin 3458 -> 3457 bytes .../ms-word-tutorial/navigation-pane.png | Bin 12619 -> 12618 bytes .../ms-word-tutorial/navigation-pane2.png | Bin 4588 -> 4587 bytes .../ms-word-tutorial/navigation-pane3.png | Bin 12537 -> 12535 bytes .../assets}/multiple-energies.png | Bin 56246 -> 56245 bytes {assets => public/assets}/ruler/center.png | Bin 224 -> 223 bytes .../assets}/ruler/left-small.png | Bin 415 -> 414 bytes .../assets}/ruler/left-smallest.png | Bin 405 -> 404 bytes {assets => public/assets}/ruler/left.png | Bin 462 -> 461 bytes .../assets}/ruler/right-small.png | Bin 314 -> 313 bytes .../assets}/ruler/right-smallest.png | Bin 314 -> 313 bytes {assets => public/assets}/ruler/right.png | Bin 403 -> 402 bytes .../assets}/sample-document-word.jpeg | Bin .../assets}/sample-module-learning-hub.jpeg | Bin {assets => public/assets}/signpost-small.jpg | Bin {assets => public/assets}/signpost.jpg | Bin 1278099 -> 1278087 bytes .../assets}/src/sample-module.psd | Bin 7843956 -> 7843313 bytes .../assets}/src/word-to-html-to-d2l.psd | Bin 85930 -> 85928 bytes ...annotated-sample-content-heavy-module.docx | Bin ...annotated-sample-content-light-module.docx | Bin .../annotated-sample-overview-module.docx | Bin .../templates/blank-working-document.docx | Bin .../sample-course-content-notes.docx | Bin 26020 -> 26019 bytes {assets => public/assets}/tooth-marks.jpg | Bin {assets => public/assets}/view-app.png | Bin 27405 -> 27404 bytes {assets => public/assets}/word-to-html5.png | Bin 9961 -> 9959 bytes {css => public/css}/prism.css | 0 public/js/jquery-3.7.1.min.js | 2 + scss/styles.scss | 41 --- {js => src/js}/ms-word-tutorial.js | 0 {js => src/js}/page-setup.js | 10 +- {js => src/js}/prism.js | 0 {pages => src/pages}/index.html | 68 ++--- {pages => src/pages}/interactions.html | 19 +- {pages => src/pages}/knowledge-check.html | 19 +- {pages => src/pages}/learning-blocks.html | 19 +- {pages => src/pages}/marker-reference.html | 18 +- {pages => src/pages}/media.html | 19 +- {pages => src/pages}/tables.html | 19 +- {pages => src/pages}/text.html | 19 +- .../partials}/accordion.html | 0 .../partials}/checklist.html | 0 .../partials}/custom-interactions.html | 0 {partials => src/partials}/feedback.html | 0 .../partials}/flashcards.html | 0 src/partials/interactions/accordion.html | 32 +++ src/partials/interactions/checklist.html | 55 ++++ .../interactions/custom-interactions.html | 19 ++ src/partials/interactions/flashcards.html | 66 +++++ .../partials}/interactions/line-matching.html | 0 .../partials}/interactions/reveal.html | 0 .../partials}/interactions/swapper.html | 0 .../partials}/interactions/tabs.html | 0 .../knowledge-check/fill-in-blank.html | 0 .../partials}/knowledge-check/matching.html | 0 .../knowledge-check/multi-choice.html | 0 .../knowledge-check/multi-select.html | 0 .../partials}/knowledge-check/ordering.html | 0 .../partials}/learning-blocks/activity.html | 0 .../partials}/learning-blocks/assignment.html | 0 .../partials}/learning-blocks/case.html | 0 .../partials}/learning-blocks/definition.html | 0 .../partials}/learning-blocks/discussion.html | 0 .../partials}/learning-blocks/doing.html | 0 .../partials}/learning-blocks/example.html | 0 .../learning-blocks/group-activity.html | 0 .../partials}/learning-blocks/key-point.html | 0 .../partials}/learning-blocks/knowing.html | 0 .../partials}/learning-blocks/link.html | 0 .../partials}/learning-blocks/note.html | 0 .../partials}/learning-blocks/outcome.html | 0 .../partials}/learning-blocks/quiz.html | 0 .../partials}/learning-blocks/reading.html | 0 .../partials}/learning-blocks/reflection.html | 0 .../partials}/learning-blocks/review.html | 0 .../partials}/learning-blocks/warning.html | 0 src/partials/line-matching.html | 91 ++++++ {partials => src/partials}/media/audio.html | 0 {partials => src/partials}/media/images.html | 0 .../partials}/media/size-position.html | 0 {partials => src/partials}/media/slider.html | 0 {partials => src/partials}/media/videos.html | 0 {partials => src/partials}/menu.html | 0 src/partials/reveal.html | 40 +++ src/partials/swapper.html | 45 +++ .../partials}/tables/default.html | 0 src/partials/tabs.html | 79 +++++ .../partials}/text/blockquotes.html | 0 {partials => src/partials}/text/headings.html | 0 .../partials}/text/hyperlinks.html | 0 {partials => src/partials}/text/math.html | 0 {partials => src/partials}/text/ordered.html | 0 .../partials}/text/paragraphs.html | 0 .../partials}/text/unordered.html | 0 {scss/constants => src/scss}/_colors.scss | 0 {scss/constants => src/scss}/_fonts.scss | 0 src/scss/_variables.scss | 17 ++ src/scss/constants/_colors.scss | 52 ++++ src/scss/constants/_fonts.scss | 3 + {scss => src/scss}/mixins/_media-queries.scss | 78 ++--- {scss => src/scss}/partials/_feedback.scss | 4 + {scss => src/scss}/partials/_home-page.scss | 3 + .../scss}/partials/_ms-word-tutorial.scss | 0 {scss => src/scss}/partials/_wrapper.scss | 3 + .../scss}/partials/element/_element.scss | 12 +- .../scss}/partials/element/_panels.scss | 3 + .../scss}/partials/element/_preview.scss | 0 .../scss}/partials/element/_word.scss | 12 +- {scss => src/scss}/partials/menu/_menu.scss | 6 +- src/scss/styles.scss | 28 ++ vite.config.js | 269 ++++++++++++++++++ 160 files changed, 1096 insertions(+), 859 deletions(-) delete mode 100644 css/hotspot.css delete mode 100644 css/styles.css create mode 100644 docker-compose.dev.yml delete mode 100644 gulp-partial-processor.mjs delete mode 100644 gulpfile.mjs delete mode 100644 js/beauty.js rename {assets => public/assets}/.htaccess (100%) rename {assets => public/assets}/VentPipesPre-sessionReading.pdf (98%) rename {assets => public/assets}/bcit-logo.svg (100%) rename {assets => public/assets}/conversion-guide-training-checklist.md (100%) rename {assets => public/assets}/create-mr.png (99%) rename {assets => public/assets}/damaged-log-small.jpg (100%) rename {assets => public/assets}/damaged-log.jpg (99%) rename {assets => public/assets}/example-element.png (99%) rename {assets => public/assets}/examples/arrow.gif (100%) rename {assets => public/assets}/examples/assets/1.jpeg (99%) rename {assets => public/assets}/examples/assets/cindy-mae.png (99%) rename {assets => public/assets}/examples/assets/corporate-building.jpg (99%) rename {assets => public/assets}/examples/assets/m3-4framework.jpg (100%) rename {assets => public/assets}/examples/assets/src/sample-module.psd (99%) rename {assets => public/assets}/examples/example-business.docx (99%) rename {assets => public/assets}/examples/example-business.html (100%) rename {assets => public/assets}/examples/example-health.docx (99%) rename {assets => public/assets}/examples/example-health.html (100%) rename {assets => public/assets}/examples/thumb-example-business-word.jpg (100%) rename {assets => public/assets}/examples/thumb-example-business.png (99%) rename {assets => public/assets}/examples/thumb-example-health-word.jpg (100%) rename {assets => public/assets}/examples/thumb-example-health.png (99%) rename {assets => public/assets}/favicon.ico (99%) rename {assets => public/assets}/fibre-damage-small.jpg (100%) rename {assets => public/assets}/fibre-damage.jpg (99%) rename {assets => public/assets}/hamburger.svg (100%) rename {assets => public/assets}/hyperlink.png (100%) rename {assets => public/assets}/lumber-yard-small.jpg (100%) rename {assets => public/assets}/lumber-yard.jpg (99%) rename {assets => public/assets}/mark-ready.png (99%) rename {assets => public/assets}/mill-machine-small.jpg (100%) rename {assets => public/assets}/mill-machine.jpg (99%) rename {assets => public/assets}/mining-pit-operations.jpeg (99%) rename {assets => public/assets}/ms-word-tutorial/clear-formatting.png (99%) rename {assets => public/assets}/ms-word-tutorial/comment.png (99%) rename {assets => public/assets}/ms-word-tutorial/home-formatting.png (99%) rename {assets => public/assets}/ms-word-tutorial/home-quick-styles.png (99%) rename {assets => public/assets}/ms-word-tutorial/insert-1.png (99%) rename {assets => public/assets}/ms-word-tutorial/insert-2.png (99%) rename {assets => public/assets}/ms-word-tutorial/merge-formatting.png (99%) rename {assets => public/assets}/ms-word-tutorial/navigation-pane.png (99%) rename {assets => public/assets}/ms-word-tutorial/navigation-pane2.png (99%) rename {assets => public/assets}/ms-word-tutorial/navigation-pane3.png (99%) rename {assets => public/assets}/multiple-energies.png (99%) rename {assets => public/assets}/ruler/center.png (97%) rename {assets => public/assets}/ruler/left-small.png (98%) rename {assets => public/assets}/ruler/left-smallest.png (98%) rename {assets => public/assets}/ruler/left.png (98%) rename {assets => public/assets}/ruler/right-small.png (98%) rename {assets => public/assets}/ruler/right-smallest.png (98%) rename {assets => public/assets}/ruler/right.png (98%) rename {assets => public/assets}/sample-document-word.jpeg (100%) rename {assets => public/assets}/sample-module-learning-hub.jpeg (100%) rename {assets => public/assets}/signpost-small.jpg (100%) rename {assets => public/assets}/signpost.jpg (99%) rename {assets => public/assets}/src/sample-module.psd (99%) rename {assets => public/assets}/src/word-to-html-to-d2l.psd (99%) rename {assets => public/assets}/templates/annotated-sample-content-heavy-module.docx (100%) rename {assets => public/assets}/templates/annotated-sample-content-light-module.docx (100%) rename {assets => public/assets}/templates/annotated-sample-overview-module.docx (100%) rename {assets => public/assets}/templates/blank-working-document.docx (100%) rename {assets => public/assets}/templates/sample-course-content-notes.docx (99%) rename {assets => public/assets}/tooth-marks.jpg (100%) rename {assets => public/assets}/view-app.png (99%) rename {assets => public/assets}/word-to-html5.png (99%) rename {css => public/css}/prism.css (100%) create mode 100644 public/js/jquery-3.7.1.min.js delete mode 100644 scss/styles.scss rename {js => src/js}/ms-word-tutorial.js (100%) rename {js => src/js}/page-setup.js (97%) rename {js => src/js}/prism.js (100%) rename {pages => src/pages}/index.html (87%) rename {pages => src/pages}/interactions.html (61%) rename {pages => src/pages}/knowledge-check.html (57%) rename {pages => src/pages}/learning-blocks.html (68%) rename {pages => src/pages}/marker-reference.html (90%) rename {pages => src/pages}/media.html (54%) rename {pages => src/pages}/tables.html (54%) rename {pages => src/pages}/text.html (57%) rename {partials/interactions => src/partials}/accordion.html (100%) rename {partials/interactions => src/partials}/checklist.html (100%) rename {partials/interactions => src/partials}/custom-interactions.html (100%) rename {partials => src/partials}/feedback.html (100%) rename {partials/interactions => src/partials}/flashcards.html (100%) create mode 100644 src/partials/interactions/accordion.html create mode 100644 src/partials/interactions/checklist.html create mode 100644 src/partials/interactions/custom-interactions.html create mode 100644 src/partials/interactions/flashcards.html rename {partials => src/partials}/interactions/line-matching.html (100%) rename {partials => src/partials}/interactions/reveal.html (100%) rename {partials => src/partials}/interactions/swapper.html (100%) rename {partials => src/partials}/interactions/tabs.html (100%) rename {partials => src/partials}/knowledge-check/fill-in-blank.html (100%) rename {partials => src/partials}/knowledge-check/matching.html (100%) rename {partials => src/partials}/knowledge-check/multi-choice.html (100%) rename {partials => src/partials}/knowledge-check/multi-select.html (100%) rename {partials => src/partials}/knowledge-check/ordering.html (100%) rename {partials => src/partials}/learning-blocks/activity.html (100%) rename {partials => src/partials}/learning-blocks/assignment.html (100%) rename {partials => src/partials}/learning-blocks/case.html (100%) rename {partials => src/partials}/learning-blocks/definition.html (100%) rename {partials => src/partials}/learning-blocks/discussion.html (100%) rename {partials => src/partials}/learning-blocks/doing.html (100%) rename {partials => src/partials}/learning-blocks/example.html (100%) rename {partials => src/partials}/learning-blocks/group-activity.html (100%) rename {partials => src/partials}/learning-blocks/key-point.html (100%) rename {partials => src/partials}/learning-blocks/knowing.html (100%) rename {partials => src/partials}/learning-blocks/link.html (100%) rename {partials => src/partials}/learning-blocks/note.html (100%) rename {partials => src/partials}/learning-blocks/outcome.html (100%) rename {partials => src/partials}/learning-blocks/quiz.html (100%) rename {partials => src/partials}/learning-blocks/reading.html (100%) rename {partials => src/partials}/learning-blocks/reflection.html (100%) rename {partials => src/partials}/learning-blocks/review.html (100%) rename {partials => src/partials}/learning-blocks/warning.html (100%) create mode 100644 src/partials/line-matching.html rename {partials => src/partials}/media/audio.html (100%) rename {partials => src/partials}/media/images.html (100%) rename {partials => src/partials}/media/size-position.html (100%) rename {partials => src/partials}/media/slider.html (100%) rename {partials => src/partials}/media/videos.html (100%) rename {partials => src/partials}/menu.html (100%) create mode 100644 src/partials/reveal.html create mode 100644 src/partials/swapper.html rename {partials => src/partials}/tables/default.html (100%) create mode 100644 src/partials/tabs.html rename {partials => src/partials}/text/blockquotes.html (100%) rename {partials => src/partials}/text/headings.html (100%) rename {partials => src/partials}/text/hyperlinks.html (100%) rename {partials => src/partials}/text/math.html (100%) rename {partials => src/partials}/text/ordered.html (100%) rename {partials => src/partials}/text/paragraphs.html (100%) rename {partials => src/partials}/text/unordered.html (100%) rename {scss/constants => src/scss}/_colors.scss (100%) rename {scss/constants => src/scss}/_fonts.scss (100%) create mode 100644 src/scss/_variables.scss create mode 100644 src/scss/constants/_colors.scss create mode 100644 src/scss/constants/_fonts.scss rename {scss => src/scss}/mixins/_media-queries.scss (79%) rename {scss => src/scss}/partials/_feedback.scss (98%) rename {scss => src/scss}/partials/_home-page.scss (96%) rename {scss => src/scss}/partials/_ms-word-tutorial.scss (100%) rename {scss => src/scss}/partials/_wrapper.scss (93%) rename {scss => src/scss}/partials/element/_element.scss (86%) rename {scss => src/scss}/partials/element/_panels.scss (95%) rename {scss => src/scss}/partials/element/_preview.scss (100%) rename {scss => src/scss}/partials/element/_word.scss (83%) rename {scss => src/scss}/partials/menu/_menu.scss (97%) create mode 100644 src/scss/styles.scss create mode 100644 vite.config.js diff --git a/Dockerfile b/Dockerfile index 29e3eb8..1673118 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,35 +1,26 @@ -# Dockerfile - -## Build +# Development stage FROM node:24.10.0-alpine3.22 AS builder WORKDIR /app +# Copy package files and install dependencies COPY package*.json ./ -RUN npm install +RUN npm ci +# Copy source code COPY . ./ +# Build stage (for production) +FROM builder AS build RUN npm run build - -## Clean -FROM nginx:alpine AS cleaner - -WORKDIR /usr/share/nginx/html - -RUN rm -rf ./* - -COPY --from=builder /app/dist/ ./ -COPY --from=builder /app/nginx.conf /etc/nginx/conf.d/default.conf - - -## Release/production -FROM nginxinc/nginx-unprivileged:1.29-alpine3.22-perl AS release +# Production stage with nginx +FROM nginxinc/nginx-unprivileged:1.29-alpine3.22-perl AS production LABEL maintainer=courseproduction@bcit.ca -WORKDIR /usr/share/nginx/html +# Copy built files and nginx config +COPY --from=build /app/dist/ /usr/share/nginx/html/ +COPY --from=build /app/nginx.conf /etc/nginx/conf.d/default.conf -COPY --from=cleaner /usr/share/nginx/html/ ./ -COPY --from=builder /app/nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 8080 \ No newline at end of file diff --git a/README.md b/README.md index 3fa986e..10b2ece 100644 --- a/README.md +++ b/README.md @@ -12,13 +12,117 @@ The Course Production Conversion Guide is an online reference for anybody that d ## Development -**Requirements**: Docker, NodeJS +**Requirements**: Node.js 18+ (or Docker) + +### Local Development + +```bash +npm install +npm run dev +``` + +This will start the Vite dev server at `http://localhost:3000` with hot module replacement. + +### Production Build + +```bash +npm run build +``` + +This creates optimized production files in the `dist/` directory. + +### Preview Production Build + +```bash +npm run preview +``` + +This serves the production build locally at `http://localhost:4173` for testing. + +## Docker Development + +### Development with Docker ```bash -docker compose up --build +# Start development server with hot reload +docker-compose -f docker-compose.dev.yml up + +# Or with rebuild +docker-compose -f docker-compose.dev.yml up --build ``` -If you encounter an error, consider the following: +This runs the Vite dev server in a container with: +- Hot module replacement +- Volume mounting for live code changes +- Port 3000 accessible at `http://localhost:3000` + +### Production with Docker + +```bash +# Start production server +docker-compose up + +# Or with rebuild +docker-compose up --build +``` + +This creates an optimized production build served by nginx at `http://localhost:8080`. + +## Project Structure + +``` +├── src/ +│ ├── pages/ # HTML entry points +│ ├── partials/ # HTML includes and components +│ ├── scss/ # SCSS stylesheets +│ ├── js/ # JavaScript modules +│ └── css/ # Static CSS files +├── public/ +│ └── assets/ # Static assets (images, fonts, etc.) +├── dist/ # Production build output +├── vite.config.js # Vite configuration +├── Dockerfile # Multi-stage Docker build +├── docker-compose.yml # Production Docker Compose +└── docker-compose.dev.yml # Development Docker Compose +``` + +## Features + +- **Modern Build System**: Vite for fast development and optimized production builds +- **Multi-page Application**: Support for multiple HTML entry points +- **Custom Plugins**: + - HTML includes (`@@include()` syntax) + - Partial processing (XML-like tags to HTML) +- **SCSS Support**: Native Sass preprocessing with Vite +- **Docker Support**: Both development and production containers +- **Hot Module Replacement**: Instant updates during development +- **Clean URLs**: SEO-friendly routing without file extensions + +## Troubleshooting + +### Common Issues + +**Port already in use:** +```bash +# Kill processes using port 3000 +npx kill-port 3000 + +# Or use a different port +npm run dev -- --port 3001 +``` + +**Docker build fails:** +- Ensure Docker is running +- Check that all files are present in the project directory +- Try rebuilding with `--no-cache`: `docker-compose up --build --no-cache` + +**Sass deprecation warnings:** +- These are warnings from Sass about deprecated `@import` syntax +- They don't affect functionality but can be addressed by migrating to `@use` syntax + +### Development Tips -* Ensure Node.js (and npm) are installed on your computer -* Ensure you run the command from the project root (same folder as package.json) +- Use `npm run dev` for local development with the fastest feedback +- Use `docker-compose -f docker-compose.dev.yml up` for consistent environment +- Use `npm run preview` to test production builds locally +- The floating navigation bar appears when scrolling down on any page \ No newline at end of file diff --git a/css/hotspot.css b/css/hotspot.css deleted file mode 100644 index 2023afd..0000000 --- a/css/hotspot.css +++ /dev/null @@ -1,184 +0,0 @@ -.hotspot-container { - position: relative; -} - -.hotspot-container a:hover, -.hotspot-container a:focus { - color: #fff; - /* border-bottom: 1px solid #00A3E0; */ -} - -.element-hotspot { - position: relative; - display: none; - border-radius: 8px; - padding: 4px; - text-align: left; - line-height: 1.5em; - color: #fff; - background-color: rgba(0, 0, 0, 0.7); -} - -.element-hotspot .notch { - position: absolute; - padding: 0; - width: 0; - height: 0; -} - -.element-hotspot .notch-top { - top: -10px; - left: 50%; - margin-left: -10px; - border-top: 0; - border-right: 10px solid transparent; - border-bottom: 10px solid rgba(0, 0, 0, 0.7); - border-left: 10px solid transparent; -} - -.element-hotspot .notch-right { - top: 50%; - right: -10px; - margin-top: -10px; - border-top: 10px solid transparent; - border-right: 0; - border-bottom: 10px solid transparent; - border-left: 10px solid rgba(0, 0, 0, 0.7); -} - -.element-hotspot .notch-bottom { - bottom: -10px; - left: 50%; - margin-left: -10px; - border-top: 10px solid rgba(0, 0, 0, 0.7); - border-right: 10px solid transparent; - border-bottom: 0; - border-left: 10px solid transparent; -} - -.element-hotspot .notch-left { - top: 75%; - left: -10px; - margin-top: -10px; - border-top: 10px solid transparent; - border-right: 10px solid rgba(0, 0, 0, 0.7); - border-bottom: 10px solid transparent; - border-left: 0; -} - -.spots { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; -} - -.spot { - position: absolute; - text-align: center; - line-height: 30px; - font-size: 32px; - font-weight: bold; - color: #fff; - width: 32px; - height: 32px; - border: 1px solid #9D2235; - border-radius: 16px; - background-color: #9D2235; -} - -.spot:hover { - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -ms-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); -} - -#spot-name, -#spot-preview, -#spot-word, -#spot-html { - display: inline-block; -} - -#spot-name { - position: absolute; - top: 5%; - left: 37%; - width: 305px; -} - -#spot-name:hover > .element-hotspot { - display: block; - top: -90px; - left: 15% -} - -#spot-preview { - position: absolute; - top: 38%; - left: 63%; - width: 375px; -} - -#spot-preview:hover > .element-hotspot { - display: block; - top: 44px; - left: -46%; -} - -#spot-word { - position: absolute; - top: 77%; - left: 27%; - width: 300px; -} - -#spot-word:hover > .element-hotspot { - display: block; - top: -222px; - left: -134px; -} - -#spot-html { - position: absolute; - top: 86%; - left: 75%; - width: 300px -} - -#spot-html:hover > .element-hotspot { - display: block; - top: -71px; - left: -313px; -} - -.element-hotspot h3 { - color: #fff; - margin: 12px 0 12px 12px; -} - -.element-hotspot p { - margin: 4px 12px 12px 12px; - line-height: 1.2em; - font-style: italic; -} - - -/* -.element-hotspot:after { - top: 100%; - left: 50%; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; - border-color: rgba(255, 255, 255, 0); - border-top-color: #ffffff; - border-width: 10px; - margin-left: -10px; -}*/ \ No newline at end of file diff --git a/css/styles.css b/css/styles.css deleted file mode 100644 index edd81b7..0000000 --- a/css/styles.css +++ /dev/null @@ -1,2 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Merriweather|Oswald);@import url(https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css);body{background:#f1f1f1}.wrapper{position:relative;background:#f1f1f1;color:#838383;width:100%;float:right;overflow-x:hidden}.wrapper>header{text-align:center;padding-bottom:50px}.wrapper>header h1{font-size:44px;font-weight:600;padding:0;border-bottom:none;color:#003c71;text-transform:uppercase}.wrapper>header p{font-family:Merriweather,serif;font-size:20px;max-width:75%;display:block;margin-left:auto;margin-right:auto}@media only screen and (max-width:599px){.wrapper>header{padding-top:35px}.wrapper>header h1{margin-bottom:25px;font-size:50px}}@media only screen and (max-width:399px){.wrapper>header{padding-top:17.5px;padding-bottom:12px}.wrapper>header h1{margin-bottom:12px;font-size:40px}}.branding .menu-button,.nav-bar .menu-button{cursor:pointer;outline:0;padding:0;border:0;margin:0;background:0 0}.nav-bar{position:fixed;z-index:4;top:-100%;right:0;width:100%;padding-top:7px;padding-bottom:9px;padding-left:26px;background:#003c71}.nav-bar.showing{top:0;z-index:1000000}.nav-bar .menu-button{height:35px;width:35px;padding:4px 5px;border-radius:5px;transition:background .5s ease}.nav-bar .menu-button path{fill:#fff;transition:fill .5s ease}.nav-bar .menu-button:focus,.nav-bar .menu-button:hover{background:#fff}.nav-bar .menu-button:focus path,.nav-bar .menu-button:hover path{fill:#003c71}.nav-bar .nav-bar-title{border:none;color:#fff;font-family:Oswald,sans-serif;font-size:27px;margin-left:20px;font-weight:400}.nav-bar .nav-bar-title>a:active,.nav-bar .nav-bar-title>a:hover,.nav-bar .nav-bar-title>a:link,.nav-bar .nav-bar-title>a:visited{color:#fff}.nav-bar .nav-bar-title:after{content:"Course Production - Conversion Guide"}@media only screen and (max-width:549px){.nav-bar .nav-bar-title:after{content:"Conversion Guide"}}.marker-link{float:right;padding:2px 4px;color:#fff!important;text-decoration:none!important}.marker-link a{color:#fff!important;border-bottom:none}.marker-link a:focus,.marker-link a:hover{color:tint(#00a3e0,40%);border-bottom:none}.marker-link a:link{border-bottom:none!important}#close-menu{position:absolute;top:20px;right:10px;z-index:9999999;background-color:#00f!important;border:none;text-indent:-999999px;display:block;height:30px;width:30px}#close-menu:before{position:absolute;top:0;left:0;content:"X";padding-left:10px;text-indent:0;display:block}.branding{padding:30px 0;position:relative;display:inline-block;width:100%}.branding .menu-button{float:left;height:40px;width:40px;margin-left:30px;margin-top:23px;background:0 0;transition:background .5s ease;padding:5px;border-radius:5px}.branding .menu-button path{transition:fill .5s ease;fill:#838383}.branding .menu-button:focus,.branding .menu-button:hover{background:#838383}.branding .menu-button:focus path,.branding .menu-button:hover path{fill:#f1f1f1}@media only screen and (max-width:499px){.branding .menu-button{margin:11px 30px;margin-right:1em}}.branding .bcit-logo{float:left;background-image:url(../../assets/bcit-logo.svg);background-size:cover;margin-left:30px;margin-right:10px;position:relative;height:80px;width:80px}@media only screen and (max-width:619px){.branding .bcit-logo{display:none}}.branding .site-title-content,.branding .site-title-head{float:left;color:#003c71;font-family:Oswald,sans-serif;font-size:26px;font-weight:400;padding-top:22px}@media only screen and (max-width:499px){.branding .site-title-content,.branding .site-title-head{float:none;display:block;margin:0 auto;padding-top:10px}}.branding .site-title-head{margin-right:5px}@media only screen and (max-width:619px){.branding .site-title-head{margin-left:20px}}a.marker-reference{float:right;margin-top:6px;margin-right:15px}a.marker-reference:link{border-bottom:none}a.marker-reference:focus,a.marker-reference:hover{border-bottom:1px solid #fff}a.marker-reference span{font-family:Oswald,sans-serif;font-size:20px;font-weight:400;color:#fff}a.marker-reference .marker{display:none}@media only screen and (max-width:649px){a.marker-reference span{display:none}a.marker-reference .marker{display:inline;font-size:22px;font-style:italic;font-weight:700;color:#003c71;background-color:#fff;border-radius:25%;padding:0 7px}}.menu{color:#fff;background:#f1f1f1;border-right:1px solid #cecece}.menu ul{list-style-type:none;left:0;width:100%;margin-right:0;padding-right:0;padding-left:15px}.menu a{padding:2px 5px;color:#0072ce;border-bottom:none;text-decoration:none}.menu a:focus,.menu a:hover{color:tint(#00a3e0,40%)}.menu li .current{position:relative;background:#fff;display:block;width:100%}.menu li .current:after{content:"";display:block;background:#00a3e0;width:5px;height:100%;position:absolute;right:0;top:0}.menu .section{margin-top:20px}.menu .section:first-child{margin-top:15px}.menu .section>a{font-size:19px;font-weight:700;text-transform:uppercase}.menu .alt-menu-links{margin:2em auto;font-size:85%}.menu{position:fixed;z-index:5;top:0;left:-290px;width:280px;max-width:85%;overflow:hidden}.menu .scrolling{overflow-y:scroll;position:relative;height:100%;width:calc(100% + 17px);padding-left:17px;margin-right:17px}.menu{transition:left .3s ease-out}.wrapper{transition:width .3s ease-out}.nav-bar{transition:width .3s ease-out,top .25s ease-out}.menu-open .menu{left:0}@media only screen and (min-width:1101px){.menu-open .wrapper{width:calc(100% - 280px)!important}}@media only screen and (min-width:1101px){.menu-open .nav-bar{width:calc(100% - 280px)!important}}.menu a.new{position:relative}.menu a.new:after{content:"NEW";color:#fff;background:#1ea3cb;padding:1px 7px 2px;border-radius:25%;font-size:10px;top:-2px;font-weight:700;position:relative;margin-left:4px}.menu-overlay{visibility:hidden;opacity:0;background-color:rgba(0,0,0,.5);position:fixed;width:100%;height:100%;top:0;left:0;right:0;bottom:0;z-index:4;cursor:pointer;transition:all .3s ease-out}.element{background:#fff}.element{margin:15px;margin-bottom:30px;padding:2em 20px;border-radius:2px;padding-bottom:100px;transition:all .3s cubic-bezier(.25,.8,.25,1)}.element:hover{box-shadow:0 14px 28px rgba(0,0,0,.25),0 10px 10px rgba(0,0,0,.22)}.element>.blurb,.element>header{max-width:800px;margin:0 auto;display:block}.element>.blurb{margin-bottom:50px}.element>header{color:#42749e}.element>header h2{font-size:1.5em;font-weight:700;text-transform:uppercase}.element>button{position:relative;color:#42749e;font-weight:700;background:0 0;border:none;border-top:1px solid #dedede;text-align:left;padding:20px 10px;width:100%;max-width:800px;margin:0 auto;display:block;outline:0;transition:all .5s ease;cursor:pointer;text-transform:uppercase}.element>button:hover{color:#00a3e0}.element>button:after{position:absolute;display:block;right:20px;top:21px;font-family:FontAwesome;content:"\f055"}.element>button.open:after{font-family:FontAwesome;content:"\f056"}.border-bottom{border-bottom:1px solid #dedede;max-width:800px;display:block;margin:0 auto}.html,.notes,.word{max-width:720px;margin-top:50px;margin:0 auto;padding-bottom:20px}.notes>h1,.notes>h2,.notes>h3,.notes>h4,.notes>h5,.notes>h6{color:#42749e;text-transform:uppercase}.html-button:before,.notes-button:before,.preview-button:before,.word-button:before{font-family:FontAwesome;margin-right:8px}.preview-button:before{content:"\f06e"}.word-button:before{content:"\f1c2"}.html-button:before{content:"\f121"}.notes-button:before{content:"\f24a"}.preview-button{cursor:default!important}.preview-button:after{content:""!important}.preview-button:hover{color:#42749e!important}.preview{margin:0 auto;overflow:hidden;width:100%;padding:0 0 1.5em 0;position:relative}.narrow-preview .preview,.narrow-preview.preview{max-width:540px;margin-left:auto;margin-right:auto;overflow:visible}.preview.container>:first-child{margin-top:0}.preview.container>:last-child{margin-bottom:0}.word *{font-family:Calibri,Candara,Segoe,"Segoe UI",Optima,Arial,sans-serif!important}.word h1,.word h2,.word h3,.word h4,.word h5,.word h6{color:#4d6ea6;font-weight:700;margin-bottom:0;margin-top:30px}.word h1{border-bottom:none}.word p{margin-bottom:15px}.word td,.word th{border:1px solid gray}.word{font-family:calibri}.word .backing{padding:10px 20px 20px;background:#c8cdd2}.word .ruler{position:relative;height:22px;width:100%;background-image:url(../../assets/ruler/center.png);background-repeat:repeat-x;margin-bottom:10px}.word .ruler:before{content:"";position:absolute;left:0;height:22px;width:59px;background-image:url(../../assets/ruler/left-small.png);background-repeat:no-repeat}.word .ruler:after{content:"";position:absolute;right:0;height:22px;width:62px;background-image:url(../../assets/ruler/right-small.png);background-repeat:no-repeat}.word .paper{background:#fff;box-shadow:-2px 2px 20px #525559;padding:50px 55px;line-height:1.3}@media only screen and (max-width:599px){.word .paper{padding:30px 20px}.word .ruler:before{width:24px;background-image:url(../../assets/ruler/left-smallest.png)}.word .ruler:after{width:25px;background-image:url(../../assets/ruler/right-smallest.png)}}.word-tool-display{position:relative;display:block;border:2px solid #fff;margin-bottom:5px}.word-tool-display img{height:auto;width:100%;display:relative;z-index:1}.word-legend .status-yes,.word-tools .status-yes{background:green}.word-legend .status-no,.word-tools .status-no{background:red}.word-legend .status-depends,.word-tools .status-depends{background:orange}.word-legend [class^=status-],.word-tools [class^=status-]{opacity:.1;transition:opacity .5s ease;cursor:pointer}.word-legend [class^=status-]:hover,.word-tools [class^=status-]:hover{opacity:.5}.word-tools .tool-info{background:#e0e0e0;margin:10px 30px 0;padding:0 10px}.word-legend{list-style-type:none}.ug-splash{width:100%;height:auto;background-color:#003c71;color:#fff;text-align:center;vertical-align:middle;padding:10vw}.ug-splash p{font-size:2em;font-weight:300}.ug-splash a.btn{color:#fff;display:inline-block}.ug-content{padding:1em 1em 4em 1em;border-bottom:1px dotted #bababa;color:#515151;max-width:100%;margin-left:auto;margin-right:auto}.ug-content>*{position:relative;max-width:720px;margin-left:auto;margin-right:auto}.ug-content>h1{color:#003c71;border:none;text-align:center;font-size:2.5em}.ug-content>h2{margin-left:auto;margin-right:auto}.ug-content p{margin:1.5em auto}.grid{display:grid;grid-template-columns:45% 10% 45%;grid-template-rows:1fr 1fr}.arrow{max-width:100px;margin:0 auto;transform:translateY(30%) translateX(0)}.example-links{margin:0 auto;width:250px}.example-links figure{float:left;clear:none}.example-links figure a{height:0;padding-top:100%;display:block;position:relative;border:none}.example-links figure a:focus,.example-links figure a:hover{box-shadow:2px 2px 5px gray}.example-links figure a img{height:100%;width:100%;position:absolute;top:0}@media only screen and (max-width:550px){.example-links{width:150px}.arrow{width:0}}.no-js-msg{background-color:#fff3cd;border:1px solid #ffeaa7;color:#856404;padding:12px 20px;margin:10px;border-radius:4px;font-size:14px;text-align:center;display:none}.no-js .no-js-msg{display:block} -/*# sourceMappingURL=maps/styles.css.map */ diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..a669fbd --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,13 @@ +services: + app: + build: + context: . + target: builder + ports: + - "3000:3000" + volumes: + - .:/app + - /app/node_modules + environment: + - NODE_ENV=development + command: npm run dev diff --git a/docker-compose.yml b/docker-compose.yml index b95b24f..5d6848c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,12 +3,8 @@ services: image: conversion-guide build: context: . - target: release - # command: npm run watch - environment: - - DEBUG=True - working_dir: /app - # volumes: - # - .:/app + target: production ports: - "8080:8080" + environment: + - NODE_ENV=production \ No newline at end of file diff --git a/gulp-partial-processor.mjs b/gulp-partial-processor.mjs deleted file mode 100644 index 1d04098..0000000 --- a/gulp-partial-processor.mjs +++ /dev/null @@ -1,94 +0,0 @@ -import through from 'through2'; -import { Transform } from 'stream'; -import fs from 'fs'; -import path from 'path'; - -// Simple HTML beautify function -function beautify(html) { - // Basic HTML formatting - add line breaks and indentation - return html - .replace(/>\n<') - .replace(/^\s+|\s+$/gm, '') // trim lines - .split('\n') - .map(line => line.trim()) - .filter(line => line.length > 0) - .join('\n'); -} - -export function partialProcessor() { - return through.obj(function(file, enc, callback) { - if (file.isNull()) { - return callback(null, file); - } - - if (file.isStream()) { - return callback(new Error('Streaming not supported')); - } - - try { - let content = file.contents.toString(); - - // Process partial content - convert XML-like tags to HTML structure - content = processPartialContent(content); - - file.contents = Buffer.from(content); - this.push(file); - callback(); - } catch (err) { - callback(err); - } - }); -} - -function processPartialContent(content) { - // Check if this is a partial with XML-like tags - if (!content.includes('') && !content.includes('') && !content.includes('')) { - // This is not a partial with XML tags, return as-is - return content; - } - - // Extract the XML-like tags - const headingMatch = content.match(/(.*?)<\/heading>/s); - const blurbMatch = content.match(/(.*?)<\/blurb>/s); - const previewMatch = content.match(/(.*?)<\/preview>/s); - const wordMatch = content.match(/(.*?)<\/word>/s); - const notesMatch = content.match(/(.*?)<\/notes>/s); - - const heading = headingMatch ? headingMatch[1].trim() : ''; - const blurb = blurbMatch ? blurbMatch[1].trim() : ''; - const preview = previewMatch ? previewMatch[1].trim() : ''; - const word = wordMatch ? wordMatch[1].trim() : ''; - const notes = notesMatch ? notesMatch[1].trim() : ''; - - // Create the HTML structure that the JavaScript was creating - let html = ''; - - if (heading) { - html += `

${heading}

\n`; - } - - if (blurb) { - html += `
${blurb}
\n`; - } - - if (preview) { - html += `
${preview}
\n`; - - // Generate the HTML section at build time (replacing prism-setup.js functionality) - const beautifiedPreview = beautify(preview); - const escapedPreview = beautifiedPreview.split("<").join("<"); - html += `
${escapedPreview}
\n`; - } - - if (word) { - html += `
${word}
\n`; - } - - if (notes) { - html += `
${notes}
\n`; - } - - // Wrap in a section with proper ID - const safeId = heading ? heading.toLowerCase().replace(/\W+/g, '-') : 'unknown'; - return `
\n${html}
`; -} diff --git a/gulpfile.mjs b/gulpfile.mjs deleted file mode 100644 index 8c3f828..0000000 --- a/gulpfile.mjs +++ /dev/null @@ -1,122 +0,0 @@ -// jshint node:true - -import gulp from 'gulp'; -import gulpSass from 'gulp-sass'; -import sass from 'sass'; -import autoprefixer from 'gulp-autoprefixer'; -import sourcemaps from 'gulp-sourcemaps'; -import cleanCSS from 'gulp-clean-css'; -import browserSync from 'browser-sync'; -import fileInclude from 'gulp-file-include'; -import { partialProcessor } from './gulp-partial-processor.mjs'; -import path from 'path'; - -const bs = browserSync.create(); -const sassCompiler = gulpSass(sass); - -const sassSources = "./scss/**/*.scss"; -const cssDest = "./css"; -const mapDest = "./maps"; -const htmlSources = ["./pages/**/*.html", "./partials/**/*.html"]; -const htmlDest = "./dist"; - -// Compiles Sass, autoprefixes, minifies, and creates sourcemaps -function css() { - return gulp.src(sassSources) - .pipe(sourcemaps.init()) - .pipe(sassCompiler().on('error', sassCompiler.logError)) - .pipe(autoprefixer()) - .pipe(cleanCSS({ - level: 1 - })) - .pipe(sourcemaps.write(mapDest)) - .pipe(gulp.dest(cssDest)) - .pipe(gulp.dest(htmlDest + '/css')) - .pipe(bs.stream()); -} - -// Copy CSS files to dist directory -function copyCSS() { - return gulp.src('./css/*.css') - .pipe(gulp.dest(htmlDest + '/css')) - .pipe(bs.stream()); -} - -// Copy assets to dist directory -function copyAssets() { - return gulp.src('./assets/**/*', { encoding: false }) - .pipe(gulp.dest(htmlDest + '/assets')); -} - -// Copy JS files to dist directory -function copyJS() { - return gulp.src('./js/**/*') - .pipe(gulp.dest(htmlDest + '/js')) - .pipe(bs.stream()); -} - -// Process partials to convert XML-like tags to HTML -function processPartials() { - return gulp.src('./partials/**/*.html') - .pipe(partialProcessor()) - .pipe(gulp.dest('./processed-partials')); -} - -// Process HTML files and include partials -function html() { - return gulp.src('./pages/**/*.html') - .pipe(fileInclude({ - prefix: '@@', - basepath: path.resolve('./processed-partials/') - })) - .pipe(gulp.dest(htmlDest)) - .pipe(bs.stream()); -} - -// Build files once -gulp.task('build', gulp.series(processPartials, gulp.parallel(css, copyCSS, copyAssets, copyJS, html))); - -// Run BrowserSync after HTML changes -/* gulp.task("sync", function () { - // Pipe nothing - return gulp.src("!./") - .pipe(bs.stream()); -}); */ - -// Watch and build files on change -gulp.task('watch', function () { - processPartials(); - css(); - copyCSS(); - copyAssets(); - copyJS(); - html(); - bs.init({ - server: { - baseDir: "./dist", - middleware: function (req, res, next) { - // Handle clean URLs - const cleanUrls = { - '/text': '/text.html', - '/media': '/media.html', - '/interactions': '/interactions.html', - '/knowledge-check': '/knowledge-check.html', - '/learning-blocks': '/learning-blocks.html', - '/tables': '/tables.html', - '/marker-reference': '/marker-reference.html' - }; - - if (cleanUrls[req.url]) { - req.url = cleanUrls[req.url]; - } - - next(); - } - } - }); - gulp.watch('./partials/**/*', gulp.series(processPartials, html)); - gulp.watch(htmlSources, gulp.series(html)); - gulp.watch(sassSources, gulp.series(css, copyCSS)); - gulp.watch('./assets/**/*', gulp.series(copyAssets)); - gulp.watch('./js/**/*', gulp.series(copyJS)); -}); diff --git a/js/beauty.js b/js/beauty.js deleted file mode 100644 index 26c4849..0000000 --- a/js/beauty.js +++ /dev/null @@ -1,187 +0,0 @@ -/* Via: http://code.google.com/p/burp-suite-beautifier-extension/source/browse/trunk/src/burp/JSBeautifier/js/beautify-html.js?r=3 */ -function style_html(t, e) { - function i() { - return this.pos = 0, this.token = "", this.current_mode = "CONTENT", this.tags = { - parent: "parent1", - parentcount: 1, - parent1: "" - }, this.tag_type = "", this.token_text = this.last_token = this.last_text = this.token_type = "", this.Utils = { - whitespace: "\n\r ".split(""), - single_token: "br,input,link,meta,!doctype,basefont,base,area,hr,wbr,param,img,isindex,?xml,embed".split(","), - extra_liners: "head,body,/html".split(","), - in_array: function (t, e) { - for (var i = 0; i < e.length; i++) - if (t === e[i]) return !0; - return !1 - } - }, this.get_content = function () { - for (var t = "", e = [], i = !1; - "<" !== this.input.charAt(this.pos);) { - if (this.pos >= this.input.length) return e.length ? e.join("") : ["", "TK_EOF"]; - if (t = this.input.charAt(this.pos), this.pos++, this.line_char_count++, this.Utils.in_array(t, this.Utils.whitespace)) e.length && (i = !0), this.line_char_count--; - else { - if (i) { - if (this.line_char_count >= this.max_char) { - e.push("\n"); - for (var n = 0; n < this.indent_level; n++) e.push(this.indent_string); - this.line_char_count = 0 - } else e.push(" "), this.line_char_count++; - i = !1 - } - e.push(t) - } - } - return e.length ? e.join("") : "" - }, this.get_contents_to = function (t) { - if (this.pos == this.input.length) return ["", "TK_EOF"]; - var e = "", - i = new RegExp("", "igm"); - i.lastIndex = this.pos; - var n = i.exec(this.input), - s = n ? n.index : this.input.length; - return this.pos < s && (e = this.input.substring(this.pos, s), this.pos = s), e - }, this.record_tag = function (t) { - this.tags[t + "count"] ? (this.tags[t + "count"]++, this.tags[t + this.tags[t + "count"]] = this.indent_level) : (this.tags[t + "count"] = 1, this.tags[t + this.tags[t + "count"]] = this.indent_level), this.tags[t + this.tags[t + "count"] + "parent"] = this.tags.parent, this.tags.parent = t + this.tags[t + "count"] - }, this.retrieve_tag = function (t) { - if (this.tags[t + "count"]) { - for (var e = this.tags.parent; e && t + this.tags[t + "count"] !== e;) e = this.tags[e + "parent"]; - e && (this.indent_level = this.tags[t + this.tags[t + "count"]], this.tags.parent = this.tags[e + "parent"]), delete this.tags[t + this.tags[t + "count"] + "parent"], delete this.tags[t + this.tags[t + "count"]], 1 == this.tags[t + "count"] ? delete this.tags[t + "count"] : this.tags[t + "count"]-- - } - }, this.get_tag = function () { - var t = "", - e = [], - i = !1; - do { - if (this.pos >= this.input.length) return e.length ? e.join("") : ["", "TK_EOF"]; - t = this.input.charAt(this.pos), this.pos++, this.line_char_count++, this.Utils.in_array(t, this.Utils.whitespace) ? (i = !0, this.line_char_count--) : (("'" === t || '"' === t) && (e[1] && "!" === e[1] || (t += this.get_unformatted(t), i = !0)), "=" === t && (i = !1), e.length && "=" !== e[e.length - 1] && ">" !== t && i && (this.line_char_count >= this.max_char ? (this.print_newline(!1, e), this.line_char_count = 0) : (e.push(" "), this.line_char_count++), i = !1), e.push(t)) - } while (">" !== t); - var n, s = e.join(""); - n = s.indexOf(-1 != s.indexOf(" ") ? " " : ">"); - var h = s.substring(1, n).toLowerCase(); - if ("/" === s.charAt(s.length - 2) || this.Utils.in_array(h, this.Utils.single_token)) this.tag_type = "SINGLE"; - else if ("script" === h) this.record_tag(h), this.tag_type = "SCRIPT"; - else if ("style" === h) this.record_tag(h), this.tag_type = "STYLE"; - else if (this.Utils.in_array(h, unformatted)) { - var r = this.get_unformatted("", s); - e.push(r), this.tag_type = "SINGLE" - } else if ("!" === h.charAt(0)) - if (-1 != h.indexOf("[if")) { - if (-1 != s.indexOf("!IE")) { - var r = this.get_unformatted("-->", s); - e.push(r) - } - this.tag_type = "START" - } else if (-1 != h.indexOf("[endif")) this.tag_type = "END", this.unindent(); - else if (-1 != h.indexOf("[cdata[")) { - var r = this.get_unformatted("]]>", s); - e.push(r), this.tag_type = "SINGLE" - } else { - var r = this.get_unformatted("-->", s); - e.push(r), this.tag_type = "SINGLE" - } else "/" === h.charAt(0) ? (this.retrieve_tag(h.substring(1)), this.tag_type = "END") : (this.record_tag(h), this.tag_type = "START"), this.Utils.in_array(h, this.Utils.extra_liners) && this.print_newline(!0, this.output); - return e.join("") - }, this.get_unformatted = function (t, e) { - if (e && -1 != e.indexOf(t)) return ""; - var i = "", - n = "", - s = !0; - do { - if (this.pos >= this.input.length) return n; - if (i = this.input.charAt(this.pos), this.pos++, this.Utils.in_array(i, this.Utils.whitespace)) { - if (!s) { - this.line_char_count--; - continue - } - if ("\n" === i || "\r" === i) { - n += "\n", this.line_char_count = 0; - continue - } - } - n += i, this.line_char_count++, s = !0 - } while (-1 == n.indexOf(t)); - return n - }, this.get_token = function () { - var t; - if ("TK_TAG_SCRIPT" === this.last_token || "TK_TAG_STYLE" === this.last_token) { - var e = this.last_token.substr(7); - return t = this.get_contents_to(e), "string" != typeof t ? t : [t, "TK_" + e] - } - if ("CONTENT" === this.current_mode) return t = this.get_content(), "string" != typeof t ? t : [t, "TK_CONTENT"]; - if ("TAG" === this.current_mode) { - if (t = this.get_tag(), "string" != typeof t) return t; - var i = "TK_TAG_" + this.tag_type; - return [t, i] - } - }, this.get_full_indent = function (t) { - return t = this.indent_level + t || 0, 1 > t ? "" : Array(t + 1).join(this.indent_string) - }, this.printer = function (t, e, i, n, s) { - this.input = t || "", this.output = [], this.indent_character = e, this.indent_string = "", this.indent_size = i, this.brace_style = s, this.indent_level = 0, this.max_char = n, this.line_char_count = 0; - for (var h = 0; h < this.indent_size; h++) this.indent_string += this.indent_character; - this.print_newline = function (t, e) { - if (this.line_char_count = 0, e && e.length) { - if (!t) - for (; this.Utils.in_array(e[e.length - 1], this.Utils.whitespace);) e.pop(); - e.push("\n"); - for (var i = 0; i < this.indent_level; i++) e.push(this.indent_string) - } - }, this.print_token = function (t) { - this.output.push(t) - }, this.indent = function () { - this.indent_level++ - }, this.unindent = function () { - this.indent_level > 0 && this.indent_level-- - } - }, this - } - var n, s, h, r, a; - for (e = e || {}, s = e.indent_size || 4, h = e.indent_char || " ", a = e.brace_style || "collapse", r = 0 == e.max_char ? 1 / 0 : e.max_char || 70, unformatted = e.unformatted || ["a"], n = new i, n.printer(t, h, s, r, a);;) { - var _ = n.get_token(); - if (n.token_text = _[0], n.token_type = _[1], "TK_EOF" === n.token_type) break; - switch (n.token_type) { - case "TK_TAG_START": - n.print_newline(!1, n.output), n.print_token(n.token_text), n.indent(), n.current_mode = "CONTENT"; - break; - case "TK_TAG_STYLE": - case "TK_TAG_SCRIPT": - n.print_newline(!1, n.output), n.print_token(n.token_text), n.current_mode = "CONTENT"; - break; - case "TK_TAG_END": - if ("TK_CONTENT" === n.last_token && "" === n.last_text) { - var o = n.token_text.match(/\w+/)[0], - u = n.output[n.output.length - 1].match(/<\s*(\w+)/); - (null === u || u[1] !== o) && n.print_newline(!0, n.output) - } - n.print_token(n.token_text), n.current_mode = "CONTENT"; - break; - case "TK_TAG_SINGLE": - n.print_newline(!1, n.output), n.print_token(n.token_text), n.current_mode = "CONTENT"; - break; - case "TK_CONTENT": - "" !== n.token_text && n.print_token(n.token_text), n.current_mode = "TAG"; - break; - case "TK_STYLE": - case "TK_SCRIPT": - if ("" !== n.token_text) { - n.output.push("\n"); - var l = n.token_text; - if ("TK_SCRIPT" == n.token_type) var c = "function" == typeof js_beautify && js_beautify; - else if ("TK_STYLE" == n.token_type) var c = "function" == typeof css_beautify && css_beautify; - if ("keep" == e.indent_scripts) var p = 0; - else if ("separate" == e.indent_scripts) var p = -n.indent_level; - else var p = 1; - var g = n.get_full_indent(p); - if (c) l = c(l.replace(/^\s*/, g), e); - else { - var f = l.match(/^\s*/)[0], - d = f.match(/[^\n\r]*$/)[0].split(n.indent_string).length - 1, - T = n.get_full_indent(p - d); - l = l.replace(/^\s*/, g).replace(/\r\n|\r|\n/g, "\n" + T).replace(/\s*$/, "") - } - l && (n.print_token(l), n.print_newline(!0, n.output)) - } - n.current_mode = "TAG" - } - n.last_token = n.token_type, n.last_text = n.token_text - } - return n.output.join("") -} \ No newline at end of file diff --git a/package.json b/package.json index d6c1772..3aed1da 100644 --- a/package.json +++ b/package.json @@ -4,27 +4,21 @@ "author": "BCIT LTC, Course Production Team", "license": "MIT", "description": "guide for conversion", - "main": "gulpfile.mjs", + "type": "module", + "main": "vite.config.js", "directories": { "doc": "docs" }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "watch": "gulp build && gulp watch", - "quickly": "gulp watch", - "build": "gulp build" - }, - "dependencies": { - "browser-sync": "^3.0.2", - "gulp": "^5.0.0", - "gulp-autoprefixer": "^9.0.0", - "gulp-clean-css": "^4.3.0", - "gulp-sass": "^5.1.0", - "gulp-sourcemaps": "^3.0.0", - "sass": "^1.77.8" + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "test": "echo \"Error: no test specified\" && exit 1" }, "devDependencies": { - "gulp-file-include": "^2.3.0", - "through2": "^4.0.2" + "js-beautify": "^1.15.4", + "sass": "^1.93.2", + "vite": "^7.1.10", + "vite-plugin-compression": "^0.5.1" } } diff --git a/assets/.htaccess b/public/assets/.htaccess similarity index 100% rename from assets/.htaccess rename to public/assets/.htaccess diff --git a/assets/VentPipesPre-sessionReading.pdf b/public/assets/VentPipesPre-sessionReading.pdf similarity index 98% rename from assets/VentPipesPre-sessionReading.pdf rename to public/assets/VentPipesPre-sessionReading.pdf index f6d185e4a11d082ba918fe7e29c3527a717d958d..54d3b476db4179d0450212021eefca855883bdf2 100644 GIT binary patch delta 1160 zcmaKse@xV69LM=Q&xgC~dtKK&l~XIII1&+dAfS?*5_laHgOPKZb^?Y5tQbH1F{ia; z$}GnQ$9NJZVok5PY13PMTK=dgZk#_tL|IIw5jL%Xg}NDe9zEatUjO#}=lgoSKcDaC z*`DvS=ghRFHDr0pR-ETdPEE-$*?t}CA8avij8@W8)6+%vV~lJ0v{Ij${XIo+J;yVuMy zEQ;rn?`Mz65|)3Cb~ko_B6F zhzBzCsf}v_F!_W?oj?n{H3;=U16N@{q0fGSCZMEIc-}~b<8TOQVghbGO;s9Mb3AOcJH zxcF)*x6|#V+`zCh*#QWLwh^lSt=|KC2oGmA2`K&2j)_@19c$0%W(tgS73oolsM5%C!Lth#h>|D zO2q|eHH*r%SVO~Waf?9|l}r4#9NTqbb)`gqCHCsY{#uE_T3lif89O8%*@3ls5wlxj z({6l8FTU6(G4>;j(TmyxXb}Z1xSqT%7zld}jUK>}NNMn}EZINBUC~5g;Q7nwKLFMXRIOCtR@`=w`HMwd?ezI{mg{UI#X zhY!ElJR<$a5#);I*YDsuTKqdsan)a=T@%=B(n_(9Fke(Y!n2xY1<@rMgLp*KWsh-~ TW`}SmB>dmCk(!zrxj6m>VfwNh delta 1417 zcmX|>eQZ-z6u@`yJ=W6gZiEMPxageFF*Z7BU=0KTYkDv#4uULhU7UyEIkf!qyD27LFJ3^g(@et*vjrc2vAX>&NLS9qlD z@$^TA;_Nvld*<*>4D$kQQ+vYVBaY@t%kvn>gxakx6eq3g)54uiVq^A{wD?52QS`|? zTdL%`y#jv~T1QU(wHQPeLxfz&<3u z{~|k&JsK@n*-l~@W<}W;9SOFF_@`TJWHQEYlk9WkA3WT!GpUc;`C1IM`MePqPvrAD zN`CASUTakyYli;`zJOe0CaUFwuTGz zCMREtNnt0)F&Q_Ud|w;Jz%lbWe@1whIcd%K>IC0F`&xSWO9JD%sF`!*6#tmG`WOBt ztsgzZ&l2y9@wbSRzw#>V!+7SB$%ilVJ2bfO2KW#~|Df`RhIr*eh?Up)W-99*;TD?r z!J8%*CU_mKx7_CSv_5!;_vc~U%Z19H3?fc^OEbB4ng|g8F-xd%v=obXuudPFEy{DG zZDL{~nM`J7Wl4R0iJ$@H&Jlh}&`ZSu#Hupkrt55*D^^oH=M;82#)wO-B6iOgy>!g` zZsDV{riCJbp~x#Vy>XFv6qj}^5>`B+>AqMj`q4E#C4R))POcj<<`vcyYWmI9f^I_T zi^42KEnZf5*e1Nk^g{jXYh9kG55Y{7?5zqnpu z<*TrpY6lt>dYd5nFrxG+Z1%xINVW%JLghgS{^uBgj zhgT~MK!3)KeX88coiLPf-Y(_7?t&J4KB$(OY!5?r3N^iZze=$k0D2|O?Q;#~HW_d} zllMYIxqT7%IkWwasB*(mSe2>u#FYCo23|V3YIppSa%(O_1Jxdmt2Ro8K;T=imyN<} z*j48!{7ZukCg54bcmmoa;^qfbtDk-V5ey%U0lo59$6znfe}K=G@y0kb;|-(#(_CqD Kx!jq5)c*l6s-$KB diff --git a/assets/bcit-logo.svg b/public/assets/bcit-logo.svg similarity index 100% rename from assets/bcit-logo.svg rename to public/assets/bcit-logo.svg diff --git a/assets/conversion-guide-training-checklist.md b/public/assets/conversion-guide-training-checklist.md similarity index 100% rename from assets/conversion-guide-training-checklist.md rename to public/assets/conversion-guide-training-checklist.md diff --git a/assets/create-mr.png b/public/assets/create-mr.png similarity index 99% rename from assets/create-mr.png rename to public/assets/create-mr.png index 9ba2dc7a61ec1781a5e7ca20e01bd6e0b174b548..2cbbca9c8e41a5a6040b2cc27452b1dda8605af0 100644 GIT binary patch delta 15 WcmeBP!ql~diKR2Z&wV2++av%iA_XD< delta 16 XcmeBL!qmNliM2Dp&z*N83)>_BFgpb= diff --git a/assets/damaged-log-small.jpg b/public/assets/damaged-log-small.jpg similarity index 100% rename from assets/damaged-log-small.jpg rename to public/assets/damaged-log-small.jpg diff --git a/assets/damaged-log.jpg b/public/assets/damaged-log.jpg similarity index 99% rename from assets/damaged-log.jpg rename to public/assets/damaged-log.jpg index 87c2f3a1cc61fee65e75463438dfcf996511bd82..31656559658877684ba6842e29f04ddb73b95b39 100644 GIT binary patch delta 45 zcmZ2ClY7-n?hX9Xn+2qm@;4iIxiC&H?2VW_p__N}-EKpsX8yi*{yxU-{C!OG?EsKp B5eWbQ delta 62 zcmZ2AlY8Av?hX9XjJ%uqrIqr5lwp?(BNH#zWXGQ5&2~K$!iI{w>*OigC RnY*u@yN_`@cOTPyI{biM2Dp&z*N8%m0}GGZ_X! diff --git a/assets/examples/arrow.gif b/public/assets/examples/arrow.gif similarity index 100% rename from assets/examples/arrow.gif rename to public/assets/examples/arrow.gif diff --git a/assets/examples/assets/1.jpeg b/public/assets/examples/assets/1.jpeg similarity index 99% rename from assets/examples/assets/1.jpeg rename to public/assets/examples/assets/1.jpeg index b7b737180c8cd63daaecc7cbda0bcb4423fe2a53..844c10fbd1dc683cd3f0f2598ee434d4131cce10 100644 GIT binary patch delta 33 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 diff --git a/assets/examples/example-business.docx b/public/assets/examples/example-business.docx similarity index 99% rename from assets/examples/example-business.docx rename to public/assets/examples/example-business.docx index 93a6be5cd5bde6d3ee92ea200ace99e145535ccf..18a9bd2c396ad354079c39a3d4397c92ca777298 100644 GIT binary patch delta 33 pcmZpC!~5?wZ^IVGZK~V1t1@P3Y*+GQEOBk0KACa*^vO(Fj{yEx4ru@Y delta 39 scmezOnz!){Z^IVGZK{mC+kr%u29Q?pV=QrH@_6-KHjJ(YTvD<;PRy-r`_NYCKoQ?platay% diff --git a/assets/examples/example-health.html b/public/assets/examples/example-health.html similarity index 100% rename from assets/examples/example-health.html rename to public/assets/examples/example-health.html diff --git a/assets/examples/thumb-example-business-word.jpg b/public/assets/examples/thumb-example-business-word.jpg similarity index 100% rename from assets/examples/thumb-example-business-word.jpg rename to public/assets/examples/thumb-example-business-word.jpg diff --git a/assets/examples/thumb-example-business.png b/public/assets/examples/thumb-example-business.png similarity index 99% rename from assets/examples/thumb-example-business.png rename to public/assets/examples/thumb-example-business.png index 031a07f452a73beaa985aee7cfb5dc18e3f48faf..f8400a28a729aeec576e83ea1edb3a61798a121a 100644 GIT binary patch delta 25 hcmbQZiMekRGfQWHpZiAEgPfa>bNcPrEOzL(7yyFC3ZVc1 delta 30 lcmeC%#5{2mGizsnpF8hHmV=y(yqk}5`t1Nx!iRo~0RW?;3dH~b diff --git a/assets/examples/thumb-example-health-word.jpg b/public/assets/examples/thumb-example-health-word.jpg similarity index 100% rename from assets/examples/thumb-example-health-word.jpg rename to public/assets/examples/thumb-example-health-word.jpg diff --git a/assets/examples/thumb-example-health.png b/public/assets/examples/thumb-example-health.png similarity index 99% rename from assets/examples/thumb-example-health.png rename to public/assets/examples/thumb-example-health.png index b44ff1ad5b462905d0d850ac809e226ef78fa79b..fc21d39cd007630c0d8cd976abc8358e4f7f91a1 100644 GIT binary patch delta 15 WcmZ2;n{oARMwZS1KlhES%X0xX0tQR~ delta 16 XcmZ2|n{mx;M%K;%KX=}ZEX#8NI>`oE diff --git a/assets/favicon.ico b/public/assets/favicon.ico similarity index 99% rename from assets/favicon.ico rename to public/assets/favicon.ico index 85912162c4b8ad7f3639885450affd8eb4448035..d5244425e3292f941ac5606a1a87871588645453 100644 GIT binary patch delta 12 Tcmdm&y*GP9tk&i@tpsiWC;0_0 delta 14 Vcmdm+y)S!1tQI5h=2)!+ZU8S@1v~%% diff --git a/assets/fibre-damage-small.jpg b/public/assets/fibre-damage-small.jpg similarity index 100% rename from assets/fibre-damage-small.jpg rename to public/assets/fibre-damage-small.jpg diff --git a/assets/fibre-damage.jpg b/public/assets/fibre-damage.jpg similarity index 99% rename from assets/fibre-damage.jpg rename to public/assets/fibre-damage.jpg index 89dfaf8ab5f64fcbca443b58630ff28b25422023..bb874f44fa3c9ad6ba0f766fc9fccdaf0bd37254 100644 GIT binary patch delta 12 Tcmex5mFde=rU_Xav%9(gDq;pg delta 14 Vcmew|mFeqLrU_Y$yc@H+x&SiA22TJ0 diff --git a/assets/hamburger.svg b/public/assets/hamburger.svg similarity index 100% rename from assets/hamburger.svg rename to public/assets/hamburger.svg diff --git a/assets/hyperlink.png b/public/assets/hyperlink.png similarity index 100% rename from assets/hyperlink.png rename to public/assets/hyperlink.png diff --git a/assets/lumber-yard-small.jpg b/public/assets/lumber-yard-small.jpg similarity index 100% rename from assets/lumber-yard-small.jpg rename to public/assets/lumber-yard-small.jpg diff --git a/assets/lumber-yard.jpg b/public/assets/lumber-yard.jpg similarity index 99% rename from assets/lumber-yard.jpg rename to public/assets/lumber-yard.jpg index fd498c0fc87657b34946beb28d98ec2954d29836..a8985417d19381c557668ca952e49aee90f2d800 100644 GIT binary patch delta 545 zcmWN=Pe{{o7zbcBx7Idmf7{Y+t(IlB&6>Z=wA$R%DWw>~2kxD)O?e~1 zSXPvDP>{x|L$UHx8P?dv7Bz$LP*Bdnm_;bkq0*@D1J4rf@t?An26zMfCq=hCxZ^4M z^Ab0df^HtIsRUS42?J8{8HMaR_>3a|b-Z{i^7WCHTMsQKu4sp|U%dPkRVO9CEwEgZ zD4=MPN2uZSwCC0oJnMoZRQs=}$CX7Ok0$ym^nu|`&DK3$3V^d9~c z0s2v564A7V`2Fn0v!I~(3SfK$|{3z0w4$Tqx4Yhydf@vAH&Li*SnC;lf#M4)VfvQyPpdH%m92 zGcMA(HfI+#vNwmLn%zVz>c*|wYRHCBHl5=la;+XOe)~P|^MAg5i}aAa32p^g0ru0p zDL1Q#rrdddmf>*`rN1q*ULc#P*HYW{ksm`hVC$J=rpa*kZnl~*^);(f8m?S_u8@D ze`%6hpd(FEUnWNH%IcXf=vxv7YDrZ3caWFkRkR#G%8nw(g4GlY*7P=FtA1M(z6ifE z9Q*tgzRx%Q4Z>4n#*a6#?GqlSKA|bbLDoo2-~?$T=Cy0sFt^Q*o8hInIkSrQ*_o3x zJ7bxSpsRITGct5)pB30h?W>Kwz@4f-MX74Lz=O?p$UfYSZXj(34jM>1=dR-}?Ql_P zN8NJO zcALlS2TrvAUCjZ+oIuP4#N0s4v;FUCUIWeTdRKWb*tY){;@kdTh<}#H_F2*VjfVi% CwllE+ delta 120 zcmbQd$6@v!hYb^&8F`y0G;aseU#b~-+gtuK0x{F}mjBG_4+8nd2U)foA7o`!0Oc8kaC2TlO_KUQ-9F((jn0Wmia^KAdIn%6*+k$1bsRo)A>AT>gK+kXi0&+-6@ KO^W7kJOlucX*10L diff --git a/assets/mining-pit-operations.jpeg b/public/assets/mining-pit-operations.jpeg similarity index 99% rename from assets/mining-pit-operations.jpeg rename to public/assets/mining-pit-operations.jpeg index 1f7f7409e244a24cc0c7d089c424e4882fa90e7c..0f8a248f06f2d5f3c39a0a9532db24386b2a72a3 100644 GIT binary patch delta 21 dcmdne$GNGGbAsDO_cMLXBK_M%`WY2=003zW2^IhV delta 25 hcmdng$GN4CbAlTq??$&XeT=-#LjBu?`WY2=004ZP2`vBs diff --git a/assets/ms-word-tutorial/clear-formatting.png b/public/assets/ms-word-tutorial/clear-formatting.png similarity index 99% rename from assets/ms-word-tutorial/clear-formatting.png rename to public/assets/ms-word-tutorial/clear-formatting.png index 91331a9569f624adbee0be28751f9597ffc9eb0b..17b2803b47c4455eb44c4bdb44e0b96ff9a775f1 100644 GIT binary patch delta 13 UcmbPNG`EPQGr-S%Bdeq(041*kng9R* delta 14 VcmbPRG_Q!YGr-TCcO#3WB>*Xh1g8K1 diff --git a/assets/ms-word-tutorial/comment.png b/public/assets/ms-word-tutorial/comment.png similarity index 99% rename from assets/ms-word-tutorial/comment.png rename to public/assets/ms-word-tutorial/comment.png index 1c129a60184ba61fddf62c4a223db9593dd6c3b3..d8ef6c61c6abacf19483dbb1c78fc648662b7cfa 100644 GIT binary patch delta 18 Zcmewm{VtlNGr-S%BWp9y=1!h;MF34R2OIzZ delta 21 ccmaDC{UMsQGr-TCcOy$P4ScsP)yGr-S%BkO(*04JmcIRF3v delta 14 VcmX>ccqEXuGr-TCcO%Pw4FD^K1x5e> diff --git a/assets/ms-word-tutorial/home-quick-styles.png b/public/assets/ms-word-tutorial/home-quick-styles.png similarity index 99% rename from assets/ms-word-tutorial/home-quick-styles.png rename to public/assets/ms-word-tutorial/home-quick-styles.png index c0ac293c081cf53aeb18e2bcb698f30a8e25241a..5027fdbcc128250c40f365d2b9e63d6790718639 100644 GIT binary patch delta 15 Wcmcb=hVkASMwZS1KlhESQDFc!8wKzH delta 16 Xcmcb&hVlLyM%K;%KX=}ZEKy+qI_d@e diff --git a/assets/ms-word-tutorial/insert-1.png b/public/assets/ms-word-tutorial/insert-1.png similarity index 99% rename from assets/ms-word-tutorial/insert-1.png rename to public/assets/ms-word-tutorial/insert-1.png index 8d9a22065c865d5bd14829ec6b62af3eef2655f8..1e229e68c4ba800291024f06cb33cba05fb042a5 100644 GIT binary patch delta 13 Ucmdn*vd@L3Gr-S%Bde7X03`kdiU0rr delta 14 VcmdnzvfqWZGr-TCcO#3H5&$T?1eX8+ diff --git a/assets/ms-word-tutorial/insert-2.png b/public/assets/ms-word-tutorial/insert-2.png similarity index 99% rename from assets/ms-word-tutorial/insert-2.png rename to public/assets/ms-word-tutorial/insert-2.png index 6e4778b2c5db53c677e9d1defaa04c1b738de80b..5a425b6af40edc94cead6c22c6f087472b5ef651 100644 GIT binary patch delta 13 UcmX>Qx<8bqGr-S%BkOK004J6OHvj+t delta 14 VcmdlVdLWdwGr-TCcO%PgEdVQc1w;S< diff --git a/assets/ms-word-tutorial/merge-formatting.png b/public/assets/ms-word-tutorial/merge-formatting.png similarity index 99% rename from assets/ms-word-tutorial/merge-formatting.png rename to public/assets/ms-word-tutorial/merge-formatting.png index 113d6171ced29e9b5e8a8f2fe85aa886af4855ca..97453647bba270f12edef86ec80be82d0ef0fb9c 100644 GIT binary patch delta 13 UcmZpYZj@%}4DfT`$Xd$_030y`>;M1& delta 14 VcmZpaZjxs04DfU3-N;hQ3jiM@1Ni^| diff --git a/assets/ms-word-tutorial/navigation-pane.png b/public/assets/ms-word-tutorial/navigation-pane.png similarity index 99% rename from assets/ms-word-tutorial/navigation-pane.png rename to public/assets/ms-word-tutorial/navigation-pane.png index 9b60deb94ae19846de7300ed2680446704c796ad..8e662c88ebcea669ea40f4ecf8ad760ce5feb173 100644 GIT binary patch delta 13 UcmX?|bSjCZGr-S%BdePs04Ui6`2YX_ delta 14 VcmX?=bUKN(Gr-TCcO#3NApk7v1qJ{B diff --git a/assets/ms-word-tutorial/navigation-pane2.png b/public/assets/ms-word-tutorial/navigation-pane2.png similarity index 99% rename from assets/ms-word-tutorial/navigation-pane2.png rename to public/assets/ms-word-tutorial/navigation-pane2.png index 43240988216bc80392c8e45da1ad968d3f2c9326..358ce0b29c207bf88723ea8b5c0b050c8207a9ec 100644 GIT binary patch delta 13 UcmaE({92i%Gr-S%BkOZP04J#hJ^%m! delta 14 VcmaE@{6?9zGr-TCcO%PlK>#a%1xo+` diff --git a/assets/ms-word-tutorial/navigation-pane3.png b/public/assets/ms-word-tutorial/navigation-pane3.png similarity index 99% rename from assets/ms-word-tutorial/navigation-pane3.png rename to public/assets/ms-word-tutorial/navigation-pane3.png index 167893a403a7f929567367700767c167265e1a96..bfd8f97be2a54e0aa57fa543f7ddce785d3699f1 100644 GIT binary patch delta 18 ZcmeyF_&t%OGr-S%BkLrM%`-F-IRH?h2XO!Z delta 21 ccmeyK_%o5UGr-TCcO%Or4MyJ0(=-w}0ASn)iU0rr diff --git a/assets/multiple-energies.png b/public/assets/multiple-energies.png similarity index 99% rename from assets/multiple-energies.png rename to public/assets/multiple-energies.png index d171a480593cc01f7b61050bb3333897a7a9da2d..be597017792cc773d727f7412cc3d8de532739fb 100644 GIT binary patch delta 15 XcmdnCoq6kaW|qzXKlhES8*c*uG&}~B delta 16 YcmdnGoq5}KX4cLCKX=}ZEE{hF065bIp#T5? diff --git a/assets/ruler/center.png b/public/assets/ruler/center.png similarity index 97% rename from assets/ruler/center.png rename to public/assets/ruler/center.png index 3007f545fb3f5fe8996fc1d1d9b20a0227d15a32..9f818a8de2d431a266ae54be59d29f7f9f22f5ce 100644 GIT binary patch delta 12 TcmaFBc%PA_Gr-S%BI|7c9!~_N delta 13 Ucmcc5_<)hMGr-TCcOuJe03o~tvH$=8 diff --git a/assets/ruler/left-small.png b/public/assets/ruler/left-small.png similarity index 98% rename from assets/ruler/left-small.png rename to public/assets/ruler/left-small.png index b4ef104f4556a5b2d387b7972b9f336f91d81ce9..fc106ae55237510f8ea853c6f5a4ac6a3c1a221e 100644 GIT binary patch delta 13 UcmbQwJdc^BGr-S%BkL?i038Pe2LJ#7 delta 14 VcmbQoJfE4hGr-TCcO%OzMgSlK1QY-O diff --git a/assets/ruler/left-smallest.png b/public/assets/ruler/left-smallest.png similarity index 98% rename from assets/ruler/left-smallest.png rename to public/assets/ruler/left-smallest.png index 8fe50395ddf34583b7d214abf2365647d51de0dd..f89cb6decd80b895db120c08dc64d44103b21158 100644 GIT binary patch delta 13 UcmbQrJcXI1Gr-S%BkKf402~7Y=>Px# delta 14 VcmbQjJe8TXGr-TCcO%OLMgSh`1NHy_ diff --git a/assets/ruler/left.png b/public/assets/ruler/left.png similarity index 98% rename from assets/ruler/left.png rename to public/assets/ruler/left.png index b5e7f2c38f4b89522d18dd51fe87e793c7a068c3..bb33d7ce28ab01be2400a9fc599dabc6c9b8dc1a 100644 GIT binary patch delta 13 UcmX@de3qG|Gr-S%BkM^<03po;lmGw# delta 14 VcmX@he2$s5Gr-TCcO%P5MgS!z1fc)` diff --git a/assets/ruler/right-small.png b/public/assets/ruler/right-small.png similarity index 98% rename from assets/ruler/right-small.png rename to public/assets/ruler/right-small.png index 55e653c5ba7b54380024f4eeec71093234578d61..63f5bc0a82238b0d1f03f24de7077f83c7aba203 100644 GIT binary patch delta 13 UcmdnRw3CUYGr-S%BdaMR03NRc)&Kwi delta 14 VcmdnVw2O(gGr-TCcO#1_BLE@a1LFVy diff --git a/assets/ruler/right-smallest.png b/public/assets/ruler/right-smallest.png similarity index 98% rename from assets/ruler/right-smallest.png rename to public/assets/ruler/right-smallest.png index 15143bb75b3568d90e196955bc0f6880b9207c22..00db4630ddcf91c71d70cf9e41c8fd6039a99725 100644 GIT binary patch delta 13 UcmdnRw3CUYGr-S%BdaMR03NRc)&Kwi delta 14 VcmdnVw2O(gGr-TCcO#1_BLE@a1LFVy diff --git a/assets/ruler/right.png b/public/assets/ruler/right.png similarity index 98% rename from assets/ruler/right.png rename to public/assets/ruler/right.png index 4ae07265d4b45e5db07292035bbd2cf6b96f1f46..91caf2346ca13e63420b7f0e8222749fba2c2fc3 100644 GIT binary patch delta 13 UcmbQtJc*g5Gr-S%BWoWc02|K(;{X5v delta 14 VcmbQlJeirbGr-TCcOy$5BLE(=1MmO< diff --git a/assets/sample-document-word.jpeg b/public/assets/sample-document-word.jpeg similarity index 100% rename from assets/sample-document-word.jpeg rename to public/assets/sample-document-word.jpeg diff --git a/assets/sample-module-learning-hub.jpeg b/public/assets/sample-module-learning-hub.jpeg similarity index 100% rename from assets/sample-module-learning-hub.jpeg rename to public/assets/sample-module-learning-hub.jpeg diff --git a/assets/signpost-small.jpg b/public/assets/signpost-small.jpg similarity index 100% rename from assets/signpost-small.jpg rename to public/assets/signpost-small.jpg diff --git a/assets/signpost.jpg b/public/assets/signpost.jpg similarity index 99% rename from assets/signpost.jpg rename to public/assets/signpost.jpg index f8a89cad097c22b2ae7621b14c349ad8b62078c9..285f4c30dc9be19e967f15cc397787c39fe326c1 100644 GIT binary patch delta 122 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 diff --git a/assets/src/word-to-html-to-d2l.psd b/public/assets/src/word-to-html-to-d2l.psd similarity index 99% rename from assets/src/word-to-html-to-d2l.psd rename to public/assets/src/word-to-html-to-d2l.psd index 4dcdcc1ba440572b34dd3d3074c71a834158e0dd..53752fc1419d646b100de6f810ceafe34efb644c 100644 GIT binary patch delta 19 bcmZ2ApLNB2)(s^mHkY0V71(_G#{Dt?Vz>&2 delta 23 ecmZ26pLNxI)(s^m7k)<=h&wV2+M>YU400my2Fw5e delta 21 ccmaFv`_h-SGr-TCcOy%RFeC5g4B>iV09bAY+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0