diff --git a/.gitattributes b/.gitattributes index 07764a7..94f480d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -* text eol=lf \ No newline at end of file +* text=auto eol=lf \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 29e3eb8..b63ff69 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 install --no-fund +# 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 e10fb12..bc60cab 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,89 @@ This is an online reference for anybody that develops, produces, or maintains an ## Development -**Requirements**: Docker, NodeJS +**Requirements**: Node.js 24+ (or Docker) +> **Modernized**: This project has been modernized from Gulp to Vite for faster development and better performance. + +### 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 with gzip and Brotli compression. + +### 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 -f docker-compose.dev.yml up --build +``` + +This runs the Vite dev server in a container with hot module replacement at `http://localhost:3000`. + +### Production with Docker + +```bash +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 +├── public/ +│ └── assets/ # Static assets +├── dist/ # Production build output +└── vite.config.js # Vite configuration +``` + +## 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()`) and partial processing +- **SCSS Support**: Native Sass preprocessing with modern `@use` syntax +- **Compression**: Automatic gzip and Brotli compression for production +- **Docker Support**: Both development and production containers +- **Hot Module Replacement**: Instant updates during development +- **Clean URLs**: SEO-friendly routing without file extensions + +## Troubleshooting + +**Port already in use:** ```bash -docker compose up --build +npx kill-port 3000 ``` -If you encounter an error, consider the following: +**Docker build fails:** +- Ensure Docker is running +- Try rebuilding with `--no-cache`: `docker-compose up --build --no-cache` -* Ensure Node.js (and npm) are installed on your computer -* Ensure you run the command from the project root (same folder as package.json) +**Missing styles after Docker rebuild:** +- Ensure HTML files reference `/css/page-setup.css` (not SCSS source) +- Check that `src/js/page-setup.js` imports the main SCSS file \ 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/pages/index.html b/pages/index.html deleted file mode 100644 index a6a5fd5..0000000 --- a/pages/index.html +++ /dev/null @@ -1,765 +0,0 @@ - - - - - - - - - Conversion Guide | BCIT Course Production - - - - - - - - - - -
This site works best with JavaScript enabled for interactive features like accordions, reveals, and navigation enhancements.
- -
-
-

The Conversion Guide is a reference for preparing Word documents for conversion to HTML.

-
-
-

Overview

-

This Conversion Guide outlines ways to prepare your content in Word so that it can be processed into HTML easily and effectively, and uploaded to a learning management system such as BCIT's Learning Hub.

-
word, html5 logos
-

Why follow this guide?

-
    -
  1. Simple markers ensure clear communication of your ideas
  2. -
  3. Standard templates provide consistent structure and aesthetics
  4. -
  5. Clear instructions enable a seamless process of conversion
  6. -
-

How to use this guide

-

Word documents serve as the build files for the modules in your course. Build files include:

-
    -
  • Course content (text, images, hyperlinks)
  • -
  • Instructions about how to convert and assemble course elements (markers and comments to the production team)
  • -
-

This guide introduces a variety of course production elements - different ways to display course content. When crafting the content of your build file, you can include any of these elements.

-

Below is an example of a quiz element:

-
example element -
Example of an element
-
-

Elements have various components:

-
-
Preview
-
A preview of the element as it will be seen on the webpage.
-
Word
-
An example showing the Word text that you provide to achieve what's in the preview.
-
HTML
-
The underlying HTML code.
-
Notes
-
Additional information such as options and restrictions for formulating your content.
-
-

When we receive your build file, the course production team will use it to quickly convert the content into HTML and upload it to the Learning Hub.

- -

Examples of how Course Production works

-

Below are some before and after examples of content converted from Word into web format.

- -
- - -
- - - - - -
- - - -
-
- -
-

Getting Started

-
    -
  1. Review the Essential Tips to learn useful tips and avoid some of the common pitfalls of using Word to create your build files.
  2. -
  3. Familiarize yourself with all of the elements available through the menu. -
  4. -
  5. Scan the MS Word Tutorial section to learn which tools are best to use and which ones could cause problems.
  6. -
  7. Choose a document to work from in the Templates section.
  8. -
  9. Refer back to this guide regularly as you develop your content.
  10. -
- -
- -
-

Essential Tips

-

Here are some things to consider when preparing your content:

-
-

Navigating content in Word

-

The Navigation Pane is a great way to view the structure of your content. Under the View menu, check the Navigation Pane box.

- navigation pane howto -

The Navigation Pane gives you a good overview of the structure of your content, and allows you to move quickly around your document by clicking on a heading.

-
-

Ideally the navigation follows a "stair-step" content structure. secondary navigation pane howto

-
-

By right-clicking on a heading, you can gain access to various tools for working on your build files.

- navigation pane tools howto -

In the example above, selecting Promote would change Sub-Topic to Heading 2.

-

Leaving special instructions

-

Word comments are the best way to leave instructions for the course production team:

-
    -
  1. Select the word or paragraph that you want to leave instructions about
  2. -
  3. Right-click and choose New Comment
  4. -
word comment howto -

Alternatively, you can press Ctrl + Alt + M on a Windows computer or Command + Option + A on a Mac.

-
-

Instructions that are embedded directly in the text will likely be missed!

-
-

Copying content from Word, PDFs, and other sources

-

If you're pasting content from other sources, try to clear or merge the formatting so that the text uses the Normal style. This ensures that any hidden formatting in Word will not emerge in the HTML.

merge formatting howto -

If you forget this step, you can always go back and clear the formatting later.

clear formatting howto -

File names and linking to files

-

When you include other files (like PowerPoints or PDFs) with your build request, it's helpful if their names do not include spaces. Spaces in a file name can cause problems when browsers try to locate the file.

-
-

A good file name:

-
bsnc-2000-stephens-learning.pdf
-
-

It's also helpful if the text in your Word document links directly to your additional files so that there is no question about where the files should be linked.

-

To link a file:

-
    -
  1. Start by making sure your additional file is in the same folder as your Word document (create a folder if necessary)
  2. -
  3. Select the text that describes the file
  4. -
  5. Right-click on the text selection and choose Hyperlink
  6. -
  7. Click the Select button and choose the file you want to link to
  8. -
  9. Click OK
  10. -
-

Page titles

-

When you're preparing your build file, try to give new pages different titles so that students can more easily find them in the Table of Contents. Any text with the Heading 1 style will become a new page, and the more unique the page name, the better.

-

Requesting files in the Table of Contents

-

To request a link to another file (like PowerPoints or PDFs), insert a title along with the file name using Word Heading 1 styling in the exact spot where you would like the file to appear in the TOC:

-
- -
-

The above syntax in Word will output to HTML as:

-
- -
-

Accessibility

-

When including a course production element (text, media, interactions, etc.) into your build file, always check the Notes section for any tips to improve digital content accessibility. For example, the Images element includes information on incorporating alternative text for screen readers or if the image fails to load.

-
-
- -
- -

MS Word Tutorial

-

Refer to the images below to see which Word tools we recommend for creating your build file.

-
    -
  •       We encourage the use of this tool
  • -
  •       We encourage the use of this tool if used correctly
  • -
  •       We discourage the use of this tool
  • -
- -

Home Tab

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAvailableNotex1x2y1y2
Paste SpecialDependsAlways use the "Text Only" when pasting content from external sources.17376
Cut/CopyYesUse this tool to Cut or Copy text within your word document.724550
Format PainterNoThis tool could cause problems with the HTML output.7245174
Font/SizeNoDo not use because any changes will be ignored in HTML.25.454939
Change CaseYesYou can use this tool to change the case of your text.54.7660.5939
Clear FormattingYesThis is useful for cleaning up content pasted from external sources.61.265939
Bold/ItalicYesThese styles will carry over into the HTML.25.432.54468
UnderlineNoThis could be confused with a hyperlink. Use Bold/Italic instead.32.537.54468
Strikethrough & Sub/SuperscriptYesThese styles will carry over into the HTML.37.548.44468
Text ColorNoDo not use because any changes will be ignored in HTML.49654468
Text AlignmentDependsThese changes will be ignored however if you would like something aligned please leave a comment in your document.66804468
Line SpacingNoDo not use because any changes will be ignored in HTML.8186.54468
Borders and BackgroundsNoDo not use because any changes will be ignored in HTML.87.5994468
ListsDependsTypically, this is not a problem. If you are emulating a particular convention (Eg. legal documents), please leave a comment indicating the reason with your specific requirements.6682939
IndentationNoDo not use because any changes will be ignored in HTML.82.790.3939
SortYesBe prepared to undo ;)9195939
Formatting SymbolsYesThis will be ignored in HTML, but we encourage it's use to help you format. 95.799939
-
- -

Quick Styles

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAvailableNotex1y1x2y2
NormalYesThe majority of your text will use this style..510.5223
No SpacingNoThis will be ignored.11.521.5223
Heading 1DependsOnly use this style to indicate a new page.22.532223
Sub-HeadingsDependsAvoid choosing headings for aesthetic reasons. Use headings to chunk your content into a hiearchy — always descend one heading level at a time (example: h1, h2, h3, etc.). Do not use more than 6 levels.3386.5223
TitleDependsUse this to indicate the name of the module (or sub-module) title.8798.5223
All other stylesNoThese will be ignored..598.52567.25
Create StyleNoCustom styles will be ignored..520.57079
Clear FormattingYesWe recommend using this whenever pasting content from an external source. It removes 99% of unwanted formatting..520.58089
Apply Styles...NoThis will be ignored..520.59099
-
-

Insert Tab

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAvailableNotex1y1x2y2
Cover PageNoThis will be removed before production..518327
WhitespaceDependsThis will be ignored..5182978
TablesDependsUse this for presenting data or structured content. Never use tables for layouts!1927378
PicturesDependsYou can embed images but be aware that Word can shrink your image if it's larger than the width of the page. It's best to provide seperate files for large images.2836.25378
Online PicturesDependsSame as pictures.36.544378
ShapesNoDon't use. The LTC has graphic artists on-hand to assist you in the creation of illustrations, charts, and diagrams.44.2552378
Smart Art and ChartsNo Don't use. The LTC has graphic artists on-hand to assist you in the creation of illustrations, charts, and diagrams.52.2569351
ScreenshotDependsSame as pictures.52.25695378
Online VideoNoProvide a link to the media instead.7078378
HyperlinkDependsUse this to link to a file, website or an email address.7999327
InterlinkingNoDo not use. Use hyperlinks instead.79992978
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAvailableNotex1y1x2y2
CommentYesInstructions in comments are better than implied visual changes..510.5378
Header, Footer & Pagination:NoThese will be ignored.11.530.5378
TextNoThese will be ignored.31.575378
EquationNoThis tool is problematic. Consult the Course Production team to discuss alternatives.7691325
SymbolDependsIf you are using an unusual symbol, please leave a comment to ensure it is converted into HTML.76912752
FlashNoThis will be ignored.9299.5378
-
-
-

Note

-

It's recommended that you avoid using any other tools not covered here.

-
-
- - - -
-

Templates

-

The following documents will help you get started with your next project. Choose a document and start writing!

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Name - - Description -
- Simple Working Document - -

Sometimes the best place to start is with a basic file.

-
- Overview Module - -

One example of a "Getting Started" module you could use as an introduction to your course.

-
- Content Light Module - -

Useful for courses where content is primarily external (PDFs, links, etc).

-
- Content Heavy Module - -

Useful for courses where there is a lot of content provided directly within the course itself.

-
- Course Element Notes - -

This set of notes used by the Occupational Health and Safety (OCHS) program was used to ensure all course modules contained the same elements.

-
-
-
- - - - - - - - - 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 f6d185e..54d3b47 100644 Binary files a/assets/VentPipesPre-sessionReading.pdf and b/public/assets/VentPipesPre-sessionReading.pdf differ 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 9ba2dc7..2cbbca9 100644 Binary files a/assets/create-mr.png and b/public/assets/create-mr.png differ 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 87c2f3a..3165655 100644 Binary files a/assets/damaged-log.jpg and b/public/assets/damaged-log.jpg differ diff --git a/assets/example-element.png b/public/assets/example-element.png similarity index 99% rename from assets/example-element.png rename to public/assets/example-element.png index 43b08b6..cbd393e 100644 Binary files a/assets/example-element.png and b/public/assets/example-element.png differ 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 b7b7371..844c10f 100644 Binary files a/assets/examples/assets/1.jpeg and b/public/assets/examples/assets/1.jpeg differ diff --git a/assets/examples/assets/cindy-mae.png b/public/assets/examples/assets/cindy-mae.png similarity index 99% rename from assets/examples/assets/cindy-mae.png rename to public/assets/examples/assets/cindy-mae.png index 77a27aa..482a838 100644 Binary files a/assets/examples/assets/cindy-mae.png and b/public/assets/examples/assets/cindy-mae.png differ diff --git a/assets/examples/assets/corporate-building.jpg b/public/assets/examples/assets/corporate-building.jpg similarity index 99% rename from assets/examples/assets/corporate-building.jpg rename to public/assets/examples/assets/corporate-building.jpg index b7b7371..844c10f 100644 Binary files a/assets/examples/assets/corporate-building.jpg and b/public/assets/examples/assets/corporate-building.jpg differ diff --git a/assets/examples/assets/m3-4framework.jpg b/public/assets/examples/assets/m3-4framework.jpg similarity index 100% rename from assets/examples/assets/m3-4framework.jpg rename to public/assets/examples/assets/m3-4framework.jpg diff --git a/assets/examples/assets/src/sample-module.psd b/public/assets/examples/assets/src/sample-module.psd similarity index 99% rename from assets/examples/assets/src/sample-module.psd rename to public/assets/examples/assets/src/sample-module.psd index 20b02e3..1e1d4da 100644 Binary files a/assets/examples/assets/src/sample-module.psd and b/public/assets/examples/assets/src/sample-module.psd differ 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 93a6be5..18a9bd2 100644 Binary files a/assets/examples/example-business.docx and b/public/assets/examples/example-business.docx differ diff --git a/assets/examples/example-business.html b/public/assets/examples/example-business.html similarity index 100% rename from assets/examples/example-business.html rename to public/assets/examples/example-business.html diff --git a/assets/examples/example-health.docx b/public/assets/examples/example-health.docx similarity index 99% rename from assets/examples/example-health.docx rename to public/assets/examples/example-health.docx index e1ff7e8..f2e4a05 100644 Binary files a/assets/examples/example-health.docx and b/public/assets/examples/example-health.docx differ 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 031a07f..f8400a2 100644 Binary files a/assets/examples/thumb-example-business.png and b/public/assets/examples/thumb-example-business.png differ 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 b44ff1a..fc21d39 100644 Binary files a/assets/examples/thumb-example-health.png and b/public/assets/examples/thumb-example-health.png differ 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 8591216..d524442 100644 Binary files a/assets/favicon.ico and b/public/assets/favicon.ico differ 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 89dfaf8..bb874f4 100644 Binary files a/assets/fibre-damage.jpg and b/public/assets/fibre-damage.jpg differ 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 fd498c0..a898541 100644 Binary files a/assets/lumber-yard.jpg and b/public/assets/lumber-yard.jpg differ diff --git a/assets/mark-ready.png b/public/assets/mark-ready.png similarity index 99% rename from assets/mark-ready.png rename to public/assets/mark-ready.png index 030986e..f7c2701 100644 Binary files a/assets/mark-ready.png and b/public/assets/mark-ready.png differ diff --git a/assets/mill-machine-small.jpg b/public/assets/mill-machine-small.jpg similarity index 100% rename from assets/mill-machine-small.jpg rename to public/assets/mill-machine-small.jpg diff --git a/assets/mill-machine.jpg b/public/assets/mill-machine.jpg similarity index 99% rename from assets/mill-machine.jpg rename to public/assets/mill-machine.jpg index 252a7d5..ec19f52 100644 Binary files a/assets/mill-machine.jpg and b/public/assets/mill-machine.jpg differ 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 1f7f740..0f8a248 100644 Binary files a/assets/mining-pit-operations.jpeg and b/public/assets/mining-pit-operations.jpeg differ diff --git a/assets/moraine-lake-time-lapse.mp4 b/public/assets/moraine-lake-time-lapse.mp4 similarity index 100% rename from assets/moraine-lake-time-lapse.mp4 rename to public/assets/moraine-lake-time-lapse.mp4 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 91331a9..17b2803 100644 Binary files a/assets/ms-word-tutorial/clear-formatting.png and b/public/assets/ms-word-tutorial/clear-formatting.png differ 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 1c129a6..d8ef6c6 100644 Binary files a/assets/ms-word-tutorial/comment.png and b/public/assets/ms-word-tutorial/comment.png differ diff --git a/assets/ms-word-tutorial/home-formatting.png b/public/assets/ms-word-tutorial/home-formatting.png similarity index 99% rename from assets/ms-word-tutorial/home-formatting.png rename to public/assets/ms-word-tutorial/home-formatting.png index 19593a4..21ed007 100644 Binary files a/assets/ms-word-tutorial/home-formatting.png and b/public/assets/ms-word-tutorial/home-formatting.png differ 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 c0ac293..5027fdb 100644 Binary files a/assets/ms-word-tutorial/home-quick-styles.png and b/public/assets/ms-word-tutorial/home-quick-styles.png differ 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 8d9a220..1e229e6 100644 Binary files a/assets/ms-word-tutorial/insert-1.png and b/public/assets/ms-word-tutorial/insert-1.png differ 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 6e4778b..5a425b6 100644 Binary files a/assets/ms-word-tutorial/insert-2.png and b/public/assets/ms-word-tutorial/insert-2.png differ 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 113d617..9745364 100644 Binary files a/assets/ms-word-tutorial/merge-formatting.png and b/public/assets/ms-word-tutorial/merge-formatting.png differ 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 9b60deb..8e662c8 100644 Binary files a/assets/ms-word-tutorial/navigation-pane.png and b/public/assets/ms-word-tutorial/navigation-pane.png differ 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 4324098..358ce0b 100644 Binary files a/assets/ms-word-tutorial/navigation-pane2.png and b/public/assets/ms-word-tutorial/navigation-pane2.png differ 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 167893a..bfd8f97 100644 Binary files a/assets/ms-word-tutorial/navigation-pane3.png and b/public/assets/ms-word-tutorial/navigation-pane3.png differ 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 d171a48..be59701 100644 Binary files a/assets/multiple-energies.png and b/public/assets/multiple-energies.png differ 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 3007f54..9f818a8 100644 Binary files a/assets/ruler/center.png and b/public/assets/ruler/center.png differ 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 b4ef104..fc106ae 100644 Binary files a/assets/ruler/left-small.png and b/public/assets/ruler/left-small.png differ 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 8fe5039..f89cb6d 100644 Binary files a/assets/ruler/left-smallest.png and b/public/assets/ruler/left-smallest.png differ 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 b5e7f2c..bb33d7c 100644 Binary files a/assets/ruler/left.png and b/public/assets/ruler/left.png differ 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 55e653c..63f5bc0 100644 Binary files a/assets/ruler/right-small.png and b/public/assets/ruler/right-small.png differ 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 15143bb..00db463 100644 Binary files a/assets/ruler/right-smallest.png and b/public/assets/ruler/right-smallest.png differ 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 4ae0726..91caf23 100644 Binary files a/assets/ruler/right.png and b/public/assets/ruler/right.png differ 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 f8a89ca..285f4c3 100644 Binary files a/assets/signpost.jpg and b/public/assets/signpost.jpg differ diff --git a/assets/src/sample-module.psd b/public/assets/src/sample-module.psd similarity index 99% rename from assets/src/sample-module.psd rename to public/assets/src/sample-module.psd index 20b02e3..1e1d4da 100644 Binary files a/assets/src/sample-module.psd and b/public/assets/src/sample-module.psd differ 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 4dcdcc1..53752fc 100644 Binary files a/assets/src/word-to-html-to-d2l.psd and b/public/assets/src/word-to-html-to-d2l.psd differ diff --git a/assets/templates/annotated-sample-content-heavy-module.docx b/public/assets/templates/annotated-sample-content-heavy-module.docx similarity index 100% rename from assets/templates/annotated-sample-content-heavy-module.docx rename to public/assets/templates/annotated-sample-content-heavy-module.docx diff --git a/assets/templates/annotated-sample-content-light-module.docx b/public/assets/templates/annotated-sample-content-light-module.docx similarity index 100% rename from assets/templates/annotated-sample-content-light-module.docx rename to public/assets/templates/annotated-sample-content-light-module.docx diff --git a/assets/templates/annotated-sample-overview-module.docx b/public/assets/templates/annotated-sample-overview-module.docx similarity index 100% rename from assets/templates/annotated-sample-overview-module.docx rename to public/assets/templates/annotated-sample-overview-module.docx diff --git a/assets/templates/blank-working-document.docx b/public/assets/templates/blank-working-document.docx similarity index 100% rename from assets/templates/blank-working-document.docx rename to public/assets/templates/blank-working-document.docx diff --git a/assets/templates/sample-course-content-notes.docx b/public/assets/templates/sample-course-content-notes.docx similarity index 99% rename from assets/templates/sample-course-content-notes.docx rename to public/assets/templates/sample-course-content-notes.docx index 05031cf..a2a1e1b 100644 Binary files a/assets/templates/sample-course-content-notes.docx and b/public/assets/templates/sample-course-content-notes.docx differ diff --git a/assets/tooth-marks.jpg b/public/assets/tooth-marks.jpg similarity index 100% rename from assets/tooth-marks.jpg rename to public/assets/tooth-marks.jpg diff --git a/assets/view-app.png b/public/assets/view-app.png similarity index 99% rename from assets/view-app.png rename to public/assets/view-app.png index e8dde91..d5d906d 100644 Binary files a/assets/view-app.png and b/public/assets/view-app.png differ diff --git a/assets/word-to-html5.png b/public/assets/word-to-html5.png similarity index 99% rename from assets/word-to-html5.png rename to public/assets/word-to-html5.png index 7eac8eb..9e52f81 100644 Binary files a/assets/word-to-html5.png and b/public/assets/word-to-html5.png differ diff --git a/css/prism.css b/public/css/prism.css similarity index 100% rename from css/prism.css rename to public/css/prism.css diff --git a/public/js/jquery-3.7.1.min.js b/public/js/jquery-3.7.1.min.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/public/js/jquery-3.7.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+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