datalog-theme 0.8.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +84 -0
- data/CITATION.cff +2 -2
- data/README.md +4 -2
- data/_data/i18n/en.yml +321 -0
- data/_data/i18n/es.yml +321 -0
- data/_data/i18n/pt.yml +321 -0
- data/_data/js_manifest.json +16 -0
- data/_includes/components/academic-dashboard.html +4 -4
- data/_includes/components/author-bio.html +21 -11
- data/_includes/components/author-list.html +32 -0
- data/_includes/components/breadcrumbs.html +6 -4
- data/_includes/components/citation-tools.html +18 -58
- data/_includes/components/comments-thread.html +90 -0
- data/_includes/components/contact-form.html +120 -0
- data/_includes/components/correction-report.html +82 -0
- data/_includes/components/enhanced-toc.html +6 -7
- data/_includes/components/hero.html +1 -1
- data/_includes/components/license-link.html +13 -0
- data/_includes/components/license-notice.html +28 -0
- data/_includes/components/moderation-inbox.html +139 -0
- data/_includes/components/post-hero.html +2 -2
- data/_includes/components/reactions.html +49 -0
- data/_includes/components/reading-list.html +34 -0
- data/_includes/components/reading-mode-toggle.html +67 -0
- data/_includes/components/reading-state-bookmark.html +27 -0
- data/_includes/components/reading-state-panel.html +62 -0
- data/_includes/components/reading-state-resume.html +17 -0
- data/_includes/components/reproducibility.html +61 -0
- data/_includes/components/responsive-image.html +3 -3
- data/_includes/components/revision-history.html +39 -0
- data/_includes/components/revision-notice.html +35 -0
- data/_includes/components/series-nav.html +64 -0
- data/_includes/components/subscribe-form.html +88 -0
- data/_includes/components/subscription-manage.html +69 -0
- data/_includes/components/visualization-card.html +1 -1
- data/_includes/components/webmentions.html +48 -0
- data/_includes/csp-meta.html +21 -1
- data/_includes/footer/nav-column.html +1 -1
- data/_includes/footer.html +5 -2
- data/_includes/head.html +64 -52
- data/_includes/header/navigation.html +2 -2
- data/_includes/header.html +1 -1
- data/_includes/layouts/default/article.html +6 -8
- data/_includes/meta/dynamic-services-config.html +14 -0
- data/_includes/meta/math-config.html +12 -5
- data/_includes/meta/person-json.html +27 -0
- data/_includes/meta/publisher.html +45 -0
- data/_includes/meta/schema.html +84 -48
- data/_includes/meta/scholarly.html +122 -0
- data/_includes/meta/scripts-loader.html +2 -0
- data/_includes/meta/webmention-discovery.html +14 -0
- data/_includes/post/related-posts.html +1 -1
- data/_includes/scripts.html +57 -0
- data/_layouts/dataset.html +5 -4
- data/_layouts/default.html +1 -1
- data/_layouts/home.html +2 -2
- data/_layouts/notebook.html +1 -1
- data/_layouts/package.html +8 -7
- data/_layouts/page.html +15 -0
- data/_layouts/portfolio.html +1 -1
- data/_layouts/post.html +94 -25
- data/_layouts/project.html +5 -5
- data/_layouts/research.html +27 -75
- data/_plugins/authors.rb +151 -0
- data/_plugins/citation_exports.rb +93 -0
- data/_plugins/config_validator.rb +223 -20
- data/_plugins/critical_css_check.rb +42 -0
- data/_plugins/i18n.rb +6 -4
- data/_plugins/image_optimizer.rb +240 -186
- data/_plugins/licenses.rb +147 -0
- data/_plugins/math_preprocessor.rb +55 -11
- data/_plugins/references.rb +260 -0
- data/_plugins/reproducibility.rb +167 -0
- data/_plugins/responsive_content.rb +40 -0
- data/_plugins/revisions.rb +102 -0
- data/_plugins/scholarly.rb +55 -0
- data/_plugins/series.rb +104 -0
- data/_plugins/statements.rb +87 -0
- data/_sass/_base.scss +13 -1
- data/_sass/_comments-thread.scss +159 -0
- data/_sass/_layout.scss +402 -1
- data/_sass/_mathematical.scss +38 -1
- data/_sass/_moderation.scss +222 -0
- data/_sass/_post-components.scss +4 -2
- data/_sass/_print.scss +299 -0
- data/_sass/_reactions.scss +89 -0
- data/_sass/_reading-state.scss +290 -0
- data/_sass/_service-forms.scss +204 -0
- data/_sass/_subscriptions.scss +140 -0
- data/_sass/_syntax-highlighting.scss +3 -3
- data/_sass/_theme.scss +11 -0
- data/_sass/_typography.scss +116 -0
- data/_sass/_utilities.scss +5 -0
- data/_sass/_variables.scss +6 -0
- data/_sass/_webmentions.scss +125 -0
- data/assets/js/dist/academic.js +1 -1
- data/assets/js/dist/analytics-dashboard.js +1 -1
- data/assets/js/dist/chunks/chunk-PATLC23F.js +1 -0
- data/assets/js/dist/chunks/chunk-VZ5WKQVA.js +1 -0
- data/assets/js/dist/chunks/chunk-WIRUK3OZ.js +1 -0
- data/assets/js/dist/comments.js +2 -0
- data/assets/js/dist/contact.js +1 -0
- data/assets/js/dist/core.js +1 -1
- data/assets/js/dist/corrections.js +1 -0
- data/assets/js/dist/loader.js +1 -1
- data/assets/js/dist/math.js +1 -1
- data/assets/js/dist/moderation.js +1 -0
- data/assets/js/dist/notebook.js +1 -1
- data/assets/js/dist/reactions.js +1 -0
- data/assets/js/dist/reading-state.js +1 -0
- data/assets/js/dist/search.js +1 -1
- data/assets/js/dist/sources.json +52 -0
- data/assets/js/dist/subscriptions.js +1 -0
- data/assets/js/dist/visualizations.js +2 -2
- data/assets/js/dist/webmentions.js +1 -0
- data/assets/js/loader.js +34 -0
- data/datalog-theme.gemspec +1 -2
- data/lib/datalog/cli.rb +9 -1
- data/lib/datalog/critical_css.rb +168 -0
- data/lib/datalog/plugins/comments.rb +33 -3
- data/lib/datalog/theme/installed_files.rb +113 -0
- data/lib/datalog/theme/repository_checkout.rb +6 -2
- data/lib/datalog/theme/version.rb +5 -1
- data/lib/datalog-theme.rb +1 -0
- metadata +60 -23
- data/assets/js/dist/chunks/chunk-225H5YXE.js +0 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
---
|
|
3
|
+
optional: []
|
|
4
|
+
---
|
|
5
|
+
The public settings of the site's dynamic services (`dynamic_services` in
|
|
6
|
+
_config.yml), for assets/js/dynamic-services/client.js, on a site that sets
|
|
7
|
+
a base URL. Every reader's browser reads this, so it holds no credential:
|
|
8
|
+
the configuration validator stops the build on a key that names one.
|
|
9
|
+
{%- endcomment -%}
|
|
10
|
+
{%- if site.dynamic_services.base_url and site.dynamic_services.base_url != '' %}
|
|
11
|
+
<script nonce="{{ page.csp_nonce }}">
|
|
12
|
+
window.DatalogDynamicServices = {{ site.dynamic_services | jsonify }};
|
|
13
|
+
</script>
|
|
14
|
+
{%- endif -%}
|
|
@@ -8,8 +8,12 @@ optional:
|
|
|
8
8
|
Computes math rendering settings shared by layouts.
|
|
9
9
|
Exposes math_enabled, math_engine, math_status_id, and math_has_expressions variables.
|
|
10
10
|
|
|
11
|
-
math_enabled resolves, in order: the page's `
|
|
12
|
-
then `theme_options.math.render_on_load` (falling back
|
|
11
|
+
math_enabled resolves, in order: the page's `math` front matter, then its
|
|
12
|
+
`mathjax` front matter, then `theme_options.math.render_on_load` (falling back
|
|
13
|
+
to `features.mathjax`). `mathjax` is an alias read only when `math` is unset: it
|
|
14
|
+
used to be read first, so a page could not turn off with `math: false` what a
|
|
15
|
+
`mathjax: true` in front matter defaults had turned on.
|
|
16
|
+
_plugins/math_preprocessor.rb resolves the two the same way.
|
|
13
17
|
With `render_on_load: auto` the engine is only loaded on pages with math: the
|
|
14
18
|
math preprocessor records each expression it wraps in `math_expressions`, and
|
|
15
19
|
leaves code alone. Kramdown's `math/tex` scripts and the preprocessor's
|
|
@@ -33,10 +37,13 @@ only on pages that opt in.
|
|
|
33
37
|
{%- if math_load == nil -%}
|
|
34
38
|
{%- assign math_load = site.features.mathjax -%}
|
|
35
39
|
{%- endif -%}
|
|
36
|
-
{%- if
|
|
37
|
-
{%- assign
|
|
38
|
-
{%-
|
|
40
|
+
{%- if math_load == nil -%}
|
|
41
|
+
{%- assign math_load = 'auto' -%}
|
|
42
|
+
{%- endif -%}
|
|
43
|
+
{%- if include.page.math != nil -%}
|
|
39
44
|
{%- assign math_enabled = include.page.math -%}
|
|
45
|
+
{%- elsif include.page.mathjax != nil -%}
|
|
46
|
+
{%- assign math_enabled = include.page.mathjax -%}
|
|
40
47
|
{%- elsif math_load == 'auto' -%}
|
|
41
48
|
{%- assign math_enabled = math_has_expressions -%}
|
|
42
49
|
{%- if content contains 'math/tex' or content contains 'math-expression--source' -%}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
---
|
|
3
|
+
required:
|
|
4
|
+
- person
|
|
5
|
+
---
|
|
6
|
+
One schema.org Person, as JSON, for a record from `page | page_authors` or
|
|
7
|
+
`page | page_contributors`. The site's own author links to the site when the
|
|
8
|
+
record names no url of its own.
|
|
9
|
+
{%- endcomment -%}
|
|
10
|
+
{%- assign person_url = include.person.url -%}
|
|
11
|
+
{%- if person_url == nil and include.person.site_author -%}{%- assign person_url = '/' -%}{%- endif -%}
|
|
12
|
+
{
|
|
13
|
+
"@type": {% if include.person.type == 'Organization' %}"Organization"{% else %}"Person"{% endif %},
|
|
14
|
+
"name": {{ include.person.name | jsonify_script }}
|
|
15
|
+
{%- if person_url -%},
|
|
16
|
+
"url": {{ person_url | absolute_url | jsonify_script }}
|
|
17
|
+
{%- endif -%}
|
|
18
|
+
{%- if include.person.affiliation -%},
|
|
19
|
+
"affiliation": {
|
|
20
|
+
"@type": "Organization",
|
|
21
|
+
"name": {{ include.person.affiliation | jsonify_script }}
|
|
22
|
+
}
|
|
23
|
+
{%- endif -%}
|
|
24
|
+
{%- if include.person.same_as.size > 0 -%},
|
|
25
|
+
"sameAs": {{ include.person.same_as | jsonify_script }}
|
|
26
|
+
{%- endif -%}
|
|
27
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
---
|
|
3
|
+
optional: []
|
|
4
|
+
---
|
|
5
|
+
Resolves who publishes the site, for structured data. Sets publisher_type
|
|
6
|
+
("Person" or "Organization"), publisher_name, publisher_url and, for an
|
|
7
|
+
Organization, publisher_logo and publisher_logo_default (true when the logo is
|
|
8
|
+
the theme's 512px icon, whose size is known).
|
|
9
|
+
|
|
10
|
+
`publisher` in _config.yml names the publisher. Without it, the site's author
|
|
11
|
+
publishes as a Person, or the site title as an Organization when there is no
|
|
12
|
+
author name. The author's affiliation is not the publisher: schema.html puts it
|
|
13
|
+
on the author.
|
|
14
|
+
{%- endcomment -%}
|
|
15
|
+
{%- assign site_author_name = site.author.name | default: site.author -%}
|
|
16
|
+
{%- if site.publisher.type == 'Organization' -%}
|
|
17
|
+
{%- assign publisher_type = 'Organization' -%}
|
|
18
|
+
{%- else -%}
|
|
19
|
+
{%- assign publisher_type = 'Person' -%}
|
|
20
|
+
{%- endif -%}
|
|
21
|
+
{%- assign publisher_name = site.publisher.name -%}
|
|
22
|
+
{%- if publisher_type == 'Person' -%}
|
|
23
|
+
{%- assign publisher_name = publisher_name | default: site_author_name -%}
|
|
24
|
+
{%- if publisher_name == nil or publisher_name == '' -%}
|
|
25
|
+
{%- assign publisher_type = 'Organization' -%}
|
|
26
|
+
{%- endif -%}
|
|
27
|
+
{%- endif -%}
|
|
28
|
+
{%- if publisher_type == 'Organization' -%}
|
|
29
|
+
{%- assign publisher_name = publisher_name | default: site.title -%}
|
|
30
|
+
{%- endif -%}
|
|
31
|
+
{%- if site.publisher.url -%}
|
|
32
|
+
{%- assign publisher_url = site.publisher.url | absolute_url -%}
|
|
33
|
+
{%- else -%}
|
|
34
|
+
{%- assign publisher_url = '/' | absolute_url -%}
|
|
35
|
+
{%- endif -%}
|
|
36
|
+
{%- assign publisher_logo = nil -%}
|
|
37
|
+
{%- assign publisher_logo_default = false -%}
|
|
38
|
+
{%- if publisher_type == 'Organization' -%}
|
|
39
|
+
{%- if site.publisher.logo -%}
|
|
40
|
+
{%- assign publisher_logo = site.publisher.logo | absolute_url -%}
|
|
41
|
+
{%- else -%}
|
|
42
|
+
{%- assign publisher_logo = '/assets/img/favicons/android-chrome-512x512.png' | absolute_url -%}
|
|
43
|
+
{%- assign publisher_logo_default = true -%}
|
|
44
|
+
{%- endif -%}
|
|
45
|
+
{%- endif -%}
|
data/_includes/meta/schema.html
CHANGED
|
@@ -7,57 +7,61 @@ optional:
|
|
|
7
7
|
---
|
|
8
8
|
Outputs comprehensive JSON-LD metadata for the current page.
|
|
9
9
|
Provides rich structured data for:
|
|
10
|
-
- Article/BlogPosting/
|
|
10
|
+
- Article/BlogPosting/TechArticle schema for posts
|
|
11
11
|
- WebPage schema for standard pages
|
|
12
12
|
- Author information with social profile links
|
|
13
|
-
- Publisher
|
|
13
|
+
- Publisher: a Person or an Organization, from `publisher` in _config.yml
|
|
14
14
|
- Images, keywords, and content metadata
|
|
15
15
|
|
|
16
|
-
Defaults to
|
|
16
|
+
Defaults to TechArticle for posts, WebPage for other pages.
|
|
17
17
|
{%- endcomment -%}
|
|
18
18
|
{%- assign schema_page = include.page -%}
|
|
19
|
+
{%- include meta/publisher.html -%}
|
|
19
20
|
{%- assign is_post = false -%}
|
|
20
21
|
{%- if schema_page.layout == 'post' or schema_page.collection == 'posts' -%}
|
|
21
22
|
{%- assign is_post = true -%}
|
|
22
23
|
{%- endif -%}
|
|
23
24
|
{%- assign default_type = 'WebPage' -%}
|
|
24
25
|
{%- if is_post -%}
|
|
25
|
-
{%- assign default_type = '
|
|
26
|
+
{%- assign default_type = 'TechArticle' -%}
|
|
26
27
|
{%- endif -%}
|
|
27
|
-
{%- assign schema_type = include.type | default: schema_page.schema_type | default: default_type -%}
|
|
28
|
+
{%- assign schema_type = include.type | default: schema_page.schema_type | default: layout.schema_type | default: default_type -%}
|
|
29
|
+
{%- if schema_type == 'TechnicalArticle' -%}{%- assign schema_type = 'TechArticle' -%}{%- endif -%}
|
|
28
30
|
{%- assign csp_registry = site.data.csp | default: {} -%}
|
|
29
31
|
{%- assign nonce_lookup = csp_registry.nonces | default: {} -%}
|
|
30
32
|
{%- assign schema_nonce = schema_page.csp_nonce | default: page.csp_nonce | default: nonce_lookup[schema_page.path] | default: nonce_lookup[page.path] | default: nonce_lookup[page.url] -%}
|
|
31
|
-
{%- assign
|
|
33
|
+
{%- assign schema_excerpt = schema_page.excerpt | strip_html -%}
|
|
34
|
+
{%- assign description = schema_page.seo_description | default: schema_page.description | default: schema_excerpt | default: site.description | strip_newlines | truncate: 300 -%}
|
|
32
35
|
{%- assign page_url = schema_page.url | absolute_url -%}
|
|
33
|
-
{%- assign
|
|
36
|
+
{%- assign schema_authors = schema_page | page_authors -%}
|
|
37
|
+
{%- assign schema_contributors = schema_page | page_contributors -%}
|
|
34
38
|
{%- assign word_count = schema_page.content | strip_html | number_of_words -%}
|
|
35
39
|
{%- assign modified = schema_page.last_modified_at | default: schema_page.updated | default: schema_page.date -%}
|
|
36
40
|
<script type="application/ld+json" nonce="{{ schema_nonce }}">
|
|
37
41
|
{
|
|
38
42
|
"@context": "https://schema.org",
|
|
39
|
-
"@type":
|
|
43
|
+
"@type": {{ schema_type | jsonify_script }},
|
|
40
44
|
"mainEntityOfPage": {
|
|
41
45
|
"@type": "WebPage",
|
|
42
|
-
"@id": {{ page_url |
|
|
46
|
+
"@id": {{ page_url | jsonify_script }}
|
|
43
47
|
},
|
|
44
|
-
"headline": {{ schema_page.title | default: site.title | truncate: 110 |
|
|
48
|
+
"headline": {{ schema_page.title | default: site.title | truncate: 110 | jsonify_script }},
|
|
45
49
|
{%- comment -%} Values the page doesn't have are left out: "description": "" and "dateModified": "" are invalid structured data. {%- endcomment -%}
|
|
46
50
|
{%- if description and description != "" -%}
|
|
47
|
-
"description": {{ description |
|
|
51
|
+
"description": {{ description | jsonify_script }},
|
|
48
52
|
{%- endif -%}
|
|
49
|
-
"url": {{ page_url |
|
|
53
|
+
"url": {{ page_url | jsonify_script }},
|
|
50
54
|
{%- if schema_page.image or schema_page.og_image -%}
|
|
51
55
|
"image": {
|
|
52
56
|
"@type": "ImageObject",
|
|
53
|
-
"url": {{ schema_page.image | default: schema_page.og_image | absolute_url |
|
|
57
|
+
"url": {{ schema_page.image | default: schema_page.og_image | absolute_url | jsonify_script }},
|
|
54
58
|
"width": {{ schema_page.image_width | default: 1200 }},
|
|
55
59
|
"height": {{ schema_page.image_height | default: 630 }}
|
|
56
60
|
},
|
|
57
61
|
{%- elsif site.social.default_image -%}
|
|
58
62
|
"image": {
|
|
59
63
|
"@type": "ImageObject",
|
|
60
|
-
"url": {{ site.social.default_image | absolute_url |
|
|
64
|
+
"url": {{ site.social.default_image | absolute_url | jsonify_script }},
|
|
61
65
|
"width": 1200,
|
|
62
66
|
"height": 630
|
|
63
67
|
},
|
|
@@ -72,56 +76,88 @@ Defaults to TechnicalArticle for posts, WebPage for other pages.
|
|
|
72
76
|
"wordCount": {{ word_count }},
|
|
73
77
|
{%- endif -%}
|
|
74
78
|
{%- if schema_page.tags and schema_page.tags.size > 0 -%}
|
|
75
|
-
"keywords": {{ schema_page.tags |
|
|
79
|
+
"keywords": {{ schema_page.tags | jsonify_script }},
|
|
76
80
|
{%- endif -%}
|
|
77
81
|
{%- if schema_page.categories and schema_page.categories.size > 0 -%}
|
|
78
|
-
"articleSection": {{ schema_page.categories | first |
|
|
82
|
+
"articleSection": {{ schema_page.categories | first | jsonify_script }},
|
|
79
83
|
{%- endif -%}
|
|
80
84
|
{%- if is_post -%}
|
|
81
85
|
"inLanguage": "{{ schema_page.lang | default: site.locale | default: 'en' | split: '_' | first }}",
|
|
82
86
|
{%- endif -%}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
{%- endif -%}
|
|
99
|
-
{%- if site.author.researchgate -%},
|
|
100
|
-
{{ site.author.researchgate | jsonify }}
|
|
101
|
-
{%- endif -%}
|
|
102
|
-
]
|
|
103
|
-
{%- endif -%}
|
|
104
|
-
},
|
|
87
|
+
{%- comment -%} One author is an object, as it always was; several are a list; a site without an author has none. {%- endcomment -%}
|
|
88
|
+
{%- if schema_authors.size > 0 -%}
|
|
89
|
+
"author": {% if schema_authors.size > 1 %}[{% endif %}
|
|
90
|
+
{%- for author in schema_authors -%}
|
|
91
|
+
{% include meta/person-json.html person=author %}{% unless forloop.last %},{% endunless %}
|
|
92
|
+
{%- endfor -%}
|
|
93
|
+
{% if schema_authors.size > 1 %}]{% endif %},
|
|
94
|
+
{%- endif -%}
|
|
95
|
+
{%- if schema_contributors.size > 0 -%}
|
|
96
|
+
"contributor": [
|
|
97
|
+
{%- for contributor in schema_contributors -%}
|
|
98
|
+
{% include meta/person-json.html person=contributor %}{% unless forloop.last %},{% endunless %}
|
|
99
|
+
{%- endfor -%}
|
|
100
|
+
],
|
|
101
|
+
{%- endif -%}
|
|
105
102
|
"publisher": {
|
|
106
|
-
"@type":
|
|
107
|
-
"name": {{
|
|
108
|
-
"url": {{
|
|
103
|
+
"@type": {{ publisher_type | jsonify_script }},
|
|
104
|
+
"name": {{ publisher_name | jsonify_script }},
|
|
105
|
+
"url": {{ publisher_url | jsonify_script }}
|
|
106
|
+
{%- if publisher_logo -%},
|
|
109
107
|
"logo": {
|
|
110
108
|
"@type": "ImageObject",
|
|
111
|
-
"url": {{
|
|
109
|
+
"url": {{ publisher_logo | jsonify_script }}
|
|
110
|
+
{%- if publisher_logo_default -%},
|
|
112
111
|
"width": 512,
|
|
113
112
|
"height": 512
|
|
113
|
+
{%- endif -%}
|
|
114
114
|
}
|
|
115
|
+
{%- endif -%}
|
|
115
116
|
}
|
|
116
117
|
{%- if schema_page.doi -%},
|
|
117
118
|
"identifier": {
|
|
118
119
|
"@type": "PropertyValue",
|
|
119
120
|
"propertyID": "doi",
|
|
120
|
-
"value": {{ schema_page.doi |
|
|
121
|
+
"value": {{ schema_page.doi | jsonify_script }}
|
|
121
122
|
}
|
|
122
123
|
{%- endif -%}
|
|
123
124
|
{%- if schema_page.citation_key -%},
|
|
124
|
-
"citation": {{ schema_page.citation_key |
|
|
125
|
+
"citation": {{ schema_page.citation_key | jsonify_script }}
|
|
126
|
+
{%- endif -%}
|
|
127
|
+
{%- comment -%} The licence of the text and figures, and who holds the copyright. {%- endcomment -%}
|
|
128
|
+
{%- assign content_license = schema_page | page_license -%}
|
|
129
|
+
{%- if content_license -%}
|
|
130
|
+
{%- if content_license.url -%},
|
|
131
|
+
"license": {{ content_license.url | jsonify_script }}
|
|
132
|
+
{%- endif -%}
|
|
133
|
+
{%- if content_license.year -%},
|
|
134
|
+
"copyrightYear": {{ content_license.year | jsonify_script }}
|
|
135
|
+
{%- endif -%}
|
|
136
|
+
{%- if content_license.holder -%},
|
|
137
|
+
"copyrightHolder": {% if content_license.people %}{% if content_license.holders.size > 1 %}[{% endif %}
|
|
138
|
+
{%- for holder in content_license.holders -%}
|
|
139
|
+
{ "@type": "Person", "name": {{ holder | jsonify_script }} }{% unless forloop.last %},{% endunless %}
|
|
140
|
+
{%- endfor -%}
|
|
141
|
+
{% if content_license.holders.size > 1 %}]{% endif %}{% else %}{ "@type": "Organization", "name": {{ content_license.holder | jsonify_script }} }{% endif %}
|
|
142
|
+
{%- endif -%}
|
|
143
|
+
{%- endif -%}
|
|
144
|
+
{%- comment -%} Each correction in the revision history, with its date, summary and link. {%- endcomment -%}
|
|
145
|
+
{%- assign corrections = schema_page.revisions | where: 'type', 'correction' -%}
|
|
146
|
+
{%- if corrections and corrections.size > 0 -%},
|
|
147
|
+
"correction": [
|
|
148
|
+
{%- for correction in corrections -%}
|
|
149
|
+
{
|
|
150
|
+
"@type": "CorrectionComment",
|
|
151
|
+
"datePublished": "{{ correction.date | date_to_xmlschema }}",
|
|
152
|
+
"text": {{ correction.summary | jsonify_script }}
|
|
153
|
+
{%- if correction.details_url -%}
|
|
154
|
+
{%- assign correction_url = correction.details_url -%}
|
|
155
|
+
{%- unless correction_url contains '://' -%}{%- assign correction_url = correction_url | absolute_url -%}{%- endunless -%},
|
|
156
|
+
"url": {{ correction_url | jsonify_script }}
|
|
157
|
+
{%- endif -%}
|
|
158
|
+
}{% unless forloop.last %},{% endunless %}
|
|
159
|
+
{%- endfor -%}
|
|
160
|
+
]
|
|
125
161
|
{%- endif -%}
|
|
126
162
|
}
|
|
127
163
|
</script>
|
|
@@ -136,19 +172,19 @@ Defaults to TechnicalArticle for posts, WebPage for other pages.
|
|
|
136
172
|
"@type": "ListItem",
|
|
137
173
|
"position": 1,
|
|
138
174
|
"name": "Home",
|
|
139
|
-
"item": {{
|
|
175
|
+
"item": {{ '/' | absolute_url | jsonify_script }}
|
|
140
176
|
},
|
|
141
177
|
{
|
|
142
178
|
"@type": "ListItem",
|
|
143
179
|
"position": 2,
|
|
144
180
|
"name": "Blog",
|
|
145
|
-
"item": {{ '/blog/' | absolute_url |
|
|
181
|
+
"item": {{ '/blog/' | absolute_url | jsonify_script }}
|
|
146
182
|
},
|
|
147
183
|
{
|
|
148
184
|
"@type": "ListItem",
|
|
149
185
|
"position": 3,
|
|
150
|
-
"name": {{ schema_page.title | truncate: 50 |
|
|
151
|
-
"item": {{ page_url |
|
|
186
|
+
"name": {{ schema_page.title | truncate: 50 | jsonify_script }},
|
|
187
|
+
"item": {{ page_url | jsonify_script }}
|
|
152
188
|
}
|
|
153
189
|
]
|
|
154
190
|
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
---
|
|
3
|
+
optional: []
|
|
4
|
+
---
|
|
5
|
+
Scholarly discovery metadata for a page read as a research article: the
|
|
6
|
+
Highwire meta tags Google Scholar and reference managers read, and their
|
|
7
|
+
Dublin Core equivalents. Only a page the `scholarly` filter accepts gets them
|
|
8
|
+
(_plugins/scholarly.rb): a research article, a page with `scholarly: true`,
|
|
9
|
+
or every post when _config.yml sets `scholarly: true`. A field the page
|
|
10
|
+
lacks leaves its tag out. The authors are the page's (page_authors), as in
|
|
11
|
+
the byline, the JSON-LD and the citation exports; `citation_authors` names
|
|
12
|
+
the indexed authors alone.
|
|
13
|
+
{%- endcomment -%}
|
|
14
|
+
{%- assign is_scholarly = page | scholarly -%}
|
|
15
|
+
{%- if is_scholarly and page.title -%}
|
|
16
|
+
{%- include meta/publisher.html -%}
|
|
17
|
+
{%- assign scholarly_title = page.citation_title | default: page.title | normalize_whitespace -%}
|
|
18
|
+
{%- assign scholarly_url = page.url | absolute_url -%}
|
|
19
|
+
{%- assign scholarly_authors = page | page_authors -%}
|
|
20
|
+
{%- assign scholarly_names = scholarly_authors | map: 'name' -%}
|
|
21
|
+
{%- assign scholarly_override = false -%}
|
|
22
|
+
{%- if page.citation_authors -%}
|
|
23
|
+
{%- assign scholarly_override = true -%}
|
|
24
|
+
{%- capture citation_source_json -%}{{ page.citation_authors | jsonify }}{%- endcapture -%}
|
|
25
|
+
{%- assign citation_source_first = citation_source_json | slice: 0, 1 -%}
|
|
26
|
+
{%- if citation_source_first == '[' -%}
|
|
27
|
+
{%- assign scholarly_names = page.citation_authors -%}
|
|
28
|
+
{%- else -%}
|
|
29
|
+
{%- assign scholarly_names = page.citation_authors | split: ';' -%}
|
|
30
|
+
{%- endif -%}
|
|
31
|
+
{%- endif -%}
|
|
32
|
+
{%- assign scholarly_pdf = page.pdf_url | default: page.citation_pdf -%}
|
|
33
|
+
{%- assign scholarly_journal = page.journal | default: page.publication -%}
|
|
34
|
+
{%- assign scholarly_issue = page.issue | default: page.number -%}
|
|
35
|
+
{%- assign scholarly_keywords = page.keywords | default: page.tags -%}
|
|
36
|
+
{%- assign scholarly_publisher = page.publisher | default: publisher_name -%}
|
|
37
|
+
{%- assign scholarly_language = page.lang | default: site.locale | default: 'en' | split: '_' | first | split: '-' | first -%}
|
|
38
|
+
{%- assign scholarly_license = page | page_license -%}
|
|
39
|
+
{%- assign scholarly_excerpt = page.excerpt | strip_html -%}
|
|
40
|
+
{%- assign scholarly_description = page.seo_description | default: page.description | default: scholarly_excerpt | normalize_whitespace | truncate: 300 -%}
|
|
41
|
+
<meta name="citation_title" content="{{ scholarly_title | escape }}" />
|
|
42
|
+
{%- if scholarly_override %}
|
|
43
|
+
{%- for name in scholarly_names %}
|
|
44
|
+
<meta name="citation_author" content="{{ name | strip | escape }}" />
|
|
45
|
+
{%- endfor %}
|
|
46
|
+
{%- else %}
|
|
47
|
+
{%- for author in scholarly_authors %}
|
|
48
|
+
<meta name="citation_author" content="{{ author.name | strip | escape }}" />
|
|
49
|
+
{%- if author.affiliation %}
|
|
50
|
+
<meta name="citation_author_institution" content="{{ author.affiliation | strip | escape }}" />
|
|
51
|
+
{%- endif %}
|
|
52
|
+
{%- if author.orcid %}
|
|
53
|
+
<meta name="citation_author_orcid" content="{{ author.orcid | escape }}" />
|
|
54
|
+
{%- endif %}
|
|
55
|
+
{%- endfor %}
|
|
56
|
+
{%- endif %}
|
|
57
|
+
{%- if page.date %}
|
|
58
|
+
<meta name="citation_publication_date" content="{{ page.date | date: '%Y/%m/%d' }}" />
|
|
59
|
+
{%- endif %}
|
|
60
|
+
<meta name="citation_public_url" content="{{ scholarly_url }}" />
|
|
61
|
+
<meta name="citation_fulltext_html_url" content="{{ scholarly_url }}" />
|
|
62
|
+
{%- if scholarly_pdf %}
|
|
63
|
+
<meta name="citation_pdf_url" content="{{ scholarly_pdf | absolute_url }}" />
|
|
64
|
+
{%- endif %}
|
|
65
|
+
{%- if page.doi %}
|
|
66
|
+
<meta name="citation_doi" content="{{ page.doi | escape }}" />
|
|
67
|
+
{%- endif %}
|
|
68
|
+
{%- if scholarly_journal %}
|
|
69
|
+
<meta name="citation_journal_title" content="{{ scholarly_journal | escape }}" />
|
|
70
|
+
{%- endif %}
|
|
71
|
+
{%- if page.conference %}
|
|
72
|
+
<meta name="citation_conference_title" content="{{ page.conference | escape }}" />
|
|
73
|
+
{%- endif %}
|
|
74
|
+
{%- if page.volume %}
|
|
75
|
+
<meta name="citation_volume" content="{{ page.volume | escape }}" />
|
|
76
|
+
{%- endif %}
|
|
77
|
+
{%- if scholarly_issue %}
|
|
78
|
+
<meta name="citation_issue" content="{{ scholarly_issue | escape }}" />
|
|
79
|
+
{%- endif %}
|
|
80
|
+
{%- if page.pages %}
|
|
81
|
+
{%- assign page_range = page.pages | append: '' | replace: '–', '-' | replace: '—', '-' | split: '-' %}
|
|
82
|
+
<meta name="citation_firstpage" content="{{ page_range[0] | strip | escape }}" />
|
|
83
|
+
{%- if page_range.size > 1 %}
|
|
84
|
+
<meta name="citation_lastpage" content="{{ page_range[1] | strip | escape }}" />
|
|
85
|
+
{%- endif %}
|
|
86
|
+
{%- endif %}
|
|
87
|
+
{%- if page.issn %}
|
|
88
|
+
<meta name="citation_issn" content="{{ page.issn | escape }}" />
|
|
89
|
+
{%- endif %}
|
|
90
|
+
{%- if page.isbn %}
|
|
91
|
+
<meta name="citation_isbn" content="{{ page.isbn | escape }}" />
|
|
92
|
+
{%- endif %}
|
|
93
|
+
<meta name="citation_publisher" content="{{ scholarly_publisher | escape }}" />
|
|
94
|
+
<meta name="citation_language" content="{{ scholarly_language }}" />
|
|
95
|
+
{%- if scholarly_keywords and scholarly_keywords.size > 0 %}
|
|
96
|
+
<meta name="citation_keywords" content="{{ scholarly_keywords | join: '; ' | escape }}" />
|
|
97
|
+
{%- endif %}
|
|
98
|
+
<link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" />
|
|
99
|
+
<meta name="DC.title" content="{{ scholarly_title | escape }}" />
|
|
100
|
+
{%- for name in scholarly_names %}
|
|
101
|
+
<meta name="DC.creator" content="{{ name | strip | escape }}" />
|
|
102
|
+
{%- endfor %}
|
|
103
|
+
{%- if page.date %}
|
|
104
|
+
<meta name="DC.date" content="{{ page.date | date: '%Y-%m-%d' }}" />
|
|
105
|
+
{%- endif %}
|
|
106
|
+
{%- if page.doi %}
|
|
107
|
+
{%- assign scholarly_identifier = page.doi -%}
|
|
108
|
+
{%- unless scholarly_identifier contains '://' -%}{%- assign scholarly_identifier = 'https://doi.org/' | append: page.doi -%}{%- endunless %}
|
|
109
|
+
<meta name="DC.identifier" content="{{ scholarly_identifier | escape }}" />
|
|
110
|
+
{%- else %}
|
|
111
|
+
<meta name="DC.identifier" content="{{ scholarly_url }}" />
|
|
112
|
+
{%- endif %}
|
|
113
|
+
<meta name="DC.type" content="Text" />
|
|
114
|
+
<meta name="DC.language" content="{{ scholarly_language }}" />
|
|
115
|
+
<meta name="DC.publisher" content="{{ scholarly_publisher | escape }}" />
|
|
116
|
+
{%- if scholarly_license.url %}
|
|
117
|
+
<meta name="DC.rights" content="{{ scholarly_license.url | escape }}" />
|
|
118
|
+
{%- endif %}
|
|
119
|
+
{%- if scholarly_description and scholarly_description != '' %}
|
|
120
|
+
<meta name="DC.description" content="{{ scholarly_description | escape }}" />
|
|
121
|
+
{%- endif %}
|
|
122
|
+
{%- endif -%}
|
|
@@ -34,4 +34,6 @@ highlighted by Rouge when the site builds, so the head renders nothing.
|
|
|
34
34
|
<script nonce="{{ page.csp_nonce }}">
|
|
35
35
|
window.DatalogIntegrations = {{ site.integrations | jsonify }};
|
|
36
36
|
</script>
|
|
37
|
+
{%- comment -%} The dynamic services' public settings, on a site that has a backend. {%- endcomment -%}
|
|
38
|
+
{% include meta/dynamic-services-config.html %}
|
|
37
39
|
{%- endif -%}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{%- comment -%}
|
|
2
|
+
---
|
|
3
|
+
optional: []
|
|
4
|
+
---
|
|
5
|
+
Webmention discovery (W3C Webmention, section 3.1.2): the receiver a site
|
|
6
|
+
names in `webmentions.endpoint` is advertised in every page's head, so a
|
|
7
|
+
website that links here can notify it. GitHub Pages cannot send the HTTP
|
|
8
|
+
Link header form, so the <link> form is the one the theme uses. Nothing is
|
|
9
|
+
advertised without an endpoint or with `webmentions.enabled: false`.
|
|
10
|
+
{%- endcomment -%}
|
|
11
|
+
{%- assign webmentions = site.webmentions -%}
|
|
12
|
+
{%- if webmentions.enabled != false and webmentions.endpoint and webmentions.endpoint != '' -%}
|
|
13
|
+
<link rel="webmention" href="{{ webmentions.endpoint }}" />
|
|
14
|
+
{%- endif -%}
|
|
@@ -41,7 +41,7 @@ Falls back to a friendly message when no related content is available.
|
|
|
41
41
|
{%- if candidate.teaser -%}
|
|
42
42
|
<a class="related-post__media" href="{{ candidate.url | relative_url }}" tabindex="-1" aria-hidden="true"><img src="{{ candidate.teaser | relative_url }}" alt="" loading="lazy" decoding="async" /></a>
|
|
43
43
|
{%- endif -%}
|
|
44
|
-
<h3><a href="{{ candidate.url | relative_url }}">{{ candidate.title }}</a></h3>
|
|
44
|
+
<h3><a href="{{ candidate.url | relative_url }}">{{ candidate.title | escape }}</a></h3>
|
|
45
45
|
<p class="related-post-meta">
|
|
46
46
|
{% include helpers/date-format.html date=candidate.date format=include.date_format %} · {{ candidate.excerpt | strip_html | default: '' | truncate: 140 }}
|
|
47
47
|
</p>
|
data/_includes/scripts.html
CHANGED
|
@@ -31,6 +31,55 @@
|
|
|
31
31
|
{% assign academic_flag = 'false' %}
|
|
32
32
|
{% endif %}
|
|
33
33
|
|
|
34
|
+
{% if site.theme_options.reading_state.enabled == false %}
|
|
35
|
+
{% assign reading_state_flag = 'false' %}
|
|
36
|
+
{% else %}
|
|
37
|
+
{% assign reading_state_flag = 'auto' %}
|
|
38
|
+
{% endif %}
|
|
39
|
+
|
|
40
|
+
{%- comment -%} The correction-report form needs a backend with the feature on (components/correction-report.html). {%- endcomment -%}
|
|
41
|
+
{% assign corrections_flag = 'false' %}
|
|
42
|
+
{% if site.dynamic_services.base_url and site.dynamic_services.base_url != '' and site.dynamic_services.features.corrections != false and site.corrections.enabled != false %}
|
|
43
|
+
{% assign corrections_flag = 'auto' %}
|
|
44
|
+
{% endif %}
|
|
45
|
+
|
|
46
|
+
{%- comment -%} The contact form likewise (components/contact-form.html). {%- endcomment -%}
|
|
47
|
+
{% assign contact_flag = 'false' %}
|
|
48
|
+
{% if site.dynamic_services.base_url and site.dynamic_services.base_url != '' and site.dynamic_services.features.contact != false and site.contact.enabled != false %}
|
|
49
|
+
{% assign contact_flag = 'auto' %}
|
|
50
|
+
{% endif %}
|
|
51
|
+
|
|
52
|
+
{%- comment -%} The comments thread of the api provider (components/comments-thread.html), site-wide or for this page. {%- endcomment -%}
|
|
53
|
+
{% assign comments_flag = 'false' %}
|
|
54
|
+
{% assign comments_options = site.datalog_plugins.options['datalog-comments'] %}
|
|
55
|
+
{% if comments_options.provider == 'api' or page.datalog_comments.provider == 'api' %}
|
|
56
|
+
{% assign comments_flag = 'auto' %}
|
|
57
|
+
{% endif %}
|
|
58
|
+
|
|
59
|
+
{%- comment -%} "Was this useful?" needs a backend with the feature on (components/reactions.html). {%- endcomment -%}
|
|
60
|
+
{% assign reactions_flag = 'false' %}
|
|
61
|
+
{% if site.dynamic_services.base_url and site.dynamic_services.base_url != '' and site.dynamic_services.features.reactions != false and site.reactions.enabled != false %}
|
|
62
|
+
{% assign reactions_flag = 'auto' %}
|
|
63
|
+
{% endif %}
|
|
64
|
+
|
|
65
|
+
{%- comment -%} "Mentioned elsewhere" needs a backend with the feature on (components/webmentions.html). {%- endcomment -%}
|
|
66
|
+
{% assign webmentions_flag = 'false' %}
|
|
67
|
+
{% if site.dynamic_services.base_url and site.dynamic_services.base_url != '' and site.dynamic_services.features.webmentions != false and site.webmentions.enabled != false %}
|
|
68
|
+
{% assign webmentions_flag = 'auto' %}
|
|
69
|
+
{% endif %}
|
|
70
|
+
|
|
71
|
+
{%- comment -%} The newsletter form and its manage page need a backend with the feature on (components/subscribe-form.html). {%- endcomment -%}
|
|
72
|
+
{% assign subscriptions_flag = 'false' %}
|
|
73
|
+
{% if site.dynamic_services.base_url and site.dynamic_services.base_url != '' and site.dynamic_services.features.subscriptions != false and site.subscriptions.enabled != false %}
|
|
74
|
+
{% assign subscriptions_flag = 'auto' %}
|
|
75
|
+
{% endif %}
|
|
76
|
+
|
|
77
|
+
{%- comment -%} The moderation inbox is off unless the site turns it on (components/moderation-inbox.html). {%- endcomment -%}
|
|
78
|
+
{% assign moderation_flag = 'false' %}
|
|
79
|
+
{% if site.moderation.enabled == true %}
|
|
80
|
+
{% assign moderation_flag = 'auto' %}
|
|
81
|
+
{% endif %}
|
|
82
|
+
|
|
34
83
|
<script nonce="{{ page.csp_nonce }}">
|
|
35
84
|
(function () {
|
|
36
85
|
const body = document.body;
|
|
@@ -42,6 +91,14 @@
|
|
|
42
91
|
body.dataset.featureMath = "{{ math_flag }}";
|
|
43
92
|
body.dataset.featureNotebook = "{{ notebook_flag }}";
|
|
44
93
|
body.dataset.featureAcademic = "{{ academic_flag }}";
|
|
94
|
+
body.dataset.featureReadingState = "{{ reading_state_flag }}";
|
|
95
|
+
body.dataset.featureCorrections = "{{ corrections_flag }}";
|
|
96
|
+
body.dataset.featureContact = "{{ contact_flag }}";
|
|
97
|
+
body.dataset.featureComments = "{{ comments_flag }}";
|
|
98
|
+
body.dataset.featureReactions = "{{ reactions_flag }}";
|
|
99
|
+
body.dataset.featureWebmentions = "{{ webmentions_flag }}";
|
|
100
|
+
body.dataset.featureSubscriptions = "{{ subscriptions_flag }}";
|
|
101
|
+
body.dataset.featureModeration = "{{ moderation_flag }}";
|
|
45
102
|
})();
|
|
46
103
|
</script>
|
|
47
104
|
|
data/_layouts/dataset.html
CHANGED
|
@@ -6,9 +6,10 @@ show_title: false # this layout renders the page's <h1>
|
|
|
6
6
|
{% assign date_format = page.date_format | default: localization_config.date_format | default: 'long' %}
|
|
7
7
|
<article class="dataset">
|
|
8
8
|
<header class="dataset-header">
|
|
9
|
-
<h1>{{ page.title }}</h1>
|
|
9
|
+
<h1>{{ page.title | escape }}</h1>
|
|
10
10
|
{% if page.updated %}<p class="dataset-meta"><strong>{% t 'dataset.last_updated' %}</strong> {{ page.updated | localize_date: date_format }}</p>{% endif %}
|
|
11
|
-
{%
|
|
11
|
+
{% assign dataset_license = page | page_license %}
|
|
12
|
+
{% if dataset_license %}<p class="dataset-meta"><strong>{% t 'dataset.license' %}</strong> {% include components/license-link.html license=dataset_license %}</p>{% endif %}
|
|
12
13
|
</header>
|
|
13
14
|
<div class="dataset-summary">
|
|
14
15
|
{{ page.summary | default: page.excerpt }}
|
|
@@ -45,9 +46,9 @@ show_title: false # this layout renders the page's <h1>
|
|
|
45
46
|
</section>
|
|
46
47
|
{% endif %}
|
|
47
48
|
{% assign citation_key = page.citation_key | default: page.slug | default: page.title | slugify %}
|
|
48
|
-
{% assign citation_authors = page
|
|
49
|
+
{% assign citation_authors = page | page_authors %}
|
|
49
50
|
{% assign citation_date = page.date | default: page.updated %}
|
|
50
51
|
{% assign citation_url = page.url | absolute_url %}
|
|
51
|
-
{% include components/citation-tools.html title=page.title authors=citation_authors date=citation_date url=citation_url citation_key=citation_key
|
|
52
|
+
{% include components/citation-tools.html title=page.title authors=citation_authors date=citation_date url=citation_url citation_key=citation_key citation_type='dataset' doi=page.doi %}
|
|
52
53
|
{% include components/open-science-badges.html %}
|
|
53
54
|
</article>
|
data/_layouts/default.html
CHANGED
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
{% include components/math-fallback.html expressions=page.math_expressions %}
|
|
35
35
|
{% include layouts/default/article.html page=page content=content date_format=date_format %}
|
|
36
36
|
</main>
|
|
37
|
-
{% include_cached footer.html %}
|
|
37
|
+
{% include_cached footer.html lang=page.lang %}
|
|
38
38
|
<div class="visually-hidden" aria-live="polite" id="{{ math_status_id }}">{% t 'global.math_loading' %}</div>
|
|
39
39
|
{% include meta/scripts-loader.html location='body' %}
|
|
40
40
|
</body>
|
data/_layouts/home.html
CHANGED
|
@@ -13,7 +13,7 @@ layout: default
|
|
|
13
13
|
{% if post.teaser %}
|
|
14
14
|
<a class="card-media" href="{{ post.url | relative_url }}" tabindex="-1" aria-hidden="true"><img src="{{ post.teaser | relative_url }}" alt="" loading="lazy" decoding="async" /></a>
|
|
15
15
|
{% endif %}
|
|
16
|
-
<h3><a href="{{ post.url | relative_url }}">{{ post.title }}</a></h3>
|
|
16
|
+
<h3><a href="{{ post.url | relative_url }}">{{ post.title | escape }}</a></h3>
|
|
17
17
|
{% assign home_date_format = localization_config.date_format | default: 'long' %}
|
|
18
18
|
{% assign reading_minutes = post.reading_time | default: post.content | number_of_words | divided_by: 180 | ceil %}
|
|
19
19
|
{% capture reading_label %}
|
|
@@ -43,7 +43,7 @@ layout: default
|
|
|
43
43
|
{% assign featured = site.portfolio | sort: 'weight' | slice: 0, 3 %}
|
|
44
44
|
{% for item in featured %}
|
|
45
45
|
<article class="card">
|
|
46
|
-
<h3><a href="{{ item.url | relative_url }}">{{ item.title }}</a></h3>
|
|
46
|
+
<h3><a href="{{ item.url | relative_url }}">{{ item.title | escape }}</a></h3>
|
|
47
47
|
<p>{{ item.summary | default: item.excerpt | strip_html | truncate: 120 }}</p>
|
|
48
48
|
<a class="card-link" href="{{ item.url | relative_url }}">{% t 'home.view_project' %}</a>
|
|
49
49
|
</article>
|
data/_layouts/notebook.html
CHANGED
|
@@ -20,7 +20,7 @@ show_title: false # this layout renders the page's <h1>
|
|
|
20
20
|
|
|
21
21
|
<header class="notebook-article__header">
|
|
22
22
|
<p class="notebook-article__label">{% t 'notebook.label' %}</p>
|
|
23
|
-
<h1 class="notebook-article__title" itemprop="headline">{{ page.title }}</h1>
|
|
23
|
+
<h1 class="notebook-article__title" itemprop="headline">{{ page.title | escape }}</h1>
|
|
24
24
|
<p class="notebook-article__summary">{{ page.summary | default: page.excerpt }}</p>
|
|
25
25
|
|
|
26
26
|
<ul class="notebook-article__meta">
|