Compare commits

...
6 Commits
9 changed files with 588 additions and 451 deletions
+1 -44
View File
@@ -1,44 +1 @@
# Logs .DS_Store
logs
*.log
npm-debug.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules
bower_components
jspm_packages
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# Copied fonts
examples/fonts
dist
article-rendered.html
# dependency graph
rollup-grapher.html
+119 -86
View File
@@ -17,14 +17,14 @@
<head> <head>
<script src="../dist/template.v2.js"></script> <script src="../dist/template.v2.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" > <meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="utf8"> <meta charset="utf8">
</head> </head>
<body> <body>
<distill-header></distill-header> <distill-header></distill-header>
<d-front-matter> <d-front-matter>
<script id='distill-front-matter' type="text/json">{ <script id='distill-front-matter' type="text/json">{
"title": "Why Momentum Really Works", "title": "Why Momentum Really Works",
"description": "Although \" extremely useful for visualizing high-dimensional data, t-SNE plots can sometimes be mysterious or misleading.", "description": "Although \" extremely useful for visualizing high-dimensional data, t-SNE plots can sometimes be mysterious or misleading.",
"published": "Jan 10, 2017", "published": "Jan 10, 2017",
@@ -54,96 +54,129 @@
] ]
} }
}</script> }</script>
</d-front-matter> </d-front-matter>
<d-title> <d-title>
<figure style="grid-column: page; margin: 1rem 0;"><img src="momentum.png" style="width:100%; border: 1px solid rgba(0, 0, 0, 0.2);"/></figure> <figure style="grid-column: page; margin: 1rem 0;"><img src="momentum.png"
<p>We often think of Momentum<d-cite key="mercier2011humans"></d-cite> as a means of dampening oscillations and speeding up the iterations, leading to faster convergence. But it has other interesting behavior. It allows a larger range of step-sizes to be used, and creates its own oscillations. What is going on?</p> style="width:100%; border: 1px solid rgba(0, 0, 0, 0.2);" /></figure>
</d-title> <p>We often think of Momentum<d-cite key="mercier2011humans"></d-cite> as a means of dampening oscillations and
<d-byline></d-byline> speeding up the iterations, leading to faster convergence. But it has other interesting behavior. It allows a
<d-article> larger range of step-sizes to be used, and creates its own oscillations. What is going on?</p>
<a class="marker" href="#section-1" id="section-1"><span>1</span></a> </d-title>
<h2>A Brief Survey of Techniques</h2> <d-byline></d-byline>
<p>Before diving in: if you havent encountered t-SNE before, heres what you need to know about the math behind it. The goal is to take a set of points in a high-dimensional space and find a faithful representation of those points in a lower-dimensional space, typically the 2D plane. The algorithm is non-linear and adapts to the underlying data, performing different transformations on different regions. Those differences can be a major source of confusion.</p> <d-article>
<p>This is the first paragraph of the article. Test a long&thinsp;&mdash;&thinsp;dash -- here it is.</p> <a class="marker" href="#section-1" id="section-1"><span>1</span></a>
<p>Test for owner's possessive. Test for "quoting a passage." And another sentence. Or two. Some flopping fins; for diving.</p> <h2>A Brief Survey of Techniques</h2>
<aside>Some text in an aside, margin notes, etc...</aside> <p>Before diving in: if you havent encountered t-SNE before, heres what you need to know about the math behind it.
<p>Here's a test of an inline equation <d-math>c = a^2 + b^2</d-math>. Also with configurable katex standards just using inline '$' signs: $$x^2$$ And then there's a block equation:</p> The goal is to take a set of points in a high-dimensional space and find a faithful representation of those points
<d-math block> in a lower-dimensional space, typically the 2D plane. The algorithm is non-linear and adapts to the underlying
c = \pm \sqrt{ \sum_{i=0}^{n}{a^{222} + b^2}} data, performing different transformations on different regions. Those differences can be a major source of
</d-math> confusion.</p>
<p>Math can also be quite involved:</p> <p>This is the first paragraph of the article. Test a long&thinsp;&mdash;&thinsp;dash -- here it is.</p>
<d-math block> <p>Test for owner's possessive. Test for "quoting a passage." And another sentence. Or two. Some flopping fins; for
\frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} {1+\frac{e^{-8\pi}} {1+\cdots} } } } diving.</p>
</d-math> <aside>Some text in an aside, margin notes, etc...</aside>
<a class="marker" href="#section-1.1" id="section-1.1"><span>1.1</span></a> <p>Here's a test of an inline equation <d-math>c = a^2 + b^2</d-math>. Also with configurable katex standards just
<h3>Citations</h3> using inline '$' signs: $$x^2$$ And then there's a block equation:</p>
<p><d-slider style="width: 200px;"></d-slider></p> <d-math block>
<p>We can<d-cite key="mercier2011humans"></d-cite> also cite <d-cite key="gregor2015draw,mercier2011humans,openai2018charter"></d-cite> external publications. <d-cite key="dong2014image,dumoulin2016guide,mordvintsev2015inceptionism"></d-cite>. We should also be testing footnotes<d-footnote>This will become a hoverable footnote. This will become a hoverable footnote. This will become a hoverable footnote. This will become a hoverable footnote. This will become a hoverable footnote. This will become a hoverable footnote. This will become a hoverable footnote. This will become a hoverable footnote.</d-footnote>. There are multiple footnotes, and they appear in the appendix<d-footnote>Given I have coded them right. Also, here's math in a footnote: <d-math>c = \sum_0^i{x}</d-math>. Also, a citation. Box-ception<d-cite key='gregor2015draw'></d-cite>!</d-footnote> as well.</p> c = \pm \sqrt{ \sum_{i=0}^{n}{a^{222} + b^2}}
<a class="marker" href="#section-2" id="section-2"><span>2</span></a> </d-math>
<h2>Displaying code snippets</h2> <p>Math can also be quite involved:</p>
<p>Some inline javascript:<d-code language="javascript">var x = 25;</d-code>. And here's a javascript code block.</p> <d-math block>
<d-code block language="javascript"> \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}}
{1+\frac{e^{-6\pi}} {1+\frac{e^{-8\pi}} {1+\cdots} } } }
</d-math>
<a class="marker" href="#section-1.1" id="section-1.1"><span>1.1</span></a>
<h3>Citations</h3>
<p>
<d-slider style="width: 200px;"></d-slider>
</p>
<p>We can<d-cite bibtex-key="mercier2011humans"></d-cite> also cite <d-cite
key="gregor2015draw,mercier2011humans,openai2018charter"></d-cite> external publications. <d-cite
key="dong2014image,dumoulin2016guide,mordvintsev2015inceptionism"></d-cite>. We should also be testing footnotes
<d-footnote>This will become a hoverable footnote. This will become a hoverable footnote. This will become a
hoverable footnote. This will become a hoverable footnote. This will become a hoverable footnote. This will
become a hoverable footnote. This will become a hoverable footnote. This will become a hoverable footnote.
</d-footnote>. There are multiple footnotes, and they appear in the appendix<d-footnote>Given I have coded them
right. Also, here's math in a footnote: <d-math>c = \sum_0^i{x}</d-math>. Also, a citation. Box-ception<d-cite
key='gregor2015draw'></d-cite>!</d-footnote> as well.</p>
<a class="marker" href="#section-2" id="section-2"><span>2</span></a>
<h2>Displaying code snippets</h2>
<p>Some inline javascript:<d-code language="javascript">var x = 25;</d-code>. And here's a javascript code block.
</p>
<d-code block language="javascript">
var x = 25; var x = 25;
function(x){ function(x){
return x * x; return x * x;
} }
</d-code> </d-code>
<p>We also support python.</p> <p>We also support python.</p>
<d-code block language="python"> <d-code block language="python">
# Python 3: Fibonacci series up to n # Python 3: Fibonacci series up to n
def fib(n): def fib(n):
a, b = 0, 1 a, b = 0, 1
while a < n: while a < n: print(a, end=' ' ) a, b=b, a+b </d-code> <p>And a table</p>
print(a, end=' ') <table>
a, b = b, a+b <thead>
</d-code> <tr>
<p>And a table</p> <th>First</th>
<table> <th>Second</th>
<thead> <th>Third</th>
<tr><th>First</th><th>Second</th><th>Third</th></tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr><td>23</td><td>654</td><td>23</td></tr> <tr>
<tr><td>14</td><td>54</td><td>34</td></tr> <td>23</td>
<tr><td>234</td><td>54</td><td>23</td></tr> <td>654</td>
</tbody> <td>23</td>
</table> </tr>
<d-figure id="last-figure"></d-figure> <tr>
<script> <td>14</td>
const figure = document.querySelector("d-figure#last-figure"); <td>54</td>
const initTag = document.createElement("span"); <td>34</td>
initTag.textContent = "initialized!" </tr>
figure.appendChild(initTag); <tr>
figure.addEventListener("ready", function() { <td>234</td>
const initTag = figure.querySelector("span"); <td>54</td>
initTag.textContent = "ready" <td>23</td>
console.log('ready') </tr>
}); </tbody>
figure.addEventListener("onscreen", function() { </table>
const initTag = figure.querySelector("span"); <d-figure id="last-figure"></d-figure>
initTag.textContent = "onscreen" <script>
console.log('onscreen') const figure = document.querySelector("d-figure#last-figure");
}); const initTag = document.createElement("span");
figure.addEventListener("offscreen", function() { initTag.textContent = "initialized!"
const initTag = figure.querySelector("span"); figure.appendChild(initTag);
initTag.textContent = "offscreen!" figure.addEventListener("ready", function () {
console.log('offscreen') const initTag = figure.querySelector("span");
}); initTag.textContent = "ready"
</script> console.log('ready')
<p>That's it for the example article!</p> });
figure.addEventListener("onscreen", function () {
const initTag = figure.querySelector("span");
initTag.textContent = "onscreen"
console.log('onscreen')
});
figure.addEventListener("offscreen", function () {
const initTag = figure.querySelector("span");
initTag.textContent = "offscreen!"
console.log('offscreen')
});
</script>
<p>That's it for the example article!</p>
</d-article> </d-article>
<d-appendix> <d-appendix>
<h3>Contributions</h3> <h3>Contributions</h3>
<p>Some text describing who did what.</p> <p>Some text describing who did what.</p>
<h3>Reviewers</h3> <h3>Reviewers</h3>
<p>Some text with links describing who reviewed the article.</p> <p>Some text with links describing who reviewed the article.</p>
<d-bibliography src="bibliography.bib"></d-bibliography> <d-bibliography src="bibliography.bib"></d-bibliography>
</d-appendix> </d-appendix>
<distill-footer></distill-footer> <distill-footer></distill-footer>
</body> </body>
+103 -33
View File
@@ -1,6 +1,6 @@
{ {
"name": "distill-template", "name": "distill-template",
"version": "2.4.2", "version": "2.5.1",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@@ -374,6 +374,17 @@
"lodash": "^4.17.4", "lodash": "^4.17.4",
"mkdirp": "^0.5.1", "mkdirp": "^0.5.1",
"source-map-support": "^0.4.15" "source-map-support": "^0.4.15"
},
"dependencies": {
"source-map-support": {
"version": "0.4.18",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
"integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
"dev": true,
"requires": {
"source-map": "^0.5.6"
}
}
} }
}, },
"babel-runtime": { "babel-runtime": {
@@ -822,6 +833,7 @@
"resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
"integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"inherits": "~2.0.0" "inherits": "~2.0.0"
} }
@@ -837,6 +849,7 @@
"resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
"integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"hoek": "2.x.x" "hoek": "2.x.x"
} }
@@ -1009,6 +1022,12 @@
"isarray": "^1.0.0" "isarray": "^1.0.0"
} }
}, },
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
"buffer-xor": { "buffer-xor": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
@@ -1211,6 +1230,7 @@
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"delayed-stream": "~1.0.0" "delayed-stream": "~1.0.0"
} }
@@ -1258,7 +1278,8 @@
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"dev": true "dev": true,
"optional": true
}, },
"constants-browserify": { "constants-browserify": {
"version": "1.0.0", "version": "1.0.0",
@@ -1340,6 +1361,7 @@
"resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
"integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"boom": "2.x.x" "boom": "2.x.x"
} }
@@ -2181,7 +2203,8 @@
"ansi-regex": { "ansi-regex": {
"version": "2.1.1", "version": "2.1.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"aproba": { "aproba": {
"version": "1.1.1", "version": "1.1.1",
@@ -2232,7 +2255,8 @@
"balanced-match": { "balanced-match": {
"version": "0.4.2", "version": "0.4.2",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"bcrypt-pbkdf": { "bcrypt-pbkdf": {
"version": "1.0.1", "version": "1.0.1",
@@ -2247,6 +2271,7 @@
"version": "0.0.9", "version": "0.0.9",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"inherits": "~2.0.0" "inherits": "~2.0.0"
} }
@@ -2255,6 +2280,7 @@
"version": "2.10.1", "version": "2.10.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"hoek": "2.x.x" "hoek": "2.x.x"
} }
@@ -2263,6 +2289,7 @@
"version": "1.1.7", "version": "1.1.7",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"balanced-match": "^0.4.1", "balanced-match": "^0.4.1",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@@ -2271,7 +2298,8 @@
"buffer-shims": { "buffer-shims": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"caseless": { "caseless": {
"version": "0.12.0", "version": "0.12.0",
@@ -2288,12 +2316,14 @@
"code-point-at": { "code-point-at": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"combined-stream": { "combined-stream": {
"version": "1.0.5", "version": "1.0.5",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"delayed-stream": "~1.0.0" "delayed-stream": "~1.0.0"
} }
@@ -2301,17 +2331,20 @@
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"console-control-strings": { "console-control-strings": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"cryptiles": { "cryptiles": {
"version": "2.0.5", "version": "2.0.5",
@@ -2357,7 +2390,8 @@
"delayed-stream": { "delayed-stream": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"delegates": { "delegates": {
"version": "1.0.0", "version": "1.0.0",
@@ -2383,7 +2417,8 @@
"extsprintf": { "extsprintf": {
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"forever-agent": { "forever-agent": {
"version": "0.6.1", "version": "0.6.1",
@@ -2405,12 +2440,14 @@
"fs.realpath": { "fs.realpath": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"fstream": { "fstream": {
"version": "1.0.11", "version": "1.0.11",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"graceful-fs": "^4.1.2", "graceful-fs": "^4.1.2",
"inherits": "~2.0.0", "inherits": "~2.0.0",
@@ -2466,6 +2503,7 @@
"version": "7.1.2", "version": "7.1.2",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"fs.realpath": "^1.0.0", "fs.realpath": "^1.0.0",
"inflight": "^1.0.4", "inflight": "^1.0.4",
@@ -2478,7 +2516,8 @@
"graceful-fs": { "graceful-fs": {
"version": "4.1.11", "version": "4.1.11",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"har-schema": { "har-schema": {
"version": "1.0.5", "version": "1.0.5",
@@ -2517,7 +2556,8 @@
"hoek": { "hoek": {
"version": "2.16.3", "version": "2.16.3",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"http-signature": { "http-signature": {
"version": "1.1.1", "version": "1.1.1",
@@ -2534,6 +2574,7 @@
"version": "1.0.6", "version": "1.0.6",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"once": "^1.3.0", "once": "^1.3.0",
"wrappy": "1" "wrappy": "1"
@@ -2542,7 +2583,8 @@
"inherits": { "inherits": {
"version": "2.0.3", "version": "2.0.3",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"ini": { "ini": {
"version": "1.3.4", "version": "1.3.4",
@@ -2554,6 +2596,7 @@
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"number-is-nan": "^1.0.0" "number-is-nan": "^1.0.0"
} }
@@ -2567,7 +2610,8 @@
"isarray": { "isarray": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"isstream": { "isstream": {
"version": "0.1.2", "version": "0.1.2",
@@ -2640,12 +2684,14 @@
"mime-db": { "mime-db": {
"version": "1.27.0", "version": "1.27.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"mime-types": { "mime-types": {
"version": "2.1.15", "version": "2.1.15",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"mime-db": "~1.27.0" "mime-db": "~1.27.0"
} }
@@ -2654,6 +2700,7 @@
"version": "3.0.4", "version": "3.0.4",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
@@ -2661,12 +2708,14 @@
"minimist": { "minimist": {
"version": "0.0.8", "version": "0.0.8",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"mkdirp": { "mkdirp": {
"version": "0.5.1", "version": "0.5.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"minimist": "0.0.8" "minimist": "0.0.8"
} }
@@ -2719,7 +2768,8 @@
"number-is-nan": { "number-is-nan": {
"version": "1.0.1", "version": "1.0.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"oauth-sign": { "oauth-sign": {
"version": "0.8.2", "version": "0.8.2",
@@ -2737,6 +2787,7 @@
"version": "1.4.0", "version": "1.4.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"wrappy": "1" "wrappy": "1"
} }
@@ -2766,7 +2817,8 @@
"path-is-absolute": { "path-is-absolute": {
"version": "1.0.1", "version": "1.0.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"performance-now": { "performance-now": {
"version": "0.2.0", "version": "0.2.0",
@@ -2777,7 +2829,8 @@
"process-nextick-args": { "process-nextick-args": {
"version": "1.0.7", "version": "1.0.7",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"punycode": { "punycode": {
"version": "1.4.1", "version": "1.4.1",
@@ -2815,6 +2868,7 @@
"version": "2.2.9", "version": "2.2.9",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"buffer-shims": "~1.0.0", "buffer-shims": "~1.0.0",
"core-util-is": "~1.0.0", "core-util-is": "~1.0.0",
@@ -2859,6 +2913,7 @@
"version": "2.6.1", "version": "2.6.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"glob": "^7.0.5" "glob": "^7.0.5"
} }
@@ -2866,7 +2921,8 @@
"safe-buffer": { "safe-buffer": {
"version": "5.0.1", "version": "5.0.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"semver": { "semver": {
"version": "5.3.0", "version": "5.3.0",
@@ -2924,6 +2980,7 @@
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"code-point-at": "^1.0.0", "code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0", "is-fullwidth-code-point": "^1.0.0",
@@ -2934,6 +2991,7 @@
"version": "1.0.1", "version": "1.0.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"safe-buffer": "^5.0.1" "safe-buffer": "^5.0.1"
} }
@@ -2948,6 +3006,7 @@
"version": "3.0.1", "version": "3.0.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"ansi-regex": "^2.0.0" "ansi-regex": "^2.0.0"
} }
@@ -2962,6 +3021,7 @@
"version": "2.2.1", "version": "2.2.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"block-stream": "*", "block-stream": "*",
"fstream": "^1.0.2", "fstream": "^1.0.2",
@@ -3017,7 +3077,8 @@
"util-deprecate": { "util-deprecate": {
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"uuid": { "uuid": {
"version": "3.0.1", "version": "3.0.1",
@@ -3046,7 +3107,8 @@
"wrappy": { "wrappy": {
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
} }
} }
}, },
@@ -3055,6 +3117,7 @@
"resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
"integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"graceful-fs": "^4.1.2", "graceful-fs": "^4.1.2",
"inherits": "~2.0.0", "inherits": "~2.0.0",
@@ -3336,6 +3399,7 @@
"resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
"integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"boom": "2.x.x", "boom": "2.x.x",
"cryptiles": "2.x.x", "cryptiles": "2.x.x",
@@ -3364,7 +3428,8 @@
"version": "2.16.3", "version": "2.16.3",
"resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
"integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
"dev": true "dev": true,
"optional": true
}, },
"home-or-tmp": { "home-or-tmp": {
"version": "2.0.0", "version": "2.0.0",
@@ -4423,13 +4488,15 @@
"version": "1.37.0", "version": "1.37.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
"integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
"dev": true "dev": true,
"optional": true
}, },
"mime-types": { "mime-types": {
"version": "2.1.21", "version": "2.1.21",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
"integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"mime-db": "~1.37.0" "mime-db": "~1.37.0"
} }
@@ -5824,6 +5891,7 @@
"resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
"integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"hoek": "2.x.x" "hoek": "2.x.x"
} }
@@ -5844,18 +5912,19 @@
} }
}, },
"source-map-support": { "source-map-support": {
"version": "0.4.15", "version": "0.5.16",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz",
"integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"source-map": "^0.5.6" "buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}, },
"dependencies": { "dependencies": {
"source-map": { "source-map": {
"version": "0.5.6", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true "dev": true
} }
} }
@@ -6041,6 +6110,7 @@
"resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
"integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"block-stream": "*", "block-stream": "*",
"fstream": "^1.0.2", "fstream": "^1.0.2",
+2 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "distill-template", "name": "distill-template",
"version": "2.4.2", "version": "2.5.1",
"description": "Template for creating Distill articles.", "description": "Template for creating Distill articles.",
"main": "dist/template.v2.js", "main": "dist/template.v2.js",
"bin": { "bin": {
@@ -48,6 +48,7 @@
"rollup-plugin-uglify": "^1.0.1", "rollup-plugin-uglify": "^1.0.1",
"rollup-watch": "^2.5.0", "rollup-watch": "^2.5.0",
"should": "^13.1.2", "should": "^13.1.2",
"source-map-support": "^0.5.16",
"webpack": "^2.2.1" "webpack": "^2.2.1"
}, },
"dependencies": { "dependencies": {
+33 -27
View File
@@ -12,10 +12,12 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
import { Template } from '../mixins/template'; import { Template } from "../mixins/template";
import { hover_cite, bibliography_cite } from '../helpers/citation'; import { hover_cite, bibliography_cite } from "../helpers/citation";
const T = Template('d-cite', ` const T = Template(
"d-cite",
`
<style> <style>
:host { :host {
@@ -69,10 +71,10 @@ ul li:last-of-type {
<div id="citation-" class="citation"> <div id="citation-" class="citation">
<span class="citation-number"></span> <span class="citation-number"></span>
</div> </div>
`); `
);
export class Cite extends T(HTMLElement) { export class Cite extends T(HTMLElement) {
/* Lifecycle */ /* Lifecycle */
constructor() { constructor() {
super(); super();
@@ -81,53 +83,55 @@ export class Cite extends T(HTMLElement) {
} }
connectedCallback() { connectedCallback() {
this.outerSpan = this.root.querySelector('#citation-'); this.outerSpan = this.root.querySelector("#citation-");
this.innerSpan = this.root.querySelector('.citation-number'); this.innerSpan = this.root.querySelector(".citation-number");
this.hoverBox = this.root.querySelector('d-hover-box'); this.hoverBox = this.root.querySelector("d-hover-box");
window.customElements.whenDefined('d-hover-box').then(() => { window.customElements.whenDefined("d-hover-box").then(() => {
this.hoverBox.listen(this); this.hoverBox.listen(this);
}); });
// in case this component got connected after values were set // in case this component got connected after values were set
if (this.numbers) { if (this.numbers) {
this.displayNumbers(this.numbers) this.displayNumbers(this.numbers);
} }
if (this.entries) { if (this.entries) {
this.displayEntries(this.entries) this.displayEntries(this.entries);
} }
} }
//TODO This causes an infinite loop on firefox with polyfills. //TODO This causes an infinite loop on firefox with polyfills.
// This is only needed for interactive editing so no priority. // This is only needed for interactive editing so no priority.
// disconnectedCallback() { // disconnectedCallback() {
// const options = { detail: [this, this.keys], bubbles: true }; // const options = { detail: [this, this.keys], bubbles: true };
// const event = new CustomEvent('onCiteKeyRemoved', options); // const event = new CustomEvent('onCiteKeyRemoved', options);
// document.dispatchEvent(event); // document.dispatchEvent(event);
// } // }
/* observe 'key' attribute */ /* observe 'key' attribute */
static get observedAttributes() { static get observedAttributes() {
return ['key']; return ["key", "bibtex-key"];
} }
attributeChangedCallback(name, oldValue, newValue) { attributeChangedCallback(name, oldValue, newValue) {
const eventName = oldValue ? 'onCiteKeyChanged' : 'onCiteKeyCreated'; const eventName = oldValue ? "onCiteKeyChanged" : "onCiteKeyCreated";
const keys = newValue.split(',').map(k => k.trim()); const keys = newValue.split(",").map(k => k.trim());
const options = { detail: [this, keys], bubbles: true }; const options = { detail: [this, keys], bubbles: true };
const event = new CustomEvent(eventName, options); const event = new CustomEvent(eventName, options);
document.dispatchEvent(event); document.dispatchEvent(event);
} }
set key(value) { set key(value) {
this.setAttribute('key', value); this.setAttribute("key", value);
} }
get key() { get key() {
return this.getAttribute('key'); return this.getAttribute("key") || this.getAttribute("bibtex-key");
} }
get keys() { get keys() {
return this.getAttribute('key').split(','); const result = this.key.split(",");
console.log(result);
return result;
} }
/* Setters & Rendering */ /* Setters & Rendering */
@@ -143,16 +147,16 @@ export class Cite extends T(HTMLElement) {
displayNumbers(numbers) { displayNumbers(numbers) {
if (!this.innerSpan) return; if (!this.innerSpan) return;
const numberStrings = numbers.map( index => { const numberStrings = numbers.map(index => {
return index == -1 ? '?' : index + 1 + ''; return index == -1 ? "?" : index + 1 + "";
}); });
const textContent = '[' + numberStrings.join(', ') + ']'; const textContent = "[" + numberStrings.join(", ") + "]";
this.innerSpan.textContent = textContent; this.innerSpan.textContent = textContent;
} }
set entries(entries) { set entries(entries) {
this._entries = entries; this._entries = entries;
this.displayEntries(entries) this.displayEntries(entries);
} }
get entries() { get entries() {
@@ -160,10 +164,12 @@ export class Cite extends T(HTMLElement) {
} }
displayEntries(entries) { displayEntries(entries) {
if (!this.hoverBox) return if (!this.hoverBox) return;
this.hoverBox.innerHTML = `<ul> this.hoverBox.innerHTML = `<ul>
${entries.map(hover_cite).map(html => `<li>${html}</li>`).join('\n')} ${entries
.map(hover_cite)
.map(html => `<li>${html}</li>`)
.join("\n")}
</ul>`; </ul>`;
} }
} }
+62 -50
View File
@@ -12,45 +12,46 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
import { FrontMatter, mergeFromYMLFrontmatter } from './front-matter'; import { FrontMatter, mergeFromYMLFrontmatter } from "./front-matter";
import { DMath } from './components/d-math'; import { DMath } from "./components/d-math";
import { collect_citations } from './helpers/citation.js'; import { collect_citations } from "./helpers/citation.js";
import { domContentLoaded } from './helpers/domContentLoaded.js'; import { domContentLoaded } from "./helpers/domContentLoaded.js";
import { parseFrontmatter } from './components/d-front-matter'; import { parseFrontmatter } from "./components/d-front-matter";
import optionalComponents from './transforms/optional-components'; import optionalComponents from "./transforms/optional-components";
const frontMatter = new FrontMatter(); const frontMatter = new FrontMatter();
export const Controller = { export const Controller = {
frontMatter: frontMatter, frontMatter: frontMatter,
waitingOn: { waitingOn: {
bibliography: [], bibliography: [],
citations: [], citations: []
}, },
listeners: { listeners: {
onCiteKeyCreated(event) { onCiteKeyCreated(event) {
const [citeTag, keys] = event.detail; const [citeTag, keys] = event.detail;
// ensure we have citations // ensure we have citations
if (!frontMatter.citationsCollected) { if (!frontMatter.citationsCollected) {
// console.debug('onCiteKeyCreated, but unresolved dependency ("citations"). Enqueing.'); // console.debug('onCiteKeyCreated, but unresolved dependency ("citations"). Enqueing.');
Controller.waitingOn.citations.push(() => Controller.listeners.onCiteKeyCreated(event)); Controller.waitingOn.citations.push(() =>
Controller.listeners.onCiteKeyCreated(event)
);
return; return;
} }
// ensure we have a loaded bibliography // ensure we have a loaded bibliography
if (!frontMatter.bibliographyParsed) { if (!frontMatter.bibliographyParsed) {
// console.debug('onCiteKeyCreated, but unresolved dependency ("bibliography"). Enqueing.'); // console.debug('onCiteKeyCreated, but unresolved dependency ("bibliography"). Enqueing.');
Controller.waitingOn.bibliography.push(() => Controller.listeners.onCiteKeyCreated(event)); Controller.waitingOn.bibliography.push(() =>
Controller.listeners.onCiteKeyCreated(event)
);
return; return;
} }
const numbers = keys.map( key => frontMatter.citations.indexOf(key) ); const numbers = keys.map(key => frontMatter.citations.indexOf(key));
citeTag.numbers = numbers; citeTag.numbers = numbers;
const entries = keys.map( key => frontMatter.bibliography.get(key) ); const entries = keys.map(key => frontMatter.bibliography.get(key));
citeTag.entries = entries; citeTag.entries = entries;
}, },
@@ -65,21 +66,23 @@ export const Controller = {
} }
// update bibliography // update bibliography
const citationListTag = document.querySelector('d-citation-list'); const citationListTag = document.querySelector("d-citation-list");
const bibliographyEntries = new Map(frontMatter.citations.map( citationKey => { const bibliographyEntries = new Map(
return [citationKey, frontMatter.bibliography.get(citationKey)]; frontMatter.citations.map(citationKey => {
})); return [citationKey, frontMatter.bibliography.get(citationKey)];
})
);
citationListTag.citations = bibliographyEntries; citationListTag.citations = bibliographyEntries;
const citeTags = document.querySelectorAll('d-cite'); const citeTags = document.querySelectorAll("d-cite");
for (const citeTag of citeTags) { for (const citeTag of citeTags) {
console.log(citeTag);
const keys = citeTag.keys; const keys = citeTag.keys;
const numbers = keys.map( key => frontMatter.citations.indexOf(key) ); const numbers = keys.map(key => frontMatter.citations.indexOf(key));
citeTag.numbers = numbers; citeTag.numbers = numbers;
const entries = keys.map( key => frontMatter.bibliography.get(key) ); const entries = keys.map(key => frontMatter.bibliography.get(key));
citeTag.entries = entries; citeTag.entries = entries;
} }
}, },
onCiteKeyRemoved(event) { onCiteKeyRemoved(event) {
@@ -87,7 +90,7 @@ export const Controller = {
}, },
onBibliographyChanged(event) { onBibliographyChanged(event) {
const citationListTag = document.querySelector('d-citation-list'); const citationListTag = document.querySelector("d-citation-list");
const bibliography = event.detail; const bibliography = event.detail;
@@ -99,19 +102,23 @@ export const Controller = {
// ensure we have citations // ensure we have citations
if (!frontMatter.citationsCollected) { if (!frontMatter.citationsCollected) {
Controller.waitingOn.citations.push( function() { Controller.waitingOn.citations.push(function() {
Controller.listeners.onBibliographyChanged({target: event.target, detail: event.detail}); Controller.listeners.onBibliographyChanged({
target: event.target,
detail: event.detail
});
}); });
return; return;
} }
if (citationListTag.hasAttribute("distill-prerendered")) {
if (citationListTag.hasAttribute('distill-prerendered')) { console.debug("Citation list was prerendered; not updating it.");
console.debug('Citation list was prerendered; not updating it.');
} else { } else {
const entries = new Map(frontMatter.citations.map( citationKey => { const entries = new Map(
return [citationKey, frontMatter.bibliography.get(citationKey)]; frontMatter.citations.map(citationKey => {
})); return [citationKey, frontMatter.bibliography.get(citationKey)];
})
);
citationListTag.citations = entries; citationListTag.citations = entries;
} }
}, },
@@ -119,9 +126,9 @@ export const Controller = {
onFootnoteChanged() { onFootnoteChanged() {
// const footnote = event.detail; // const footnote = event.detail;
//TODO: optimize to only update current footnote //TODO: optimize to only update current footnote
const footnotesList = document.querySelector('d-footnote-list'); const footnotesList = document.querySelector("d-footnote-list");
if (footnotesList) { if (footnotesList) {
const footnotes = document.querySelectorAll('d-footnote'); const footnotes = document.querySelectorAll("d-footnote");
footnotesList.footnotes = footnotes; footnotesList.footnotes = footnotes;
} }
}, },
@@ -130,25 +137,25 @@ export const Controller = {
const data = event.detail; const data = event.detail;
mergeFromYMLFrontmatter(frontMatter, data); mergeFromYMLFrontmatter(frontMatter, data);
const interstitial = document.querySelector('d-interstitial'); const interstitial = document.querySelector("d-interstitial");
if (interstitial) { if (interstitial) {
if (typeof frontMatter.password !== 'undefined') { if (typeof frontMatter.password !== "undefined") {
interstitial.password = frontMatter.password; interstitial.password = frontMatter.password;
} else { } else {
interstitial.parentElement.removeChild(interstitial); interstitial.parentElement.removeChild(interstitial);
} }
} }
const prerendered = document.body.hasAttribute('distill-prerendered'); const prerendered = document.body.hasAttribute("distill-prerendered");
if (!prerendered && domContentLoaded()) { if (!prerendered && domContentLoaded()) {
optionalComponents(document, frontMatter); optionalComponents(document, frontMatter);
const appendix = document.querySelector('distill-appendix'); const appendix = document.querySelector("distill-appendix");
if (appendix) { if (appendix) {
appendix.frontMatter = frontMatter; appendix.frontMatter = frontMatter;
} }
const byline = document.querySelector('d-byline'); const byline = document.querySelector("d-byline");
if (byline) { if (byline) {
byline.frontMatter = frontMatter; byline.frontMatter = frontMatter;
} }
@@ -157,24 +164,31 @@ export const Controller = {
DMath.katexOptions = data.katex; DMath.katexOptions = data.katex;
} }
} }
}, },
DOMContentLoaded() { DOMContentLoaded() {
if (Controller.loaded) { if (Controller.loaded) {
console.warn('Controller received DOMContentLoaded but was already loaded!'); console.warn(
"Controller received DOMContentLoaded but was already loaded!"
);
return; return;
} else if (!domContentLoaded()) { } else if (!domContentLoaded()) {
console.warn('Controller received DOMContentLoaded at document.readyState: ' + document.readyState + '!'); console.warn(
"Controller received DOMContentLoaded at document.readyState: " +
document.readyState +
"!"
);
return; return;
} else { } else {
Controller.loaded = true; Controller.loaded = true;
console.debug('Runlevel 4: Controller running DOMContentLoaded'); console.debug("Runlevel 4: Controller running DOMContentLoaded");
} }
const frontMatterTag = document.querySelector('d-front-matter'); const frontMatterTag = document.querySelector("d-front-matter");
const data = parseFrontmatter(frontMatterTag); if (frontMatterTag) {
Controller.listeners.onFrontMatterChanged({detail: data}); const data = parseFrontmatter(frontMatterTag);
Controller.listeners.onFrontMatterChanged({ detail: data });
}
// Resolving "citations" dependency due to initial DOM load // Resolving "citations" dependency due to initial DOM load
frontMatter.citations = collect_citations(); frontMatter.citations = collect_citations();
@@ -189,13 +203,11 @@ export const Controller = {
} }
} }
const footnotesList = document.querySelector('d-footnote-list'); const footnotesList = document.querySelector("d-footnote-list");
if (footnotesList) { if (footnotesList) {
const footnotes = document.querySelectorAll('d-footnote'); const footnotes = document.querySelectorAll("d-footnote");
footnotesList.footnotes = footnotes; footnotesList.footnotes = footnotes;
} }
} }
} // listeners
}, // listeners
}; // Controller }; // Controller
@@ -13,20 +13,20 @@ export const footerTemplate = `
contain: content; contain: content;
} }
.logo svg { .footer-container .logo svg {
width: 24px; width: 24px;
position: relative; position: relative;
top: 4px; top: 4px;
margin-right: 2px; margin-right: 2px;
} }
.logo svg path { .footer-container .logo svg path {
fill: none; fill: none;
stroke: rgba(255, 255, 255, 0.8); stroke: rgba(255, 255, 255, 0.8);
stroke-width: 3px; stroke-width: 3px;
} }
.logo { .footer-container .logo {
font-size: 17px; font-size: 17px;
font-weight: 200; font-weight: 200;
color: rgba(255, 255, 255, 0.8); color: rgba(255, 255, 255, 0.8);
@@ -34,16 +34,16 @@ export const footerTemplate = `
margin-right: 6px; margin-right: 6px;
} }
.container { .footer-container {
grid-column: text; grid-column: text;
} }
.nav { .footer-container .nav {
font-size: 0.9em; font-size: 0.9em;
margin-top: 1.5em; margin-top: 1.5em;
} }
.nav a { .footer-container .nav a {
color: rgba(255, 255, 255, 0.8); color: rgba(255, 255, 255, 0.8);
margin-right: 6px; margin-right: 6px;
text-decoration: none; text-decoration: none;
@@ -51,7 +51,7 @@ export const footerTemplate = `
</style> </style>
<div class='container'> <div class='footer-container'>
<a href="/" class="logo"> <a href="/" class="logo">
${logo} ${logo}
+104 -89
View File
@@ -12,11 +12,12 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
export function collect_citations(dom=document) { export function collect_citations(dom = document) {
const citations = new Set(); const citations = new Set();
const citeTags = dom.querySelectorAll('d-cite'); const citeTags = dom.querySelectorAll("d-cite");
for (const tag of citeTags) { for (const tag of citeTags) {
const keys = tag.getAttribute('key').split(','); const keyString = tag.getAttribute("key") || tag.getAttribute("bibtex-key");
const keys = keyString.split(",").map(k => k.trim());
for (const key of keys) { for (const key of keys) {
citations.add(key); citations.add(key);
} }
@@ -24,62 +25,74 @@ export function collect_citations(dom=document) {
return [...citations]; return [...citations];
} }
export function inline_cite_short(keys){ export function inline_cite_short(keys) {
function cite_string(key){ function cite_string(key) {
if (key in data.bibliography){ if (key in data.bibliography) {
var n = data.citations.indexOf(key)+1; var n = data.citations.indexOf(key) + 1;
return ''+n; return "" + n;
} else { } else {
return '?'; return "?";
} }
} }
return '['+keys.map(cite_string).join(', ')+']'; return "[" + keys.map(cite_string).join(", ") + "]";
} }
export function inline_cite_long(keys){ export function inline_cite_long(keys) {
function cite_string(key){ function cite_string(key) {
if (key in data.bibliography){ if (key in data.bibliography) {
var ent = data.bibliography[key]; var ent = data.bibliography[key];
var names = ent.author.split(' and '); var names = ent.author.split(" and ");
names = names.map(name => name.split(',')[0].trim()); names = names.map(name => name.split(",")[0].trim());
var year = ent.year; var year = ent.year;
if (names.length == 1) return names[0] + ', ' + year; if (names.length == 1) return names[0] + ", " + year;
if (names.length == 2) return names[0] + ' & ' + names[1] + ', ' + year; if (names.length == 2) return names[0] + " & " + names[1] + ", " + year;
if (names.length > 2) return names[0] + ', et al., ' + year; if (names.length > 2) return names[0] + ", et al., " + year;
} else { } else {
return '?'; return "?";
} }
} }
return keys.map(cite_string).join(', '); return keys.map(cite_string).join(", ");
} }
function author_string(ent, template, sep, finalSep){ function author_string(ent, template, sep, finalSep) {
if (ent.author == null) { return ''; } if (ent.author == null) {
var names = ent.author.split(' and '); return "";
}
var names = ent.author.split(" and ");
let name_strings = names.map(name => { let name_strings = names.map(name => {
name = name.trim(); name = name.trim();
if (name.indexOf(',') != -1){ if (name.indexOf(",") != -1) {
var last = name.split(',')[0].trim(); var last = name.split(",")[0].trim();
var firsts = name.split(',')[1]; var firsts = name.split(",")[1];
} else if (name.indexOf(' ') != -1) { } else if (name.indexOf(" ") != -1) {
var last = name.split(' ').slice(-1)[0].trim(); var last = name
var firsts = name.split(' ').slice(0,-1).join(' '); .split(" ")
.slice(-1)[0]
.trim();
var firsts = name
.split(" ")
.slice(0, -1)
.join(" ");
} else { } else {
var last = name.trim(); var last = name.trim();
} }
var initials = ''; var initials = "";
if (firsts != undefined) { if (firsts != undefined) {
initials = firsts.trim().split(' ').map(s => s.trim()[0]); initials = firsts
initials = initials.join('.')+'.'; .trim()
.split(" ")
.map(s => s.trim()[0]);
initials = initials.join(".") + ".";
} }
return template.replace('${F}', firsts) return template
.replace('${L}', last) .replace("${F}", firsts)
.replace('${I}', initials) .replace("${L}", last)
.replace("${I}", initials)
.trim(); // in case one of first or last was empty .trim(); // in case one of first or last was empty
}); });
if (names.length > 1) { if (names.length > 1) {
var str = name_strings.slice(0, names.length-1).join(sep); var str = name_strings.slice(0, names.length - 1).join(sep);
str += (finalSep || sep) + name_strings[names.length-1]; str += (finalSep || sep) + name_strings[names.length - 1];
return str; return str;
} else { } else {
return name_strings[0]; return name_strings[0];
@@ -87,69 +100,71 @@ function author_string(ent, template, sep, finalSep){
} }
function venue_string(ent) { function venue_string(ent) {
var cite = (ent.journal || ent.booktitle || ''); var cite = ent.journal || ent.booktitle || "";
if ('volume' in ent){ if ("volume" in ent) {
var issue = ent.issue || ent.number; var issue = ent.issue || ent.number;
issue = (issue != undefined)? '('+issue+')' : ''; issue = issue != undefined ? "(" + issue + ")" : "";
cite += ', Vol ' + ent.volume + issue; cite += ", Vol " + ent.volume + issue;
} }
if ('pages' in ent){ if ("pages" in ent) {
cite += ', pp. ' + ent.pages; cite += ", pp. " + ent.pages;
} }
if (cite != '') cite += '. '; if (cite != "") cite += ". ";
if ('publisher' in ent){ if ("publisher" in ent) {
cite += ent.publisher; cite += ent.publisher;
if (cite[cite.length-1] != '.') cite += '.'; if (cite[cite.length - 1] != ".") cite += ".";
} }
return cite; return cite;
} }
function link_string(ent){ function link_string(ent) {
if ('url' in ent){ if ("url" in ent) {
var url = ent.url; var url = ent.url;
var arxiv_match = (/arxiv\.org\/abs\/([0-9\.]*)/).exec(url); var arxiv_match = /arxiv\.org\/abs\/([0-9\.]*)/.exec(url);
if (arxiv_match != null){ if (arxiv_match != null) {
url = `http://arxiv.org/pdf/${arxiv_match[1]}.pdf`; url = `http://arxiv.org/pdf/${arxiv_match[1]}.pdf`;
} }
if (url.slice(-4) == '.pdf'){ if (url.slice(-4) == ".pdf") {
var label = 'PDF'; var label = "PDF";
} else if (url.slice(-5) == '.html') { } else if (url.slice(-5) == ".html") {
var label = 'HTML'; var label = "HTML";
} }
return ` &ensp;<a href="${url}">[${label||'link'}]</a>`; return ` &ensp;<a href="${url}">[${label || "link"}]</a>`;
}/* else if ("doi" in ent){ } /* else if ("doi" in ent){
return ` &ensp;<a href="https://doi.org/${ent.doi}" >[DOI]</a>`; return ` &ensp;<a href="https://doi.org/${ent.doi}" >[DOI]</a>`;
}*/ else { }*/ else {
return ''; return "";
} }
} }
function doi_string(ent, new_line){ function doi_string(ent, new_line) {
if ('doi' in ent) { if ("doi" in ent) {
return `${new_line?'<br>':''} <a href="https://doi.org/${ent.doi}" style="text-decoration:inherit;">DOI: ${ent.doi}</a>`; return `${new_line ? "<br>" : ""} <a href="https://doi.org/${
ent.doi
}" style="text-decoration:inherit;">DOI: ${ent.doi}</a>`;
} else { } else {
return ''; return "";
} }
} }
function title_string(ent) { function title_string(ent) {
return '<span class="title">' + ent.title + '</span> '; return '<span class="title">' + ent.title + "</span> ";
} }
export function bibliography_cite(ent, fancy){ export function bibliography_cite(ent, fancy) {
if (ent){ if (ent) {
var cite = title_string(ent); var cite = title_string(ent);
cite += link_string(ent) + '<br>'; cite += link_string(ent) + "<br>";
if (ent.author) { if (ent.author) {
cite += author_string(ent, '${L}, ${I}', ', ', ' and '); cite += author_string(ent, "${L}, ${I}", ", ", " and ");
if (ent.year || ent.date) { if (ent.year || ent.date) {
cite += ', '; cite += ", ";
} }
} }
if (ent.year || ent.date) { if (ent.year || ent.date) {
cite += (ent.year || ent.date) + '. '; cite += (ent.year || ent.date) + ". ";
} else { } else {
cite += '. '; cite += ". ";
} }
cite += venue_string(ent); cite += venue_string(ent);
cite += doi_string(ent); cite += doi_string(ent);
@@ -166,39 +181,39 @@ export function bibliography_cite(ent, fancy){
cite += link_string(ent); cite += link_string(ent);
return cite*/ return cite*/
} else { } else {
return '?'; return "?";
} }
} }
export function hover_cite(ent){ export function hover_cite(ent) {
if (ent){ if (ent) {
var cite = ''; var cite = "";
cite += '<strong>' + ent.title + '</strong>'; cite += "<strong>" + ent.title + "</strong>";
cite += link_string(ent); cite += link_string(ent);
cite += '<br>'; cite += "<br>";
var a_str = author_string(ent, '${I} ${L}', ', ') + '.'; var a_str = author_string(ent, "${I} ${L}", ", ") + ".";
var v_str = venue_string(ent).trim() + ' ' + ent.year + '. ' + doi_string(ent, true); var v_str =
venue_string(ent).trim() + " " + ent.year + ". " + doi_string(ent, true);
if ((a_str+v_str).length < Math.min(40, ent.title.length)) { if ((a_str + v_str).length < Math.min(40, ent.title.length)) {
cite += a_str + ' ' + v_str; cite += a_str + " " + v_str;
} else { } else {
cite += a_str + '<br>' + v_str; cite += a_str + "<br>" + v_str;
} }
return cite; return cite;
} else { } else {
return '?'; return "?";
} }
} }
//https://scholar.google.com/scholar?q=allintitle%3ADocument+author%3Aolah //https://scholar.google.com/scholar?q=allintitle%3ADocument+author%3Aolah
function get_GS_URL(ent){ function get_GS_URL(ent) {
if (ent){ if (ent) {
var names = ent.author.split(' and '); var names = ent.author.split(" and ");
names = names.map(name => name.split(',')[0].trim()); names = names.map(name => name.split(",")[0].trim());
var title = ent.title.split(' ');//.replace(/[,:]/, "") var title = ent.title.split(" "); //.replace(/[,:]/, "")
var url = 'http://search.labs.crossref.org/dois?';//""https://scholar.google.com/scholar?" var url = "http://search.labs.crossref.org/dois?"; //""https://scholar.google.com/scholar?"
url += uris({q: names.join(' ') + ' ' + title.join(' ')}); url += uris({ q: names.join(" ") + " " + title.join(" ") });
} }
} }
+157 -114
View File
@@ -14,75 +14,88 @@
/* global it, describe, before, beforeEach, after, afterEach */ /* global it, describe, before, beforeEach, after, afterEach */
const jsdom = require('jsdom'); const jsdom = require("jsdom");
const { JSDOM } = jsdom; const { JSDOM } = jsdom;
const expect = require('chai').expect; const expect = require("chai").expect;
const distill = require('../dist/transforms.v2.js'); const distill = require("../dist/transforms.v2.js");
// omitJSDOMErrors as JSDOM routinely can't parse modern CSS // omitJSDOMErrors as JSDOM routinely can't parse modern CSS
const virtualConsole = new jsdom.VirtualConsole(); const virtualConsole = new jsdom.VirtualConsole();
virtualConsole.sendTo(console, { omitJSDOMErrors: true }); virtualConsole.sendTo(console, { omitJSDOMErrors: true });
const options = { runScripts: 'outside-only', QuerySelector: true, virtualConsole: virtualConsole }; const options = {
runScripts: "outside-only",
QuerySelector: true,
virtualConsole: virtualConsole
};
describe('Distill V2 (transforms)', function() { describe("Distill V2 (transforms)", function() {
it("should export its expected interface", function() {
it('should export its expected interface', function() { expect(distill.testing).to.be.an("object");
expect(distill.testing).to.be.an('object'); expect(distill.usesTemplateV2).to.be.a("function");
expect(distill.usesTemplateV2).to.be.a('function'); expect(distill.render).to.be.a("function");
expect(distill.render).to.be.a('function'); expect(distill.distillify).to.be.a("function");
expect(distill.distillify).to.be.a('function');
}); });
describe('#usesTemplateV2()', function() { describe("#usesTemplateV2()", function() {
it("should detect v1", function() {
it('should detect v1', function() { const frag = JSDOM.fragment(
const frag = JSDOM.fragment('<script src="https://distill.pub/template.v1.js"></script>'); '<script src="https://distill.pub/template.v1.js"></script>'
);
expect(distill.usesTemplateV2(frag)).to.be.false; expect(distill.usesTemplateV2(frag)).to.be.false;
}); });
it('should detect v2', function() { it("should detect v2", function() {
const frag = JSDOM.fragment('<script src="https://distill.pub/template.v2.js"></script>'); const frag = JSDOM.fragment(
'<script src="https://distill.pub/template.v2.js"></script>'
);
expect(distill.usesTemplateV2(frag)).to.be.true; expect(distill.usesTemplateV2(frag)).to.be.true;
}); });
it('should detect local scripts as well', function() { it("should detect local scripts as well", function() {
const frag = JSDOM.fragment('<script src="/template.v2.js"></script>'); const frag = JSDOM.fragment('<script src="/template.v2.js"></script>');
expect(distill.usesTemplateV2(frag)).to.be.true; expect(distill.usesTemplateV2(frag)).to.be.true;
}); });
it('should error on unknown distill script', function() { it("should error on unknown distill script", function() {
const frag = JSDOM.fragment('<script src="https://distill.pub/template.v42.js"></script>'); const frag = JSDOM.fragment(
expect(()=> distill.usesTemplateV2(frag)).to.throw('unknown'); '<script src="https://distill.pub/template.v42.js"></script>'
);
expect(() => distill.usesTemplateV2(frag)).to.throw("unknown");
}); });
it('should error on no distill script', function() { it("should error on no distill script", function() {
const frag = JSDOM.fragment('<script src="https://code.jquery.com/jquery-3.2.1.js"></script>'); const frag = JSDOM.fragment(
expect(()=> distill.usesTemplateV2(frag)).to.throw('at all'); '<script src="https://code.jquery.com/jquery-3.2.1.js"></script>'
);
expect(() => distill.usesTemplateV2(frag)).to.throw("at all");
}); });
}); });
describe('#render()', function() { describe("#render()", function() {
describe("should extract metadata", function() {
describe('should extract metadata', function() { it("should extract citations", function() {
const dom = new JSDOM(
it('should extract citations', function() { '<d-cite key="test-citation-key">sth</d-cite>',
const dom = new JSDOM('<d-cite key="test-citation-key">sth</d-cite>', options); options
);
const data = {}; const data = {};
const extractCitations = distill.testing.extractors.get('ExtractCitations'); const extractCitations = distill.testing.extractors.get(
expect(extractCitations).to.be.a('function'); "ExtractCitations"
);
expect(extractCitations).to.be.a("function");
extractCitations(dom.window.document, data); extractCitations(dom.window.document, data);
expect(data).to.have.property('citations'); expect(data).to.have.property("citations");
const citations = data.citations; const citations = data.citations;
expect(citations).to.be.an.instanceof(Array); expect(citations).to.be.an.instanceof(Array);
expect(citations).to.have.lengthOf(1); expect(citations).to.have.lengthOf(1);
const citation = citations[0]; const citation = citations[0];
expect(citation).to.equal('test-citation-key'); expect(citation).to.equal("test-citation-key");
}); });
it('should extract bibliography', function() { it("should extract bibliography", function() {
const dom = new JSDOM(` const dom = new JSDOM(
`
<d-cite key="mercier2011humans">sth</d-cite> <d-cite key="mercier2011humans">sth</d-cite>
<d-bibliography> <d-bibliography>
<script type="text/bibtex"> <script type="text/bibtex">
@@ -99,44 +112,58 @@ describe('Distill V2 (transforms)', function() {
} }
</script> </script>
</d-bibliography> </d-bibliography>
`, options); `,
options
);
const data = {}; const data = {};
const extractBibliography = distill.testing.extractors.get('ExtractBibliography'); const extractBibliography = distill.testing.extractors.get(
"ExtractBibliography"
);
extractBibliography(dom.window.document, data); extractBibliography(dom.window.document, data);
expect(data.bibliography).to.be.an.instanceof(Map); expect(data.bibliography).to.be.an.instanceof(Map);
const entry = data.bibliography.get('mercier2011humans'); const entry = data.bibliography.get("mercier2011humans");
expect(entry).to.be.an('object'); expect(entry).to.be.an("object");
expect(entry).to.have.property('year', '2011'); expect(entry).to.have.property("year", "2011");
}); });
it('should extract front-matter'); it("should extract front-matter");
}); // metadata }); // metadata
describe('should transform the DOM', function() { describe("should transform the DOM", function() {
it("should add Google scholar citation information", function() {
it('should add Google scholar citation information', function() { const dom = new JSDOM("", options);
const dom = new JSDOM('', options);
const data = { const data = {
authors: [ authors: [
{firstName: 'Frank', lastName: 'Underwood', affiliation: 'Google Brain', affiliationURL: 'https://g.co/brain'}, {
{firstName: 'Shan', lastName: 'Carter', affiliation: 'Google Brain', affiliationURL: 'https://g.co/brain'}, firstName: "Frank",
lastName: "Underwood",
affiliation: "Google Brain",
affiliationURL: "https://g.co/brain"
},
{
firstName: "Shan",
lastName: "Carter",
affiliation: "Google Brain",
affiliationURL: "https://g.co/brain"
}
], ],
doiSuffix: 'test-doi-suffix' doiSuffix: "test-doi-suffix"
}; };
const firstAuthorName = data.authors[0].firstName + ' ' + data.authors[0].lastName; const firstAuthorName =
const GSfirstAuthorName = data.authors[0].lastName + ', ' + data.authors[0].firstName; data.authors[0].firstName + " " + data.authors[0].lastName;
const GSfirstAuthorName =
data.authors[0].lastName + ", " + data.authors[0].firstName;
const meta = distill.testing.transforms.get('Meta'); const meta = distill.testing.transforms.get("Meta");
expect(meta).to.be.a('function'); expect(meta).to.be.a("function");
meta(dom.window.document, data); meta(dom.window.document, data);
const metaTags = dom.window.document.querySelectorAll('meta'); const metaTags = dom.window.document.querySelectorAll("meta");
expect(metaTags).to.not.be.empty; expect(metaTags).to.not.be.empty;
// Google Scholar // Google Scholar
const GSAuthorTags = Array.prototype.filter.call(metaTags, (tag) => { const GSAuthorTags = Array.prototype.filter.call(metaTags, tag => {
return tag.name === 'citation_author'; return tag.name === "citation_author";
}); });
expect(GSAuthorTags).to.have.lengthOf(2); expect(GSAuthorTags).to.have.lengthOf(2);
const GSFirstAuthorTag = GSAuthorTags[0]; const GSFirstAuthorTag = GSAuthorTags[0];
@@ -144,74 +171,89 @@ describe('Distill V2 (transforms)', function() {
expect(GSFirstAuthorTag.content).to.equal(GSfirstAuthorName); expect(GSFirstAuthorTag.content).to.equal(GSfirstAuthorName);
// Schema.org Author tags // Schema.org Author tags
const SOAuthorTags = Array.prototype.filter.call(metaTags, (tag) => { const SOAuthorTags = Array.prototype.filter.call(metaTags, tag => {
return tag.getAttribute('property') === 'article:author'; return tag.getAttribute("property") === "article:author";
}); });
expect(SOAuthorTags).to.have.lengthOf(2); expect(SOAuthorTags).to.have.lengthOf(2);
const SOFirstAuthorTag = SOAuthorTags[0]; const SOFirstAuthorTag = SOAuthorTags[0];
expect(SOFirstAuthorTag.content).to.equal(firstAuthorName); expect(SOFirstAuthorTag.content).to.equal(firstAuthorName);
}); });
it('given already correct data, it should add Google scholar references information', function() { it("given already correct data, it should add Google scholar references information", function() {
const dom = new JSDOM('', options); const dom = new JSDOM("", options);
const data = { const data = {
doiSuffix: 'test-doi-suffix', doiSuffix: "test-doi-suffix",
citations: ['test-citation-key'], citations: ["test-citation-key"],
bibliography: new Map([[ bibliography: new Map([
'test-citation-key', { [
title: 'Why do humans reason? Arguments for an argumentative theory', "test-citation-key",
author: 'Mercier, Hugo and Sperber, Dan', {
journal: 'Behavioral and brain sciences', title:
volume: 34, "Why do humans reason? Arguments for an argumentative theory",
number: 2 author: "Mercier, Hugo and Sperber, Dan",
} journal: "Behavioral and brain sciences",
]]) volume: 34,
number: 2
}
]
])
}; };
const meta = distill.testing.transforms.get('Meta'); const meta = distill.testing.transforms.get("Meta");
expect(meta).to.be.a('function'); expect(meta).to.be.a("function");
meta(dom.window.document, data); meta(dom.window.document, data);
const metaTags = [].slice.call(dom.window.document.querySelectorAll('meta[name="citation_reference"]')); const metaTags = [].slice.call(
dom.window.document.querySelectorAll(
'meta[name="citation_reference"]'
)
);
expect(metaTags).to.not.be.empty; expect(metaTags).to.not.be.empty;
}); });
it('given an arxiv article, it should add a special Google scholar arxiv citation', function() { it("given an arxiv article, it should add a special Google scholar arxiv citation", function() {
const dom = new JSDOM('', options); const dom = new JSDOM("", options);
const data = { const data = {
doiSuffix: 'test-doi-suffix', doiSuffix: "test-doi-suffix",
citations: ['dumoulin2016guide'], citations: ["dumoulin2016guide"],
bibliography: new Map([[ bibliography: new Map([
'dumoulin2016guide', { [
title: 'A guide to convolution arithmetic for deep learning', "dumoulin2016guide",
author: 'Dumoulin, Vincent and Visin, Francesco', {
journal: 'arXiv preprint arXiv:1603.07285', title: "A guide to convolution arithmetic for deep learning",
year: '2016', author: "Dumoulin, Vincent and Visin, Francesco",
url: 'https://arxiv.org/pdf/1603.07285.pdf' journal: "arXiv preprint arXiv:1603.07285",
} year: "2016",
]]) url: "https://arxiv.org/pdf/1603.07285.pdf"
}
]
])
}; };
const meta = distill.testing.transforms.get('Meta'); const meta = distill.testing.transforms.get("Meta");
expect(meta).to.be.a('function'); expect(meta).to.be.a("function");
meta(dom.window.document, data); meta(dom.window.document, data);
const metaTags = [].slice.call(dom.window.document.querySelectorAll('meta[name="citation_reference"]')); const metaTags = [].slice.call(
dom.window.document.querySelectorAll(
'meta[name="citation_reference"]'
)
);
expect(metaTags).to.not.be.empty; expect(metaTags).to.not.be.empty;
const metaTag = metaTags[0]; const metaTag = metaTags[0];
expect(metaTag).to.have.property('content'); expect(metaTag).to.have.property("content");
const content = metaTag.content; const content = metaTag.content;
expect(content).to.include('citation_title'); expect(content).to.include("citation_title");
expect(content).to.include('citation_author'); expect(content).to.include("citation_author");
expect(content.match(/citation_author=/g).length).to.equal(2); expect(content.match(/citation_author=/g).length).to.equal(2);
expect(content).to.include('citation_publication_date'); expect(content).to.include("citation_publication_date");
expect(content).to.include('citation_arxiv_id'); expect(content).to.include("citation_arxiv_id");
expect(content).to.not.include('journal'); expect(content).to.not.include("journal");
}); });
it('given only a DOM (and publish data), it should add Google scholar references information', function() { it("given only a DOM (and publish data), it should add Google scholar references information", function() {
const dom = new JSDOM(` const dom = new JSDOM(
`
<d-cite key="mercier2011humans">sth</d-cite> <d-cite key="mercier2011humans">sth</d-cite>
<d-bibliography> <d-bibliography>
<script type="text/bibtex"> <script type="text/bibtex">
@@ -228,27 +270,28 @@ describe('Distill V2 (transforms)', function() {
} }
</script> </script>
</d-bibliography> </d-bibliography>
`, options); `,
options
);
const data = { publishedDate: new Date(), updatedDate: new Date() }; const data = { publishedDate: new Date(), updatedDate: new Date() };
distill.render(dom.window.document, data, false); distill.render(dom.window.document, data, false);
const metaTags = [].slice.call(dom.window.document.querySelectorAll('meta[name="citation_reference"]')); const metaTags = [].slice.call(
dom.window.document.querySelectorAll(
'meta[name="citation_reference"]'
)
);
expect(metaTags).to.not.be.empty; expect(metaTags).to.not.be.empty;
}); });
}); });
}); // render }); // render
it('should export #distillify()', function() { it("should export #distillify()", function() {
expect(distill.distillify).to.be.a('function'); expect(distill.distillify).to.be.a("function");
}); });
describe('#distillify()', function() { describe("#distillify()", function() {
it("should ensure existence of header");
it('should ensure existence of header'); it("should ensure existence of footer");
it('should ensure existence of footer'); it("should ensure existence of distill appendix");
it('should ensure existence of distill appendix');
}); });
}); // describe 'Transform' }); // describe 'Transform'