Compare commits

...

25 Commits

Author SHA1 Message Date
Ludwig Schubert e6dd2fbfd9 2.4.0 2019-01-31 17:21:49 -08:00
Ludwig Schubert 37cc1f3157 Fix d-cite tags that are dynamically added (such as in footnotes) + eliminate inline-block extra whitespace 2019-01-31 17:20:56 -08:00
Ludwig Schubert 9ead1f6f01 Remove stray console.log(frontmatter) call 2019-01-31 17:20:56 -08:00
Ludwig Schubert ebe56d2329 Render d-math in all body (not just article) and remove contain: content optimizations in favor of contain: style 2019-01-31 17:20:56 -08:00
Ludwig Schubert c3ff605777 Move Runlevel reporting to console.debug calls, fix logic flaw when to complain about Controller initialization 2019-01-31 17:20:42 -08:00
Ludwig Schubert 0300b98cb6 2.3.0 2019-01-06 20:51:37 -08:00
Ludwig Schubert ecfd28bdf9 Allow any tag type in parseFrontMatter. <script> is still recommended where possible. 2019-01-06 20:33:19 -08:00
Ludwig Schubert 86ca6f72f4 Merge branch 'master' of github.com:distillpub/template 2019-01-03 14:42:54 -08:00
Ludwig Schubert d0f5824e0c Support specifying DOI in frontMatter (meant to be used for self-publishing; not for pre-rendered distill publishing) 2019-01-03 14:42:45 -08:00
Ludwig Schubert 8bd32bdf0b Merge pull request #100 from distillpub/d-cite-keys-whitespace
Trim whitespace
2018-12-28 19:59:06 +00:00
Shan Carter f2ae6d7aa3 Merge pull request #81 from lbertge/master
Update readme
2018-12-27 11:49:00 -08:00
Shan Carter 37c7483cb0 Trim whitespace
Trimming whitespace on keys.
2018-12-20 14:01:30 -08:00
Ludwig Schubert a272efb89c 2.2.26 2018-12-17 13:28:04 -08:00
Ludwig Schubert bb19b13467 Fixes #80 by switching a div tag inside a p tag to a span tag.
Thanks, humbertaco!
2018-12-17 13:26:33 -08:00
Ludwig Schubert 7e240ddf4f Work around wrong baseline for math tags resulting from an overzealous contain optimization that became active in Chrome 71. Fixes #96. 2018-12-17 13:17:53 -08:00
Ludwig Schubert 84c400184d Render math tags in all elements under body, not just in d-article.
Should fix #97, but still in testing.
2018-12-17 13:06:18 -08:00
Ludwig Schubert d187130657 2.2.25 2018-12-17 12:59:47 -08:00
Ludwig Schubert cc6b6bf595 Fix #95 in Chrome 69+, Safari, Firefox by reverting to JS based tooltip positioning. Also DRYs some styles 2018-12-17 12:59:38 -08:00
Ludwig Schubert 9463d6e58d 2.2.24 2018-08-30 15:37:02 -07:00
Ludwig Schubert 3c2f782e74 Fix scope typo 2018-08-30 15:36:55 -07:00
Ludwig Schubert 6bd5d0bf03 2.2.23 2018-07-11 14:00:02 -07:00
Ludwig Schubert a5f663c249 Disable converting ligatures during pre-rendering due to Chrome bug 862648 2018-07-11 13:59:54 -07:00
Albert Ge 975c3e8256 Update readme 2018-07-06 14:47:18 -07:00
Ludwig Schubert b854bd0124 Merge branch 'master' of github.com:distillpub/template 2018-06-22 12:02:59 -07:00
Ludwig Schubert a6df552537 Generalize disclaimer 2018-03-30 11:09:31 -07:00
22 changed files with 108 additions and 74 deletions
+5 -5
View File
@@ -1,8 +1,6 @@
# Distill Template
_Disclaimer: This project is research code. It is not an official Google product._
This is the repository for the distill web framework.
This is the repository for the Distill web framework.
## Contributing
@@ -13,10 +11,12 @@ To contribute a change, [check out the contributing guide](CONTRIBUTING.md).
### Local Development
Run `npm run start` to start a watching build rollup server. To view the sample pages in the repo, you can run `npm run serve` as a separate process which starts a static server. `npm run build` will run a one-time build.
First, run `npm install` to install all node modules required. Then, run `npm run dev` to start a watching build rollup server. To view the sample pages in the repo, you can run `npm run serve` as a separate process which starts a static server. `npm run build` will run a one-time build.
## License
## Disclaimer & License
_This project is research code. It is not an official product of Google or any other institution supporting Distill._
Copyright 2018, The Distill Template Authors.
+1 -1
View File
@@ -32,7 +32,7 @@
{
"author":"Chris Olah",
"authorURL":"https://colah.github.io/",
"affiliations": [{"name": "Google Brain", "url": "https://g.co/brain"}]
"affiliations": [{"name": "Google Brain"}]
},
{
"author":"Ludwig Schubert",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "distill-template",
"version": "2.2.19",
"version": "2.4.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "distill-template",
"version": "2.2.22",
"version": "2.4.0",
"description": "Template for creating Distill articles.",
"main": "dist/template.v2.js",
"bin": {
+16 -13
View File
@@ -13,6 +13,7 @@
// limitations under the License.
import { Controller } from './controller';
import { domContentLoaded } from './helpers/domContentLoaded.js';
/* Transforms */
import { makeStyleTag } from './styles/styles';
@@ -55,13 +56,13 @@ const distillMain = function() {
throw new Error('Runlevel 1: Distill Template is getting loaded more than once, aborting!');
} else {
window.distillTemplateIsLoading = true;
console.info('Runlevel 1: Distill Template has started loading.');
console.debug('Runlevel 1: Distill Template has started loading.');
}
/* 2. Add styles if they weren't added during prerendering */
makeStyleTag(document);
console.info('Runlevel 1: Static Distill styles have been added.');
console.info('Runlevel 1->2.');
console.debug('Runlevel 1: Static Distill styles have been added.');
console.debug('Runlevel 1->2.');
window.distillRunlevel += 1;
/* 3. Register Controller listener functions */
@@ -73,8 +74,8 @@ const distillMain = function() {
console.error('Runlevel 2: Controller listeners need to be functions!');
}
}
console.info('Runlevel 2: We can now listen to controller events.');
console.info('Runlevel 2->3.');
console.debug('Runlevel 2: We can now listen to controller events.');
console.debug('Runlevel 2->3.');
window.distillRunlevel += 1;
/* 4. Register components */
@@ -93,29 +94,31 @@ const distillMain = function() {
}
const allComponents = components.concat(distillComponents);
for (const component of allComponents) {
console.info('Runlevel 2: Registering custom element: ' + component.is);
console.debug('Runlevel 2: Registering custom element: ' + component.is);
customElements.define(component.is, component);
}
console.info('Runlevel 3: Distill Template finished registering custom elements.');
console.info('Runlevel 3->4.');
console.debug('Runlevel 3: Distill Template finished registering custom elements.');
console.debug('Runlevel 3->4.');
window.distillRunlevel += 1;
// If template was added after DOMContentLoaded we may have missed that event.
// Controller will check for that case, so trigger the event explicitly:
Controller.listeners.DOMContentLoaded();
if (domContentLoaded()) {
Controller.listeners.DOMContentLoaded();
}
console.info('Runlevel 4: Distill Template initialisation complete.');
console.debug('Runlevel 4: Distill Template initialisation complete.');
};
window.distillRunlevel = 0;
/* 0. Check browser feature support; synchronously polyfill if needed */
if (Polyfills.browserSupportsAllFeatures()) {
console.info('Runlevel 0: No need for polyfills.');
console.info('Runlevel 0->1.');
console.debug('Runlevel 0: No need for polyfills.');
console.debug('Runlevel 0->1.');
window.distillRunlevel += 1;
distillMain();
} else {
console.info('Runlevel 0: Distill Template is loading polyfills.');
console.debug('Runlevel 0: Distill Template is loading polyfills.');
Polyfills.load(distillMain);
}
+2 -2
View File
@@ -24,11 +24,11 @@ export function bylineTemplate(frontMatter) {
<p class="author">
${author.personalURL ? `
<a class="name" href="${author.personalURL}">${author.name}</a>` : `
<div class="name">${author.name}</div>`}
<span class="name">${author.name}</span>`}
</p>
<p class="affiliation">
${author.affiliations.map(affiliation =>
affiliation.url ? `<a class="affiliation" href="${affiliation.url}">${affiliation.name}</a>` : `<div class="affiliation">${affiliation.name}</div>`
affiliation.url ? `<a class="affiliation" href="${affiliation.url}">${affiliation.name}</a>` : `<span class="affiliation">${affiliation.name}</span>`
).join(', ')}
</p>
`).join('')}
+1 -1
View File
@@ -16,7 +16,7 @@ import { bibliography_cite } from '../helpers/citation';
const styles = `
d-citation-list {
contain: layout style;
contain: style;
}
d-citation-list .references {
+39 -14
View File
@@ -23,7 +23,6 @@ const T = Template('d-cite', `
}
.citation {
display: inline-block;
color: hsla(206, 90%, 20%, 0.7);
}
@@ -48,10 +47,6 @@ figcaption .citation-number {
line-height: 1em;
}
d-hover-box {
margin-top: 1.9em;
}
ul {
margin: 0;
padding: 0;
@@ -71,12 +66,19 @@ ul li:last-of-type {
<d-hover-box id="hover-box"></d-hover-box>
<div id="citation-" class="citation"><slot></slot><span class="citation-number"></span></div>
<div id="citation-" class="citation">
<span class="citation-number"></span>
</div>
`);
export class Cite extends T(HTMLElement) {
/* Lifecycle */
constructor() {
super();
this._numbers = [];
this._entries = [];
}
connectedCallback() {
this.outerSpan = this.root.querySelector('#citation-');
@@ -85,6 +87,13 @@ export class Cite extends T(HTMLElement) {
window.customElements.whenDefined('d-hover-box').then(() => {
this.hoverBox.listen(this);
});
// in case this component got connected after values were set
if (this.numbers) {
this.displayNumbers(this.numbers)
}
if (this.entries) {
this.displayEntries(this.entries)
}
}
//TODO This causes an infinite loop on firefox with polyfills.
@@ -103,7 +112,7 @@ export class Cite extends T(HTMLElement) {
attributeChangedCallback(name, oldValue, newValue) {
const eventName = oldValue ? 'onCiteKeyChanged' : 'onCiteKeyCreated';
const keys = newValue.split(',');
const keys = newValue.split(',').map(k => k.trim());
const options = { detail: [this, keys], bubbles: true };
const event = new CustomEvent(eventName, options);
document.dispatchEvent(event);
@@ -124,21 +133,37 @@ export class Cite extends T(HTMLElement) {
/* Setters & Rendering */
set numbers(numbers) {
this._numbers = numbers;
this.displayNumbers(numbers);
}
get numbers() {
return this._numbers;
}
displayNumbers(numbers) {
if (!this.innerSpan) return;
const numberStrings = numbers.map( index => {
return index == -1 ? '?' : index + 1 + '';
});
const textContent = '[' + numberStrings.join(', ') + ']';
if (this.innerSpan) {
this.innerSpan.textContent = textContent;
}
this.innerSpan.textContent = textContent;
}
set entries(entries) {
if (this.hoverBox) {
this.hoverBox.innerHTML = `<ul>
this._entries = entries;
this.displayEntries(entries)
}
get entries() {
return this._entries;
}
displayEntries(entries) {
if (!this.hoverBox) return
this.hoverBox.innerHTML = `<ul>
${entries.map(hover_cite).map(html => `<li>${html}</li>`).join('\n')}
</ul>`;
}
</ul>`;
}
}
+1 -7
View File
@@ -22,6 +22,7 @@ d-math[block] {
}
:host {
}
sup {
@@ -37,13 +38,6 @@ span {
cursor: default;
}
.container {
position: absolute;
width: 100%;
left: 0;
z-index: 10000;
}
.footnote-container {
padding: 10px;
}
+1 -2
View File
@@ -30,12 +30,11 @@ export function _moveLegacyAffiliationFormatIntoArray(frontMatter) {
author.affiliations = [newAffiliation];
}
}
console.log(frontMatter)
return frontMatter
}
export function parseFrontmatter(element) {
const scriptTag = element.querySelector('script');
const scriptTag = element.firstElementChild;
if (scriptTag) {
const type = scriptTag.getAttribute('type');
if (type.split('/')[1] == 'json') {
+10 -3
View File
@@ -20,9 +20,10 @@ const T = Template('d-hover-box', `
:host {
position: absolute;
width: 100%;
left: 0;
left: 0px;
z-index: 10000;
display: none;
white-space: normal
}
.container {
@@ -40,10 +41,13 @@ const T = Template('d-hover-box', `
left: 0;
width: 100%;
border: 1px solid rgba(0, 0, 0, 0.1);
background-color: rgb(250, 250, 250);
background-color: rgba(250, 250, 250, 0.95);
box-shadow: 0 0 7px rgba(0, 0, 0, 0.1);
border-radius: 4px;
box-sizing: border-box;
backdrop-filter: blur(2px);
-webkit-backdrop-filter: blur(2px);
}
</style>
@@ -117,11 +121,14 @@ export class HoverBox extends T(HTMLElement) {
show(position) {
this.visible = true;
this.style.display = 'block';
// 10px extra offset from element
this.style.top = Math.round(position[1] + 10) + 'px';
}
showAtNode(node) {
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetTop
const bbox = node.getBoundingClientRect();
this.show([bbox.right, bbox.bottom]);
this.show([node.offsetLeft + bbox.width, node.offsetTop + bbox.height]);
}
hide() {
+2 -3
View File
@@ -30,7 +30,7 @@ ${katexCSSTag}
:host {
display: inline-block;
contain: content;
contain: style;
}
:host([block]) {
@@ -73,8 +73,7 @@ export class DMath extends Mutating(T(HTMLElement)) {
}
// transform inline delimited math to d-math tags
if (DMath.katexOptions.delimiters) {
const article = document.querySelector('d-article');
renderMathInElement(article, DMath.katexOptions);
renderMathInElement(document.body, DMath.katexOptions);
}
}
+4 -6
View File
@@ -15,14 +15,12 @@
import { FrontMatter, mergeFromYMLFrontmatter } from './front-matter';
import { DMath } from './components/d-math';
import { collect_citations } from './helpers/citation.js';
import { domContentLoaded } from './helpers/domContentLoaded.js';
import { parseFrontmatter } from './components/d-front-matter';
import optionalComponents from './transforms/optional-components';
const frontMatter = new FrontMatter();
function domContentLoaded() {
return ['interactive', 'complete'].indexOf(document.readyState) !== -1;
}
export const Controller = {
@@ -109,7 +107,7 @@ export const Controller = {
if (citationListTag.hasAttribute('distill-prerendered')) {
console.info('Citation list was prerendered; not updating it.');
console.debug('Citation list was prerendered; not updating it.');
} else {
const entries = new Map(frontMatter.citations.map( citationKey => {
return [citationKey, frontMatter.bibliography.get(citationKey)];
@@ -167,11 +165,11 @@ export const Controller = {
console.warn('Controller received DOMContentLoaded but was already loaded!');
return;
} else if (!domContentLoaded()) {
console.warn('Controller received DOMContentLoaded before appropriate document.readyState!');
console.warn('Controller received DOMContentLoaded at document.readyState: ' + document.readyState + '!');
return;
} else {
Controller.loaded = true;
console.log('Runlevel 4: Controller running DOMContentLoaded');
console.debug('Runlevel 4: Controller running DOMContentLoaded');
}
const frontMatterTag = document.querySelector('d-front-matter');
+1
View File
@@ -96,6 +96,7 @@ export function mergeFromYMLFrontmatter(target, source) {
target.authors = source.authors.map( (authorObject) => new Author(authorObject));
target.katex = source.katex;
target.password = source.password;
target.doi = source.doi;
}
export class FrontMatter {
+3
View File
@@ -0,0 +1,3 @@
export function domContentLoaded() {
return ['interactive', 'complete'].indexOf(document.readyState) !== -1;
}
+5 -5
View File
@@ -13,7 +13,7 @@
// limitations under the License.
export function addPolyfill(polyfill, polyfillLoadedCallback) {
console.info('Runlevel 0: Polyfill required: ' + polyfill.name);
console.debug('Runlevel 0: Polyfill required: ' + polyfill.name);
const script = document.createElement('script');
script.src = polyfill.url;
script.async = false;
@@ -58,11 +58,11 @@ export class Polyfills {
// Define an intermediate callback that checks if all is loaded.
const polyfillLoaded = function(polyfill) {
polyfill.loaded = true;
console.info('Runlevel 0: Polyfill has finished loading: ' + polyfill.name);
// console.info(window[polyfill.name]);
console.debug('Runlevel 0: Polyfill has finished loading: ' + polyfill.name);
// console.debug(window[polyfill.name]);
if (Polyfills.neededPolyfills.every((poly) => poly.loaded)) {
console.info('Runlevel 0: All required polyfills have finished loading.');
console.info('Runlevel 0->1.');
console.debug('Runlevel 0: All required polyfills have finished loading.');
console.debug('Runlevel 0->1.');
window.distillRunlevel = 1;
callback();
}
+1 -1
View File
@@ -227,7 +227,7 @@ d-figure {
/* KaTeX */
.katex, .katex-prerendered {
contain: content;
contain: style;
display: inline-block;
}
+1 -1
View File
@@ -15,7 +15,7 @@
*/
d-byline {
contain: content;
contain: style;
overflow: hidden;
border-top: 1px solid rgba(0, 0, 0, 0.1);
font-size: 0.8rem;
+5 -5
View File
@@ -17,20 +17,20 @@ import { renderMathInElement } from '../helpers/katex-auto-render';
export default function(dom, data) {
let needsCSS = false;
const article = dom.querySelector('d-article');
const body = dom.querySelector('body');
if (!article) {
console.warn("No d-article tag found!");
if (!body) {
console.warn("No body tag found!");
return;
}
if (data.katex && data.katex.delimiters) {
global.document = dom;
renderMathInElement(article, data.katex);
renderMathInElement(body, data.katex);
}
// render d-math tags
const mathTags = article.querySelectorAll('d-math');
const mathTags = body.querySelectorAll('d-math');
if (mathTags.length > 0) {
needsCSS = true;
console.warn(`Prerendering ${mathTags.length} math tags...`);
+1 -1
View File
@@ -43,7 +43,7 @@ export default function(dom, data) {
let title = dom.querySelector('d-title');
if (!title) {
let title = dom.createElement('d-title');
title = dom.createElement('d-title');
body.insertBefore(title, byline);
}
+1 -1
View File
@@ -67,7 +67,7 @@ export default function render(dom) {
if (templateTag) {
templateTag.parentNode.removeChild(templateTag);
} else {
console.info('FYI: Did not find template tag when trying to remove it. You may not have added it. Be aware that our polyfills will add it.')
console.debug('FYI: Did not find template tag when trying to remove it. You may not have added it. Be aware that our polyfills will add it.')
}
// add loader
+6 -1
View File
@@ -24,12 +24,17 @@ export default function(dom) {
if (text && acceptNode(n)) {
text = quotes(text);
text = punctuation(text);
text = ligatures(text);
// TODO: Add back support for ligatures once their uppercased versions don't hang Chrome search anymore
// see: https://bugs.chromium.org/p/chromium/issues/detail?id=862648
// text = ligatures(text);
n.nodeValue = text;
}
}
}
// 2018-07-11 shancarter@ and ludwigschubert@ no longer know what this was meant to accomplish
// if it was trying to not replace text in any child nodes of those listed here,
// then it does not accomplish that.
function acceptNode(node) {
var parent = node.parentElement;
var isMath = (parent && parent.getAttribute && parent.getAttribute('class')) ? parent.getAttribute('class').includes('katex') || parent.getAttribute('class').includes('MathJax') : false;