You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-11-26 22:41:17 +02:00
All: Added Katex support
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -37,4 +37,6 @@ _mydocs
|
|||||||
Assets/DownloadBadges*.psd
|
Assets/DownloadBadges*.psd
|
||||||
node_modules
|
node_modules
|
||||||
Tools/github_oauth_token.txt
|
Tools/github_oauth_token.txt
|
||||||
_releases
|
_releases
|
||||||
|
ReactNativeClient/lib/csstojs/
|
||||||
|
ElectronClient/app/gui/note-viewer/fonts/
|
||||||
@@ -1,179 +1,193 @@
|
|||||||
<style>
|
<!DOCTYPE html>
|
||||||
body {
|
<html>
|
||||||
overflow: hidden;
|
<head>
|
||||||
}
|
<style>
|
||||||
|
body {
|
||||||
#content {
|
overflow: hidden;
|
||||||
overflow-y: auto;
|
|
||||||
height: 100%;
|
|
||||||
padding-left: 10px;
|
|
||||||
padding-right: 10px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<div id="hlScriptContainer"></div>
|
|
||||||
<div id="content" ondragstart="return false;" ondrop="return false;"></div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
const { ipcRenderer } = require('electron');
|
|
||||||
const contentElement = document.getElementById('content');
|
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
// Handle dynamically loading HLJS when a code element is present
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
let hljsScriptAdded = false;
|
|
||||||
let hljsLoaded = false;
|
|
||||||
|
|
||||||
function loadHljs(callback) {
|
|
||||||
hljsScriptAdded = true;
|
|
||||||
|
|
||||||
const script = document.createElement('script');
|
|
||||||
script.onload = function () {
|
|
||||||
hljsLoaded = true;
|
|
||||||
applyHljs();
|
|
||||||
};
|
|
||||||
script.src = 'highlight/highlight.pack.js';
|
|
||||||
document.getElementById('hlScriptContainer').appendChild(script);
|
|
||||||
|
|
||||||
const link = document.createElement('link');
|
|
||||||
link.rel = 'stylesheet';
|
|
||||||
// https://ace.c9.io/build/kitchen-sink.html
|
|
||||||
// https://highlightjs.org/static/demo/
|
|
||||||
link.href = 'highlight/styles/atom-one-light.css';
|
|
||||||
document.getElementById('hlScriptContainer').appendChild(link);
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadAndApplyHljs() {
|
|
||||||
var codeElements = document.getElementsByClassName('code');
|
|
||||||
if (!codeElements.length) return;
|
|
||||||
|
|
||||||
if (!hljsScriptAdded) {
|
|
||||||
this.loadHljs();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If HLJS is not loaded yet, no need to do anything. When it loads
|
|
||||||
// it will automatically apply the style to all the code elements.
|
|
||||||
if (hljsLoaded) applyHljs(codeElements);
|
|
||||||
}
|
|
||||||
|
|
||||||
function applyHljs(codeElements) {
|
|
||||||
if (typeof codeElements === 'undefined') codeElements = document.getElementsByClassName('code');
|
|
||||||
|
|
||||||
for (var i = 0; i < codeElements.length; i++) {
|
|
||||||
hljs.highlightBlock(codeElements[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
// / Handle dynamically loading HLJS when a code element is present
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Note: the scroll position source of truth is "percentScroll_". This is easier to manage than scrollTop because
|
|
||||||
// the scrollTop value depends on the images being loaded or not. For example, if the scrollTop is saved while
|
|
||||||
// images are being displayed then restored while images are being reloaded, the new scrollTop might be changed
|
|
||||||
// so that it is not greater than contentHeight. On the other hand, with percentScroll it is possible to restore
|
|
||||||
// it at any time knowing that it's not going to be changed because the content height has changed.
|
|
||||||
// To restore percentScroll the "checkScrollIID" interval is used. It constantly resets the scroll position during
|
|
||||||
// one second after the content has been updated.
|
|
||||||
//
|
|
||||||
// ignoreNextScroll is used to differentiate between scroll event from the users and those that are the result
|
|
||||||
// of programmatically changing scrollTop. We only want to respond to events initiated by the user.
|
|
||||||
|
|
||||||
let percentScroll_ = 0;
|
|
||||||
let checkScrollIID_ = null;
|
|
||||||
|
|
||||||
function setPercentScroll(percent) {
|
|
||||||
percentScroll_ = percent;
|
|
||||||
contentElement.scrollTop = percentScroll_ * maxScrollTop();
|
|
||||||
}
|
|
||||||
|
|
||||||
function percentScroll() {
|
|
||||||
return percentScroll_;
|
|
||||||
}
|
|
||||||
|
|
||||||
function restorePercentScroll() {
|
|
||||||
setPercentScroll(percentScroll_);
|
|
||||||
}
|
|
||||||
|
|
||||||
ipcRenderer.on('setHtml', (event, html) => {
|
|
||||||
contentElement.innerHTML = html;
|
|
||||||
|
|
||||||
loadAndApplyHljs();
|
|
||||||
|
|
||||||
// Remove the bullet from "ul" for checkbox lists and extra padding
|
|
||||||
const checkboxes = document.getElementsByClassName('checkbox');
|
|
||||||
for (let i = 0; i < checkboxes.length; i++) {
|
|
||||||
const cb = checkboxes[i];
|
|
||||||
const ul = cb.parentElement.parentElement;
|
|
||||||
if (!ul) {
|
|
||||||
console.warn('Unexpected layout for checkbox');
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
ul.style.listStyleType = 'none';
|
|
||||||
ul.style.paddingLeft = 0;
|
#content {
|
||||||
|
overflow-y: auto;
|
||||||
|
height: 100%;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.katex { font-size: 1.3em; } /* This controls the global Katex font size*/
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="hlScriptContainer"></div>
|
||||||
|
<div id="content" ondragstart="return false;" ondrop="return false;"></div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const { ipcRenderer } = require('electron');
|
||||||
|
const contentElement = document.getElementById('content');
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
// Handle dynamically loading HLJS when a code element is present
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
let hljsScriptAdded = false;
|
||||||
|
let hljsLoaded = false;
|
||||||
|
|
||||||
|
function loadHljs(callback) {
|
||||||
|
hljsScriptAdded = true;
|
||||||
|
|
||||||
|
const script = document.createElement('script');
|
||||||
|
script.onload = function () {
|
||||||
|
hljsLoaded = true;
|
||||||
|
applyHljs();
|
||||||
|
};
|
||||||
|
script.src = 'highlight/highlight.pack.js';
|
||||||
|
document.getElementById('hlScriptContainer').appendChild(script);
|
||||||
|
|
||||||
|
const link = document.createElement('link');
|
||||||
|
link.rel = 'stylesheet';
|
||||||
|
// https://ace.c9.io/build/kitchen-sink.html
|
||||||
|
// https://highlightjs.org/static/demo/
|
||||||
|
link.href = 'highlight/styles/atom-one-light.css';
|
||||||
|
document.getElementById('hlScriptContainer').appendChild(link);
|
||||||
}
|
}
|
||||||
|
|
||||||
let previousContentHeight = contentElement.scrollHeight;
|
function loadAndApplyHljs() {
|
||||||
let startTime = Date.now();
|
var codeElements = document.getElementsByClassName('code');
|
||||||
ignoreNextScrollEvent = true;
|
if (!codeElements.length) return;
|
||||||
restorePercentScroll();
|
|
||||||
|
|
||||||
if (!checkScrollIID_) {
|
if (!hljsScriptAdded) {
|
||||||
checkScrollIID_ = setInterval(() => {
|
this.loadHljs();
|
||||||
const h = contentElement.scrollHeight;
|
return;
|
||||||
if (h !== previousContentHeight) {
|
}
|
||||||
previousContentHeight = h;
|
|
||||||
ignoreNextScrollEvent = true;
|
// If HLJS is not loaded yet, no need to do anything. When it loads
|
||||||
restorePercentScroll();
|
// it will automatically apply the style to all the code elements.
|
||||||
|
if (hljsLoaded) applyHljs(codeElements);
|
||||||
|
}
|
||||||
|
|
||||||
|
function applyHljs(codeElements) {
|
||||||
|
if (typeof codeElements === 'undefined') codeElements = document.getElementsByClassName('code');
|
||||||
|
|
||||||
|
for (var i = 0; i < codeElements.length; i++) {
|
||||||
|
try {
|
||||||
|
hljs.highlightBlock(codeElements[i]);
|
||||||
|
} catch (error) {
|
||||||
|
console.warn('Cannot highlight code', error);
|
||||||
}
|
}
|
||||||
if (Date.now() - startTime >= 1000) {
|
}
|
||||||
clearInterval(checkScrollIID_);
|
}
|
||||||
checkScrollIID_ = null;
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
// / Handle dynamically loading HLJS when a code element is present
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Note: the scroll position source of truth is "percentScroll_". This is easier to manage than scrollTop because
|
||||||
|
// the scrollTop value depends on the images being loaded or not. For example, if the scrollTop is saved while
|
||||||
|
// images are being displayed then restored while images are being reloaded, the new scrollTop might be changed
|
||||||
|
// so that it is not greater than contentHeight. On the other hand, with percentScroll it is possible to restore
|
||||||
|
// it at any time knowing that it's not going to be changed because the content height has changed.
|
||||||
|
// To restore percentScroll the "checkScrollIID" interval is used. It constantly resets the scroll position during
|
||||||
|
// one second after the content has been updated.
|
||||||
|
//
|
||||||
|
// ignoreNextScroll is used to differentiate between scroll event from the users and those that are the result
|
||||||
|
// of programmatically changing scrollTop. We only want to respond to events initiated by the user.
|
||||||
|
|
||||||
|
let percentScroll_ = 0;
|
||||||
|
let checkScrollIID_ = null;
|
||||||
|
|
||||||
|
function setPercentScroll(percent) {
|
||||||
|
percentScroll_ = percent;
|
||||||
|
contentElement.scrollTop = percentScroll_ * maxScrollTop();
|
||||||
|
}
|
||||||
|
|
||||||
|
function percentScroll() {
|
||||||
|
return percentScroll_;
|
||||||
|
}
|
||||||
|
|
||||||
|
function restorePercentScroll() {
|
||||||
|
setPercentScroll(percentScroll_);
|
||||||
|
}
|
||||||
|
|
||||||
|
ipcRenderer.on('setHtml', (event, html) => {
|
||||||
|
contentElement.innerHTML = html;
|
||||||
|
|
||||||
|
loadAndApplyHljs();
|
||||||
|
|
||||||
|
// Remove the bullet from "ul" for checkbox lists and extra padding
|
||||||
|
const checkboxes = document.getElementsByClassName('checkbox');
|
||||||
|
for (let i = 0; i < checkboxes.length; i++) {
|
||||||
|
const cb = checkboxes[i];
|
||||||
|
const ul = cb.parentElement.parentElement;
|
||||||
|
if (!ul) {
|
||||||
|
console.warn('Unexpected layout for checkbox');
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}, 1);
|
ul.style.listStyleType = 'none';
|
||||||
}
|
ul.style.paddingLeft = 0;
|
||||||
});
|
}
|
||||||
|
|
||||||
let ignoreNextScrollEvent = false;
|
let previousContentHeight = contentElement.scrollHeight;
|
||||||
ipcRenderer.on('setPercentScroll', (event, percent) => {
|
let startTime = Date.now();
|
||||||
if (checkScrollIID_) {
|
ignoreNextScrollEvent = true;
|
||||||
clearInterval(checkScrollIID_);
|
restorePercentScroll();
|
||||||
checkScrollIID_ = null;
|
|
||||||
|
if (!checkScrollIID_) {
|
||||||
|
checkScrollIID_ = setInterval(() => {
|
||||||
|
const h = contentElement.scrollHeight;
|
||||||
|
if (h !== previousContentHeight) {
|
||||||
|
previousContentHeight = h;
|
||||||
|
ignoreNextScrollEvent = true;
|
||||||
|
restorePercentScroll();
|
||||||
|
}
|
||||||
|
if (Date.now() - startTime >= 1000) {
|
||||||
|
clearInterval(checkScrollIID_);
|
||||||
|
checkScrollIID_ = null;
|
||||||
|
}
|
||||||
|
}, 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let ignoreNextScrollEvent = false;
|
||||||
|
ipcRenderer.on('setPercentScroll', (event, percent) => {
|
||||||
|
if (checkScrollIID_) {
|
||||||
|
clearInterval(checkScrollIID_);
|
||||||
|
checkScrollIID_ = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
ignoreNextScrollEvent = true;
|
||||||
|
setPercentScroll(percent);
|
||||||
|
});
|
||||||
|
|
||||||
|
function maxScrollTop() {
|
||||||
|
return Math.max(0, contentElement.scrollHeight - contentElement.clientHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
ignoreNextScrollEvent = true;
|
contentElement.addEventListener('scroll', function(e) {
|
||||||
setPercentScroll(percent);
|
if (ignoreNextScrollEvent) {
|
||||||
});
|
ignoreNextScrollEvent = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const m = maxScrollTop();
|
||||||
|
const percent = m ? contentElement.scrollTop / m : 0;
|
||||||
|
setPercentScroll(percent);
|
||||||
|
ipcRenderer.sendToHost('percentScroll', percent);
|
||||||
|
});
|
||||||
|
|
||||||
function maxScrollTop() {
|
// Disable drag and drop otherwise it's possible to drop a URL
|
||||||
return Math.max(0, contentElement.scrollHeight - contentElement.clientHeight);
|
// on it and it will open in the view as a website.
|
||||||
}
|
document.addEventListener('drop', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
||||||
|
document.addEventListener('dragover', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
||||||
|
document.addEventListener('dragover', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
contentElement.addEventListener('scroll', function(e) {
|
</body>
|
||||||
if (ignoreNextScrollEvent) {
|
</html>
|
||||||
ignoreNextScrollEvent = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const m = maxScrollTop();
|
|
||||||
const percent = m ? contentElement.scrollTop / m : 0;
|
|
||||||
setPercentScroll(percent);
|
|
||||||
ipcRenderer.sendToHost('percentScroll', percent);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Disable drag and drop otherwise it's possible to drop a URL
|
|
||||||
// on it and it will open in the view as a website.
|
|
||||||
document.addEventListener('drop', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
});
|
|
||||||
document.addEventListener('dragover', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
});
|
|
||||||
document.addEventListener('dragover', function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
948
ElectronClient/app/package-lock.json
generated
948
ElectronClient/app/package-lock.json
generated
@@ -11,6 +11,7 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"7zip-bin-linux": "1.3.1",
|
"7zip-bin-linux": "1.3.1",
|
||||||
|
"7zip-bin-mac": "1.0.1",
|
||||||
"7zip-bin-win": "2.1.1"
|
"7zip-bin-win": "2.1.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -30,6 +31,18 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"7zip-bin-linux": {
|
||||||
|
"version": "1.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/7zip-bin-linux/-/7zip-bin-linux-1.3.1.tgz",
|
||||||
|
"integrity": "sha512-Wv1uEEeHbTiS1+ycpwUxYNuIcyohU6Y6vEqY3NquBkeqy0YhVdsNUGsj0XKSRciHR6LoJSEUuqYUexmws3zH7Q==",
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"7zip-bin-mac": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/7zip-bin-mac/-/7zip-bin-mac-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-Pmh3i78JJq3GgVlCcHRQXUdVXAI=",
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
"7zip-bin-win": {
|
"7zip-bin-win": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/7zip-bin-win/-/7zip-bin-win-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/7zip-bin-win/-/7zip-bin-win-2.1.1.tgz",
|
||||||
@@ -926,6 +939,7 @@
|
|||||||
"requires": {
|
"requires": {
|
||||||
"anymatch": "1.3.2",
|
"anymatch": "1.3.2",
|
||||||
"async-each": "1.0.1",
|
"async-each": "1.0.1",
|
||||||
|
"fsevents": "1.1.3",
|
||||||
"glob-parent": "2.0.0",
|
"glob-parent": "2.0.0",
|
||||||
"inherits": "2.0.3",
|
"inherits": "2.0.3",
|
||||||
"is-binary-path": "1.0.1",
|
"is-binary-path": "1.0.1",
|
||||||
@@ -2027,6 +2041,909 @@
|
|||||||
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
|
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"fsevents": {
|
||||||
|
"version": "1.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
|
||||||
|
"integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"nan": "2.7.0",
|
||||||
|
"node-pre-gyp": "0.6.39"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"abbrev": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"ajv": {
|
||||||
|
"version": "4.11.8",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"co": "4.6.0",
|
||||||
|
"json-stable-stringify": "1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ansi-regex": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"aproba": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"are-we-there-yet": {
|
||||||
|
"version": "1.1.4",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"delegates": "1.0.0",
|
||||||
|
"readable-stream": "2.2.9"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"asn1": {
|
||||||
|
"version": "0.2.3",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"assert-plus": {
|
||||||
|
"version": "0.2.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"asynckit": {
|
||||||
|
"version": "0.4.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"aws-sign2": {
|
||||||
|
"version": "0.6.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"aws4": {
|
||||||
|
"version": "1.6.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"balanced-match": {
|
||||||
|
"version": "0.4.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"bcrypt-pbkdf": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"tweetnacl": "0.14.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"block-stream": {
|
||||||
|
"version": "0.0.9",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"inherits": "2.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"boom": {
|
||||||
|
"version": "2.10.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"hoek": "2.16.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.7",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "0.4.2",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"buffer-shims": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"caseless": {
|
||||||
|
"version": "0.12.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"co": {
|
||||||
|
"version": "4.6.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"code-point-at": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"combined-stream": {
|
||||||
|
"version": "1.0.5",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"delayed-stream": "1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"concat-map": {
|
||||||
|
"version": "0.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"console-control-strings": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"core-util-is": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"cryptiles": {
|
||||||
|
"version": "2.0.5",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"boom": "2.10.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dashdash": {
|
||||||
|
"version": "1.14.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"assert-plus": "1.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"assert-plus": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"debug": {
|
||||||
|
"version": "2.6.8",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"ms": "2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"deep-extend": {
|
||||||
|
"version": "0.4.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"delayed-stream": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"delegates": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"detect-libc": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"ecc-jsbn": {
|
||||||
|
"version": "0.1.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"jsbn": "0.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"extend": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"extsprintf": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"forever-agent": {
|
||||||
|
"version": "0.6.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"form-data": {
|
||||||
|
"version": "2.1.4",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"asynckit": "0.4.0",
|
||||||
|
"combined-stream": "1.0.5",
|
||||||
|
"mime-types": "2.1.15"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fs.realpath": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"fstream": {
|
||||||
|
"version": "1.0.11",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"graceful-fs": "4.1.11",
|
||||||
|
"inherits": "2.0.3",
|
||||||
|
"mkdirp": "0.5.1",
|
||||||
|
"rimraf": "2.6.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fstream-ignore": {
|
||||||
|
"version": "1.0.5",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"fstream": "1.0.11",
|
||||||
|
"inherits": "2.0.3",
|
||||||
|
"minimatch": "3.0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gauge": {
|
||||||
|
"version": "2.7.4",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"aproba": "1.1.1",
|
||||||
|
"console-control-strings": "1.1.0",
|
||||||
|
"has-unicode": "2.0.1",
|
||||||
|
"object-assign": "4.1.1",
|
||||||
|
"signal-exit": "3.0.2",
|
||||||
|
"string-width": "1.0.2",
|
||||||
|
"strip-ansi": "3.0.1",
|
||||||
|
"wide-align": "1.1.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getpass": {
|
||||||
|
"version": "0.1.7",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"assert-plus": "1.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"assert-plus": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"glob": {
|
||||||
|
"version": "7.1.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"fs.realpath": "1.0.0",
|
||||||
|
"inflight": "1.0.6",
|
||||||
|
"inherits": "2.0.3",
|
||||||
|
"minimatch": "3.0.4",
|
||||||
|
"once": "1.4.0",
|
||||||
|
"path-is-absolute": "1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"graceful-fs": {
|
||||||
|
"version": "4.1.11",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"har-schema": {
|
||||||
|
"version": "1.0.5",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"har-validator": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"ajv": "4.11.8",
|
||||||
|
"har-schema": "1.0.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"has-unicode": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"hawk": {
|
||||||
|
"version": "3.1.3",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"boom": "2.10.1",
|
||||||
|
"cryptiles": "2.0.5",
|
||||||
|
"hoek": "2.16.3",
|
||||||
|
"sntp": "1.0.9"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hoek": {
|
||||||
|
"version": "2.16.3",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"http-signature": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"assert-plus": "0.2.0",
|
||||||
|
"jsprim": "1.4.0",
|
||||||
|
"sshpk": "1.13.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"inflight": {
|
||||||
|
"version": "1.0.6",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"once": "1.4.0",
|
||||||
|
"wrappy": "1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"inherits": {
|
||||||
|
"version": "2.0.3",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"ini": {
|
||||||
|
"version": "1.3.4",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"is-fullwidth-code-point": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"number-is-nan": "1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"is-typedarray": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"isarray": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"isstream": {
|
||||||
|
"version": "0.1.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"jodid25519": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"jsbn": "0.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"jsbn": {
|
||||||
|
"version": "0.1.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"json-schema": {
|
||||||
|
"version": "0.2.3",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"json-stable-stringify": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"jsonify": "0.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"json-stringify-safe": {
|
||||||
|
"version": "5.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"jsonify": {
|
||||||
|
"version": "0.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"jsprim": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"assert-plus": "1.0.0",
|
||||||
|
"extsprintf": "1.0.2",
|
||||||
|
"json-schema": "0.2.3",
|
||||||
|
"verror": "1.3.6"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"assert-plus": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mime-db": {
|
||||||
|
"version": "1.27.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"mime-types": {
|
||||||
|
"version": "2.1.15",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"mime-db": "1.27.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.0.4",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "1.1.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"minimist": {
|
||||||
|
"version": "0.0.8",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"mkdirp": {
|
||||||
|
"version": "0.5.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"minimist": "0.0.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"node-pre-gyp": {
|
||||||
|
"version": "0.6.39",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"detect-libc": "1.0.2",
|
||||||
|
"hawk": "3.1.3",
|
||||||
|
"mkdirp": "0.5.1",
|
||||||
|
"nopt": "4.0.1",
|
||||||
|
"npmlog": "4.1.0",
|
||||||
|
"rc": "1.2.1",
|
||||||
|
"request": "2.81.0",
|
||||||
|
"rimraf": "2.6.1",
|
||||||
|
"semver": "5.3.0",
|
||||||
|
"tar": "2.2.1",
|
||||||
|
"tar-pack": "3.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nopt": {
|
||||||
|
"version": "4.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"abbrev": "1.1.0",
|
||||||
|
"osenv": "0.1.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"npmlog": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"are-we-there-yet": "1.1.4",
|
||||||
|
"console-control-strings": "1.1.0",
|
||||||
|
"gauge": "2.7.4",
|
||||||
|
"set-blocking": "2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"number-is-nan": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"oauth-sign": {
|
||||||
|
"version": "0.8.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"object-assign": {
|
||||||
|
"version": "4.1.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"once": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"wrappy": "1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"os-homedir": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"os-tmpdir": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"osenv": {
|
||||||
|
"version": "0.1.4",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"os-homedir": "1.0.2",
|
||||||
|
"os-tmpdir": "1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"path-is-absolute": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"performance-now": {
|
||||||
|
"version": "0.2.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"process-nextick-args": {
|
||||||
|
"version": "1.0.7",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"punycode": {
|
||||||
|
"version": "1.4.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"qs": {
|
||||||
|
"version": "6.4.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"rc": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"deep-extend": "0.4.2",
|
||||||
|
"ini": "1.3.4",
|
||||||
|
"minimist": "1.2.0",
|
||||||
|
"strip-json-comments": "2.0.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"minimist": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"readable-stream": {
|
||||||
|
"version": "2.2.9",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"buffer-shims": "1.0.0",
|
||||||
|
"core-util-is": "1.0.2",
|
||||||
|
"inherits": "2.0.3",
|
||||||
|
"isarray": "1.0.0",
|
||||||
|
"process-nextick-args": "1.0.7",
|
||||||
|
"string_decoder": "1.0.1",
|
||||||
|
"util-deprecate": "1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"request": {
|
||||||
|
"version": "2.81.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"aws-sign2": "0.6.0",
|
||||||
|
"aws4": "1.6.0",
|
||||||
|
"caseless": "0.12.0",
|
||||||
|
"combined-stream": "1.0.5",
|
||||||
|
"extend": "3.0.1",
|
||||||
|
"forever-agent": "0.6.1",
|
||||||
|
"form-data": "2.1.4",
|
||||||
|
"har-validator": "4.2.1",
|
||||||
|
"hawk": "3.1.3",
|
||||||
|
"http-signature": "1.1.1",
|
||||||
|
"is-typedarray": "1.0.0",
|
||||||
|
"isstream": "0.1.2",
|
||||||
|
"json-stringify-safe": "5.0.1",
|
||||||
|
"mime-types": "2.1.15",
|
||||||
|
"oauth-sign": "0.8.2",
|
||||||
|
"performance-now": "0.2.0",
|
||||||
|
"qs": "6.4.0",
|
||||||
|
"safe-buffer": "5.0.1",
|
||||||
|
"stringstream": "0.0.5",
|
||||||
|
"tough-cookie": "2.3.2",
|
||||||
|
"tunnel-agent": "0.6.0",
|
||||||
|
"uuid": "3.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rimraf": {
|
||||||
|
"version": "2.6.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"glob": "7.1.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"safe-buffer": {
|
||||||
|
"version": "5.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"semver": {
|
||||||
|
"version": "5.3.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"set-blocking": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"signal-exit": {
|
||||||
|
"version": "3.0.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"sntp": {
|
||||||
|
"version": "1.0.9",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"hoek": "2.16.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sshpk": {
|
||||||
|
"version": "1.13.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"asn1": "0.2.3",
|
||||||
|
"assert-plus": "1.0.0",
|
||||||
|
"bcrypt-pbkdf": "1.0.1",
|
||||||
|
"dashdash": "1.14.1",
|
||||||
|
"ecc-jsbn": "0.1.1",
|
||||||
|
"getpass": "0.1.7",
|
||||||
|
"jodid25519": "1.0.2",
|
||||||
|
"jsbn": "0.1.1",
|
||||||
|
"tweetnacl": "0.14.5"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"assert-plus": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"string-width": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"code-point-at": "1.1.0",
|
||||||
|
"is-fullwidth-code-point": "1.0.0",
|
||||||
|
"strip-ansi": "3.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"string_decoder": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "5.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"stringstream": {
|
||||||
|
"version": "0.0.5",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"strip-ansi": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"ansi-regex": "2.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"strip-json-comments": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"tar": {
|
||||||
|
"version": "2.2.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"block-stream": "0.0.9",
|
||||||
|
"fstream": "1.0.11",
|
||||||
|
"inherits": "2.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tar-pack": {
|
||||||
|
"version": "3.4.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"debug": "2.6.8",
|
||||||
|
"fstream": "1.0.11",
|
||||||
|
"fstream-ignore": "1.0.5",
|
||||||
|
"once": "1.4.0",
|
||||||
|
"readable-stream": "2.2.9",
|
||||||
|
"rimraf": "2.6.1",
|
||||||
|
"tar": "2.2.1",
|
||||||
|
"uid-number": "0.0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tough-cookie": {
|
||||||
|
"version": "2.3.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"punycode": "1.4.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tunnel-agent": {
|
||||||
|
"version": "0.6.0",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "5.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tweetnacl": {
|
||||||
|
"version": "0.14.5",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"uid-number": {
|
||||||
|
"version": "0.0.6",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"util-deprecate": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"uuid": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"verror": {
|
||||||
|
"version": "1.3.6",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"extsprintf": "1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"wide-align": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"string-width": "1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"wrappy": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"bundled": true,
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"fullstore": {
|
"fullstore": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/fullstore/-/fullstore-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/fullstore/-/fullstore-1.1.0.tgz",
|
||||||
@@ -2680,6 +3597,14 @@
|
|||||||
"resolved": "https://registry.npmjs.org/jssha/-/jssha-2.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/jssha/-/jssha-2.3.1.tgz",
|
||||||
"integrity": "sha1-FHshJTaQNcpLL30hDcU58Amz3po="
|
"integrity": "sha1-FHshJTaQNcpLL30hDcU58Amz3po="
|
||||||
},
|
},
|
||||||
|
"katex": {
|
||||||
|
"version": "0.9.0-beta1",
|
||||||
|
"resolved": "https://registry.npmjs.org/katex/-/katex-0.9.0-beta1.tgz",
|
||||||
|
"integrity": "sha512-M7c7Eihp665Bh9wDR0xg/PdE1OuCa15PsiDQSBYyr+xJR8WrFP8nxdNF1lNUCBPzEup4zECG2jFUIZnU66xBRQ==",
|
||||||
|
"requires": {
|
||||||
|
"match-at": "0.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"kind-of": {
|
"kind-of": {
|
||||||
"version": "3.2.2",
|
"version": "3.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||||
@@ -2860,6 +3785,29 @@
|
|||||||
"uc.micro": "1.0.3"
|
"uc.micro": "1.0.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"markdown-it-katex": {
|
||||||
|
"version": "2.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/markdown-it-katex/-/markdown-it-katex-2.0.3.tgz",
|
||||||
|
"integrity": "sha1-17hqGuoLnWSW+rTnkZoY/e9YnDk=",
|
||||||
|
"requires": {
|
||||||
|
"katex": "0.6.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"katex": {
|
||||||
|
"version": "0.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/katex/-/katex-0.6.0.tgz",
|
||||||
|
"integrity": "sha1-EkGOCRIcBckgQbazuftrqyE8tvM=",
|
||||||
|
"requires": {
|
||||||
|
"match-at": "0.1.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"match-at": {
|
||||||
|
"version": "0.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/match-at/-/match-at-0.1.1.tgz",
|
||||||
|
"integrity": "sha512-h4Yd392z9mST+dzc+yjuybOGFNOZjmXIPKWjxBd1Bb23r4SmDOsk2NYCU2BMUBGbSpZqwVsZYNq26QS3xfaT3Q=="
|
||||||
|
},
|
||||||
"md5": {
|
"md5": {
|
||||||
"version": "2.2.1",
|
"version": "2.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
"pack": "node_modules/.bin/electron-builder --dir",
|
"pack": "node_modules/.bin/electron-builder --dir",
|
||||||
"dist": "node_modules/.bin/electron-builder",
|
"dist": "node_modules/.bin/electron-builder",
|
||||||
"publish": "build -p always",
|
"publish": "build -p always",
|
||||||
"postinstall": "node compile-jsx.js && node compile-package-info.js",
|
"postinstall": "node compile-jsx.js && node compile-package-info.js && node ../../Tools/copycss.js --copy-fonts",
|
||||||
"compile": "node compile-jsx.js && node compile-package-info.js"
|
"compile": "node compile-jsx.js && node compile-package-info.js && node ../../Tools/copycss.js --copy-fonts"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -62,10 +62,10 @@
|
|||||||
"highlight.js": "^9.12.0",
|
"highlight.js": "^9.12.0",
|
||||||
"html-entities": "^1.2.1",
|
"html-entities": "^1.2.1",
|
||||||
"jssha": "^2.3.1",
|
"jssha": "^2.3.1",
|
||||||
|
"katex": "^0.9.0-beta1",
|
||||||
"levenshtein": "^1.0.5",
|
"levenshtein": "^1.0.5",
|
||||||
"lodash": "^4.17.4",
|
"lodash": "^4.17.4",
|
||||||
"markdown-it": "^8.4.0",
|
"markdown-it": "^8.4.0",
|
||||||
"markdown-it-katex": "^2.0.3",
|
|
||||||
"md5": "^2.2.1",
|
"md5": "^2.2.1",
|
||||||
"mime": "^2.0.3",
|
"mime": "^2.0.3",
|
||||||
"moment": "^2.19.1",
|
"moment": "^2.19.1",
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ const Resource = require('lib/models/Resource.js');
|
|||||||
const ModelCache = require('lib/ModelCache');
|
const ModelCache = require('lib/ModelCache');
|
||||||
const { shim } = require('lib/shim.js');
|
const { shim } = require('lib/shim.js');
|
||||||
const md5 = require('md5');
|
const md5 = require('md5');
|
||||||
|
const MdToHtml_Katex = require('lib/MdToHtml_Katex');
|
||||||
|
|
||||||
class MdToHtml {
|
class MdToHtml {
|
||||||
|
|
||||||
@@ -156,27 +157,56 @@ class MdToHtml {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
customCodeHandler_(language) {
|
||||||
|
if (!language) return null;
|
||||||
|
|
||||||
|
const handlers = {};
|
||||||
|
handlers['katex'] = new MdToHtml_Katex();
|
||||||
|
return language in handlers ? handlers[language] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
parseInlineCodeLanguage_(content) {
|
||||||
|
const m = content.match(/^\{\.([a-zA-Z0-9]+)\}/);
|
||||||
|
if (m && m.length >= 2) {
|
||||||
|
const language = m[1];
|
||||||
|
return {
|
||||||
|
language: language,
|
||||||
|
newContent: content.substr(language.length + 3),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
renderTokens_(markdownIt, tokens, options) {
|
renderTokens_(markdownIt, tokens, options) {
|
||||||
let output = [];
|
let output = [];
|
||||||
let previousToken = null;
|
let previousToken = null;
|
||||||
let anchorAttrs = [];
|
let anchorAttrs = [];
|
||||||
|
let extraCssBlocks = {};
|
||||||
|
|
||||||
for (let i = 0; i < tokens.length; i++) {
|
for (let i = 0; i < tokens.length; i++) {
|
||||||
const t = tokens[i];
|
let t = tokens[i];
|
||||||
const nextToken = i < tokens.length ? tokens[i+1] : null;
|
const nextToken = i < tokens.length ? tokens[i+1] : null;
|
||||||
|
|
||||||
let tag = t.tag;
|
let tag = t.tag;
|
||||||
let openTag = null;
|
let openTag = null;
|
||||||
let closeTag = null;
|
let closeTag = null;
|
||||||
let attrs = t.attrs ? t.attrs : [];
|
let attrs = t.attrs ? t.attrs : [];
|
||||||
|
let tokenContent = t.content ? t.content : null;
|
||||||
const isCodeBlock = tag === 'code' && t.block;
|
const isCodeBlock = tag === 'code' && t.block;
|
||||||
|
const isInlineCode = t.type === 'code_inline';
|
||||||
|
const codeBlockLanguage = t && t.info ? t.info : null;
|
||||||
|
let codeBlockHandler = null;
|
||||||
|
|
||||||
// if (t.map) attrs.push(['data-map', t.map.join(':')]);
|
if (isCodeBlock) codeBlockHandler = this.customCodeHandler_(codeBlockLanguage);
|
||||||
|
|
||||||
if (previousToken && previousToken.tag === 'li' && tag === 'p') {
|
if (previousToken && previousToken.tag === 'li' && tag === 'p') {
|
||||||
// Markdown-it render list items as <li><p>Text<p></li> which makes it
|
// Markdown-it render list items as <li><p>Text<p></li> which makes it
|
||||||
// complicated to style and layout the HTML, so we remove this extra
|
// complicated to style and layout the HTML, so we remove this extra
|
||||||
// <p> here and below in closeTag.
|
// <p> here and below in closeTag.
|
||||||
openTag = null;
|
openTag = null;
|
||||||
|
} else if (isInlineCode) {
|
||||||
|
openTag = null;
|
||||||
} else if (tag && t.type.indexOf('_open') >= 0) {
|
} else if (tag && t.type.indexOf('_open') >= 0) {
|
||||||
openTag = tag;
|
openTag = tag;
|
||||||
} else if (tag && t.type.indexOf('_close') >= 0) {
|
} else if (tag && t.type.indexOf('_close') >= 0) {
|
||||||
@@ -186,7 +216,11 @@ class MdToHtml {
|
|||||||
} else if (t.type === 'link_open') {
|
} else if (t.type === 'link_open') {
|
||||||
openTag = 'a';
|
openTag = 'a';
|
||||||
} else if (isCodeBlock) {
|
} else if (isCodeBlock) {
|
||||||
openTag = 'pre';
|
if (codeBlockHandler) {
|
||||||
|
openTag = null;
|
||||||
|
} else {
|
||||||
|
openTag = 'pre';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (openTag) {
|
if (openTag) {
|
||||||
@@ -201,30 +235,42 @@ class MdToHtml {
|
|||||||
|
|
||||||
if (isCodeBlock) {
|
if (isCodeBlock) {
|
||||||
const codeAttrs = ['code'];
|
const codeAttrs = ['code'];
|
||||||
if (t.info) codeAttrs.push(t.info); // t.info contains the language when the token is a codeblock
|
if (!codeBlockHandler) {
|
||||||
output.push('<code class="' + codeAttrs.join(' ') + '">');
|
if (codeBlockLanguage) codeAttrs.push(t.info); // t.info contains the language when the token is a codeblock
|
||||||
|
output.push('<code class="' + codeAttrs.join(' ') + '">');
|
||||||
|
}
|
||||||
|
} else if (isInlineCode) {
|
||||||
|
const result = this.parseInlineCodeLanguage_(tokenContent);
|
||||||
|
if (result) {
|
||||||
|
codeBlockHandler = this.customCodeHandler_(result.language);
|
||||||
|
tokenContent = result.newContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!codeBlockHandler) {
|
||||||
|
output.push('<code>');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (codeBlockHandler) codeBlockHandler.loadAssets();
|
||||||
|
|
||||||
if (t.type === 'image') {
|
if (t.type === 'image') {
|
||||||
if (t.content) attrs.push(['title', t.content]);
|
if (tokenContent) attrs.push(['title', tokenContent]);
|
||||||
output.push(this.renderImage_(attrs, options));
|
output.push(this.renderImage_(attrs, options));
|
||||||
} else if (t.type === 'softbreak') {
|
} else if (t.type === 'softbreak') {
|
||||||
output.push('<br/>');
|
output.push('<br/>');
|
||||||
} else if (t.type === 'hr') {
|
} else if (t.type === 'hr') {
|
||||||
output.push('<hr/>');
|
output.push('<hr/>');
|
||||||
} else if (t.type === 'math_inline') {
|
|
||||||
const mathText = markdownIt.render('$' + t.content + '$');
|
|
||||||
output.push(mathText);
|
|
||||||
} else if (t.type === 'math_block') {
|
|
||||||
const mathText = markdownIt.render('$$' + t.content + '$$');
|
|
||||||
output.push(mathText);
|
|
||||||
} else {
|
} else {
|
||||||
if (t.children) {
|
if (t.children) {
|
||||||
const parsedChildren = this.renderTokens_(markdownIt, t.children, options);
|
const parsedChildren = this.renderTokens_(markdownIt, t.children, options);
|
||||||
output = output.concat(parsedChildren);
|
output = output.concat(parsedChildren);
|
||||||
} else {
|
} else {
|
||||||
if (t.content) {
|
if (tokenContent) {
|
||||||
output.push(htmlentities(t.content));
|
if ((isCodeBlock || isInlineCode) && codeBlockHandler) {
|
||||||
|
output = codeBlockHandler.processContent(output, tokenContent);
|
||||||
|
} else {
|
||||||
|
output.push(htmlentities(tokenContent));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -236,10 +282,18 @@ class MdToHtml {
|
|||||||
} else if (tag && t.type.indexOf('inline') >= 0) {
|
} else if (tag && t.type.indexOf('inline') >= 0) {
|
||||||
closeTag = openTag;
|
closeTag = openTag;
|
||||||
} else if (isCodeBlock) {
|
} else if (isCodeBlock) {
|
||||||
closeTag = openTag;
|
if (!codeBlockHandler) closeTag = openTag;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isCodeBlock) output.push('</code>');
|
if (isCodeBlock) {
|
||||||
|
if (!codeBlockHandler) {
|
||||||
|
output.push('</code>');
|
||||||
|
}
|
||||||
|
} else if (isInlineCode) {
|
||||||
|
if (!codeBlockHandler) {
|
||||||
|
output.push('</code>');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (closeTag) {
|
if (closeTag) {
|
||||||
if (closeTag === 'a') {
|
if (closeTag === 'a') {
|
||||||
@@ -249,8 +303,28 @@ class MdToHtml {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (codeBlockHandler) {
|
||||||
|
const extraCss = codeBlockHandler.extraCss();
|
||||||
|
const name = codeBlockHandler.name();
|
||||||
|
if (extraCss && !(name in extraCssBlocks)) {
|
||||||
|
extraCssBlocks[name] = extraCss;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
previousToken = t;
|
previousToken = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Insert the extra CSS at the top of the HTML
|
||||||
|
|
||||||
|
const temp = ['<style>'];
|
||||||
|
for (let n in extraCssBlocks) {
|
||||||
|
if (!extraCssBlocks.hasOwnProperty(n)) continue;
|
||||||
|
temp.push(extraCssBlocks[n]);
|
||||||
|
}
|
||||||
|
temp.push('</style>');
|
||||||
|
|
||||||
|
output = temp.concat(output);
|
||||||
|
|
||||||
return output.join('');
|
return output.join('');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,8 +341,6 @@ class MdToHtml {
|
|||||||
linkify: true,
|
linkify: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
md.use(require('markdown-it-katex'));
|
|
||||||
|
|
||||||
// Hack to make checkboxes clickable. Ideally, checkboxes should be parsed properly in
|
// Hack to make checkboxes clickable. Ideally, checkboxes should be parsed properly in
|
||||||
// renderTokens_(), but for now this hack works. Marking it with HORRIBLE_HACK so
|
// renderTokens_(), but for now this hack works. Marking it with HORRIBLE_HACK so
|
||||||
// that it can be removed and replaced later on.
|
// that it can be removed and replaced later on.
|
||||||
@@ -288,10 +360,11 @@ class MdToHtml {
|
|||||||
const env = {};
|
const env = {};
|
||||||
const tokens = md.parse(body, env);
|
const tokens = md.parse(body, env);
|
||||||
|
|
||||||
|
let renderedBody = this.renderTokens_(md, tokens, options);
|
||||||
|
|
||||||
// console.info(body);
|
// console.info(body);
|
||||||
// console.info(tokens);
|
// console.info(tokens);
|
||||||
|
// console.info(renderedBody);
|
||||||
let renderedBody = this.renderTokens_(md, tokens, options);
|
|
||||||
|
|
||||||
if (HORRIBLE_HACK) {
|
if (HORRIBLE_HACK) {
|
||||||
let loopCount = 0;
|
let loopCount = 0;
|
||||||
@@ -389,7 +462,7 @@ class MdToHtml {
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const styleHtml = '<style>' + normalizeCss + "\n" + css + '</style>' + '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.5.1/katex.min.css">';
|
const styleHtml = '<style>' + normalizeCss + "\n" + css + '</style>'; //+ '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.5.1/katex.min.css">';
|
||||||
|
|
||||||
const output = styleHtml + renderedBody;
|
const output = styleHtml + renderedBody;
|
||||||
|
|
||||||
|
|||||||
44
ReactNativeClient/lib/MdToHtml_Katex.js
Normal file
44
ReactNativeClient/lib/MdToHtml_Katex.js
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
const { shim } = require('lib/shim');
|
||||||
|
const katex = require('katex');
|
||||||
|
const katexCss = require('lib/csstojs/katex.css.js');
|
||||||
|
const Setting = require('lib/models/Setting');
|
||||||
|
|
||||||
|
class MdToHtml_Katex {
|
||||||
|
|
||||||
|
name() {
|
||||||
|
return 'katex';
|
||||||
|
}
|
||||||
|
|
||||||
|
processContent(renderedTokens, content) {
|
||||||
|
try {
|
||||||
|
const renderered = katex.renderToString(content);
|
||||||
|
renderedTokens.push(renderered);
|
||||||
|
} catch (error) {
|
||||||
|
renderedTokens.push('Cannot render Katex content: ' + error.message);
|
||||||
|
}
|
||||||
|
return renderedTokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
extraCss() {
|
||||||
|
return katexCss;
|
||||||
|
}
|
||||||
|
|
||||||
|
async loadAssets() {
|
||||||
|
// In node, the fonts are simply copied using copycss to where Katex expects to find them, which is under app/gui/note-viewer/fonts
|
||||||
|
|
||||||
|
// In React Native, it's more complicated and we need to download and copy them to the right directory. Ideally, we should embed
|
||||||
|
// them as an asset and copy them from there (or load them from there by modifying Katex CSS), but for now that will do.
|
||||||
|
|
||||||
|
if (shim.isReactNative()) {
|
||||||
|
// Fonts must go under the resourceDir directory because this is the baseUrl of NoteBodyViewer
|
||||||
|
const baseDir = Setting.value('resourceDir');
|
||||||
|
await shim.fsDriver().mkdir(baseDir + '/fonts');
|
||||||
|
await shim.fetchBlob('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.9.0-beta1/fonts/KaTeX_Main-Regular.woff2', { overwrite: false, path: baseDir + '/fonts/KaTeX_Main-Regular.woff2' });
|
||||||
|
await shim.fetchBlob('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.9.0-beta1/fonts/KaTeX_Math-Italic.woff2', { overwrite: false, path: baseDir + '/fonts/KaTeX_Math-Italic.woff2' });
|
||||||
|
await shim.fetchBlob('https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.9.0-beta1/fonts/KaTeX_Size1-Regular.woff2', { overwrite: false, path: baseDir + '/fonts/KaTeX_Size1-Regular.woff2' });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = MdToHtml_Katex;
|
||||||
@@ -51,7 +51,19 @@ class NoteBodyViewer extends Component {
|
|||||||
paddingBottom: '3.8em', // Extra bottom padding to make it possible to scroll past the action button (so that it doesn't overlap the text)
|
paddingBottom: '3.8em', // Extra bottom padding to make it possible to scroll past the action button (so that it doesn't overlap the text)
|
||||||
};
|
};
|
||||||
|
|
||||||
const html = this.mdToHtml_.render(note ? note.body : '', this.props.webViewStyle, mdOptions);
|
let html = this.mdToHtml_.render(note ? note.body : '', this.props.webViewStyle, mdOptions);
|
||||||
|
|
||||||
|
html = `
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
` + html + `
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
`;
|
||||||
|
|
||||||
let webViewStyle = {}
|
let webViewStyle = {}
|
||||||
// On iOS, the onLoadEnd() event is never fired so always
|
// On iOS, the onLoadEnd() event is never fired so always
|
||||||
|
|||||||
@@ -45,12 +45,20 @@ function shimInit() {
|
|||||||
|
|
||||||
let headers = options.headers ? options.headers : {};
|
let headers = options.headers ? options.headers : {};
|
||||||
let method = options.method ? options.method : 'GET';
|
let method = options.method ? options.method : 'GET';
|
||||||
|
const overwrite = 'overwrite' in options ? options.overwrite : true;
|
||||||
|
|
||||||
let dirs = RNFetchBlob.fs.dirs;
|
let dirs = RNFetchBlob.fs.dirs;
|
||||||
let localFilePath = options.path;
|
let localFilePath = options.path;
|
||||||
if (localFilePath.indexOf('/') !== 0) localFilePath = dirs.DocumentDir + '/' + localFilePath;
|
if (localFilePath.indexOf('/') !== 0) localFilePath = dirs.DocumentDir + '/' + localFilePath;
|
||||||
|
|
||||||
|
if (!overwrite) {
|
||||||
|
if (await shim.fsDriver().exists(localFilePath)) {
|
||||||
|
return { ok: true };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
delete options.path;
|
delete options.path;
|
||||||
|
delete options.overwrite;
|
||||||
|
|
||||||
const doFetchBlob = () => {
|
const doFetchBlob = () => {
|
||||||
return RNFetchBlob.config({
|
return RNFetchBlob.config({
|
||||||
|
|||||||
13
ReactNativeClient/package-lock.json
generated
13
ReactNativeClient/package-lock.json
generated
@@ -3397,6 +3397,14 @@
|
|||||||
"verror": "1.10.0"
|
"verror": "1.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"katex": {
|
||||||
|
"version": "0.9.0-beta1",
|
||||||
|
"resolved": "https://registry.npmjs.org/katex/-/katex-0.9.0-beta1.tgz",
|
||||||
|
"integrity": "sha512-M7c7Eihp665Bh9wDR0xg/PdE1OuCa15PsiDQSBYyr+xJR8WrFP8nxdNF1lNUCBPzEup4zECG2jFUIZnU66xBRQ==",
|
||||||
|
"requires": {
|
||||||
|
"match-at": "0.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"kind-of": {
|
"kind-of": {
|
||||||
"version": "3.2.2",
|
"version": "3.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
||||||
@@ -3658,6 +3666,11 @@
|
|||||||
"uc.micro": "1.0.3"
|
"uc.micro": "1.0.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"match-at": {
|
||||||
|
"version": "0.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/match-at/-/match-at-0.1.1.tgz",
|
||||||
|
"integrity": "sha512-h4Yd392z9mST+dzc+yjuybOGFNOZjmXIPKWjxBd1Bb23r4SmDOsk2NYCU2BMUBGbSpZqwVsZYNq26QS3xfaT3Q=="
|
||||||
|
},
|
||||||
"md5": {
|
"md5": {
|
||||||
"version": "2.2.1",
|
"version": "2.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
|
||||||
|
|||||||
@@ -6,7 +6,8 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node node_modules/react-native/local-cli/cli.js start",
|
"start": "node node_modules/react-native/local-cli/cli.js start",
|
||||||
"test": "jest"
|
"test": "jest",
|
||||||
|
"postinstall": "node ../Tools/copycss.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"base-64": "^0.1.0",
|
"base-64": "^0.1.0",
|
||||||
@@ -14,6 +15,7 @@
|
|||||||
"events": "^1.1.1",
|
"events": "^1.1.1",
|
||||||
"form-data": "^2.1.4",
|
"form-data": "^2.1.4",
|
||||||
"html-entities": "^1.2.1",
|
"html-entities": "^1.2.1",
|
||||||
|
"katex": "^0.9.0-beta1",
|
||||||
"markdown-it": "^8.4.0",
|
"markdown-it": "^8.4.0",
|
||||||
"md5": "^2.2.1",
|
"md5": "^2.2.1",
|
||||||
"moment": "^2.18.1",
|
"moment": "^2.18.1",
|
||||||
|
|||||||
27
Tools/copycss.js
Normal file
27
Tools/copycss.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
const fs = require('fs-extra');
|
||||||
|
|
||||||
|
const cwd = process.cwd();
|
||||||
|
const outputDir = cwd + '/lib/csstojs';
|
||||||
|
|
||||||
|
async function createJsFromCss(name, filePath) {
|
||||||
|
let css = await fs.readFile(filePath, 'utf-8');
|
||||||
|
css = css.replace(/\`/g, '\\`');
|
||||||
|
const js = 'module.exports = `' + css + '`;';
|
||||||
|
|
||||||
|
const outputPath = outputDir + '/' + name + '.css.js';
|
||||||
|
await fs.writeFile(outputPath, js);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main(argv) {
|
||||||
|
await fs.mkdirp(outputDir);
|
||||||
|
await createJsFromCss('katex', cwd + '/node_modules/katex/dist/katex.min.css');
|
||||||
|
|
||||||
|
if (argv.indexOf('--copy-fonts') >= 0) {
|
||||||
|
await fs.copy(cwd + '/node_modules/katex/dist/fonts', cwd + '/gui/note-viewer/fonts');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main(process.argv).catch((error) => {
|
||||||
|
console.error(error);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user