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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8fe68fd135e8a6ff30a3a597f329725092136fe52f33703581b3e35ca68c70fa
|
|
4
|
+
data.tar.gz: 80113ba4c2548b97000485bb62a020909ccf4249f942b590513ede696388b56b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 04ebe3a9e3b5ec9b7515612536fb81dfc68fa5830d833773e713affb2422b1ee827a0369ee0b3941a0b61594759c8d94078b8f7f041097206580f4995e4f6030
|
|
7
|
+
data.tar.gz: dcea06f1254a7454de4514136a93489b89007de171757bed05c228a6eba926b2e09abcade38c814dda9610eae0be96008d3624cc099660368ff4bba21239eaa4
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,90 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
4
4
|
|
|
5
|
+
## [0.9.1] - 2026-09-20
|
|
6
|
+
|
|
7
|
+
Planned patch release: **0.9.1**. This release contains bug fixes only.
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Keep numbered figure, table and statement references unchanged when posts are embedded in feeds or listings. Parse escaped attribute quotes completely and fail malformed tags with the page and tag name (#298, #299).
|
|
12
|
+
- Keep editorial asides in the article flow, preserve image proportions at narrow widths, contain wide tables and equations, and restore spacing beside Rouge line numbers (#300, #301, #319, #321).
|
|
13
|
+
- Use `TechArticle` structured data, respect layout schema types, preserve comparison operators in titles and descriptions, escape script-sensitive JSON, and include `baseurl` in publisher, author and breadcrumb URLs (#302, #303, #313).
|
|
14
|
+
- Preserve idempotency keys across retries of unchanged submissions and recover contact, correction and subscription forms after temporary capability failures (#304, #305).
|
|
15
|
+
- Retain subscription management retries and distinguish service failures from expired links. Prevent stale reaction and moderation reads from overwriting newer state, respect moderation-specific endpoints, show retry timing and body request IDs, and sort timestamps by instant (#306).
|
|
16
|
+
- Capture correction quotes before pointer interaction clears the selection, and clear them after successful submission (#307).
|
|
17
|
+
- Offer reading resume above the article, preserve the saved position until resumed or dismissed, flush pending progress when leaving, and keep erased data erased. Restore highlights after math and visualization rendering and avoid ambiguous matches in other sections (#308, #309).
|
|
18
|
+
- Correct macOS highlight shortcuts and Escape handling, report storage failures while keeping erase available, merge and sanitize imports, honor disabled reading lists, and keep fallback marks out of table/list whitespace and SVG (#310).
|
|
19
|
+
- Produce complete BibTeX, RIS and EndNote records with format-specific types and escaped BibTeX fields. Share the exporter with research pages, preserve semicolon-separated author names, and support organization authors (#311).
|
|
20
|
+
- Supply missing notebook labels in English, Spanish and Portuguese and validate literal translation keys (#312).
|
|
21
|
+
- Validate author and licence shapes, resolve author names and profile handles, inherit partial licence settings, preserve year ranges, normalize repository and DOI links, prevent image variant collisions, handle encoded image paths, and propagate `updated` to feeds and sitemaps (#313).
|
|
22
|
+
- Preserve visualization fallback tables and live content in print and hide code line-number gutters (#314).
|
|
23
|
+
- Default omitted math loading settings to automatic detection and preserve inline parenthesis and double-dollar TeX through Markdown conversion, and leave empty delimiters literal (#315, #316, #320).
|
|
24
|
+
- Render tag and category links only when their archive page exists, removing broken links without adding archive features (#293).
|
|
25
|
+
|
|
26
|
+
## [0.9.0] - 2026-09-18
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
|
|
30
|
+
- The build warns when front matter `defaults` set `math: true` or `mathjax: true` while `theme_options.math.render_on_load` is `auto`, since every page in their scope then loads the math engine, with math or without. It also warns that `theme_options.math.enabled` has no effect: nothing reads it, though the user guide's troubleshooting table told readers to check it (#234).
|
|
31
|
+
- `publisher` in `_config.yml` names who publishes the site, as a `Person` or an `Organization`, with a `name`, `url` and, for an organization, `logo`. Each page's JSON-LD, a post's microdata and the citation exports use it. `docs/configuration-reference.md` describes the defaults (#240).
|
|
32
|
+
- A JPEG or PNG image on a page, a Markdown image included, is offered its AVIF and WebP copies in a `<picture>`, with its resized copies as the `srcset` of its `<img>`. Only the `responsive-image.html` include rendered a `<picture>` before, so Markdown images never got one. An image that has its own `srcset`, sits in a `<picture>` or sets `data-no-optimize` keeps its markup, and `theme_options.images.variants: false` turns the copies off. The configuration guide lists the tools to install (#243).
|
|
33
|
+
- A site can keep the theme in a Git submodule and use it as its theme: `gem "datalog-theme", path: "vendor/datalog"` and `theme: datalog-theme`, with nothing copied into the site. `docs/install.md` covers the setup, updates, the CI steps, and moving from a site that pointed `layouts_dir`, `includes_dir`, `plugins_dir` and `sass.sass_dir` into the submodule and copied the theme's assets and data in (#241).
|
|
34
|
+
- The build stops when a theme checkout's script bundles were not built from the sources beside them, or were never built, and names the command that builds them. `npm run build:js` records a SHA-256 of every file it builds from in `assets/js/dist/sources.json` (#241).
|
|
35
|
+
- The build stops when a site has its own copy of a file in `assets/js/dist`, of `assets/js/loader.js`, `_data/js_manifest.json` or `_data/cdn-integrity.yml` that differs from the theme's. The site's copy takes the place of the theme's file, so it would load scripts from another version of the theme (#241).
|
|
36
|
+
- The build warns when `layouts_dir`, `includes_dir`, `plugins_dir` or `sass.sass_dir` point into a copy of the theme, a setup that cannot read the theme's assets and data (#241).
|
|
37
|
+
- `bundle exec datalog critical-css` writes a site's critical CSS. It builds the site for production, extracts the CSS a page with the home layout, a post and one other page need for their first screen with the `critical` npm package, and writes `_includes/critical-css/home.html`, `post.html` and `default.html` in the site. A site installed from the gem had only the theme's empty files, so `critical_css.enabled` changed nothing there. The demo's deploy and Lighthouse runs use the same command through `npm run build:critical`, which ran `scripts/extract_critical_css.js` before. The configuration guide describes the settings and what to install (#238).
|
|
38
|
+
- A production build warns when `critical_css.enabled` is true and a critical CSS file is empty (#238).
|
|
39
|
+
- A page can name several authors, as `authors:` (names, `_data/authors.yml` keys or maps with `name`, `affiliation`, `orcid` and `url`), and its contributors with their roles, as `contributors:`. The byline, the author cards, the JSON-LD, the `citation_author` meta tags and the BibTeX, RIS and EndNote exports all read the same list, from the new `page_authors` and `page_contributors` filters. The JSON-LD `author` becomes a list for several authors, and `contributor` lists the contributors. Several authors get compact cards; `author_cards: detailed` gives each a full card, and `false` none. Each `citation_author` tag is followed by that author's `citation_author_institution` and `citation_author_orcid`. `author:` still names a single author. `docs/components.md` has a collaborative article example (#252).
|
|
40
|
+
- Numbered figures and tables, with references to them: `{% figure id="fig-power" src="..." alt="..." %}` and `{% table id="tab-runs" %}` take their caption, with Markdown and math, from their body, and `{% ref fig-power %}` becomes a link reading "Figure 1". Numbers follow each page's order, so a reference can come before its target and reordering renumbers every reference; in a post's excerpt it links to the post's page. A reference to an id no figure or table has, or two with the same id, stops the build. The words come from `references.figure` and `references.table` in `_data/i18n`, and in print a numbered figure or table is kept on one page. The user guide has a worked example with an equation, a figure and a table (#250).
|
|
41
|
+
- Theorems, lemmas, propositions, corollaries, definitions, assumptions, examples and remarks, as `{% theorem id="thm-wlln" title="Weak law of large numbers" %}` and the like, and proofs, as `{% proof for="thm-wlln" %}`. Articles wrote them as a blockquote with a bold "Theorem 1." typed by hand, which nothing numbered, linked or checked. Each kind is numbered on its own in page order and `{% ref thm-wlln %}` reads "Theorem 1", with the ids and build errors of figures and tables; `label="A"` names a statement "Theorem A" in place of a number. A proof's heading reads "Proof of Theorem 1", linked to the theorem, and it ends with ∎ unless `qed="false"`. Bodies keep their Markdown, math and code. Statements and proofs are groups named by their heading, and the words come from `_data/i18n`. The user guide has a short article as an example (#249).
|
|
42
|
+
- A revision history for articles: `revisions:` in front matter lists what changed since publication, each entry with a `date`, a `type` (`correction`, `update`, `review` or `editorial`), a `summary` and an optional `details_url`. The newest correction or update is announced under the post's metadata, with a link to the full history after the body, which ends with the publication date; `revision_notice: false` turns the notice off. The newest revision that changed the article sets `last_modified_at` when it is later than the page's own, so the JSON-LD `dateModified`, the microdata, the feed and the sitemap carry it, and each correction is a schema.org `CorrectionComment`. The post's metadata now shows "Updated" when the article changed on another day than it was published. A malformed date, a missing summary or an unknown type stops the build and names the page. `docs/components.md` explains which date is which, from `date` to `reviewed_at` (#245).
|
|
43
|
+
- A licence for an article's text and figures, and one for its code samples. `content_license: CC-BY-4.0` in `_config.yml` is the default for every article; `license:` in front matter replaces it, with an SPDX identifier (the Creative Commons family, `CC0-1.0`, `MIT`, `Apache-2.0`, the BSD and GPL families, `MPL-2.0`, `ISC`, `Unlicense`, `all-rights-reserved`), a map with `name`, `url`, `holder` and `year` for any other licence, or `false` to decline. `code_license` names the code samples' terms the same way. A post shows the notice before "How to cite": "© 2024 Diogo Ribeiro. Text and figures under CC BY 4.0. Code samples under MIT.", each licence a `rel="license"` link that keeps its address in print. The head carries `<link rel="license">`, and the JSON-LD `license`, `copyrightYear` and `copyrightHolder`. A dataset's header and a research article's "Rights" row link the licence the same way; datasets and packages carry their own `license` and never take the site's default. `docs/components.md` explains the difference between the repository's licence and an article's (#251).
|
|
44
|
+
- Scholarly discovery metadata for research articles: the Highwire meta tags Google Scholar and reference managers read, and their Dublin Core equivalents, from `_includes/meta/scholarly.html`. Besides the `citation_title`, `citation_author` (with each author's institution and ORCID), `citation_publication_date`, `citation_doi`, `citation_journal_title` and `citation_conference_title` the head already carried, a page gets `citation_public_url` and `citation_fulltext_html_url`, `citation_pdf_url` from `pdf_url` (or `citation_pdf`), `citation_volume`, `citation_issue`, `citation_firstpage` and `citation_lastpage`, `citation_issn`, `citation_isbn`, `citation_publisher`, `citation_language` and `citation_keywords`, and `DC.title`, `DC.creator`, `DC.date`, `DC.identifier` (the DOI, else the URL), `DC.type`, `DC.language`, `DC.publisher`, `DC.rights` (the licence) and `DC.description`. A field the page lacks leaves its tag out. The authors are the page's, as in the byline, the JSON-LD and the citation exports. `docs/google-scholar-setup.md` lists the tags and the front matter they read (#247).
|
|
45
|
+
- Article series: `series: {id: missing-data, order: 3}` in front matter (or `series: missing-data` with `series_order: 3`) makes a post part of a series, whose title and description live once in `_data/series.yml` (or on a part as `title`). The post shows the series at the top, with "Part 3 of 4", a progress bar, every part in order with the current one marked `aria-current`, and the previous and next parts, and again the previous and next parts at the end; both are `<nav>` landmarks apart from the chronological previous/next pagination. Parts are ordered by `order`, whatever was published between them; a part without a whole-number order, or two parts with the same order, stops the build and names the posts. `docs/components.md` has a complete three-part example (#244).
|
|
46
|
+
- A "Reproduce this analysis" panel: `reproducibility:` in front matter names the `code` (with the commit, tag or branch as `ref`), `data` (with `version` and `doi`), `notebook`, `environment` (a `file` in the repository at that ref, a `container` image and an `archive`) and `results` behind an article, every one optional and each a bare URL if that is all there is. The post shows the artifacts given with their identifiers, after the body and before the revision history, and a research article after its "Code and reproducibility" section; a ref or a file in a GitHub or GitLab repository is linked to that exact version. External links carry `rel="external noopener"`, a site path takes the baseurl, and in print every artifact keeps its address. A URL that is not http(s), a site path or a DOI stops the build and names the page and the field. `docs/components.md` has a worked example (#246).
|
|
47
|
+
- Reading mode and print for posts. A "Reading mode" button under the metadata hides the site's navigation, the sharing buttons, the citation tools, the badges, the author card, the related posts and the chronological pagination, and leaves the article with its metadata, its table of contents, its equations, figures, code and the panels that belong to it; the button stays in reach, Escape leaves the mode, and nothing is duplicated. `theme_options.reading_mode.enabled: false` removes it and `remember: true` keeps the choice across pages. A print stylesheet (`_sass/_print.scss`) prints the article black on white whatever the theme, hides the chrome and the interactive-only controls, keeps figures, tables, code blocks, statements and display equations on one page where the browser can, wraps code without a dark background, writes the address after every external link in the text and the article's own address (and DOI) under the metadata, and replaces interactive embeds with a note (#248).
|
|
48
|
+
- Local-first reading state on posts: a "Save for later" bookmark, reading progress with a "Resume where you left off" prompt on return, and private highlights with notes, all kept in the reader's browser (`localStorage`) with no account, no server and no telemetry. A highlight is saved as the quoted text with what comes before and after it, so it is found again after the article is edited as long as the passage survives, and one whose passage is gone is listed as not found; the CSS Custom Highlight API paints them where the browser has it, marks elsewhere, so selecting and copying are untouched. The toolbar over a selection and the shortcuts Alt+Shift+H and Alt+Shift+N add a highlight; the panel under the article lists them with their notes, apart from any comments, and offers export, import and erase. `{% include components/reading-list.html %}` lists the saved articles on a page, which the demo has at `/saved/`. `theme_options.reading_state` turns the layer, each part and the list page on or off. A browser that blocks storage sees a message and disabled controls, and nothing breaks. A later sync with the dynamic services (#259) would be opt-in and separate (#260).
|
|
49
|
+
- A dynamic-services contract for the optional backend-backed features: `dynamic_services` in `_config.yml` (`base_url`, `api_version`, `timeout_ms`, `credentials`, `features`, `paths`, `csrf_header`, `csrf_cookie`), inlined into every page as public settings and allowed in the Content Security Policy's `connect-src`; a browser client (`assets/js/dynamic-services/client.js`) that builds versioned URLs, sends and reads JSON, times requests out, retries idempotent reads only, sends idempotency keys and CSRF headers on writes, turns every failure into one `ServiceError` with a kind (`disabled`, `unsupported`, `version`, `timeout`, `network`, `malformed`, `unauthorized`, `forbidden`, `not_found`, `conflict`, `invalid`, `rate_limited`, `server`, `http`), the request id and `Retry-After`, and discovers the service's features from `GET /v1/capabilities`, treating another API version as a visible mismatch; and shared form states (`form-state.js`) for the forms that post to it. A key naming a secret under `dynamic_services` stops the build. `docs/dynamic-services.md` holds the contract, the security boundary and a reference serverless-plus-MongoDB deployment; the reader-facing messages live under `dynamic_services.errors` in `_data/i18n` (#259).
|
|
50
|
+
- Correction reports: on a site whose dynamic services offer the feature, every post carries "Report an error or suggest a correction", a collapsed form with a category (`corrections.categories`, labelled in `_data/i18n`), the section from the article's headings, the message, an optional email for a reply, and the text the reader had selected. It posts to `/v1/corrections` with the article's address and title and an idempotency key, through the shared client, and shows pending, success, the site's own checks and the service's `422` as field errors, a rate limit and a failure with the request id, and a disabled state when the backend is missing, the feature off, not offered or of another API version; a hidden honeypot catches bots. Reports are never shown on the page: `docs/components.md` explains how one feeds the revision history only after the author has looked. `corrections.enabled: false` or `corrections: false` on a post removes the form. The browser suite builds the site with `tests/integration/site-config.yml`, which points the services at an address the specs answer themselves (#256).
|
|
51
|
+
- Contact form: a page with `contact_form: true` (the demo's `/contact/`, now the footer's Contact link) carries a structured message form, a category (`contact.categories`, labelled in `_data/i18n`, with a short prompt per category that the hint follows), the sender's name, email and optional affiliation, a subject and the message, posted to `/v1/contact` with the page it came from and an idempotency key, through the shared client, with the same states as the correction report. `contact.prompts`, `contact.privacy_notice` and `contact.retention` change the prompts and the privacy wording. Without a backend, or with the feature off, the page shows `contact_email` instead, so it is never empty; `contact.enabled: false` removes both. Messages never reach the page or a feed (#261).
|
|
52
|
+
- Self-hosted comments: `datalog-comments` gains a fourth provider, `api`, which reads and writes the thread through the site's dynamic services (`GET /v1/comments?path=…`, `POST /v1/comments`) instead of Giscus, utterances or Disqus, so the author owns the discussion. The thread loads when the reader gets near it, shows loading, empty, error (with a retry) and disabled states, nests replies under their parent (`replies: false` for a flat list), and renders everything the service returns as text, keeping an author's link only when it is an http(s) address. The form posts a comment or a reply with a name, an optional email (never shown) and website, and the text, with an idempotency key; a comment held for moderation appears to its author with an "Awaiting moderation" badge. `endpoint` keeps comments on a host apart from `dynamic_services.base_url`, and its origin joins the Content Security Policy. `docs/components.md` carries the contract, the backend's duties and a MongoDB reference model that no part of the theme requires (#253).
|
|
53
|
+
- Reactions: "Was this useful?" under every post of a site whose dynamic services offer the feature, with a small configurable set of answers (`reactions.types`, labelled in `_data/i18n`), read from `GET /v1/reactions?path=…` and sent to `POST /v1/reactions` with an idempotency key. The counts are the service's own and only those: none is shown without a backend, with the feature off, when the service cannot be read or answers in another shape, and none is added by the theme after a vote. The reader's choice is kept on their device (`localStorage`) and shown pressed on the next visit; nothing identifies the reader to the service and the theme does not fingerprint. States loading, loaded, unavailable, pending, selected, disabled, with a conflict shown as already counted and a rate limit or failure announced without changing anything. `reactions.counts: false` hides the counts; `reactions.enabled: false` or `reactions: false` on a post removes the strip (#255).
|
|
54
|
+
- Webmentions: `webmentions.endpoint` advertises a receiver in every page's head with the standard `<link rel="webmention">`, and on a site whose dynamic services offer the feature every post carries "Mentioned elsewhere", the links, replies and reposts other websites sent about it, read from `GET /v1/webmentions?target=…` when the reader gets near the section. Only entries the receiver verified, from http(s) sources and of the kinds in `webmentions.types` (mention and reply by default) are shown, newest first and as text: no markup from a source is parsed, titles and excerpts are cut, links carry `rel="nofollow noopener ugc"`. Loading, empty, error (with a retry) and disabled (the section hides itself) states; the section says it is not the comments. `docs/components.md` carries the contract, the receiver's duties and a reference deployment with a receiver and a store that nothing requires (#258).
|
|
55
|
+
- Newsletter subscriptions: on a site whose dynamic services offer the feature, a compact subscribe form in the footer, at the end of posts or both (`subscriptions.placement`), with an email address, optional topics (`subscriptions.topics`, labelled in `_data/i18n`), consent wording that follows `double_opt_in` and a link to `privacy_url`. It posts to `/v1/subscriptions` with an idempotency key and shows pending confirmation, confirmed, already subscribed (a `409`, not an error), the site's checks and the service's `422` on the fields, a rate limit and a failure; a honeypot catches bots. A page with `subscription_manage: true` (the demo's `/subscriptions/`, out of search results and the sitemap) is where the emails lead: `?confirm=` confirms, `?unsubscribe=` ends the subscription after a press of the button, `?manage=` loads and saves the topics, and the token leaves the address bar as soon as it is read. The client gains `patch` and `delete`. No form renders without a backend; addresses never reach a page or an analytics product. `docs/components.md` carries the contract and a reference model that MongoDB is one way to store (#254).
|
|
56
|
+
- Moderation inbox: a page with `moderation_inbox: true` (the demo's `/admin/moderation/`: `noindex,nofollow`, out of the sitemap, the search index and the navigation) lists what the self-hosted features received, pending comments, comments flagged as spam, correction reports and abuse reports, with filters (what, status, report category, page path, since, text) and the actions each item's type and status allow: approve, mark as spam, hide, delete; mark reviewed, accept for editorial action, reject, resolve with the address of the issue, pull request or revision; dismiss. Off unless `moderation.enabled: true`. The page is a shell and says so: authentication and authorization are the moderation service's, or an identity-aware proxy's, on every request; the browser only sends its session (`credentials: include`), a `401` links `moderation.sign_in_url`, a `403` says the account may not moderate, and the build now refuses a key named like a secret under `moderation` as it does under `dynamic_services`. Everything the service returns is rendered as text; an action changes the page only when the service says it happened, and a failure leaves the item as it was with the reason next to it. `docs/moderation.md` carries the contract, the audit trail, the security boundary (CORS with credentials, CSRF) and a reference deployment that needs no particular database (#257).
|
|
57
|
+
|
|
58
|
+
### Changed
|
|
59
|
+
|
|
60
|
+
- The site's author, not the author's affiliation, is the publisher when `publisher` is not set. The JSON-LD named `author.affiliation` as the publishing `Organization`, so every post on a personal site said the author's university published it, and a post's microdata and its BibTeX, RIS and EndNote exports named the university as publisher too. Now the JSON-LD names the author as a `Person`, or the site title as an `Organization` when there is no author name, and the citation exports name the site title. The affiliation moves to the author's own `affiliation` in the JSON-LD, only when the page's author is the site's author. A site that the author's institution does publish keeps its old output with `publisher: {type: Organization, name: <the institution>}` (#240).
|
|
61
|
+
- The theme no longer depends on `mini_magick`: the image optimizer runs ImageMagick itself (#243).
|
|
62
|
+
- A site using the theme from a Git checkout or a local path no longer publishes the checkout's script sources, which no page loads. It gets the theme assets the packaged gem contains (#241).
|
|
63
|
+
- Scholarly meta tags are emitted only for pages read as research articles, not for every page with a title: the home page, the search page and every casual post carried `citation_title` and `citation_author`. A page with the `research` layout has them unless it says `scholarly: false`; any other page has them with `scholarly: true` in its front matter; and `scholarly: true` in `_config.yml` covers every post, as the demo's does, while a list names the collections or layouts to cover. A site that wants its posts indexed as before sets it. The `citation_orcid` and `citation_dataset_doi` tags, which no index defines, and the `<link rel="citation_pdf_url">`, which Google Scholar reads only as a meta tag, are no longer emitted; each author's ORCID is in `citation_author_orcid`, and `citation_pdf_url` is now a meta tag (#247).
|
|
64
|
+
|
|
65
|
+
### Fixed
|
|
66
|
+
|
|
67
|
+
- A post without a table of contents, because it has no headings or says `toc: false`, was laid out in the 14rem column meant for the contents at the large breakpoint, 224px wide; the article now spans the wrapper. The demo's first post was one.
|
|
68
|
+
- The table of contents is a `<nav role="doc-toc">`: an `<aside>` may not carry that role (axe `aria-allowed-role`). Its active entry uses the accent as readable text (`--color-accent-text`; the plain accent was 4.12:1 on the entry's tint) and its reading-progress line the secondary ink (the tertiary one was 2.41:1 in the light theme and 3.73:1 in the dark one).
|
|
69
|
+
- Strings, attributes and insertions in code blocks used the success green and regular expressions and tracebacks the warning amber, both about 3:1 on the code background in the light theme; they use `$color-success-text` and `$color-warning-text` now, as the teal and the warning notices already did.
|
|
70
|
+
- MathJax draws `\eqref` and `\ref` as a link inside its `aria-hidden` output, which the Tab key reached and a screen reader could not name (axe `aria-hidden-focus`). The drawn link leaves the tab order and the same address follows the expression as a real link, "Equation (3)", shown when it takes the focus.
|
|
71
|
+
- The axe spec now scans a post with a table of contents and code blocks and one with equation references, in both themes; the post it scanned had neither, which is how these went unnoticed.
|
|
72
|
+
- The Pa11y workflow failed now and then in "Install Pa11y CI", when Puppeteer could not download its browser ("All providers failed for chrome-headless-shell"), with nothing wrong with the pages. It installs pa11y-ci without that download and points Puppeteer at the Chrome the runner image ships.
|
|
73
|
+
- `docs/README.md` linked to the installation guide's "Install from a Git Checkout" section by its old anchor, which #242 renamed (#250).
|
|
74
|
+
- `author: jane_smith` put "jane_smith" in the post's byline, JSON-LD and meta tags; only the author card looked the key up in `_data/authors.yml`. The research layout gave every author the site author's ORCID and affiliation, and the JSON-LD gave any author the site author's GitHub, Twitter and LinkedIn profiles, and only when an ORCID was set. Each author now has their own details (#252).
|
|
75
|
+
- The EndNote export wrote each author as `%A - Name`, since it rewrote the RIS `AU - Name` lines, and with several authors the BibTeX author field and the RIS author lines held stray line breaks (#252).
|
|
76
|
+
- The author card's placeholder showed no initials: `map: 'first'` on the words of the name returned nothing (#252).
|
|
77
|
+
- The critical CSS inlined on the demo's pages carried the Google Fonts `@font-face` rules for the TrueType files headless Chrome is served: eight on the home page. Extraction now reads only `main.css`, which also cut the home page from over a minute to seconds (#238).
|
|
78
|
+
- The image optimizer never created a resized, AVIF or WebP copy of any image, with ImageMagick installed or not. Looking for avifenc, it called `Jekyll::Utils.which`, which Jekyll does not have, and the error, logged at debug level only, stopped every copy. The optimizer now finds ImageMagick 7 (`magick`) or, outside Windows, ImageMagick 6 (`convert`), creates only the formats it can write, and encodes each copy as the build starts, into `.jekyll-cache/datalog-images`, where later builds find it. A copy that fails to encode is left out with a warning, so no page offers a file that was never written. The Tests workflow installs ImageMagick and avifenc, and `tests/test_image_variants.rb` checks the encoded files (#243).
|
|
79
|
+
- On a site served below a `baseurl`, such as a GitHub project page, a JPEG or PNG from the site's files got a `srcset` naming it without the baseurl, so the browser requested it from the wrong path and showed no image. Every URL the optimizer writes now starts with the baseurl (#243).
|
|
80
|
+
- The README, the installation guide and the starter template's `Gemfile` install the gem with `~> 0.8.0`; they still said `~> 0.7` after 0.8.0 was released. The Release workflow now rewrites these constraints, and the release tag in the guide's Git example, when it bumps the version, and it runs `tests/test_install_versions.rb`, which fails a release whose install examples fall behind (#242).
|
|
81
|
+
- The starter template's deploy workflow set up Ruby 3.1, and the installation guide said Ruby 3.0 was enough, but 0.8.0 requires Ruby 3.2: on an older Ruby, Bundler cannot install it. Both say 3.2 now. `datalog check` also accepted Ruby 3.0; it now checks the requirement the gemspec declares (#242).
|
|
82
|
+
- The installation guide told Git users to install from `develop`, and `docs/branch-trigger-policy.md` said `main` was reserved for future use. The guide now lists the release channels (RubyGems, release tags, `main` for the latest release, `develop` for unreleased work) and pins a release tag, and the branch policy describes `main` as the stable release branch and lists every workflow's triggers. The template guide pushed the starter to `develop`, while its deploy workflow runs on `main` (#242).
|
|
83
|
+
- Pages scroll smoothly only when the reader has not asked for reduced motion. `html { scroll-behavior: smooth }` applied to every reader, and the site navigation, the post table of contents and package pages passed `behavior: "smooth"` to their scroll calls, which overrides that preference. The stylesheet now sets smooth scrolling inside `@media (prefers-reduced-motion: no-preference)`, and the three scripts pass no behavior, so they follow it. `tests/integration/reduced-motion.spec.js` checks both preferences in the browser (#239).
|
|
84
|
+
- A page's `math` front matter now takes precedence over `mathjax`. `mathjax`, which the configuration guide did not mention, was read first, so under a `mathjax: true` in front matter defaults a page with `math: false` still loaded MathJax, which then rendered the page's dollar signs. `mathjax` is still read, as an alias, when `math` is not set, and the math preprocessor resolves the two the same way (#234).
|
|
85
|
+
- Inline math with spaces inside the dollars, such as `$ \frac{TP}{TP + FP} $`, counts as math when it holds a TeX command, `^` or `_`. MathJax and KaTeX render it, but the math preprocessor followed Pandoc's rule and left it out, so with `render_on_load: auto` a page whose only math was written that way loaded no engine and showed the TeX source. The preprocessor now sets aside each expression it wraps, as it does code, so a later pattern cannot pair a dollar sign inside one with a dollar sign outside it (#234).
|
|
86
|
+
- `jekyll serve` stopped regenerating the site after its first build when `_config.yml` set `sass.style`, as the demo's does. Converting a stylesheet, jekyll-sass-converter replaces that value in the site's configuration with a Symbol, and the config validator, which checked the configuration again on every build, stopped each rebuild with "Invalid type for 'sass.style'". A site's configuration is now checked on its first build only, and a Symbol passes where a String is expected. `jekyll build` was not affected (#235).
|
|
87
|
+
- Configuration errors linked to a documentation site that was never published. They link to `docs/configuration-reference.md` on GitHub, which now lists every key the validator checks (#235).
|
|
88
|
+
|
|
5
89
|
## [0.8.0] - 2026-09-14
|
|
6
90
|
|
|
7
91
|
### Added
|
data/CITATION.cff
CHANGED
|
@@ -16,8 +16,8 @@ abstract: >-
|
|
|
16
16
|
It offers integrated notebook publishing, advanced math rendering, interactive
|
|
17
17
|
visualization workflows, and reproducibility tooling optimised for open science communities.
|
|
18
18
|
license: MIT
|
|
19
|
-
version: 0.
|
|
20
|
-
date-released: 2026-09-
|
|
19
|
+
version: 0.9.1
|
|
20
|
+
date-released: 2026-09-20
|
|
21
21
|
keywords:
|
|
22
22
|
- data-science
|
|
23
23
|
- jekyll
|
data/README.md
CHANGED
|
@@ -208,9 +208,11 @@ Data-driven configuration allows you to publish or reorder projects, datasets, s
|
|
|
208
208
|
Add the theme gem to your Jekyll site:
|
|
209
209
|
|
|
210
210
|
```ruby
|
|
211
|
-
gem "datalog-theme", "~> 0.
|
|
211
|
+
gem "datalog-theme", "~> 0.9.0"
|
|
212
212
|
```
|
|
213
213
|
|
|
214
|
+
The constraint takes the patch releases of the current minor series. Until 1.0 a minor release may include breaking changes, listed in the [changelog](CHANGELOG.md).
|
|
215
|
+
|
|
214
216
|
Then enable it in `_config.yml`. Naming the theme under `plugins:` registers its Liquid tags, and the build needs an author name:
|
|
215
217
|
|
|
216
218
|
```yml
|
|
@@ -221,7 +223,7 @@ author:
|
|
|
221
223
|
name: Your Name
|
|
222
224
|
```
|
|
223
225
|
|
|
224
|
-
The [installation guide](docs/install.md) covers the files a site supplies itself, installing from a
|
|
226
|
+
The [installation guide](docs/install.md) covers the files a site supplies itself, installing from Git (a release tag, `main` for the latest release, or `develop` for unreleased work), and publishing to GitHub Pages. GitHub Pages cannot build a site that uses this theme by itself, so the guide publishes it with GitHub Actions.
|
|
225
227
|
|
|
226
228
|
## Continuous Integration & Testing
|
|
227
229
|
|
data/_data/i18n/en.yml
CHANGED
|
@@ -156,6 +156,230 @@ article:
|
|
|
156
156
|
published: Published
|
|
157
157
|
updated: Updated
|
|
158
158
|
author: Author
|
|
159
|
+
authors: Authors
|
|
160
|
+
corrections:
|
|
161
|
+
summary: Report an error or suggest a correction
|
|
162
|
+
intro: "Spotted a mistake in the mathematics, the facts, a citation, the code or the reproducibility? Say what and where. The report goes to the author, not onto the page."
|
|
163
|
+
category: What kind of problem
|
|
164
|
+
section: Where
|
|
165
|
+
section_any: The whole article
|
|
166
|
+
message: What is wrong, and what should it say
|
|
167
|
+
message_hint: At least 20 characters. Quote the passage if you can.
|
|
168
|
+
contact_email: Your email (optional)
|
|
169
|
+
contact_hint: Only if you want a reply. It is never shown on the site.
|
|
170
|
+
send: Send the report
|
|
171
|
+
pending: Sending the report…
|
|
172
|
+
success: "Thank you. The report reached the author and stays private; a correction would appear in the article's revision history."
|
|
173
|
+
message_short: "Say a little more: at least {{min}} characters."
|
|
174
|
+
email_invalid: That does not look like an email address.
|
|
175
|
+
categories:
|
|
176
|
+
mathematical-error: Mathematical error
|
|
177
|
+
factual-error: Factual error
|
|
178
|
+
citation: Broken or wrong citation
|
|
179
|
+
code: Outdated or broken code
|
|
180
|
+
reproducibility: Reproducibility failure
|
|
181
|
+
typo: Typo that changes the meaning
|
|
182
|
+
accessibility: Accessibility problem
|
|
183
|
+
other: Something else
|
|
184
|
+
moderation:
|
|
185
|
+
unavailable: Moderation is not set up on this site.
|
|
186
|
+
boundary: "This page is only a window. Signing in, and what an account may do, are decided by the moderation service on every request; nothing here is protected by the page itself."
|
|
187
|
+
filters: Filters
|
|
188
|
+
type: What
|
|
189
|
+
status: Status
|
|
190
|
+
category: Report category
|
|
191
|
+
path: Page path
|
|
192
|
+
since: Since
|
|
193
|
+
search: Text
|
|
194
|
+
apply: Apply
|
|
195
|
+
reset: Reset
|
|
196
|
+
queue: Awaiting a decision
|
|
197
|
+
any_type: Everything
|
|
198
|
+
any_category: Any category
|
|
199
|
+
loading: Loading the queue…
|
|
200
|
+
empty: Nothing here.
|
|
201
|
+
more: Load more
|
|
202
|
+
working: Working…
|
|
203
|
+
done: "Done: {{action}}."
|
|
204
|
+
unauthorized: You are not signed in to the moderation service.
|
|
205
|
+
forbidden: This account may not moderate this site.
|
|
206
|
+
sign_in: Sign in
|
|
207
|
+
sign_in_hint: Sign in to the moderation service, then reload this page.
|
|
208
|
+
link_required: "Give the address of the issue, pull request or revision (http:// or https://)."
|
|
209
|
+
note: Note, kept with the action
|
|
210
|
+
link: Issue, pull request or revision
|
|
211
|
+
in_reply_to: In reply to
|
|
212
|
+
types:
|
|
213
|
+
comment: Comment
|
|
214
|
+
correction: Correction report
|
|
215
|
+
abuse: Abuse report
|
|
216
|
+
statuses:
|
|
217
|
+
pending: Pending
|
|
218
|
+
approved: Approved
|
|
219
|
+
spam: Spam
|
|
220
|
+
hidden: Hidden
|
|
221
|
+
deleted: Deleted
|
|
222
|
+
new: New
|
|
223
|
+
reviewed: Reviewed
|
|
224
|
+
accepted: Accepted
|
|
225
|
+
rejected: Rejected
|
|
226
|
+
resolved: Resolved
|
|
227
|
+
open: Open
|
|
228
|
+
dismissed: Dismissed
|
|
229
|
+
actions:
|
|
230
|
+
approve: Approve
|
|
231
|
+
spam: Mark as spam
|
|
232
|
+
hide: Hide
|
|
233
|
+
delete: Delete
|
|
234
|
+
reviewed: Mark reviewed
|
|
235
|
+
accept: Accept for editorial action
|
|
236
|
+
reject: Reject
|
|
237
|
+
resolve: Resolve with a link
|
|
238
|
+
dismiss: Dismiss
|
|
239
|
+
subscriptions:
|
|
240
|
+
topics_legend: What to receive
|
|
241
|
+
topics:
|
|
242
|
+
new-articles: New articles
|
|
243
|
+
research-notes: Research notes
|
|
244
|
+
datasets: Datasets
|
|
245
|
+
consent: "You will get these emails and nothing else, and every one of them has an unsubscribe link."
|
|
246
|
+
consent_double: "You will get one email asking you to confirm; nothing else is sent until you do. Every email has an unsubscribe link."
|
|
247
|
+
privacy_link: Privacy policy
|
|
248
|
+
sending: Subscribing…
|
|
249
|
+
pending: Almost there. Check your inbox and follow the link to confirm.
|
|
250
|
+
confirmed: You are subscribed. Thank you.
|
|
251
|
+
duplicate: This address is already subscribed.
|
|
252
|
+
email_invalid: That does not look like an email address.
|
|
253
|
+
topics_required: Pick at least one.
|
|
254
|
+
manage:
|
|
255
|
+
retry: Try again
|
|
256
|
+
idle: "This page confirms, changes or ends a newsletter subscription. Open it from the link in one of the emails."
|
|
257
|
+
unavailable: Subscriptions are not set up on this site.
|
|
258
|
+
confirming: Confirming your subscription…
|
|
259
|
+
confirmed: Your subscription is confirmed. Thank you.
|
|
260
|
+
invalid_link: This link is not valid any more. Subscribe again to get a new one.
|
|
261
|
+
unsubscribe_question: Stop all emails to this address?
|
|
262
|
+
unsubscribe: Unsubscribe
|
|
263
|
+
unsubscribing: Unsubscribing…
|
|
264
|
+
unsubscribed: You are unsubscribed. No more emails will be sent.
|
|
265
|
+
loading: Loading your preferences…
|
|
266
|
+
preferences: What you receive
|
|
267
|
+
save: Save
|
|
268
|
+
saving: Saving…
|
|
269
|
+
saved: Your preferences are saved.
|
|
270
|
+
webmentions:
|
|
271
|
+
heading: Mentioned elsewhere
|
|
272
|
+
intro: "Links, replies and reposts from other websites, as the site's receiver verified them. These are not comments on this site."
|
|
273
|
+
loading: Looking for mentions from other websites…
|
|
274
|
+
empty: No mentions from other websites yet.
|
|
275
|
+
retry: Try again
|
|
276
|
+
types:
|
|
277
|
+
mention: Mention
|
|
278
|
+
reply: Reply
|
|
279
|
+
repost: Repost
|
|
280
|
+
like: Like
|
|
281
|
+
reactions:
|
|
282
|
+
prompt: Was this useful?
|
|
283
|
+
sending: Sending your feedback…
|
|
284
|
+
thanks: Thank you. Your feedback was counted.
|
|
285
|
+
already: Your feedback was already counted.
|
|
286
|
+
types:
|
|
287
|
+
useful: Useful
|
|
288
|
+
clear: Clear
|
|
289
|
+
interesting: Interesting
|
|
290
|
+
needs-clarification: Needs clarification
|
|
291
|
+
comments:
|
|
292
|
+
loading: Loading the discussion…
|
|
293
|
+
empty: No comments yet. Start the discussion.
|
|
294
|
+
noscript: The discussion needs JavaScript to load.
|
|
295
|
+
retry: Try again
|
|
296
|
+
reply: Reply
|
|
297
|
+
replying_to: "Replying to {{name}}"
|
|
298
|
+
cancel_reply: Cancel the reply
|
|
299
|
+
anonymous: Anonymous
|
|
300
|
+
pending: Awaiting moderation
|
|
301
|
+
form_heading: Join the discussion
|
|
302
|
+
name: Your name
|
|
303
|
+
email: Your email (optional)
|
|
304
|
+
email_hint: Never shown. Only if you want to be told of replies.
|
|
305
|
+
url: Your website (optional)
|
|
306
|
+
body: Your comment
|
|
307
|
+
send: Post the comment
|
|
308
|
+
sending: Posting the comment…
|
|
309
|
+
posted: Thank you. Your comment is up.
|
|
310
|
+
posted_pending: Thank you. Your comment is waiting to be read and will appear once approved.
|
|
311
|
+
moderated: Comments are read before they appear. Your email is never shown.
|
|
312
|
+
privacy: Your email is never shown.
|
|
313
|
+
name_required: Say who you are.
|
|
314
|
+
email_invalid: That does not look like an email address.
|
|
315
|
+
url_invalid: A website address starts with http:// or https://.
|
|
316
|
+
body_short: Say a little more.
|
|
317
|
+
contact:
|
|
318
|
+
legend: Contact
|
|
319
|
+
intro: "Say what you have in mind and how to reach you. The message goes to the author, not onto the site."
|
|
320
|
+
category: What is this about
|
|
321
|
+
name: Your name
|
|
322
|
+
email: Your email
|
|
323
|
+
affiliation: Affiliation (optional)
|
|
324
|
+
subject: Subject
|
|
325
|
+
message: Message
|
|
326
|
+
message_hint: At least 20 characters.
|
|
327
|
+
privacy: "Your message and your address go to the author and are never shown on the site."
|
|
328
|
+
send: Send the message
|
|
329
|
+
pending: Sending the message…
|
|
330
|
+
success: "Thank you. The message reached the author, who will reply to the address you gave."
|
|
331
|
+
name_required: Say who you are.
|
|
332
|
+
email_invalid: That does not look like an email address.
|
|
333
|
+
subject_required: Give the message a subject.
|
|
334
|
+
message_short: "Say a little more: at least {{min}} characters."
|
|
335
|
+
fallback: "This site has no message service; write to {{email}}."
|
|
336
|
+
categories:
|
|
337
|
+
research-collaboration: Research collaboration
|
|
338
|
+
consulting: Consulting or a project
|
|
339
|
+
speaking: Speaking or teaching
|
|
340
|
+
mentoring: Mentoring
|
|
341
|
+
reproducibility: A dataset or reproducibility question
|
|
342
|
+
media: Media or an interview
|
|
343
|
+
other: Something else
|
|
344
|
+
prompts:
|
|
345
|
+
research-collaboration: "Say which question, data or method you have in mind, and the timescale."
|
|
346
|
+
consulting: "Say what the project is, its scope, and when you need it."
|
|
347
|
+
speaking: "Say the event, the date, where (or online), the audience and the topic."
|
|
348
|
+
mentoring: "Say where you are now and what you want to get better at."
|
|
349
|
+
reproducibility: "Name the article or dataset, and what did not reproduce or is unclear."
|
|
350
|
+
media: "Say the outlet, the topic and your deadline."
|
|
351
|
+
dynamic_services:
|
|
352
|
+
errors:
|
|
353
|
+
disabled: This feature is not set up on this site.
|
|
354
|
+
unsupported: The service behind this site does not offer this feature.
|
|
355
|
+
version: This site and its service expect different API versions; the site's maintainer needs to update one of them.
|
|
356
|
+
timeout: The service took too long to answer. Try again in a moment.
|
|
357
|
+
network: The service could not be reached. Check your connection and try again.
|
|
358
|
+
malformed: The service answered in a way this site could not read.
|
|
359
|
+
unauthorized: You need to sign in for this.
|
|
360
|
+
forbidden: You are not allowed to do this.
|
|
361
|
+
not_found: The service has nothing at that address.
|
|
362
|
+
conflict: This was already done, or something changed in the meantime.
|
|
363
|
+
invalid: Some of what you entered needs a correction.
|
|
364
|
+
rate_limited: Too many requests for now. Please wait a little and try again.
|
|
365
|
+
server: The service ran into a problem. Try again later.
|
|
366
|
+
http: The service refused the request.
|
|
367
|
+
aborted: The request was cancelled.
|
|
368
|
+
retry_after: "Try again in {{seconds}} seconds."
|
|
369
|
+
reference: "Reference: {{id}}"
|
|
370
|
+
references:
|
|
371
|
+
figure: Figure
|
|
372
|
+
table: Table
|
|
373
|
+
theorem: Theorem
|
|
374
|
+
lemma: Lemma
|
|
375
|
+
proposition: Proposition
|
|
376
|
+
corollary: Corollary
|
|
377
|
+
definition: Definition
|
|
378
|
+
assumption: Assumption
|
|
379
|
+
example: Example
|
|
380
|
+
remark: Remark
|
|
381
|
+
proof: Proof
|
|
382
|
+
proof_of: "Proof of {{target}}"
|
|
159
383
|
post:
|
|
160
384
|
provenance:
|
|
161
385
|
heading: Author and editorial note
|
|
@@ -163,10 +387,85 @@ post:
|
|
|
163
387
|
evidence: Evidence used
|
|
164
388
|
method: Method
|
|
165
389
|
reviewed: Reviewed
|
|
390
|
+
revisions:
|
|
391
|
+
heading: Revision history
|
|
392
|
+
corrected_on: "Corrected on {{date}}."
|
|
393
|
+
updated_on: "Updated on {{date}}."
|
|
394
|
+
details: Details
|
|
395
|
+
history_link: Revision history
|
|
396
|
+
types:
|
|
397
|
+
correction: Correction
|
|
398
|
+
update: Update
|
|
399
|
+
review: Review
|
|
400
|
+
editorial: Editorial
|
|
401
|
+
published: Published
|
|
402
|
+
license:
|
|
403
|
+
content: "Text and figures under {{license}}."
|
|
404
|
+
code: "Code samples under {{license}}."
|
|
405
|
+
reserved: All rights reserved.
|
|
406
|
+
series:
|
|
407
|
+
label: Series
|
|
408
|
+
part_of: "Part {{part}} of {{total}}"
|
|
409
|
+
nav_label: "Series: {{title}}"
|
|
410
|
+
previous: Previous part
|
|
411
|
+
next: Next part
|
|
412
|
+
reproduce:
|
|
413
|
+
heading: Reproduce this analysis
|
|
414
|
+
intro: The code, data and environment behind this article.
|
|
415
|
+
code: Source code
|
|
416
|
+
data: Data
|
|
417
|
+
notebook: Notebook
|
|
418
|
+
environment: Environment
|
|
419
|
+
results: Results
|
|
420
|
+
ref: "at {{ref}}"
|
|
421
|
+
version: "version {{version}}"
|
|
422
|
+
container: Container
|
|
423
|
+
archive: Archived environment
|
|
424
|
+
reading_mode:
|
|
425
|
+
enter: Reading mode
|
|
426
|
+
exit: Exit reading mode
|
|
427
|
+
hint: Hides the site's navigation and the panels around the article; press Escape to leave.
|
|
428
|
+
print:
|
|
429
|
+
source: Online at
|
|
430
|
+
reading_state:
|
|
431
|
+
save: Save for later
|
|
432
|
+
saved: Saved
|
|
433
|
+
saved_list: Saved articles
|
|
434
|
+
unavailable: This browser is not letting the site keep data, so saving, progress and highlights are off.
|
|
435
|
+
resume: Resume where you left off
|
|
436
|
+
progress: "{{percent}}% read"
|
|
437
|
+
resume_button: Resume
|
|
438
|
+
dismiss: Dismiss
|
|
439
|
+
highlight: Highlight
|
|
440
|
+
note: Highlight with a note
|
|
441
|
+
shortcuts: "With text selected, Alt+Shift+H highlights it and Alt+Shift+N adds a note."
|
|
442
|
+
highlights_heading: Your private highlights
|
|
443
|
+
data_heading: Your reading data
|
|
444
|
+
intro: Kept in this browser only and never sent anywhere. These are your notes, not comments.
|
|
445
|
+
empty: Select a passage of the article to highlight it.
|
|
446
|
+
note_label: Note
|
|
447
|
+
go_to: Go to
|
|
448
|
+
remove: Remove
|
|
449
|
+
lost: Not found in the current text
|
|
450
|
+
export: Export as JSON
|
|
451
|
+
exported: Your reading data was downloaded.
|
|
452
|
+
import: Import JSON
|
|
453
|
+
imported: "{{count}} articles imported."
|
|
454
|
+
import_failed: That file is not a reading data export.
|
|
455
|
+
erase_article: Erase this article's data
|
|
456
|
+
erased_article: This article's data was erased.
|
|
457
|
+
erase_all: Erase all reading data
|
|
458
|
+
erase_confirm: Erase every saved article, position and highlight in this browser?
|
|
459
|
+
erased_all: All reading data was erased.
|
|
460
|
+
list_empty: No saved articles yet. Save one with "Save for later" on a post.
|
|
461
|
+
highlights_count: "{{count}} highlights"
|
|
166
462
|
article_information: Article information
|
|
167
463
|
meta:
|
|
168
464
|
published: Published
|
|
465
|
+
updated: Updated
|
|
169
466
|
author: Author
|
|
467
|
+
authors: Authors
|
|
468
|
+
contributors: Contributors
|
|
170
469
|
reading_time: Reading time
|
|
171
470
|
difficulty: Difficulty
|
|
172
471
|
runtime: Runtime
|
|
@@ -206,6 +505,27 @@ dataset:
|
|
|
206
505
|
description: Description
|
|
207
506
|
type: Type
|
|
208
507
|
notebook:
|
|
508
|
+
tags_label: Notebook tags
|
|
509
|
+
sidebar_label: Notebook details
|
|
510
|
+
sidebar:
|
|
511
|
+
overview: Overview
|
|
512
|
+
code_cells: code cells
|
|
513
|
+
markdown_cells: Markdown cells
|
|
514
|
+
error_outputs: error outputs
|
|
515
|
+
execution: Execution
|
|
516
|
+
kernel: Kernel
|
|
517
|
+
language: Language
|
|
518
|
+
file: File
|
|
519
|
+
branch: Branch
|
|
520
|
+
runtime: Runtime
|
|
521
|
+
not_specified: Not specified
|
|
522
|
+
na: Not available
|
|
523
|
+
run_online: Run online
|
|
524
|
+
launch_binder: Launch in Binder
|
|
525
|
+
open_colab: Open in Colab
|
|
526
|
+
version_history: Version history
|
|
527
|
+
last_commit: Last commit
|
|
528
|
+
view_latest: View latest version
|
|
209
529
|
label: Interactive Notebook
|
|
210
530
|
meta:
|
|
211
531
|
published: "Published:"
|
|
@@ -217,6 +537,7 @@ notebook:
|
|
|
217
537
|
runtime: "Runtime:"
|
|
218
538
|
actions:
|
|
219
539
|
download: Download .ipynb
|
|
540
|
+
view_source: View source
|
|
220
541
|
launch_binder: Launch in Binder
|
|
221
542
|
open_colab: Open in Colab
|
|
222
543
|
academic_dashboard:
|