add buildstep to docker
This commit is contained in:
parent
a63649dacc
commit
091c6ef4f6
|
@ -1,8 +1,6 @@
|
||||||
app/db/SQL
|
app/db/SQL
|
||||||
node_modules
|
node_modules
|
||||||
storage
|
storage
|
||||||
public/scripts
|
|
||||||
public/styles
|
|
||||||
.git
|
.git
|
||||||
.idea
|
.idea
|
||||||
.cd .babelrc
|
.cd .babelrc
|
||||||
|
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -3,7 +3,7 @@
|
||||||
/node_modules/
|
/node_modules/
|
||||||
/tests/resources/storage/
|
/tests/resources/storage/
|
||||||
/app/sdks/*
|
/app/sdks/*
|
||||||
/public/dist/
|
/public/dist/*
|
||||||
/.idea/
|
/.idea/
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.php_cs.cache
|
.php_cs.cache
|
||||||
|
|
16
Dockerfile
16
Dockerfile
|
@ -12,6 +12,18 @@ RUN composer update --ignore-platform-reqs --optimize-autoloader \
|
||||||
--no-plugins --no-scripts --prefer-dist \
|
--no-plugins --no-scripts --prefer-dist \
|
||||||
`if [ "$TESTING" != "true" ]; then echo "--no-dev"; fi`
|
`if [ "$TESTING" != "true" ]; then echo "--no-dev"; fi`
|
||||||
|
|
||||||
|
FROM node:16-alpine as node
|
||||||
|
|
||||||
|
WORKDIR /usr/local/src/
|
||||||
|
|
||||||
|
COPY package-lock.json /usr/local/src/
|
||||||
|
COPY package.json /usr/local/src/
|
||||||
|
COPY gulpfile.js /usr/local/src/
|
||||||
|
COPY public /usr/local/src/public
|
||||||
|
|
||||||
|
RUN npm ci
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
FROM php:8.0-cli-alpine as compile
|
FROM php:8.0-cli-alpine as compile
|
||||||
|
|
||||||
ARG DEBUG=false
|
ARG DEBUG=false
|
||||||
|
@ -195,6 +207,7 @@ RUN \
|
||||||
WORKDIR /usr/src/code
|
WORKDIR /usr/src/code
|
||||||
|
|
||||||
COPY --from=composer /usr/local/src/vendor /usr/src/code/vendor
|
COPY --from=composer /usr/local/src/vendor /usr/src/code/vendor
|
||||||
|
COPY --from=node /usr/local/src/public/dist /usr/src/code/public/dist
|
||||||
COPY --from=swoole /usr/local/lib/php/extensions/no-debug-non-zts-20200930/swoole.so /usr/local/lib/php/extensions/no-debug-non-zts-20200930/yasd.so* /usr/local/lib/php/extensions/no-debug-non-zts-20200930/
|
COPY --from=swoole /usr/local/lib/php/extensions/no-debug-non-zts-20200930/swoole.so /usr/local/lib/php/extensions/no-debug-non-zts-20200930/yasd.so* /usr/local/lib/php/extensions/no-debug-non-zts-20200930/
|
||||||
COPY --from=redis /usr/local/lib/php/extensions/no-debug-non-zts-20200930/redis.so /usr/local/lib/php/extensions/no-debug-non-zts-20200930/
|
COPY --from=redis /usr/local/lib/php/extensions/no-debug-non-zts-20200930/redis.so /usr/local/lib/php/extensions/no-debug-non-zts-20200930/
|
||||||
COPY --from=imagick /usr/local/lib/php/extensions/no-debug-non-zts-20200930/imagick.so /usr/local/lib/php/extensions/no-debug-non-zts-20200930/
|
COPY --from=imagick /usr/local/lib/php/extensions/no-debug-non-zts-20200930/imagick.so /usr/local/lib/php/extensions/no-debug-non-zts-20200930/
|
||||||
|
@ -205,7 +218,8 @@ COPY --from=maxmind /usr/local/lib/php/extensions/no-debug-non-zts-20200930/maxm
|
||||||
COPY ./app /usr/src/code/app
|
COPY ./app /usr/src/code/app
|
||||||
COPY ./bin /usr/local/bin
|
COPY ./bin /usr/local/bin
|
||||||
COPY ./docs /usr/src/code/docs
|
COPY ./docs /usr/src/code/docs
|
||||||
COPY ./public /usr/src/code/public
|
COPY ./public/fonts /usr/src/code/public/fonts
|
||||||
|
COPY ./public/images /usr/src/code/public/images
|
||||||
COPY ./src /usr/src/code/src
|
COPY ./src /usr/src/code/src
|
||||||
|
|
||||||
# Set Volumes
|
# Set Volumes
|
||||||
|
|
|
@ -103,6 +103,8 @@ if(!empty($platforms)) {
|
||||||
});
|
});
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</script>
|
</script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/components/prism-core.min.js" integrity="sha512-TbHaMJHEmRBDf9W3P7VcRGwEmVEJu7MO6roAE0C4yqoNHeIVo3otIX3zj1DOLtn7YCD+U8Oy1T9eMtG/M9lxRw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/plugins/autoloader/prism-autoloader.min.js" integrity="sha512-sv0slik/5O0JIPdLBCR2A3XDg/1U3WuDEheZfI/DI5n8Yqc3h5kjrnr46FGBNiUAJF7rE4LHKwQ/SoSLRKAxEA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||||
<?php echo $this->exec($this->getParam('head', [])); ?>
|
<?php echo $this->exec($this->getParam('head', [])); ?>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|
35
gulpfile.js
35
gulpfile.js
|
@ -9,7 +9,7 @@ const gulpCleanCSS = require('gulp-clean-css');
|
||||||
|
|
||||||
// Config
|
// Config
|
||||||
|
|
||||||
const configApp = {
|
const configApp = {
|
||||||
mainFile: 'app.js',
|
mainFile: 'app.js',
|
||||||
src: [
|
src: [
|
||||||
'public/scripts/dependencies/litespeed.js',
|
'public/scripts/dependencies/litespeed.js',
|
||||||
|
@ -76,7 +76,7 @@ const configApp = {
|
||||||
'public/scripts/views/general/switch.js',
|
'public/scripts/views/general/switch.js',
|
||||||
'public/scripts/views/general/theme.js',
|
'public/scripts/views/general/theme.js',
|
||||||
'public/scripts/views/general/version.js',
|
'public/scripts/views/general/version.js',
|
||||||
|
|
||||||
'public/scripts/views/paging/back.js',
|
'public/scripts/views/paging/back.js',
|
||||||
'public/scripts/views/paging/next.js',
|
'public/scripts/views/paging/next.js',
|
||||||
|
|
||||||
|
@ -87,19 +87,18 @@ const configApp = {
|
||||||
'public/scripts/views/ui/phases.js',
|
'public/scripts/views/ui/phases.js',
|
||||||
'public/scripts/views/ui/trigger.js',
|
'public/scripts/views/ui/trigger.js',
|
||||||
],
|
],
|
||||||
|
|
||||||
dest: './public/dist/scripts'
|
dest: './public/dist/scripts'
|
||||||
};
|
};
|
||||||
|
|
||||||
const configDep = {
|
const configDep = {
|
||||||
mainFile: 'app-dep.js',
|
mainFile: 'app-dep.js',
|
||||||
src: [
|
src: [
|
||||||
//'node_modules/appwrite/src/sdk.js',
|
|
||||||
'public/scripts/dependencies/appwrite.js',
|
'public/scripts/dependencies/appwrite.js',
|
||||||
'public/scripts/dependencies/chart.js',
|
'node_modules/chart.js/dist/chart.js',
|
||||||
'public/scripts/dependencies/markdown-it.js',
|
'node_modules/markdown-it/dist/markdown-it.js',
|
||||||
'public/scripts/dependencies/pell.js',
|
'node_modules/pell/dist/pell.js',
|
||||||
'public/scripts/dependencies/prism.js',
|
'node_modules/turndown/dist/turndown.js',
|
||||||
'public/scripts/dependencies/turndown.js',
|
|
||||||
],
|
],
|
||||||
dest: './public/dist/scripts'
|
dest: './public/dist/scripts'
|
||||||
};
|
};
|
||||||
|
@ -113,40 +112,40 @@ const config = {
|
||||||
dest: './public/dist/scripts'
|
dest: './public/dist/scripts'
|
||||||
};
|
};
|
||||||
|
|
||||||
function lessLTR () {
|
function lessLTR() {
|
||||||
return src('./public/styles/default-ltr.less')
|
return src('./public/styles/default-ltr.less')
|
||||||
.pipe(gulpLess())
|
.pipe(gulpLess())
|
||||||
.pipe(gulpCleanCSS({compatibility: 'ie8'}))
|
.pipe(gulpCleanCSS({ compatibility: 'ie8' }))
|
||||||
.pipe(dest('./public/dist/styles'));
|
.pipe(dest('./public/dist/styles'));
|
||||||
}
|
}
|
||||||
|
|
||||||
function lessRTL () {
|
function lessRTL() {
|
||||||
return src('./public/styles/default-rtl.less')
|
return src('./public/styles/default-rtl.less')
|
||||||
.pipe(gulpLess())
|
.pipe(gulpLess())
|
||||||
.pipe(gulpCleanCSS({compatibility: 'ie8'}))
|
.pipe(gulpCleanCSS({ compatibility: 'ie8' }))
|
||||||
.pipe(dest('./public/dist/styles'));
|
.pipe(dest('./public/dist/styles'));
|
||||||
}
|
}
|
||||||
|
|
||||||
function concatApp () {
|
function concatApp() {
|
||||||
return src(configApp.src)
|
return src(configApp.src)
|
||||||
.pipe(gulpConcat(configApp.mainFile))
|
.pipe(gulpConcat(configApp.mainFile))
|
||||||
.pipe(gulpJsmin())
|
.pipe(gulpJsmin())
|
||||||
.pipe(dest(configApp.dest));
|
.pipe(dest(configApp.dest));
|
||||||
}
|
}
|
||||||
|
|
||||||
function concatDep () {
|
function concatDep() {
|
||||||
return src(configDep.src)
|
return src(configDep.src)
|
||||||
.pipe(gulpConcat(configDep.mainFile))
|
.pipe(gulpConcat(configDep.mainFile))
|
||||||
.pipe(gulpJsmin())
|
.pipe(gulpJsmin())
|
||||||
.pipe(dest(configDep.dest));
|
.pipe(dest(configDep.dest));
|
||||||
}
|
}
|
||||||
|
|
||||||
function concat () {
|
function concat() {
|
||||||
return src(config.src)
|
return src(config.src)
|
||||||
.pipe(gulpConcat(config.mainFile))
|
.pipe(gulpConcat(config.mainFile))
|
||||||
.pipe(dest(config.dest));
|
.pipe(dest(config.dest));
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.import = series(concatDep);
|
exports.import = series(concatDep);
|
||||||
exports.less = series(lessLTR, lessRTL);
|
exports.less = series(lessLTR, lessRTL);
|
||||||
exports.build = series(concatApp, concat);
|
exports.build = series(concatApp, concat);
|
158
package-lock.json
generated
158
package-lock.json
generated
|
@ -1,13 +1,19 @@
|
||||||
{
|
{
|
||||||
"name": "appwrite-server",
|
"name": "appwrite-server",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "appwrite-server",
|
"name": "appwrite-server",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"license": "BSD-3-Clause",
|
"license": "BSD-3-Clause",
|
||||||
|
"dependencies": {
|
||||||
|
"chart.js": "^3.5.1",
|
||||||
|
"markdown-it": "^12.2.0",
|
||||||
|
"pell": "^1.0.6",
|
||||||
|
"turndown": "^7.1.1"
|
||||||
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"gulp": "^4.0.2",
|
"gulp": "^4.0.2",
|
||||||
"gulp-clean-css": "^4.3.0",
|
"gulp-clean-css": "^4.3.0",
|
||||||
|
@ -116,6 +122,11 @@
|
||||||
"integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
|
"integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/argparse": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
|
||||||
|
},
|
||||||
"node_modules/arr-diff": {
|
"node_modules/arr-diff": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
|
||||||
|
@ -536,6 +547,11 @@
|
||||||
"node": ">= 0.6.0"
|
"node": ">= 0.6.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/chart.js": {
|
||||||
|
"version": "3.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.5.1.tgz",
|
||||||
|
"integrity": "sha512-m5kzt72I1WQ9LILwQC4syla/LD/N413RYv2Dx2nnTkRS9iv/ey1xLTt0DnPc/eWV4zI+BgEgDYBIzbQhZHc/PQ=="
|
||||||
|
},
|
||||||
"node_modules/chokidar": {
|
"node_modules/chokidar": {
|
||||||
"version": "2.1.8",
|
"version": "2.1.8",
|
||||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
|
||||||
|
@ -980,6 +996,11 @@
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/domino": {
|
||||||
|
"version": "2.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz",
|
||||||
|
"integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ=="
|
||||||
|
},
|
||||||
"node_modules/duplexer2": {
|
"node_modules/duplexer2": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
|
||||||
|
@ -1044,6 +1065,14 @@
|
||||||
"once": "^1.4.0"
|
"once": "^1.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/entities": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/fb55/entities?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/errno": {
|
"node_modules/errno": {
|
||||||
"version": "0.1.8",
|
"version": "0.1.8",
|
||||||
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
|
||||||
|
@ -2575,6 +2604,14 @@
|
||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/linkify-it": {
|
||||||
|
"version": "3.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
|
||||||
|
"integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"uc.micro": "^1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/load-json-file": {
|
"node_modules/load-json-file": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
|
||||||
|
@ -2823,6 +2860,21 @@
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/markdown-it": {
|
||||||
|
"version": "12.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz",
|
||||||
|
"integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==",
|
||||||
|
"dependencies": {
|
||||||
|
"argparse": "^2.0.1",
|
||||||
|
"entities": "~2.1.0",
|
||||||
|
"linkify-it": "^3.0.1",
|
||||||
|
"mdurl": "^1.0.1",
|
||||||
|
"uc.micro": "^1.0.5"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"markdown-it": "bin/markdown-it.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/matchdep": {
|
"node_modules/matchdep": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
|
||||||
|
@ -2865,6 +2917,11 @@
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/mdurl": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
|
||||||
|
},
|
||||||
"node_modules/meow": {
|
"node_modules/meow": {
|
||||||
"version": "3.7.0",
|
"version": "3.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
|
||||||
|
@ -3438,6 +3495,11 @@
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/pell": {
|
||||||
|
"version": "1.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/pell/-/pell-1.0.6.tgz",
|
||||||
|
"integrity": "sha512-wuackvgjFCHmVABy7ACSmY2u53w+TlYFrVL2hN6V3rGL/iWWwVXMw2uphpZSXNnqFQTI8nMpD3UNNX8+R4BAYw=="
|
||||||
|
},
|
||||||
"node_modules/pify": {
|
"node_modules/pify": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
|
||||||
|
@ -4548,6 +4610,14 @@
|
||||||
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
|
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/turndown": {
|
||||||
|
"version": "7.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/turndown/-/turndown-7.1.1.tgz",
|
||||||
|
"integrity": "sha512-BEkXaWH7Wh7e9bd2QumhfAXk5g34+6QUmmWx+0q6ThaVOLuLUqsnkq35HQ5SBHSaxjSfSM7US5o4lhJNH7B9MA==",
|
||||||
|
"dependencies": {
|
||||||
|
"domino": "^2.1.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/type": {
|
"node_modules/type": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
|
||||||
|
@ -4560,6 +4630,11 @@
|
||||||
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
|
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/uc.micro": {
|
||||||
|
"version": "1.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
|
||||||
|
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
|
||||||
|
},
|
||||||
"node_modules/unc-path-regex": {
|
"node_modules/unc-path-regex": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
|
||||||
|
@ -5068,6 +5143,11 @@
|
||||||
"integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
|
"integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"argparse": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
|
||||||
|
},
|
||||||
"arr-diff": {
|
"arr-diff": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
|
||||||
|
@ -5397,6 +5477,11 @@
|
||||||
"integrity": "sha1-W5UvniDqIc0Iyn/hNaEPb+kcEJ4=",
|
"integrity": "sha1-W5UvniDqIc0Iyn/hNaEPb+kcEJ4=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"chart.js": {
|
||||||
|
"version": "3.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.5.1.tgz",
|
||||||
|
"integrity": "sha512-m5kzt72I1WQ9LILwQC4syla/LD/N413RYv2Dx2nnTkRS9iv/ey1xLTt0DnPc/eWV4zI+BgEgDYBIzbQhZHc/PQ=="
|
||||||
|
},
|
||||||
"chokidar": {
|
"chokidar": {
|
||||||
"version": "2.1.8",
|
"version": "2.1.8",
|
||||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
|
||||||
|
@ -5761,6 +5846,11 @@
|
||||||
"integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
|
"integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"domino": {
|
||||||
|
"version": "2.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz",
|
||||||
|
"integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ=="
|
||||||
|
},
|
||||||
"duplexer2": {
|
"duplexer2": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
|
||||||
|
@ -5827,6 +5917,11 @@
|
||||||
"once": "^1.4.0"
|
"once": "^1.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"entities": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w=="
|
||||||
|
},
|
||||||
"errno": {
|
"errno": {
|
||||||
"version": "0.1.8",
|
"version": "0.1.8",
|
||||||
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
|
||||||
|
@ -7076,6 +7171,14 @@
|
||||||
"resolve": "^1.1.7"
|
"resolve": "^1.1.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"linkify-it": {
|
||||||
|
"version": "3.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
|
||||||
|
"integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
|
||||||
|
"requires": {
|
||||||
|
"uc.micro": "^1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"load-json-file": {
|
"load-json-file": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
|
||||||
|
@ -7303,6 +7406,18 @@
|
||||||
"object-visit": "^1.0.0"
|
"object-visit": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"markdown-it": {
|
||||||
|
"version": "12.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz",
|
||||||
|
"integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==",
|
||||||
|
"requires": {
|
||||||
|
"argparse": "^2.0.1",
|
||||||
|
"entities": "~2.1.0",
|
||||||
|
"linkify-it": "^3.0.1",
|
||||||
|
"mdurl": "^1.0.1",
|
||||||
|
"uc.micro": "^1.0.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
"matchdep": {
|
"matchdep": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
|
||||||
|
@ -7338,6 +7453,11 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"mdurl": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
|
||||||
|
},
|
||||||
"meow": {
|
"meow": {
|
||||||
"version": "3.7.0",
|
"version": "3.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
|
||||||
|
@ -7800,6 +7920,11 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"pell": {
|
||||||
|
"version": "1.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/pell/-/pell-1.0.6.tgz",
|
||||||
|
"integrity": "sha512-wuackvgjFCHmVABy7ACSmY2u53w+TlYFrVL2hN6V3rGL/iWWwVXMw2uphpZSXNnqFQTI8nMpD3UNNX8+R4BAYw=="
|
||||||
|
},
|
||||||
"pify": {
|
"pify": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
|
||||||
|
@ -8489,6 +8614,15 @@
|
||||||
"integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
|
"integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"string_decoder": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "~5.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"string-width": {
|
"string-width": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
|
||||||
|
@ -8517,15 +8651,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"string_decoder": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
|
||||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"safe-buffer": "~5.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"strip-ansi": {
|
"strip-ansi": {
|
||||||
"version": "0.3.0",
|
"version": "0.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
|
||||||
|
@ -8710,6 +8835,14 @@
|
||||||
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
|
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"turndown": {
|
||||||
|
"version": "7.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/turndown/-/turndown-7.1.1.tgz",
|
||||||
|
"integrity": "sha512-BEkXaWH7Wh7e9bd2QumhfAXk5g34+6QUmmWx+0q6ThaVOLuLUqsnkq35HQ5SBHSaxjSfSM7US5o4lhJNH7B9MA==",
|
||||||
|
"requires": {
|
||||||
|
"domino": "^2.1.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"type": {
|
"type": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
|
||||||
|
@ -8722,6 +8855,11 @@
|
||||||
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
|
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"uc.micro": {
|
||||||
|
"version": "1.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
|
||||||
|
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
|
||||||
|
},
|
||||||
"unc-path-regex": {
|
"unc-path-regex": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"license": "BSD-3-Clause",
|
"license": "BSD-3-Clause",
|
||||||
"repository": "public",
|
"repository": "public",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "npm run gulp:less && npm run gulp:import && npm run gulp:build",
|
"build": "ls public/ && npm run gulp:less && npm run gulp:import && npm run gulp:build",
|
||||||
"gulp:less": "gulp less",
|
"gulp:less": "gulp less",
|
||||||
"gulp:import": "gulp import",
|
"gulp:import": "gulp import",
|
||||||
"gulp:build": "gulp build"
|
"gulp:build": "gulp build"
|
||||||
|
@ -15,5 +15,11 @@
|
||||||
"gulp-concat": "^2.6.1",
|
"gulp-concat": "^2.6.1",
|
||||||
"gulp-jsmin": "^0.1.5",
|
"gulp-jsmin": "^0.1.5",
|
||||||
"gulp-less": "^5.0.0"
|
"gulp-less": "^5.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"chart.js": "^3.5.1",
|
||||||
|
"markdown-it": "^12.2.0",
|
||||||
|
"pell": "^1.0.6",
|
||||||
|
"turndown": "^7.1.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
|
@ -1 +0,0 @@
|
||||||
/*https://github.com/jaredreich/pell*/!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.pell={})}(this,function(t){"use strict";var e=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},n=function(t,e,n){return t.addEventListener(e,n)},r=function(t,e){return t.appendChild(e)},i=function(t){return document.createElement(t)},o=function(t){return document.queryCommandState(t)},u=function(t){return document.queryCommandValue(t)},c=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return document.execCommand(t,!1,e)},l={bold:{icon:"<b>B</b>",title:"Bold",state:function(){return o("bold")},result:function(){return c("bold")}},italic:{icon:"<i>I</i>",title:"Italic",state:function(){return o("italic")},result:function(){return c("italic")}},underline:{icon:"<u>U</u>",title:"Underline",state:function(){return o("underline")},result:function(){return c("underline")}},strikethrough:{icon:"<strike>S</strike>",title:"Strike-through",state:function(){return o("strikeThrough")},result:function(){return c("strikeThrough")}},heading1:{icon:"<b>H<sub>1</sub></b>",title:"Heading 1",result:function(){return c("formatBlock","<h1>")}},heading2:{icon:"<b>H<sub>2</sub></b>",title:"Heading 2",result:function(){return c("formatBlock","<h2>")}},paragraph:{icon:"¶",title:"Paragraph",result:function(){return c("formatBlock","<p>")}},quote:{icon:"“ ”",title:"Quote",result:function(){return c("formatBlock","<blockquote>")}},olist:{icon:"#",title:"Ordered List",result:function(){return c("insertOrderedList")}},ulist:{icon:"•",title:"Unordered List",result:function(){return c("insertUnorderedList")}},code:{icon:"</>",title:"Code",result:function(){return c("formatBlock","<pre>")}},line:{icon:"―",title:"Horizontal Line",result:function(){return c("insertHorizontalRule")}},link:{icon:"🔗",title:"Link",result:function(){var t=window.prompt("Enter the link URL");t&&c("createLink",t)}},image:{icon:"📷",title:"Image",result:function(){var t=window.prompt("Enter the image URL");t&&c("insertImage",t)}}},a={actionbar:"pell-actionbar",button:"pell-button",content:"pell-content",selected:"pell-button-selected"},s=function(t){var o=t.actions?t.actions.map(function(t){return"string"==typeof t?l[t]:l[t.name]?e({},l[t.name],t):t}):Object.keys(l).map(function(t){return l[t]}),s=e({},a,t.classes),f=t.defaultParagraphSeparator||"div",d=i("div");d.className=s.actionbar,r(t.element,d);var m=t.element.content=i("div");return m.contentEditable=!0,m.className=s.content,m.oninput=function(e){var n=e.target.firstChild;n&&3===n.nodeType?c("formatBlock","<"+f+">"):"<br>"===m.innerHTML&&(m.innerHTML=""),t.onChange(m.innerHTML)},m.onkeydown=function(t){"Tab"===t.key?t.preventDefault():"Enter"===t.key&&"blockquote"===u("formatBlock")&&setTimeout(function(){return c("formatBlock","<"+f+">")},0)},r(t.element,m),o.forEach(function(t){var e=i("button");if(e.className=s.button,e.innerHTML=t.icon,e.title=t.title,e.setAttribute("type","button"),e.onclick=function(){return t.result()&&m.focus()},t.state){var o=function(){return e.classList[t.state()?"add":"remove"](s.selected)};n(m,"keyup",o),n(m,"mouseup",o),n(e,"click",o)}r(d,e)}),t.styleWithCSS&&c("styleWithCSS"),c("defaultParagraphSeparator",f),t.element},f={exec:c,init:s};t.exec=c,t.init=s,t.default=f,Object.defineProperty(t,"__esModule",{value:!0})});
|
|
File diff suppressed because one or more lines are too long
|
@ -1,932 +0,0 @@
|
||||||
var TurndownService = (function () {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
function extend (destination) {
|
|
||||||
for (var i = 1; i < arguments.length; i++) {
|
|
||||||
var source = arguments[i];
|
|
||||||
for (var key in source) {
|
|
||||||
if (source.hasOwnProperty(key)) destination[key] = source[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return destination
|
|
||||||
}
|
|
||||||
|
|
||||||
function repeat (character, count) {
|
|
||||||
return Array(count + 1).join(character)
|
|
||||||
}
|
|
||||||
|
|
||||||
var blockElements = [
|
|
||||||
'address', 'article', 'aside', 'audio', 'blockquote', 'body', 'canvas',
|
|
||||||
'center', 'dd', 'dir', 'div', 'dl', 'dt', 'fieldset', 'figcaption',
|
|
||||||
'figure', 'footer', 'form', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
|
|
||||||
'header', 'hgroup', 'hr', 'html', 'isindex', 'li', 'main', 'menu', 'nav',
|
|
||||||
'noframes', 'noscript', 'ol', 'output', 'p', 'pre', 'section', 'table',
|
|
||||||
'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'ul'
|
|
||||||
];
|
|
||||||
|
|
||||||
function isBlock (node) {
|
|
||||||
return blockElements.indexOf(node.nodeName.toLowerCase()) !== -1
|
|
||||||
}
|
|
||||||
|
|
||||||
var voidElements = [
|
|
||||||
'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input',
|
|
||||||
'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'
|
|
||||||
];
|
|
||||||
|
|
||||||
function isVoid (node) {
|
|
||||||
return voidElements.indexOf(node.nodeName.toLowerCase()) !== -1
|
|
||||||
}
|
|
||||||
|
|
||||||
var voidSelector = voidElements.join();
|
|
||||||
function hasVoid (node) {
|
|
||||||
return node.querySelector && node.querySelector(voidSelector)
|
|
||||||
}
|
|
||||||
|
|
||||||
var rules = {};
|
|
||||||
|
|
||||||
rules.paragraph = {
|
|
||||||
filter: 'p',
|
|
||||||
|
|
||||||
replacement: function (content) {
|
|
||||||
return '\n\n' + content + '\n\n'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.lineBreak = {
|
|
||||||
filter: 'br',
|
|
||||||
|
|
||||||
replacement: function (content, node, options) {
|
|
||||||
return options.br + '\n'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.heading = {
|
|
||||||
filter: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
|
|
||||||
|
|
||||||
replacement: function (content, node, options) {
|
|
||||||
var hLevel = Number(node.nodeName.charAt(1));
|
|
||||||
|
|
||||||
if (options.headingStyle === 'setext' && hLevel < 3) {
|
|
||||||
var underline = repeat((hLevel === 1 ? '=' : '-'), content.length);
|
|
||||||
return (
|
|
||||||
'\n\n' + content + '\n' + underline + '\n\n'
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
return '\n\n' + repeat('#', hLevel) + ' ' + content + '\n\n'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.blockquote = {
|
|
||||||
filter: 'blockquote',
|
|
||||||
|
|
||||||
replacement: function (content) {
|
|
||||||
content = content.replace(/^\n+|\n+$/g, '');
|
|
||||||
content = content.replace(/^/gm, '> ');
|
|
||||||
return '\n\n' + content + '\n\n'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.list = {
|
|
||||||
filter: ['ul', 'ol'],
|
|
||||||
|
|
||||||
replacement: function (content, node) {
|
|
||||||
var parent = node.parentNode;
|
|
||||||
if (parent.nodeName === 'LI' && parent.lastElementChild === node) {
|
|
||||||
return '\n' + content
|
|
||||||
} else {
|
|
||||||
return '\n\n' + content + '\n\n'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.listItem = {
|
|
||||||
filter: 'li',
|
|
||||||
|
|
||||||
replacement: function (content, node, options) {
|
|
||||||
content = content
|
|
||||||
.replace(/^\n+/, '') // remove leading newlines
|
|
||||||
.replace(/\n+$/, '\n') // replace trailing newlines with just a single one
|
|
||||||
.replace(/\n/gm, '\n '); // indent
|
|
||||||
var prefix = options.bulletListMarker + ' ';
|
|
||||||
var parent = node.parentNode;
|
|
||||||
if (parent.nodeName === 'OL') {
|
|
||||||
var start = parent.getAttribute('start');
|
|
||||||
var index = Array.prototype.indexOf.call(parent.children, node);
|
|
||||||
prefix = (start ? Number(start) + index : index + 1) + '. ';
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
prefix + content + (node.nextSibling && !/\n$/.test(content) ? '\n' : '')
|
|
||||||
)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.indentedCodeBlock = {
|
|
||||||
filter: function (node, options) {
|
|
||||||
return (
|
|
||||||
options.codeBlockStyle === 'indented' &&
|
|
||||||
node.nodeName === 'PRE' &&
|
|
||||||
node.firstChild &&
|
|
||||||
node.firstChild.nodeName === 'CODE'
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
replacement: function (content, node, options) {
|
|
||||||
return (
|
|
||||||
'\n\n ' +
|
|
||||||
node.firstChild.textContent.replace(/\n/g, '\n ') +
|
|
||||||
'\n\n'
|
|
||||||
)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.fencedCodeBlock = {
|
|
||||||
filter: function (node, options) {
|
|
||||||
return (
|
|
||||||
options.codeBlockStyle === 'fenced' &&
|
|
||||||
node.nodeName === 'PRE' &&
|
|
||||||
node.firstChild &&
|
|
||||||
node.firstChild.nodeName === 'CODE'
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
replacement: function (content, node, options) {
|
|
||||||
var className = node.firstChild.className || '';
|
|
||||||
var language = (className.match(/language-(\S+)/) || [null, ''])[1];
|
|
||||||
|
|
||||||
return (
|
|
||||||
'\n\n' + options.fence + language + '\n' +
|
|
||||||
node.firstChild.textContent +
|
|
||||||
'\n' + options.fence + '\n\n'
|
|
||||||
)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.horizontalRule = {
|
|
||||||
filter: 'hr',
|
|
||||||
|
|
||||||
replacement: function (content, node, options) {
|
|
||||||
return '\n\n' + options.hr + '\n\n'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.inlineLink = {
|
|
||||||
filter: function (node, options) {
|
|
||||||
return (
|
|
||||||
options.linkStyle === 'inlined' &&
|
|
||||||
node.nodeName === 'A' &&
|
|
||||||
node.getAttribute('href')
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
replacement: function (content, node) {
|
|
||||||
var href = node.getAttribute('href');
|
|
||||||
var title = node.title ? ' "' + node.title + '"' : '';
|
|
||||||
return '[' + content + '](' + href + title + ')'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.referenceLink = {
|
|
||||||
filter: function (node, options) {
|
|
||||||
return (
|
|
||||||
options.linkStyle === 'referenced' &&
|
|
||||||
node.nodeName === 'A' &&
|
|
||||||
node.getAttribute('href')
|
|
||||||
)
|
|
||||||
},
|
|
||||||
|
|
||||||
replacement: function (content, node, options) {
|
|
||||||
var href = node.getAttribute('href');
|
|
||||||
var title = node.title ? ' "' + node.title + '"' : '';
|
|
||||||
var replacement;
|
|
||||||
var reference;
|
|
||||||
|
|
||||||
switch (options.linkReferenceStyle) {
|
|
||||||
case 'collapsed':
|
|
||||||
replacement = '[' + content + '][]';
|
|
||||||
reference = '[' + content + ']: ' + href + title;
|
|
||||||
break
|
|
||||||
case 'shortcut':
|
|
||||||
replacement = '[' + content + ']';
|
|
||||||
reference = '[' + content + ']: ' + href + title;
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
var id = this.references.length + 1;
|
|
||||||
replacement = '[' + content + '][' + id + ']';
|
|
||||||
reference = '[' + id + ']: ' + href + title;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.references.push(reference);
|
|
||||||
return replacement
|
|
||||||
},
|
|
||||||
|
|
||||||
references: [],
|
|
||||||
|
|
||||||
append: function (options) {
|
|
||||||
var references = '';
|
|
||||||
if (this.references.length) {
|
|
||||||
references = '\n\n' + this.references.join('\n') + '\n\n';
|
|
||||||
this.references = []; // Reset references
|
|
||||||
}
|
|
||||||
return references
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.emphasis = {
|
|
||||||
filter: ['em', 'i'],
|
|
||||||
|
|
||||||
replacement: function (content, node, options) {
|
|
||||||
if (!content.trim()) return ''
|
|
||||||
return options.emDelimiter + content + options.emDelimiter
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.strong = {
|
|
||||||
filter: ['strong', 'b'],
|
|
||||||
|
|
||||||
replacement: function (content, node, options) {
|
|
||||||
if (!content.trim()) return ''
|
|
||||||
return options.strongDelimiter + content + options.strongDelimiter
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.code = {
|
|
||||||
filter: function (node) {
|
|
||||||
var hasSiblings = node.previousSibling || node.nextSibling;
|
|
||||||
var isCodeBlock = node.parentNode.nodeName === 'PRE' && !hasSiblings;
|
|
||||||
|
|
||||||
return node.nodeName === 'CODE' && !isCodeBlock
|
|
||||||
},
|
|
||||||
|
|
||||||
replacement: function (content) {
|
|
||||||
if (!content.trim()) return ''
|
|
||||||
|
|
||||||
var delimiter = '`';
|
|
||||||
var leadingSpace = '';
|
|
||||||
var trailingSpace = '';
|
|
||||||
var matches = content.match(/`+/gm);
|
|
||||||
if (matches) {
|
|
||||||
if (/^`/.test(content)) leadingSpace = ' ';
|
|
||||||
if (/`$/.test(content)) trailingSpace = ' ';
|
|
||||||
while (matches.indexOf(delimiter) !== -1) delimiter = delimiter + '`';
|
|
||||||
}
|
|
||||||
|
|
||||||
return delimiter + leadingSpace + content + trailingSpace + delimiter
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
rules.image = {
|
|
||||||
filter: 'img',
|
|
||||||
|
|
||||||
replacement: function (content, node) {
|
|
||||||
var alt = node.alt || '';
|
|
||||||
var src = node.getAttribute('src') || '';
|
|
||||||
var title = node.title || '';
|
|
||||||
var titlePart = title ? ' "' + title + '"' : '';
|
|
||||||
return src ? '![' + alt + ']' + '(' + src + titlePart + ')' : ''
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Manages a collection of rules used to convert HTML to Markdown
|
|
||||||
*/
|
|
||||||
|
|
||||||
function Rules (options) {
|
|
||||||
this.options = options;
|
|
||||||
this._keep = [];
|
|
||||||
this._remove = [];
|
|
||||||
|
|
||||||
this.blankRule = {
|
|
||||||
replacement: options.blankReplacement
|
|
||||||
};
|
|
||||||
|
|
||||||
this.keepReplacement = options.keepReplacement;
|
|
||||||
|
|
||||||
this.defaultRule = {
|
|
||||||
replacement: options.defaultReplacement
|
|
||||||
};
|
|
||||||
|
|
||||||
this.array = [];
|
|
||||||
for (var key in options.rules) this.array.push(options.rules[key]);
|
|
||||||
}
|
|
||||||
|
|
||||||
Rules.prototype = {
|
|
||||||
add: function (key, rule) {
|
|
||||||
this.array.unshift(rule);
|
|
||||||
},
|
|
||||||
|
|
||||||
keep: function (filter) {
|
|
||||||
this._keep.unshift({
|
|
||||||
filter: filter,
|
|
||||||
replacement: this.keepReplacement
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
remove: function (filter) {
|
|
||||||
this._remove.unshift({
|
|
||||||
filter: filter,
|
|
||||||
replacement: function () {
|
|
||||||
return ''
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
forNode: function (node) {
|
|
||||||
if (node.isBlank) return this.blankRule
|
|
||||||
var rule;
|
|
||||||
|
|
||||||
if ((rule = findRule(this.array, node, this.options))) return rule
|
|
||||||
if ((rule = findRule(this._keep, node, this.options))) return rule
|
|
||||||
if ((rule = findRule(this._remove, node, this.options))) return rule
|
|
||||||
|
|
||||||
return this.defaultRule
|
|
||||||
},
|
|
||||||
|
|
||||||
forEach: function (fn) {
|
|
||||||
for (var i = 0; i < this.array.length; i++) fn(this.array[i], i);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function findRule (rules, node, options) {
|
|
||||||
for (var i = 0; i < rules.length; i++) {
|
|
||||||
var rule = rules[i];
|
|
||||||
if (filterValue(rule, node, options)) return rule
|
|
||||||
}
|
|
||||||
return void 0
|
|
||||||
}
|
|
||||||
|
|
||||||
function filterValue (rule, node, options) {
|
|
||||||
var filter = rule.filter;
|
|
||||||
if (typeof filter === 'string') {
|
|
||||||
if (filter === node.nodeName.toLowerCase()) return true
|
|
||||||
} else if (Array.isArray(filter)) {
|
|
||||||
if (filter.indexOf(node.nodeName.toLowerCase()) > -1) return true
|
|
||||||
} else if (typeof filter === 'function') {
|
|
||||||
if (filter.call(rule, node, options)) return true
|
|
||||||
} else {
|
|
||||||
throw new TypeError('`filter` needs to be a string, array, or function')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The collapseWhitespace function is adapted from collapse-whitespace
|
|
||||||
* by Luc Thevenard.
|
|
||||||
*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2014 Luc Thevenard <lucthevenard@gmail.com>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* collapseWhitespace(options) removes extraneous whitespace from an the given element.
|
|
||||||
*
|
|
||||||
* @param {Object} options
|
|
||||||
*/
|
|
||||||
function collapseWhitespace (options) {
|
|
||||||
var element = options.element;
|
|
||||||
var isBlock = options.isBlock;
|
|
||||||
var isVoid = options.isVoid;
|
|
||||||
var isPre = options.isPre || function (node) {
|
|
||||||
return node.nodeName === 'PRE'
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!element.firstChild || isPre(element)) return
|
|
||||||
|
|
||||||
var prevText = null;
|
|
||||||
var prevVoid = false;
|
|
||||||
|
|
||||||
var prev = null;
|
|
||||||
var node = next(prev, element, isPre);
|
|
||||||
|
|
||||||
while (node !== element) {
|
|
||||||
if (node.nodeType === 3 || node.nodeType === 4) { // Node.TEXT_NODE or Node.CDATA_SECTION_NODE
|
|
||||||
var text = node.data.replace(/[ \r\n\t]+/g, ' ');
|
|
||||||
|
|
||||||
if ((!prevText || / $/.test(prevText.data)) &&
|
|
||||||
!prevVoid && text[0] === ' ') {
|
|
||||||
text = text.substr(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// `text` might be empty at this point.
|
|
||||||
if (!text) {
|
|
||||||
node = remove(node);
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
node.data = text;
|
|
||||||
|
|
||||||
prevText = node;
|
|
||||||
} else if (node.nodeType === 1) { // Node.ELEMENT_NODE
|
|
||||||
if (isBlock(node) || node.nodeName === 'BR') {
|
|
||||||
if (prevText) {
|
|
||||||
prevText.data = prevText.data.replace(/ $/, '');
|
|
||||||
}
|
|
||||||
|
|
||||||
prevText = null;
|
|
||||||
prevVoid = false;
|
|
||||||
} else if (isVoid(node)) {
|
|
||||||
// Avoid trimming space around non-block, non-BR void elements.
|
|
||||||
prevText = null;
|
|
||||||
prevVoid = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
node = remove(node);
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var nextNode = next(prev, node, isPre);
|
|
||||||
prev = node;
|
|
||||||
node = nextNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prevText) {
|
|
||||||
prevText.data = prevText.data.replace(/ $/, '');
|
|
||||||
if (!prevText.data) {
|
|
||||||
remove(prevText);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* remove(node) removes the given node from the DOM and returns the
|
|
||||||
* next node in the sequence.
|
|
||||||
*
|
|
||||||
* @param {Node} node
|
|
||||||
* @return {Node} node
|
|
||||||
*/
|
|
||||||
function remove (node) {
|
|
||||||
var next = node.nextSibling || node.parentNode;
|
|
||||||
|
|
||||||
node.parentNode.removeChild(node);
|
|
||||||
|
|
||||||
return next
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* next(prev, current, isPre) returns the next node in the sequence, given the
|
|
||||||
* current and previous nodes.
|
|
||||||
*
|
|
||||||
* @param {Node} prev
|
|
||||||
* @param {Node} current
|
|
||||||
* @param {Function} isPre
|
|
||||||
* @return {Node}
|
|
||||||
*/
|
|
||||||
function next (prev, current, isPre) {
|
|
||||||
if ((prev && prev.parentNode === current) || isPre(current)) {
|
|
||||||
return current.nextSibling || current.parentNode
|
|
||||||
}
|
|
||||||
|
|
||||||
return current.firstChild || current.nextSibling || current.parentNode
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set up window for Node.js
|
|
||||||
*/
|
|
||||||
|
|
||||||
var root = (typeof window !== 'undefined' ? window : {});
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Parsing HTML strings
|
|
||||||
*/
|
|
||||||
|
|
||||||
function canParseHTMLNatively () {
|
|
||||||
var Parser = root.DOMParser;
|
|
||||||
var canParse = false;
|
|
||||||
|
|
||||||
// Adapted from https://gist.github.com/1129031
|
|
||||||
// Firefox/Opera/IE throw errors on unsupported types
|
|
||||||
try {
|
|
||||||
// WebKit returns null on unsupported types
|
|
||||||
if (new Parser().parseFromString('', 'text/html')) {
|
|
||||||
canParse = true;
|
|
||||||
}
|
|
||||||
} catch (e) {}
|
|
||||||
|
|
||||||
return canParse
|
|
||||||
}
|
|
||||||
|
|
||||||
function createHTMLParser () {
|
|
||||||
var Parser = function () {};
|
|
||||||
|
|
||||||
{
|
|
||||||
if (shouldUseActiveX()) {
|
|
||||||
Parser.prototype.parseFromString = function (string) {
|
|
||||||
var doc = new window.ActiveXObject('htmlfile');
|
|
||||||
doc.designMode = 'on'; // disable on-page scripts
|
|
||||||
doc.open();
|
|
||||||
doc.write(string);
|
|
||||||
doc.close();
|
|
||||||
return doc
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
Parser.prototype.parseFromString = function (string) {
|
|
||||||
var doc = document.implementation.createHTMLDocument('');
|
|
||||||
doc.open();
|
|
||||||
doc.write(string);
|
|
||||||
doc.close();
|
|
||||||
return doc
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Parser
|
|
||||||
}
|
|
||||||
|
|
||||||
function shouldUseActiveX () {
|
|
||||||
var useActiveX = false;
|
|
||||||
try {
|
|
||||||
document.implementation.createHTMLDocument('').open();
|
|
||||||
} catch (e) {
|
|
||||||
if (window.ActiveXObject) useActiveX = true;
|
|
||||||
}
|
|
||||||
return useActiveX
|
|
||||||
}
|
|
||||||
|
|
||||||
var HTMLParser = canParseHTMLNatively() ? root.DOMParser : createHTMLParser();
|
|
||||||
|
|
||||||
function RootNode (input) {
|
|
||||||
var root;
|
|
||||||
if (typeof input === 'string') {
|
|
||||||
var doc = htmlParser().parseFromString(
|
|
||||||
// DOM parsers arrange elements in the <head> and <body>.
|
|
||||||
// Wrapping in a custom element ensures elements are reliably arranged in
|
|
||||||
// a single element.
|
|
||||||
'<x-turndown id="turndown-root">' + input + '</x-turndown>',
|
|
||||||
'text/html'
|
|
||||||
);
|
|
||||||
root = doc.getElementById('turndown-root');
|
|
||||||
} else {
|
|
||||||
root = input.cloneNode(true);
|
|
||||||
}
|
|
||||||
collapseWhitespace({
|
|
||||||
element: root,
|
|
||||||
isBlock: isBlock,
|
|
||||||
isVoid: isVoid
|
|
||||||
});
|
|
||||||
|
|
||||||
return root
|
|
||||||
}
|
|
||||||
|
|
||||||
var _htmlParser;
|
|
||||||
function htmlParser () {
|
|
||||||
_htmlParser = _htmlParser || new HTMLParser();
|
|
||||||
return _htmlParser
|
|
||||||
}
|
|
||||||
|
|
||||||
function Node (node) {
|
|
||||||
node.isBlock = isBlock(node);
|
|
||||||
node.isCode = node.nodeName.toLowerCase() === 'code' || node.parentNode.isCode;
|
|
||||||
node.isBlank = isBlank(node);
|
|
||||||
node.flankingWhitespace = flankingWhitespace(node);
|
|
||||||
return node
|
|
||||||
}
|
|
||||||
|
|
||||||
function isBlank (node) {
|
|
||||||
return (
|
|
||||||
['A', 'TH', 'TD'].indexOf(node.nodeName) === -1 &&
|
|
||||||
/^\s*$/i.test(node.textContent) &&
|
|
||||||
!isVoid(node) &&
|
|
||||||
!hasVoid(node)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
function flankingWhitespace (node) {
|
|
||||||
var leading = '';
|
|
||||||
var trailing = '';
|
|
||||||
|
|
||||||
if (!node.isBlock) {
|
|
||||||
var hasLeading = /^[ \r\n\t]/.test(node.textContent);
|
|
||||||
var hasTrailing = /[ \r\n\t]$/.test(node.textContent);
|
|
||||||
|
|
||||||
if (hasLeading && !isFlankedByWhitespace('left', node)) {
|
|
||||||
leading = ' ';
|
|
||||||
}
|
|
||||||
if (hasTrailing && !isFlankedByWhitespace('right', node)) {
|
|
||||||
trailing = ' ';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return { leading: leading, trailing: trailing }
|
|
||||||
}
|
|
||||||
|
|
||||||
function isFlankedByWhitespace (side, node) {
|
|
||||||
var sibling;
|
|
||||||
var regExp;
|
|
||||||
var isFlanked;
|
|
||||||
|
|
||||||
if (side === 'left') {
|
|
||||||
sibling = node.previousSibling;
|
|
||||||
regExp = / $/;
|
|
||||||
} else {
|
|
||||||
sibling = node.nextSibling;
|
|
||||||
regExp = /^ /;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sibling) {
|
|
||||||
if (sibling.nodeType === 3) {
|
|
||||||
isFlanked = regExp.test(sibling.nodeValue);
|
|
||||||
} else if (sibling.nodeType === 1 && !isBlock(sibling)) {
|
|
||||||
isFlanked = regExp.test(sibling.textContent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return isFlanked
|
|
||||||
}
|
|
||||||
|
|
||||||
var reduce = Array.prototype.reduce;
|
|
||||||
var leadingNewLinesRegExp = /^\n*/;
|
|
||||||
var trailingNewLinesRegExp = /\n*$/;
|
|
||||||
|
|
||||||
function TurndownService (options) {
|
|
||||||
if (!(this instanceof TurndownService)) return new TurndownService(options)
|
|
||||||
|
|
||||||
var defaults = {
|
|
||||||
rules: rules,
|
|
||||||
headingStyle: 'setext',
|
|
||||||
hr: '* * *',
|
|
||||||
bulletListMarker: '*',
|
|
||||||
codeBlockStyle: 'indented',
|
|
||||||
fence: '```',
|
|
||||||
emDelimiter: '_',
|
|
||||||
strongDelimiter: '**',
|
|
||||||
linkStyle: 'inlined',
|
|
||||||
linkReferenceStyle: 'full',
|
|
||||||
br: ' ',
|
|
||||||
blankReplacement: function (content, node) {
|
|
||||||
return node.isBlock ? '\n\n' : ''
|
|
||||||
},
|
|
||||||
keepReplacement: function (content, node) {
|
|
||||||
return node.isBlock ? '\n\n' + node.outerHTML + '\n\n' : node.outerHTML
|
|
||||||
},
|
|
||||||
defaultReplacement: function (content, node) {
|
|
||||||
return node.isBlock ? '\n\n' + content + '\n\n' : content
|
|
||||||
}
|
|
||||||
};
|
|
||||||
this.options = extend({}, defaults, options);
|
|
||||||
this.rules = new Rules(this.options);
|
|
||||||
}
|
|
||||||
|
|
||||||
TurndownService.prototype = {
|
|
||||||
/**
|
|
||||||
* The entry point for converting a string or DOM node to Markdown
|
|
||||||
* @public
|
|
||||||
* @param {String|HTMLElement} input The string or DOM node to convert
|
|
||||||
* @returns A Markdown representation of the input
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
|
|
||||||
turndown: function (input) {
|
|
||||||
if (!canConvert(input)) {
|
|
||||||
throw new TypeError(
|
|
||||||
input + ' is not a string, or an element/document/fragment node.'
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (input === '') return ''
|
|
||||||
|
|
||||||
var output = process.call(this, new RootNode(input));
|
|
||||||
return postProcess.call(this, output)
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add one or more plugins
|
|
||||||
* @public
|
|
||||||
* @param {Function|Array} plugin The plugin or array of plugins to add
|
|
||||||
* @returns The Turndown instance for chaining
|
|
||||||
* @type Object
|
|
||||||
*/
|
|
||||||
|
|
||||||
use: function (plugin) {
|
|
||||||
if (Array.isArray(plugin)) {
|
|
||||||
for (var i = 0; i < plugin.length; i++) this.use(plugin[i]);
|
|
||||||
} else if (typeof plugin === 'function') {
|
|
||||||
plugin(this);
|
|
||||||
} else {
|
|
||||||
throw new TypeError('plugin must be a Function or an Array of Functions')
|
|
||||||
}
|
|
||||||
return this
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds a rule
|
|
||||||
* @public
|
|
||||||
* @param {String} key The unique key of the rule
|
|
||||||
* @param {Object} rule The rule
|
|
||||||
* @returns The Turndown instance for chaining
|
|
||||||
* @type Object
|
|
||||||
*/
|
|
||||||
|
|
||||||
addRule: function (key, rule) {
|
|
||||||
this.rules.add(key, rule);
|
|
||||||
return this
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Keep a node (as HTML) that matches the filter
|
|
||||||
* @public
|
|
||||||
* @param {String|Array|Function} filter The unique key of the rule
|
|
||||||
* @returns The Turndown instance for chaining
|
|
||||||
* @type Object
|
|
||||||
*/
|
|
||||||
|
|
||||||
keep: function (filter) {
|
|
||||||
this.rules.keep(filter);
|
|
||||||
return this
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove a node that matches the filter
|
|
||||||
* @public
|
|
||||||
* @param {String|Array|Function} filter The unique key of the rule
|
|
||||||
* @returns The Turndown instance for chaining
|
|
||||||
* @type Object
|
|
||||||
*/
|
|
||||||
|
|
||||||
remove: function (filter) {
|
|
||||||
this.rules.remove(filter);
|
|
||||||
return this
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Escapes Markdown syntax
|
|
||||||
* @public
|
|
||||||
* @param {String} string The string to escape
|
|
||||||
* @returns A string with Markdown syntax escaped
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
|
|
||||||
escape: function (string) {
|
|
||||||
return (
|
|
||||||
string
|
|
||||||
// Escape backslash escapes!
|
|
||||||
.replace(/\\(\S)/g, '\\\\$1')
|
|
||||||
|
|
||||||
// Escape headings
|
|
||||||
.replace(/^(#{1,6} )/gm, '\\$1')
|
|
||||||
|
|
||||||
// Escape hr
|
|
||||||
.replace(/^([-*_] *){3,}$/gm, function (match, character) {
|
|
||||||
return match.split(character).join('\\' + character)
|
|
||||||
})
|
|
||||||
|
|
||||||
// Escape ol bullet points
|
|
||||||
.replace(/^(\W* {0,3})(\d+)\. /gm, '$1$2\\. ')
|
|
||||||
|
|
||||||
// Escape ul bullet points
|
|
||||||
.replace(/^([^\\\w]*)[*+-] /gm, function (match) {
|
|
||||||
return match.replace(/([*+-])/g, '\\$1')
|
|
||||||
})
|
|
||||||
|
|
||||||
// Escape blockquote indents
|
|
||||||
.replace(/^(\W* {0,3})> /gm, '$1\\> ')
|
|
||||||
|
|
||||||
// Escape em/strong *
|
|
||||||
.replace(/\*+(?![*\s\W]).+?\*+/g, function (match) {
|
|
||||||
return match.replace(/\*/g, '\\*')
|
|
||||||
})
|
|
||||||
|
|
||||||
// Escape em/strong _
|
|
||||||
.replace(/_+(?![_\s\W]).+?_+/g, function (match) {
|
|
||||||
return match.replace(/_/g, '\\_')
|
|
||||||
})
|
|
||||||
|
|
||||||
// Escape code _
|
|
||||||
.replace(/`+(?![`\s\W]).+?`+/g, function (match) {
|
|
||||||
return match.replace(/`/g, '\\`')
|
|
||||||
})
|
|
||||||
|
|
||||||
// Escape link brackets
|
|
||||||
.replace(/[\[\]]/g, '\\$&') // eslint-disable-line no-useless-escape
|
|
||||||
)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reduces a DOM node down to its Markdown string equivalent
|
|
||||||
* @private
|
|
||||||
* @param {HTMLElement} parentNode The node to convert
|
|
||||||
* @returns A Markdown representation of the node
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
|
|
||||||
function process (parentNode) {
|
|
||||||
var self = this;
|
|
||||||
return reduce.call(parentNode.childNodes, function (output, node) {
|
|
||||||
node = new Node(node);
|
|
||||||
|
|
||||||
var replacement = '';
|
|
||||||
if (node.nodeType === 3) {
|
|
||||||
replacement = node.isCode ? node.nodeValue : self.escape(node.nodeValue);
|
|
||||||
} else if (node.nodeType === 1) {
|
|
||||||
replacement = replacementForNode.call(self, node);
|
|
||||||
}
|
|
||||||
|
|
||||||
return join(output, replacement)
|
|
||||||
}, '')
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appends strings as each rule requires and trims the output
|
|
||||||
* @private
|
|
||||||
* @param {String} output The conversion output
|
|
||||||
* @returns A trimmed version of the ouput
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
|
|
||||||
function postProcess (output) {
|
|
||||||
var self = this;
|
|
||||||
this.rules.forEach(function (rule) {
|
|
||||||
if (typeof rule.append === 'function') {
|
|
||||||
output = join(output, rule.append(self.options));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return output.replace(/^[\t\r\n]+/, '').replace(/[\t\r\n\s]+$/, '')
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts an element node to its Markdown equivalent
|
|
||||||
* @private
|
|
||||||
* @param {HTMLElement} node The node to convert
|
|
||||||
* @returns A Markdown representation of the node
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
|
|
||||||
function replacementForNode (node) {
|
|
||||||
var rule = this.rules.forNode(node);
|
|
||||||
var content = process.call(this, node);
|
|
||||||
var whitespace = node.flankingWhitespace;
|
|
||||||
if (whitespace.leading || whitespace.trailing) content = content.trim();
|
|
||||||
return (
|
|
||||||
whitespace.leading +
|
|
||||||
rule.replacement(content, node, this.options) +
|
|
||||||
whitespace.trailing
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines the new lines between the current output and the replacement
|
|
||||||
* @private
|
|
||||||
* @param {String} output The current conversion output
|
|
||||||
* @param {String} replacement The string to append to the output
|
|
||||||
* @returns The whitespace to separate the current output and the replacement
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
|
|
||||||
function separatingNewlines (output, replacement) {
|
|
||||||
var newlines = [
|
|
||||||
output.match(trailingNewLinesRegExp)[0],
|
|
||||||
replacement.match(leadingNewLinesRegExp)[0]
|
|
||||||
].sort();
|
|
||||||
var maxNewlines = newlines[newlines.length - 1];
|
|
||||||
return maxNewlines.length < 2 ? maxNewlines : '\n\n'
|
|
||||||
}
|
|
||||||
|
|
||||||
function join (string1, string2) {
|
|
||||||
var separator = separatingNewlines(string1, string2);
|
|
||||||
|
|
||||||
// Remove trailing/leading newlines and replace with separator
|
|
||||||
string1 = string1.replace(trailingNewLinesRegExp, '');
|
|
||||||
string2 = string2.replace(leadingNewLinesRegExp, '');
|
|
||||||
|
|
||||||
return string1 + separator + string2
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines whether an input can be converted
|
|
||||||
* @private
|
|
||||||
* @param {String|HTMLElement} input Describe this parameter
|
|
||||||
* @returns Describe what it returns
|
|
||||||
* @type String|Object|Array|Boolean|Number
|
|
||||||
*/
|
|
||||||
|
|
||||||
function canConvert (input) {
|
|
||||||
return (
|
|
||||||
input != null && (
|
|
||||||
typeof input === 'string' ||
|
|
||||||
(input.nodeType && (
|
|
||||||
input.nodeType === 1 || input.nodeType === 9 || input.nodeType === 11
|
|
||||||
))
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return TurndownService;
|
|
||||||
|
|
||||||
}());
|
|
|
@ -1,22 +1,22 @@
|
||||||
(function(window) {
|
(function (window) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
window.ls.container.get("view").add({
|
window.ls.container.get("view").add({
|
||||||
selector: "data-forms-chart",
|
selector: "data-forms-chart",
|
||||||
controller: function(element, container, date, document) {
|
controller: function (element, container, date, document) {
|
||||||
let wrapper = document.createElement("div");
|
let wrapper = document.createElement("div");
|
||||||
let child = document.createElement("canvas");
|
let child = document.createElement("canvas");
|
||||||
let sources = element.getAttribute('data-forms-chart');
|
let sources = element.getAttribute('data-forms-chart');
|
||||||
let width = element.getAttribute('data-width') || 500;
|
let width = element.getAttribute('data-width') || 500;
|
||||||
let height = element.getAttribute('data-height') || 175;
|
let height = element.getAttribute('data-height') || 175;
|
||||||
let colors = (element.getAttribute('data-colors') || 'blue,green,orange,red').split(',');
|
let colors = (element.getAttribute('data-colors') || 'blue,green,orange,red').split(',');
|
||||||
let themes = {'blue': '#29b5d9', 'green': '#4eb55b', 'orange': '#fba233', 'red': '#dc3232',};
|
let themes = { 'blue': '#29b5d9', 'green': '#4eb55b', 'orange': '#fba233', 'red': '#dc3232', };
|
||||||
let range = {'24h': 'H:i', '7d': 'd F Y', '30d': 'd F Y', '90d': 'd F Y'}
|
let range = { '24h': 'H:i', '7d': 'd F Y', '30d': 'd F Y', '90d': 'd F Y' }
|
||||||
|
|
||||||
element.parentNode.insertBefore(wrapper, element.nextSibling);
|
element.parentNode.insertBefore(wrapper, element.nextSibling);
|
||||||
|
|
||||||
wrapper.classList.add('content');
|
wrapper.classList.add('content');
|
||||||
|
|
||||||
child.width = width;
|
child.width = width;
|
||||||
child.height = height;
|
child.height = height;
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
let chart = null;
|
let chart = null;
|
||||||
|
|
||||||
let check = function() {
|
let check = function () {
|
||||||
|
|
||||||
let config = {
|
let config = {
|
||||||
type: "line",
|
type: "line",
|
||||||
|
@ -36,14 +36,7 @@
|
||||||
},
|
},
|
||||||
options: {
|
options: {
|
||||||
responsive: true,
|
responsive: true,
|
||||||
title: {
|
tooltip: {
|
||||||
display: false,
|
|
||||||
text: "Stats"
|
|
||||||
},
|
|
||||||
legend: {
|
|
||||||
display: false
|
|
||||||
},
|
|
||||||
tooltips: {
|
|
||||||
mode: "index",
|
mode: "index",
|
||||||
intersect: false,
|
intersect: false,
|
||||||
caretPadding: 0
|
caretPadding: 0
|
||||||
|
@ -53,16 +46,21 @@
|
||||||
intersect: true
|
intersect: true
|
||||||
},
|
},
|
||||||
scales: {
|
scales: {
|
||||||
xAxes: [
|
x: {
|
||||||
{
|
display: false
|
||||||
display: false
|
},
|
||||||
}
|
y: {
|
||||||
],
|
display: false
|
||||||
yAxes: [
|
}
|
||||||
{
|
},
|
||||||
display: false
|
plugins: {
|
||||||
}
|
title: {
|
||||||
]
|
display: false,
|
||||||
|
text: "Stats"
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
display: false
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -82,25 +80,25 @@
|
||||||
config.data.datasets[i].data = [0, 0, 0, 0, 0, 0, 0];
|
config.data.datasets[i].data = [0, 0, 0, 0, 0, 0, 0];
|
||||||
config.data.datasets[i].fill = true;
|
config.data.datasets[i].fill = true;
|
||||||
|
|
||||||
if(!data) {
|
if (!data) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let dateFormat = (value.range && range[value.range]) ? range[value.range] : 'd F Y';
|
let dateFormat = (value.range && range[value.range]) ? range[value.range] : 'd F Y';
|
||||||
|
|
||||||
for (let x = 0; x < data.length; x++) {
|
for (let x = 0; x < data.length; x++) {
|
||||||
config.data.datasets[i].data[x] = data[x].value;
|
config.data.datasets[i].data[x] = data[x].value;
|
||||||
config.data.labels[x] = date.format(dateFormat, data[x].date);
|
config.data.labels[x] = date.format(dateFormat, data[x].date);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(chart) {
|
if (chart) {
|
||||||
chart.destroy();
|
chart.destroy();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
}
|
}
|
||||||
chart = new Chart(child.getContext("2d"), config);
|
chart = new Chart(child.getContext("2d"), config);
|
||||||
|
|
||||||
wrapper.dataset["canvas"] = true;
|
wrapper.dataset["canvas"] = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -110,4 +108,4 @@
|
||||||
element.addEventListener('change', check);
|
element.addEventListener('change', check);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})(window);
|
})(window);
|
Loading…
Reference in a new issue