Skip to content

Commit

Permalink
groups
Browse files Browse the repository at this point in the history
  • Loading branch information
guybedo committed Oct 30, 2018
1 parent 49f30c9 commit 5bee22a
Show file tree
Hide file tree
Showing 14 changed files with 233 additions and 33 deletions.
23 changes: 22 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,14 @@ async function cleanup(item, blueprint) {
spinner.start('Enhancing web page');
const dom = createDom({ url: item.url, content });

if (!item.amp) {
item._url = item.url;
}
const amp = dom.window.document.querySelector('link[rel=amphtml]');
if (amp && blueprint.options.amp) {
spinner.succeed('Found AMP version');
return cleanup(
Object.assign({}, item, { url: amp.href }),
Object.assign({}, item, { url: amp.href, amp: amp.href }),
blueprint
);
}
Expand Down Expand Up @@ -144,6 +147,24 @@ async function bundle(blueprint) {
style += fs.readFileSync(resolve(blueprint.toc.css), 'utf8');
}

if (blueprint.document.groups && blueprint.document.groups.length > 0) {
blueprint.document.useGroups = true;
blueprint.toc.template = './templates/default_toc_w_groups.html';
let itemIndex = {};
blueprint.document.items.forEach(function(item) {
itemIndex[item._url] = item;
});
blueprint.document.groups = blueprint.document.groups.map(function(
group
) {
group.items = group.items.map(function(item) {
return itemIndex[item.url];
});
return group;
});
}
console.log(blueprint);

const html = nunjucks.renderString(
fs.readFileSync(resolve(blueprint.document.template), 'utf8'),
{
Expand Down
52 changes: 52 additions & 0 deletions samples/blueprint-full.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{
"cover": {
"generate": true,
"template": "./templates/default_cover.html",
"css": "./templates/default_cover.css",
"title": null,
"picture": null,
"header": "Percollate",
"footer": "Generated on 2018-10-30"
},
"toc": {
"generate": true,
"template": "./templates/default_toc.html",
"css": "./templates/default_toc.css"
},
"document": {
"template": "./templates/default.html",
"css": "./templates/default.css",
"items": [
{
"url": "https://www.engadget.com/2018/10/28/fallout-76-not-coming-to-switch/"
},
{
"url": "https://techcrunch.com/2018/10/28/silicon-valleys-sovereign-wealth-problem/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+Techcrunch+%28TechCrunch%29"
}
],
"groups": [
{
"label": "Group1",
"items": [
{
"url": "https://www.engadget.com/2018/10/28/fallout-76-not-coming-to-switch/"
}
]
},
{
"label": "Group2",
"items": [
{
"url": "https://techcrunch.com/2018/10/28/silicon-valleys-sovereign-wealth-problem/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+Techcrunch+%28TechCrunch%29"
}
]
}
]
},
"options": {
"output": "percollate.pdf",
"individual": false,
"amp": true,
"sandbox": true
}
}
38 changes: 38 additions & 0 deletions samples/blueprint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"cover": { "generate": true },
"toc": { "generate": true },
"document": {
"items": [
{
"url": "https://www.engadget.com/2018/10/28/fallout-76-not-coming-to-switch/"
},
{
"url": "https://techcrunch.com/2018/10/28/silicon-valleys-sovereign-wealth-problem/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+Techcrunch+%28TechCrunch%29"
}
],
"groups": [
{
"label": "Group1",
"items": [
{
"url": "https://www.engadget.com/2018/10/28/fallout-76-not-coming-to-switch/"
}
]
},
{
"label": "Group2",
"items": [
{
"url": "https://techcrunch.com/2018/10/28/silicon-valleys-sovereign-wealth-problem/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+Techcrunch+%28TechCrunch%29"
}
]
}
]
},
"options": {
"output": "percollate.pdf",
"individual": false,
"amp": true,
"sandbox": true
}
}
24 changes: 22 additions & 2 deletions src/blueprints.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ function defaultBlueprint() {
function fromCommandLineOptions(urls, options) {
let blueprint = null;
if (options.blueprint) {
blueprint = JSON.parse(fs.readFileSync(options.blueprint, 'utf8'));
blueprint = _buildBluePrint(
JSON.parse(fs.readFileSync(options.blueprint, 'utf8'))
);
} else {
blueprint = _parseCommandLineOptions(options, defaultBlueprint());
}
Expand All @@ -24,6 +26,23 @@ function fromCommandLineOptions(urls, options) {
return blueprint;
}

function _buildBluePrint(userBlueprint) {
let blueprint = Object.assign({}, defaultBlueprint());
blueprint.cover = Object.assign({}, blueprint.cover, userBlueprint.cover);
blueprint.toc = Object.assign({}, blueprint.toc, userBlueprint.toc);
blueprint.document = Object.assign(
{},
blueprint.document,
userBlueprint.document
);
blueprint.options = Object.assign(
{},
blueprint.options,
userBlueprint.options
);
return blueprint;
}

function _parseCommandLineOptions(options, blueprint) {
if (options.cover) {
blueprint.cover['generate'] = options.cover;
Expand Down Expand Up @@ -79,7 +98,8 @@ function _defaultDocument() {
template: './templates/default.html',
css: './templates/default.css',
assets: {},
items: []
items: [],
groups: []
};
}

Expand Down
2 changes: 1 addition & 1 deletion src/enhancements.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ function ampToHtml(doc) {

function extractImage(doc) {
const selectors = [
"meta[name='og:image']",
"meta[name='twitter:image']",
"meta[name='og:image']",
'amp-img',
'img'
];
Expand Down
3 changes: 0 additions & 3 deletions templates/default.css
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,6 @@ pre code {

article {
font-size: 1em;
}

article:not(:last-of-type) {
page-break-after: always;
}

Expand Down
35 changes: 11 additions & 24 deletions templates/default.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,35 +11,22 @@
<body>

{% if blueprint.cover.generate %}
{% include blueprint.cover.template %}
{% include blueprint.cover.template %}
{% endif %}

{% if blueprint.toc.generate %}
{% include blueprint.toc.template %}
{% include blueprint.toc.template %}
{% endif %}

{% for item in items %}
<article id="{{ item._id }}" class='article'>
<header class='article__header'>
<h1 class='article__title'>
{{ item.title }}
</h1>
{% if item.byline %}
<p class='article__byline'>
By <span>{{ item.byline }}</span>
</p>
{% endif %}
<p class='article__url'>
Source:
<a class='no-href' href="{{item.url}}">{{item.url}}</a>
</p>
</header>

<div class='article__content'>
{{ item.content }}
</div>
</article>
{% endfor %}
{% if blueprint.document.useGroups %}
{% for group in blueprint.document.groups %}
{% include "./templates/default_group.html" %}
{% endfor %}
{% else %}
{% for item in items %}
{% include "./templates/default_item.html" %}
{% endfor %}
{% endif %}

<!-- Template to use for page footer -->
<template class='footer-template'>
Expand Down
5 changes: 5 additions & 0 deletions templates/default_cover.css
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@
position: absolute;
bottom: 10px;
}
.cover-jumbo > h2 {
font-size: 1.25rem;
position: absolute;
bottom: 10px;
}
.cover-picture {
position: relative;
height: 40%;
Expand Down
27 changes: 27 additions & 0 deletions templates/default_group.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<div class="cover">
<div class="cover-jumbo">
<h2 id="group_{{group.label}}">{{group.label}}</h2>
</div>
</div>
{% for item in group.items %}
<article id="item_{{item._id}}" class='article'>
<header class='article__header'>
<h1 class='article__title'>
{{ item.title }}
</h1>
{% if item.byline %}
<p class='article__byline'>
By <span>{{ item.byline }}</span>
</p>
{% endif %}
<p class='article__url'>
Source:
<a class='no-href' href="{{item.url}}">{{item.url}}</a>
</p>
</header>

<div class='article__content'>
{{ item.content }}
</div>
</article>
{% endfor %}
5 changes: 5 additions & 0 deletions templates/default_group_cover.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<div class="cover">
<div class="cover-jumbo">
<h2>{{group.title}}</h2>
</div>
</div>
20 changes: 20 additions & 0 deletions templates/default_item.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<article id="{{ item._id }}" class='article'>
<header class='article__header'>
<h1 class='article__title'>
{{ item.title }}
</h1>
{% if item.byline %}
<p class='article__byline'>
By <span>{{ item.byline }}</span>
</p>
{% endif %}
<p class='article__url'>
Source:
<a class='no-href' href="{{item.url}}">{{item.url}}</a>
</p>
</header>

<div class='article__content'>
{{ item.content }}
</div>
</article>
15 changes: 15 additions & 0 deletions templates/default_toc.css
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,18 @@ nav.toc {
height: 100%;
page-break-after: always;
}

.toc ol {
padding-inline-start: 1.5rem;
}

.toc a[href]:after {
content: none !important;
}

.toc ol.toc-groups {
list-style-type: none;
}
.toc ol.toc-items {
list-style-type: circle;
}
4 changes: 2 additions & 2 deletions templates/default_toc.html
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<nav class="toc">
<h1>Items</h1>
<ol>
<ol class="toc-items">
{% for item in items %}
<li class="toc__line"><a href="#{{ item._id }}">{{ item.title }}</a></li>
<li class="toc__line"><a href="#item_{{item._id}}">{{ item.title }}</a></li>
{% endfor %}
</ol>
</nav>
13 changes: 13 additions & 0 deletions templates/default_toc_w_groups.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<nav class="toc">
<h1>Items</h1>
<ol class="toc-groups">
{% for group in blueprint.document.groups %}
<li class="toc__line"><a href="#group_{{group.label}}">{{ group.label }}</a></li>
<ol class="toc-items">
{% for item in group.items %}
<li class="toc__line"><a href="#item_{{item._id}}">{{ item.title }}</a></li>
{% endfor %}
</ol>
{% endfor %}
</ol>
</nav>

0 comments on commit 5bee22a

Please sign in to comment.