From b7e6f581fa6fb730bfe5e778e4fa455c8c1d9d33 Mon Sep 17 00:00:00 2001 From: Vincent Rubinetti Date: Fri, 13 Dec 2019 15:12:12 -0500 Subject: [PATCH 01/24] Update plugins for pandoc-xnos suite version 2.0 breaking changes merges https://github.com/manubot/rootstock/pull/286 closes https://github.com/manubot/rootstock/issues/284 - removes table scroll plugin - relies on pandoc-tablenos to wrap `` elements in `
`s that can be scrolled - updates CSS such that breaks are forced when printing or when a table isn't given an id (and thus isn't wrapped with a `
` - simplifies plugins a bit as a result of pandoc-tablenos and pandoc-fignos changes - adds tolerance to scroll-out-of-bounds feature - adds support for equations in anchors plugin --- build/build.sh | 1 - build/plugins/accordion.html | 12 +++--- build/plugins/anchors.html | 34 +++++++--------- build/plugins/jump-to-first.html | 12 +++--- build/plugins/link-highlight.html | 10 +---- build/plugins/table-scroll.html | 68 ------------------------------- build/plugins/tooltips.html | 14 +++---- build/themes/default.html | 68 ++++++++++++++++++------------- 8 files changed, 71 insertions(+), 148 deletions(-) delete mode 100644 build/plugins/table-scroll.html diff --git a/build/build.sh b/build/build.sh index 1ed0e1c5..a859667c 100755 --- a/build/build.sh +++ b/build/build.sh @@ -40,7 +40,6 @@ pandoc --verbose \ --csl="$CSL_PATH" \ --metadata link-citations=true \ --include-after-body=build/themes/default.html \ - --include-after-body=build/plugins/table-scroll.html \ --include-after-body=build/plugins/anchors.html \ --include-after-body=build/plugins/accordion.html \ --include-after-body=build/plugins/tooltips.html \ diff --git a/build/plugins/accordion.html b/build/plugins/accordion.html index ebd6ec8d..eaddd546 100644 --- a/build/plugins/accordion.html +++ b/build/plugins/accordion.html @@ -99,17 +99,15 @@ function getHashTarget(link) { const hash = link ? link.hash : window.location.hash; const id = hash.slice(1); - let target = document.querySelector( - '[id="' + id + '"], [name="' + id + '"]' - ); + let target = document.querySelector('[id="' + id + '"]'); if (!target) return; // if figure or table, modify target to get expected element - if (hash.indexOf('#fig:') === 0) - target = target.parentNode; - if (hash.indexOf('#tbl:') === 0) - target = target.nextElementSibling; + if (id.indexOf('fig:') === 0) + target = target.querySelector('figure'); + if (id.indexOf('tbl:') === 0) + target = target.querySelector('table'); return target; } diff --git a/build/plugins/anchors.html b/build/plugins/anchors.html index 92015d1b..4f2e6ba3 100644 --- a/build/plugins/anchors.html +++ b/build/plugins/anchors.html @@ -23,7 +23,7 @@ const options = { // which types of elements to add anchors next to, in // "document.querySelector" format - typesQuery: 'h1, h2, h3, figure, table', + typesQuery: 'h1, h2, h3, [id^="fig:"], [id^="tbl:"], [id^="eq:"]', // whether plugin is on or not enabled: 'true' }; @@ -50,11 +50,13 @@ function onScroll() { // if url has hash and user has scrolled out of view of hash // target, remove hash from url + const tolerance = 100; const target = getHashTarget(); if (target) { if ( - target.getBoundingClientRect().top > window.innerHeight || - target.getBoundingClientRect().bottom < 0 + target.getBoundingClientRect().top > + window.innerHeight + tolerance || + target.getBoundingClientRect().bottom < 0 - tolerance ) history.pushState(null, null, ' '); } @@ -62,24 +64,20 @@ // add anchor to element function addAnchor(element) { - let withId; // element with unique id let addTo; // element to add anchor button to // if figure or table, modify withId and addTo to get expected // elements - if (element.tagName.toLowerCase() === 'figure') { - withId = element.querySelector('img'); + if (element.id.indexOf('fig:') === 0) { addTo = element.querySelector('figcaption'); - } else if (element.tagName.toLowerCase() === 'table') { - withId = - element.previousElementSibling || - element.parentNode.previousElementSibling; + } else if (element.id.indexOf('tbl:') === 0) { addTo = element.querySelector('caption'); + } else if (element.id.indexOf('eq:') === 0) { + addTo = element.querySelector('.eqnos-number'); } - withId = withId || element; addTo = addTo || element; - const id = withId.id || withId.name || null; + const id = element.id || null; // do not add anchor if element doesn't have assigned id. // id is generated by pandoc and is assumed to be unique and @@ -101,17 +99,15 @@ function getHashTarget() { const hash = window.location.hash; const id = hash.slice(1); - let target = document.querySelector( - '[id="' + id + '"], [name="' + id + '"]' - ); + let target = document.querySelector('[id="' + id + '"]'); if (!target) return; // if figure or table, modify target to get expected element - if (hash.indexOf('#fig:') === 0) - target = target.parentNode; - if (hash.indexOf('#tbl:') === 0) - target = target.nextElementSibling; + if (id.indexOf('fig:') === 0) + target = target.querySelector('figure'); + if (id.indexOf('tbl:') === 0) + target = target.querySelector('table'); return target; } diff --git a/build/plugins/jump-to-first.html b/build/plugins/jump-to-first.html index 90e88ba7..e8a8088f 100644 --- a/build/plugins/jump-to-first.html +++ b/build/plugins/jump-to-first.html @@ -102,11 +102,11 @@ // add button next to each figure function makeFigureButtons() { - const figures = document.querySelectorAll('img[id^="fig:"]'); + const figures = document.querySelectorAll('[id^="fig:"]'); for (const figure of figures) { // get figure id and element to add button to const id = figure.id; - const container = figure.nextElementSibling; + const container = figure.querySelector('figcaption') || figure; const first = getFirstOccurrence(id); // if can't find link to figure, ignore @@ -130,13 +130,11 @@ // add button next to each figure function makeTableButtons() { - const tables = document.querySelectorAll('a[name^="tbl:"]'); + const tables = document.querySelectorAll('[id^="tbl:"]'); for (const table of tables) { // get ref id and element to add button to - const id = table.name; - const container = table.nextElementSibling.querySelector( - 'caption' - ); + const id = table.id; + const container = table.querySelector('caption') || table; const first = getFirstOccurrence(id); // if can't find link to table, ignore diff --git a/build/plugins/link-highlight.html b/build/plugins/link-highlight.html index a8a3ac5b..4462f509 100644 --- a/build/plugins/link-highlight.html +++ b/build/plugins/link-highlight.html @@ -86,18 +86,10 @@ function getHashTarget(link) { const hash = link ? link.hash : window.location.hash; const id = hash.slice(1); - let target = document.querySelector( - '[id="' + id + '"], [name="' + id + '"]' - ); + let target = document.querySelector('[id="' + id + '"]'); if (!target) return; - // if figure or table, modify target to get expected element - if (hash.indexOf('#fig:') === 0) - target = target.parentNode; - else if (hash.indexOf('#tbl:') === 0) - target = target.nextElementSibling.querySelector('caption'); - return target; } diff --git a/build/plugins/table-scroll.html b/build/plugins/table-scroll.html deleted file mode 100644 index 2a4473ab..00000000 --- a/build/plugins/table-scroll.html +++ /dev/null @@ -1,68 +0,0 @@ - - - diff --git a/build/plugins/tooltips.html b/build/plugins/tooltips.html index 2afc2cba..f9cbc60e 100644 --- a/build/plugins/tooltips.html +++ b/build/plugins/tooltips.html @@ -398,19 +398,15 @@ function getSource(link) { const hash = link ? link.hash : window.location.hash; const id = hash.slice(1); - let target = document.querySelector( - '[id="' + id + '"], [name="' + id + '"]' - ); + let target = document.querySelector('[id="' + id + '"]'); if (!target) return; - // if figure or table, modify target to get expected element - if (hash.indexOf('#ref-') === 0) + // if ref or figure, modify target to get expected element + if (id.indexOf('ref-') === 0) target = target.querySelector('p'); - else if (hash.indexOf('#fig:') === 0) - target = target.parentNode; - else if (hash.indexOf('#tbl:') === 0) - return; + else if (id.indexOf('fig:') === 0) + target = target.querySelector('figure'); return target; } diff --git a/build/themes/default.html b/build/themes/default.html index 3e83ddda..26675bdf 100644 --- a/build/themes/default.html +++ b/build/themes/default.html @@ -229,6 +229,7 @@ padding: 10px; /* squash table if too wide for page by forcing line breaks */ overflow-wrap: break-word; + word-break: break-word; } /* header row and even rows */ @@ -617,6 +618,43 @@ margin-bottom: 20px; } + /* -------------------------------------------------- */ + /* tablenos */ + /* -------------------------------------------------- */ + + /* tablenos wrapper */ + .tablenos { + /* show scrollbar on tables if necessary to prevent overflow */ + width: 100%; + margin: 20px 0; + } + + .tablenos > table { + /* move margins from table to table_wrapper to allow margin collapsing */ + margin: 0; + } + + @media only screen { + /* tablenos wrapper */ + .tablenos { + /* show scrollbar on tables if necessary to prevent overflow */ + overflow-x: auto !important; + } + + .tablenos th, + .tablenos td { + overflow-wrap: unset !important; + word-break: unset !important; + } + + /* table in wrapper */ + .tablenos table, + .tablenos table * { + /* don't break table words */ + overflow-wrap: normal !important; + } + } + /* -------------------------------------------------- */ /* mathjax */ /* -------------------------------------------------- */ @@ -646,34 +684,8 @@ /* equation */ span[id^="eq:"] > span.math.display > span { - /* nudge to make room for equation auto-number */ - margin-right: 40px !important; - } - - /* -------------------------------------------------- */ - /* table scroll plugin */ - /* -------------------------------------------------- */ - - @media only screen { - /* table wrapper */ - .table_wrapper { - /* show scrollbar on tables if necessary to prevent overflow */ - overflow: auto; - width: 100%; - margin: 20px 0; - } - - /* table within table wrapper */ - .table_wrapper table, - .table_wrapper table * { - /* don't break table words */ - word-break: normal !important; - } - - .table_wrapper > table { - /* move margins from table to table_wrapper to allow margin collapsing */ - margin: 0; - } + /* nudge to make room for equation auto-number and anchor */ + margin-right: 60px !important; } /* -------------------------------------------------- */ From 37b33788b3456cf8ddcd61aea1689070c97012fc Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Wed, 18 Dec 2019 13:11:22 -0500 Subject: [PATCH 02/24] Update metadata.authors & USAGE Merges https://github.com/manubot/rootstock/pull/289 * Update metadata.yaml to use 'authors' * Mention delete-me.md in USAGE --- USAGE.md | 5 ++++- build/environment.yml | 2 +- content/metadata.yaml | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/USAGE.md b/USAGE.md index f44e2c21..2ee4969d 100644 --- a/USAGE.md +++ b/USAGE.md @@ -12,6 +12,9 @@ Markdown files are identified by their `.md` extension and ordered according to For basic formatting, check out the [CommonMark Help](https://commonmark.org/help/) page for an introduction to the formatting options provided by standard markdown. In addition, Manubot supports an extended version of markdown, tailored for scholarly writing, which includes [Pandoc's Markdown](https://pandoc.org/MANUAL.html#pandocs-markdown) and the extensions discussed below. +The `content/02.delete-me.md` file in the Rootstock repository shows many of the elements and formatting options supported by Manubot. +See the [raw markdown](https://gitlab.com/manubot/rootstock/blob/master/content/02.delete-me.md#L) in this file and compare it to the [rendered manuscript](https://manubot.github.io/rootstock/). + Within a paragraph in markdown, single newlines are interpreted as whitespace (same as a space). A paragraph's source does not need to contain newlines. However, "one paragraph per line" makes the git diff less precise, leading to less granular review commenting, and makes conflicts more likely. @@ -179,7 +182,7 @@ The following YAML shows the supported key–value pairs for an author: ```yaml github: dhimmel # strongly suggested name: Daniel S. Himmelstein # mandatory -initials: DSH # strongly suggested +initials: DSH # optional orcid: 0000-0002-3012-7446 # mandatory twitter: dhimmel # optional email: daniel.himmelstein@gmail.com # suggested diff --git a/build/environment.yml b/build/environment.yml index 3841e7e1..bf625816 100644 --- a/build/environment.yml +++ b/build/environment.yml @@ -19,7 +19,7 @@ dependencies: - watchdog=0.9.0 - pip: - errorhandler==2.0.1 - - git+https://github.com/manubot/manubot@2ffcec1183bdaf7c49a81490b9c31d05e977b351 + - git+https://github.com/manubot/manubot@9c58b4ea44b5080de426f1e544c6734dc22771a0 - jsonref==0.2 - opentimestamps-client==0.7.0 - opentimestamps==0.4.1 diff --git a/content/metadata.yaml b/content/metadata.yaml index 553de29c..34cc4d43 100644 --- a/content/metadata.yaml +++ b/content/metadata.yaml @@ -5,7 +5,7 @@ keywords: - publishing - manubot lang: en-US -author_info: +authors: - github: johndoe name: John Doe From b5c196fb9010777ac0b57772eaa52a4addd2e496 Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Sat, 4 Jan 2020 16:49:26 -0500 Subject: [PATCH 03/24] SETUP: better manubot update instructions merges https://github.com/manubot/rootstock/pull/298 --- SETUP.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/SETUP.md b/SETUP.md index e4058585..bc7f520f 100644 --- a/SETUP.md +++ b/SETUP.md @@ -174,14 +174,18 @@ This process can be difficult, especially if conflicts have arisen, and is recom It is recommended to do rootstock upgrades via a pull request to help you view the proposed changes and to ensure the build uses the updated environment. First, checkout a new branch to use as the pull request head branch: -```sh -# This command names the branch using the current date, i.e. rootstock-2018-11-16 +```shell +# checkout a new branch, named using the current date, i.e. rootstock-2018-11-16 git checkout -b rootstock-$(date '+%Y-%m-%d') ``` Second, pull the new commits from rootstock, but do not automerge: -```sh +```shell +# if rootstock remote is not set, add it +git config remote.rootstock.url || git remote add rootstock https://github.com/manubot/rootstock.git + +# pull the new commits from rootstock git pull --no-ff --no-commit rootstock master ``` @@ -197,6 +201,14 @@ When there are no longer any unstaged changes, then do `git commit`. If updating `master` via a pull request, proceed to push the commit to GitHub and open a pull request. Once the pull request is ready to merge, use GitHub's "Create a merge commit" option rather than "Squash and merge" or "Rebase and merge" to preserve the rootstock commit hashes. +The environment for local builds does not automatically update when [`build/environment.yml`](build/environment.yml) changes. +To update your local conda `manubot` environment with new changes, run: + +```shell +# update a local conda environment +conda env update --file build/environment.yml +``` + # Previewing pull request builds with AppVeyor You can optionally enable AppVeyor continuous integration to view pull request builds. From 06fb01d0c8e5c1ca7632cd17c27d3fddd0691386 Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Sat, 4 Jan 2020 17:27:12 -0500 Subject: [PATCH 04/24] build: configure pandoc using --defaults files merges https://github.com/manubot/rootstock/pull/290 The options for the pandoc commands in build/build.sh are now configured in YAML files that are passed to Pandoc using --defaults. export PANDOC_DEFAULTS_DIR to override the directory with pandoc --defaults files --- build/README.md | 9 ++-- build/build.sh | 66 ++++------------------- build/environment.yml | 2 +- build/pandoc-defaults/common.yaml | 13 +++++ build/pandoc-defaults/docx.yaml | 8 +++ build/pandoc-defaults/html.yaml | 21 ++++++++ build/pandoc-defaults/pdf-weasyprint.yaml | 9 ++++ 7 files changed, 69 insertions(+), 59 deletions(-) create mode 100644 build/pandoc-defaults/common.yaml create mode 100644 build/pandoc-defaults/docx.yaml create mode 100644 build/pandoc-defaults/html.yaml create mode 100644 build/pandoc-defaults/pdf-weasyprint.yaml diff --git a/build/README.md b/build/README.md index 40a3cb41..c61b8fa7 100644 --- a/build/README.md +++ b/build/README.md @@ -1,7 +1,7 @@ # Building the manuscript [`build.sh`](build.sh) builds the repository. -`sh build/build.sh` should be executed from the root directory of the repository. +`bash build/build.sh` should be executed from the root directory of the repository. By default, `build.sh` creates HTML and PDF outputs. However, setting the `BUILD_PDF` environment variable to `false` will suppress PDF output. For example, run local builds using the command `BUILD_PDF=false bash build/build.sh`. @@ -10,8 +10,11 @@ To build a DOCX file of the manuscript, set the `BUILD_DOCX` environment variabl For example, use the command `BUILD_DOCX=true bash build/build.sh`. To export DOCX for all Travis builds, set a [Travis environment variable](https://docs.travis-ci.com/user/environment-variables/#Defining-Variables-in-Repository-Settings). Currently, equation numbers via `pandoc-eqnos` are not supported for DOCX output. -There is varying support for embedding images in DOCX output. -Please reference [Pull Request #40](https://github.com/manubot/rootstock/pull/40) for possible solutions and continued discussion. + +Format conversion is done using [Pandoc](https://pandoc.org/MANUAL.html). +`build.sh` calls `pandoc` commands using the options specified in [`pandoc-defaults`](pandoc-defaults). +Each file specifies a set of pandoc `--defaults` options for a given format. +To change the options, either edit the YAML files directly or add additional `--defaults` files. ## Environment diff --git a/build/build.sh b/build/build.sh index a859667c..7173f3e3 100755 --- a/build/build.sh +++ b/build/build.sh @@ -19,42 +19,19 @@ manubot process \ --cache-directory=ci/cache \ --log-level=INFO -# pandoc settings -CSL_PATH=build/assets/style.csl -BIBLIOGRAPHY_PATH=output/references.json -INPUT_PATH=output/manuscript.md +# Pandoc's configuration is specified via files of option defaults +# located in the PANDOC_DEFAULTS_DIR directory. +PANDOC_DEFAULTS_DIR="${PANDOC_DEFAULTS_DIR:-build/pandoc-defaults}" # Make output directory mkdir -p output # Create HTML output -# http://pandoc.org/MANUAL.html +# https://pandoc.org/MANUAL.html echo >&2 "Exporting HTML manuscript" pandoc --verbose \ - --from=markdown \ - --to=html5 \ - --filter=pandoc-fignos \ - --filter=pandoc-eqnos \ - --filter=pandoc-tablenos \ - --bibliography="$BIBLIOGRAPHY_PATH" \ - --csl="$CSL_PATH" \ - --metadata link-citations=true \ - --include-after-body=build/themes/default.html \ - --include-after-body=build/plugins/anchors.html \ - --include-after-body=build/plugins/accordion.html \ - --include-after-body=build/plugins/tooltips.html \ - --include-after-body=build/plugins/jump-to-first.html \ - --include-after-body=build/plugins/link-highlight.html \ - --include-after-body=build/plugins/table-of-contents.html \ - --include-after-body=build/plugins/lightbox.html \ - --include-after-body=build/plugins/attributes.html \ - --mathjax \ - --variable math="" \ - --include-after-body=build/plugins/math.html \ - --include-after-body=build/plugins/hypothesis.html \ - --include-after-body=build/plugins/analytics.html \ - --output=output/manuscript.html \ - "$INPUT_PATH" + --defaults="$PANDOC_DEFAULTS_DIR/common.yaml" \ + --defaults="$PANDOC_DEFAULTS_DIR/html.yaml" # Return null if docker command is missing, otherwise return path to docker DOCKER_EXISTS="$(command -v docker || true)" @@ -66,20 +43,9 @@ if [ "${BUILD_PDF:-}" != "false" ] && [ -z "$DOCKER_EXISTS" ]; then if [ -L images ]; then rm images; fi # if images is a symlink, remove it ln -s content/images pandoc \ - --from=markdown \ - --to=html5 \ - --pdf-engine=weasyprint \ - --pdf-engine-opt=--presentational-hints \ - --filter=pandoc-fignos \ - --filter=pandoc-eqnos \ - --filter=pandoc-tablenos \ - --bibliography="$BIBLIOGRAPHY_PATH" \ - --csl="$CSL_PATH" \ - --metadata link-citations=true \ - --webtex=https://latex.codecogs.com/svg.latex? \ - --include-after-body=build/themes/default.html \ - --output=output/manuscript.pdf \ - "$INPUT_PATH" + --defaults="$PANDOC_DEFAULTS_DIR/common.yaml" \ + --defaults="$PANDOC_DEFAULTS_DIR/html.yaml" \ + --defaults="$PANDOC_DEFAULTS_DIR/pdf-weasyprint.yaml" rm images fi @@ -111,18 +77,8 @@ fi if [ "${BUILD_DOCX:-}" = "true" ]; then echo >&2 "Exporting Word Docx manuscript" pandoc --verbose \ - --from=markdown \ - --to=docx \ - --filter=pandoc-fignos \ - --filter=pandoc-eqnos \ - --filter=pandoc-tablenos \ - --bibliography="$BIBLIOGRAPHY_PATH" \ - --csl="$CSL_PATH" \ - --metadata link-citations=true \ - --reference-doc=build/themes/default.docx \ - --resource-path=.:content \ - --output=output/manuscript.docx \ - "$INPUT_PATH" + --defaults="$PANDOC_DEFAULTS_DIR/common.yaml" \ + --defaults="$PANDOC_DEFAULTS_DIR/docx.yaml" fi echo >&2 "Build complete" diff --git a/build/environment.yml b/build/environment.yml index bf625816..4d5ea063 100644 --- a/build/environment.yml +++ b/build/environment.yml @@ -9,7 +9,7 @@ dependencies: - jinja2=2.10.3 - jsonschema=3.1.1 - pandas=0.25.2 - - pandoc=2.7.3 + - pandoc=2.9 - pango=1.40.14 - pip=19.3 - psutil=5.6.3 diff --git a/build/pandoc-defaults/common.yaml b/build/pandoc-defaults/common.yaml new file mode 100644 index 00000000..53ae895e --- /dev/null +++ b/build/pandoc-defaults/common.yaml @@ -0,0 +1,13 @@ +# Pandoc --defaults shared between Manubot output formats. +from: markdown +input-file: output/manuscript.md +filters: +- pandoc-fignos +- pandoc-eqnos +- pandoc-tablenos +- pandoc-citeproc +wrap: preserve +metadata: + bibliography: output/references.json + csl: build/assets/style.csl + link-citations: true diff --git a/build/pandoc-defaults/docx.yaml b/build/pandoc-defaults/docx.yaml new file mode 100644 index 00000000..b8f2f932 --- /dev/null +++ b/build/pandoc-defaults/docx.yaml @@ -0,0 +1,8 @@ +# Pandoc --defaults for DOCX output. +# Load on top of common defaults. +to: docx +output-file: output/manuscript.docx +reference-doc: build/themes/default.docx +resource-path: + - '.' + - content diff --git a/build/pandoc-defaults/html.yaml b/build/pandoc-defaults/html.yaml new file mode 100644 index 00000000..be2a4239 --- /dev/null +++ b/build/pandoc-defaults/html.yaml @@ -0,0 +1,21 @@ +# Pandoc --defaults for HTML output. +# Load on top of common defaults. +to: html5 +output-file: output/manuscript.html +include-after-body: +- build/themes/default.html +- build/plugins/anchors.html +- build/plugins/accordion.html +- build/plugins/tooltips.html +- build/plugins/jump-to-first.html +- build/plugins/link-highlight.html +- build/plugins/table-of-contents.html +- build/plugins/lightbox.html +- build/plugins/attributes.html +- build/plugins/math.html +- build/plugins/hypothesis.html +- build/plugins/analytics.html +variables: + math: '' +html-math-method: + method: mathjax diff --git a/build/pandoc-defaults/pdf-weasyprint.yaml b/build/pandoc-defaults/pdf-weasyprint.yaml new file mode 100644 index 00000000..4f7666a8 --- /dev/null +++ b/build/pandoc-defaults/pdf-weasyprint.yaml @@ -0,0 +1,9 @@ +# Pandoc --defaults for PDF output via weasyprint. +# Load on top of HTML defaults. +output-file: output/manuscript.pdf +pdf-engine: weasyprint +pdf-engine-opts: +- '--presentational-hints' +html-math-method: + method: webtex + url: 'https://latex.codecogs.com/svg.latex?' From 6636b912c6b41593acd2041d34cd4158c1b317fb Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Tue, 14 Jan 2020 10:00:34 -0500 Subject: [PATCH 05/24] Process citations / references with pandoc-manubot-cite filter merges https://github.com/manubot/rootstock/pull/300 --- USAGE.md | 28 ++++++++++++++++++++++++++-- build/build.sh | 1 + build/environment.yml | 2 +- build/pandoc-defaults/common.yaml | 2 +- content/02.delete-me.md | 11 ++++++----- content/citation-tags.tsv | 2 -- 6 files changed, 35 insertions(+), 11 deletions(-) delete mode 100644 content/citation-tags.tsv diff --git a/USAGE.md b/USAGE.md index 2ee4969d..d93e244c 100644 --- a/USAGE.md +++ b/USAGE.md @@ -111,15 +111,39 @@ For example, the following citations all refer to the same study, but will be tr #### Citation tags -The system also supports citation tags, which are recommended for the following applications: +The system also supports citation tags, which map from one citation key (an alias) to another. +Tags are recommended for the following applications: 1. A citation's identifier contains forbidden characters, such as `;` or `=`, or ends with a non-alphanumeric character other than `/`. In these instances, you must use a tag. 2. A single reference is cited many times. Therefore, it might make sense to define a tag, so if the citation updates (e.g. a newer version becomes available), only a single change is required. -Tags should be defined in [`content/citation-tags.tsv`](content/citation-tags.tsv). +Tags can be defined using Markdown's [link reference syntax](https://spec.commonmark.org/0.29/#link-reference-definitions) as follows: + +```markdown +Citing a URL containing a `?` character [@tag:my-url]. +Citing a DOI containing parentheses [@doi:my-doi]. + +[@tag:my-url]: url:https://openreview.net/forum?id=HkwoSDPgg +[@tag:my-doi]: doi:10.1016/S0022-2836(05)80360-2 +``` + +This syntax is also used by [`pandoc-url2cite`](https://github.com/phiresky/pandoc-url2cite). +Make sure to place these link reference definitions in their own paragraphs. + +Another method for defining tags is to define `pandoc.citekey-aliases` in `metadata.yaml`: + +```yaml +pandoc: + citekey-aliases: + tag:my-url: url:https://openreview.net/forum?id=HkwoSDPgg + tag:my-doi: doi:10.1016/S0022-2836(05)80360-2 +``` + +For backwards compatability, tags can also be defined in `content/citation-tags.tsv`. If `citation-tags.tsv` defines the tag `study-x`, then this study can be cited like `@tag:study-x`. +This method is deprecated. ## Reference metadata diff --git a/build/build.sh b/build/build.sh index 7173f3e3..99bba951 100755 --- a/build/build.sh +++ b/build/build.sh @@ -17,6 +17,7 @@ manubot process \ --content-directory=content \ --output-directory=output \ --cache-directory=ci/cache \ + --skip-citations \ --log-level=INFO # Pandoc's configuration is specified via files of option defaults diff --git a/build/environment.yml b/build/environment.yml index 4d5ea063..3e18921f 100644 --- a/build/environment.yml +++ b/build/environment.yml @@ -19,7 +19,7 @@ dependencies: - watchdog=0.9.0 - pip: - errorhandler==2.0.1 - - git+https://github.com/manubot/manubot@9c58b4ea44b5080de426f1e544c6734dc22771a0 + - git+https://github.com/manubot/manubot@5ac49d740aeba413a3af94f8b5d9b78812b641f0 - jsonref==0.2 - opentimestamps-client==0.7.0 - opentimestamps==0.4.1 diff --git a/build/pandoc-defaults/common.yaml b/build/pandoc-defaults/common.yaml index 53ae895e..12c0c343 100644 --- a/build/pandoc-defaults/common.yaml +++ b/build/pandoc-defaults/common.yaml @@ -5,9 +5,9 @@ filters: - pandoc-fignos - pandoc-eqnos - pandoc-tablenos +- pandoc-manubot-cite - pandoc-citeproc wrap: preserve metadata: - bibliography: output/references.json csl: build/assets/style.csl link-citations: true diff --git a/content/02.delete-me.md b/content/02.delete-me.md index 8ed37afd..557caeb7 100644 --- a/content/02.delete-me.md +++ b/content/02.delete-me.md @@ -32,9 +32,9 @@ Combined *italics and __bold__* - List item - List item -superscript2 +subscript: H~2~O is a liquid -subscript2n+1 +superscript: 2^10^ is 1024. [unicode superscripts](https://www.google.com/search?q=superscript+generator)⁰¹²³⁴⁵⁶⁷⁸⁹ @@ -46,7 +46,6 @@ Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliqu Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. - Putting each sentence on its own line has numerous benefits with regard to [editing](https://asciidoctor.org/docs/asciidoc-recommended-practices/#one-sentence-per-line) and [version control](https://rhodesmill.org/brandon/2012/one-sentence-per-line/). Line break without starting a new paragraph by putting @@ -111,6 +110,10 @@ Citation by tag [@tag:deep-review]. Multiple citations can be put inside the same set of brackets [@doi:10.7554/eLife.32822; @tag:deep-review; @isbn:9780262517638]. Manubot plugins provide easier, more convenient visualization of and navigation between citations [@doi:10.1371/journal.pcbi.1007128; @pmid:30718888; @pmcid:PMC6103790; @tag:deep-review]. +Citation tags (i.e. aliases) can be defined in their own paragraphs using Markdown's reference link syntax: + +[@tag:deep-review]: doi:10.1098/rsif.2017.0387 + ## Referencing figures, tables, equations Figure @fig:square-image @@ -131,14 +134,12 @@ Equation @eq:long-equation > Quoted text - > Quoted block of text > > Two roads diverged in a wood, and I— > I took the one less traveled by, > And that has made all the difference. - Code `in the middle` of normal text, aka `inline code`. Code block with Python syntax highlighting: diff --git a/content/citation-tags.tsv b/content/citation-tags.tsv deleted file mode 100644 index 94fd8ee8..00000000 --- a/content/citation-tags.tsv +++ /dev/null @@ -1,2 +0,0 @@ -tag citation -deep-review doi:10.1098/rsif.2017.0387 From 52211e13d0424c0f408e447b81d2c63c4eb5fc52 Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Tue, 14 Jan 2020 17:31:56 -0500 Subject: [PATCH 06/24] Minor environment updates on 2020-01-14 merges https://github.com/manubot/rootstock/pull/301 --- build/environment.yml | 12 ++++++------ ci/install.sh | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build/environment.yml b/build/environment.yml index 3e18921f..8fab1791 100644 --- a/build/environment.yml +++ b/build/environment.yml @@ -7,19 +7,19 @@ dependencies: - cffi=1.12.3 - ghp-import=0.5.5 - jinja2=2.10.3 - - jsonschema=3.1.1 - - pandas=0.25.2 + - jsonschema=3.2.0 + - pandas=0.25.3 - pandoc=2.9 - pango=1.40.14 - pip=19.3 - - psutil=5.6.3 - - python=3.7.3 - - pyyaml=5.1 + - psutil=5.6.7 + - python=3.7.6 + - pyyaml=5.3 - requests=2.22.0 - watchdog=0.9.0 - pip: - errorhandler==2.0.1 - - git+https://github.com/manubot/manubot@5ac49d740aeba413a3af94f8b5d9b78812b641f0 + - git+https://github.com/manubot/manubot@6a35918777228197b96e57e195320e42d6039fe1 - jsonref==0.2 - opentimestamps-client==0.7.0 - opentimestamps==0.4.1 diff --git a/ci/install.sh b/ci/install.sh index 72833087..5b64145f 100755 --- a/ci/install.sh +++ b/ci/install.sh @@ -6,7 +6,7 @@ set -o errexit \ -o pipefail -wget https://repo.continuum.io/miniconda/Miniconda3-4.7.10-Linux-x86_64.sh \ +wget https://repo.continuum.io/miniconda/Miniconda3-4.7.12.1-Linux-x86_64.sh \ --output-document miniconda.sh bash miniconda.sh -b -p $HOME/miniconda source $HOME/miniconda/etc/profile.d/conda.sh From f072e933887225ba131caeac3aa96a5902b1a90e Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Fri, 17 Jan 2020 15:35:17 -0500 Subject: [PATCH 07/24] GitHub Actions workflow for building and deployment merges https://github.com/manubot/rootstock/pull/297 --- .github/workflows/manubot.yaml | 40 ++++++++++++ README.md | 15 +++-- SETUP.md | 108 ++++++++++++++++++++++++--------- build/README.md | 5 +- ci/README.md | 2 +- ci/deploy.sh | 27 ++++++--- output/README.md | 2 +- webpage/README.md | 11 ++-- 8 files changed, 152 insertions(+), 58 deletions(-) create mode 100644 .github/workflows/manubot.yaml diff --git a/.github/workflows/manubot.yaml b/.github/workflows/manubot.yaml new file mode 100644 index 00000000..355c20f4 --- /dev/null +++ b/.github/workflows/manubot.yaml @@ -0,0 +1,40 @@ +name: Manubot +on: + push: + branches: + - master + pull_request: + branches: + - master +jobs: + manubot: + name: Manubot + runs-on: ubuntu-latest + steps: + - name: Checkout Repository + uses: actions/checkout@v2 + - name: Install Environment + uses: goanpeca/setup-miniconda@v1 + with: + activate-environment: manubot + environment-file: build/environment.yml + auto-activate-base: false + miniconda-version: 'latest' + - name: Build Manuscript + env: + GITHUB_PULL_REQUEST_SHA: ${{ github.event.pull_request.head.sha }} + shell: bash --login {0} + run: bash build/build.sh + - name: Upload Artifacts + uses: actions/upload-artifact@v1 + with: + name: output + path: output + - name: Deploy Manuscript + if: github.ref == 'refs/heads/master' && github.event_name == 'push' + env: + MANUBOT_SSH_PRIVATE_KEY: ${{ secrets.MANUBOT_SSH_PRIVATE_KEY }} + BUILD_WEB_URL: https://github.com/${{ github.repository }}/commit/${{ github.sha }}/checks + COMMIT_MESSAGE: ${{ github.event.head_commit.message }} + shell: bash --login {0} + run: bash ci/deploy.sh diff --git a/README.md b/README.md index 4c076c75..fd26266f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,9 @@ [![HTML Manuscript](https://img.shields.io/badge/manuscript-HTML-blue.svg)](https://manubot.github.io/rootstock/) [![PDF Manuscript](https://img.shields.io/badge/manuscript-PDF-blue.svg)](https://manubot.github.io/rootstock/manuscript.pdf) -[![Build Status](https://travis-ci.com/manubot/rootstock.svg?branch=master)](https://travis-ci.com/manubot/rootstock) +[![GitHub Actions Status](https://github.com/manubot/rootstock/workflows/manubot/badge.svg)](https://github.com/manubot/rootstock/actions) +[![Travis Build Status](https://travis-ci.com/manubot/rootstock.svg?branch=master)](https://travis-ci.com/manubot/rootstock) + ## Manuscript description @@ -36,7 +38,6 @@ The directories are as follows: + [`webpage`](webpage) is a directory meant to be rendered as a static webpage for viewing the HTML manuscript. + [`build`](build) contains commands and tools for building the manuscript. + [`ci`](ci) contains files necessary for deployment via continuous integration. - For the CI configuration, see [`.travis.yml`](.travis.yml). ### Local execution @@ -74,19 +75,17 @@ bash build/autobuild.sh ### Continuous Integration -[![Build Status](https://travis-ci.com/manubot/rootstock.svg?branch=master)](https://travis-ci.com/manubot/rootstock) - -Whenever a pull request is opened, Travis CI will test whether the changes break the build process to generate a formatted manuscript. +Whenever a pull request is opened, CI (continuous integration) will test whether the changes break the build process to generate a formatted manuscript. The build process aims to detect common errors, such as invalid citations. -If your pull request build fails, see the Travis CI logs for the cause of failure and revise your pull request accordingly. +If your pull request build fails, see the CI logs for the cause of failure and revise your pull request accordingly. -When a commit to the `master` branch occurs (for example, when a pull request is merged), Travis CI builds the manuscript and writes the results to the [`gh-pages`](https://github.com/manubot/rootstock/tree/gh-pages) and [`output`](https://github.com/manubot/rootstock/tree/output) branches. +When a commit to the `master` branch occurs (for example, when a pull request is merged), CI builds the manuscript and writes the results to the [`gh-pages`](https://github.com/manubot/rootstock/tree/gh-pages) and [`output`](https://github.com/manubot/rootstock/tree/output) branches. The `gh-pages` branch uses [GitHub Pages](https://pages.github.com/) to host the following URLs: + **HTML manuscript** at https://manubot.github.io/rootstock/ + **PDF manuscript** at https://manubot.github.io/rootstock/manuscript.pdf -For continuous integration configuration details, see [`.travis.yml`](.travis.yml). +For continuous integration configuration details, see [`.github/workflows/manubot.yaml`](.github/workflows/manubot.yaml) if using GitHub Actions or [`.travis.yml`](.travis.yml) if using Travis CI. ## License diff --git a/SETUP.md b/SETUP.md index bc7f520f..0af07ca0 100644 --- a/SETUP.md +++ b/SETUP.md @@ -62,28 +62,36 @@ git push --set-upstream origin output ## Continuous integration -Now you must manually enable Travis CI for the new repository at . -Click the `+` sign to "Add New Repository". -If you don't see your repository listed, push the "Sync account" button. -Finally, flick the repository's switch to enable CI. +Manubot integrates with cloud services to perform continuous integration (CI). +For Manubot that means automatically building and deploying your manuscript. +Manubot supports the following services: + +- [GitHub Actions](https://github.com/features/actions). + Configured at [`.github/workflows/manubot.yaml`](.github/workflows/manubot.yaml) +- [Travis CI](https://travis-ci.com). + Configured at [`.travis.yml`](.travis.yml). +- [AppVeyor](https://www.appveyor.com/). + Configured at [`.appveyor.yml`](.appveyor.yml). + +GitHub Actions is the default service for new manucripts since it's easiest to setup. +We recommend using either GitHub Actions or Travis CI, but not both to avoid deploying manuscripts multiple times. +AppVeyor can be used in addition to GitHub Actions or Travis CI to comment on pull request with download links to rendered PDFs. +GitHub Actions do upload rendered manuscripts as artifacts, but do not leave pull request comments. ### Deploy key -Generate a deploy key so Travis CI can write to the repository. +Generate a deploy key so CI can write to the repository. ```sh -# IMPORTANT: change working directory to ci -cd ci - # Generate deploy.key.pub (public) and deploy.key (private) ssh-keygen \ -t rsa -b 4096 -N "" \ - -C "deploy@travis-ci.com" \ - -f deploy.key + -C "deploy@manubot.org" \ + -f ci/deploy.key # Encode deploy.key to remove newlines, writing encoded text to deploy.key.txt. # This is required for entry into the Travis settings. -openssl base64 -A -in deploy.key > deploy.key.txt +openssl base64 -A -in ci/deploy.key > ci/deploy.key.txt ``` #### Add the public key to GitHub @@ -93,23 +101,61 @@ openssl base64 -A -in deploy.key > deploy.key.txt echo "https://github.com/$OWNER/$REPO/settings/keys/new" # Print the public key for copy-pasting to GitHub -cat deploy.key.pub +cat ci/deploy.key.pub ``` Go to the GitHub settings URL echoed above in a browser, and click "Add deploy key". For "Title", add a description like "Manubot Travis Deploy Key". -Copy-paste the contents of the `deploy.key.pub` text file (printed above by `cat`) into the "Key" text box. +Copy-paste the contents of the `ci/deploy.key.pub` text file (printed above by `cat`) into the "Key" text box. Check the "Allow write access" box below. Finally, click "Add key". -#### Add the private key to Travis CI +#### Add the private key to GitHub + +```sh +# Print the URL for adding the private key to GitHub +echo "https://github.com/$OWNER/$REPO/settings/secrets" + +# Print the encoded private key for copy-pasting to GitHub +cat ci/deploy.key.txt && echo +``` + +Next, go to the GitHub repository settings page (URL echoed above). +Click "Add a new secret". +For "Name", enter `MANUBOT_SSH_PRIVATE_KEY`. +Next, copy-paste the content of `deploy.key.txt` into "Value" +(printed above by `cat`, including any trailing `=` characters if present). + +### GitHub Actions + +If you plan on only using GitHub actions, you can remove configuration files for other CI services: + +```shell +# remove Travis CI config +git rm .travis.yml +# remove AppVeyor config +git rm .appveyor.yml +# remove ci/install.sh if not using neither Travis CI nor AppVeyor +git rm ci/install.sh +``` + +
+Expand for Travis CI setup + +### Travis CI + +Travis CI is another option for continuous integration. +Now you must manually enable Travis CI for the new repository at . +Click the `+` sign to "Add New Repository". +If you don't see your repository listed, push the "Sync account" button. +Finally, flick the repository's switch to enable CI. ```sh # Print the URL for adding the private key to Travis CI echo "https://travis-ci.com/$OWNER/$REPO/settings" # Print the encoded private key for copy-pasting to Travis CI -cat deploy.key.txt && echo +cat ci/deploy.key.txt && echo ``` Next, go to the Travis CI repository settings page (URL echoed above). @@ -121,6 +167,22 @@ Make sure "Display value in build logs" remains toggled off (the default). While in the Travis CI settings, activate the [limit concurrent jobs](https://blog.travis-ci.com/2014-07-18-per-repository-concurrency-setting/) toggle and enter `1` in the value field. This ensures previous Manubot builds deploy before subsequent ones begin. +
+ +
+Expand for AppVeyor setup + +### Previewing pull request builds with AppVeyor + +You can optionally enable AppVeyor continuous integration to view pull request builds. +Unlike Travis CI, AppVeyor supports storing manuscripts generated during pull request builds as artifacts. +These can be previewed to facilitate pull request review and ensure formatting and reference changes render as expected. +When a pull request build runs successfully, **@AppVeyorBot** will comment on the pull request with a download link to the manuscript PDF. + +To enable AppVeyor, follow steps 1 and 2 of the [AppVeyor welcome](https://www.appveyor.com/docs/) to sign in to AppVeyor and add your manuscript repository as an AppVeyor project. +The repository already contains an `.appveyor.yml` build configuration file, so no other setup is required. +AppVeyor only runs when it detects changes that are likely to affect the manuscript. +
### CI clean up @@ -129,10 +191,7 @@ Clean up: ```sh # Optionally remove untracked files -rm deploy.key* - -# IMPORTANT: return to the repository's root directory -cd .. +rm ci/deploy.key* ``` ## README updates @@ -208,14 +267,3 @@ To update your local conda `manubot` environment with new changes, run: # update a local conda environment conda env update --file build/environment.yml ``` - -# Previewing pull request builds with AppVeyor - -You can optionally enable AppVeyor continuous integration to view pull request builds. -Unlike Travis CI, AppVeyor supports storing manuscripts generated during pull request builds as artifacts. -These can be previewed to facilitate pull request review and ensure formatting and reference changes render as expected. -When a pull request build runs successfully, **@AppVeyorBot** will comment on the pull request with a download link to the manuscript PDF. - -To enable AppVeyor, follow steps 1 and 2 of the [AppVeyor welcome](https://www.appveyor.com/docs/) to sign in to AppVeyor and add your manuscript repository as an AppVeyor project. -The repository already contains an `.appveyor.yml` build configuration file, so no other setup is required. -AppVeyor only runs when it detects changes that are likely to affect the manuscript. diff --git a/build/README.md b/build/README.md index c61b8fa7..9516922e 100644 --- a/build/README.md +++ b/build/README.md @@ -8,7 +8,7 @@ For example, run local builds using the command `BUILD_PDF=false bash build/buil To build a DOCX file of the manuscript, set the `BUILD_DOCX` environment variable to `true`. For example, use the command `BUILD_DOCX=true bash build/build.sh`. -To export DOCX for all Travis builds, set a [Travis environment variable](https://docs.travis-ci.com/user/environment-variables/#Defining-Variables-in-Repository-Settings). +To export DOCX for all CI builds, set an environment variable (see docs for [GitHub Actions](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/using-environment-variables) or [Travis CI](https://docs.travis-ci.com/user/environment-variables/#Defining-Variables-in-Repository-Settings)). Currently, equation numbers via `pandoc-eqnos` are not supported for DOCX output. Format conversion is done using [Pandoc](https://pandoc.org/MANUAL.html). @@ -52,7 +52,8 @@ If Docker is available, `build.sh` uses the [Athena](https://www.athenapdf.com/) Otherwise, `build.sh` uses [WeasyPrint](https://weasyprint.org/) to build the PDF. It is common for WeasyPrint to generate many warnings and errors that can be safely ignored. Examples are shown below: -``` + +```text WARNING: Ignored `pointer-events: none` at 3:16, unknown property. WARNING: Ignored `font-display:auto` at 1:53114, descriptor not supported. ERROR: Failed to load font at "https://use.fontawesome.com/releases/v5.7.2/webfonts/fa-brands-400.eot#iefix" diff --git a/ci/README.md b/ci/README.md index 4622c9f9..db6ccca3 100644 --- a/ci/README.md +++ b/ci/README.md @@ -5,4 +5,4 @@ Specifically, [`deploy.sh`](deploy.sh) runs on successful `master` branch builds The contents of `../webpage` are committed to the `gh-pages` branch. The contents of `../output` are committed to the `output` branch. -For more information on the CI implementation, see the [Travis CI configuration](../.travis.yml) and the CI setup documentation in `SETUP.md`. +For more information on the CI implementation, see the CI setup documentation in `SETUP.md`. diff --git a/ci/deploy.sh b/ci/deploy.sh index 041458d5..5ef1ed60 100755 --- a/ci/deploy.sh +++ b/ci/deploy.sh @@ -7,9 +7,16 @@ set -o errexit \ -o nounset \ -o pipefail +# set environment variables for either Travis or GitHub Actions +REPO_SLUG=${TRAVIS_REPO_SLUG:-$GITHUB_REPOSITORY} +COMMIT=${TRAVIS_COMMIT:-$GITHUB_SHA} +BUILD_WEB_URL=${TRAVIS_BUILD_WEB_URL:-$BUILD_WEB_URL} +JOB_WEB_URL=${TRAVIS_JOB_WEB_URL:-"https://github.com/$GITHUB_REPOSITORY/runs/$GITHUB_ACTION"} +BRANCH=${TRAVIS_BRANCH:-master} + # Add commit hash to the README -OWNER_NAME="$(dirname "$TRAVIS_REPO_SLUG")" -REPO_NAME="$(basename "$TRAVIS_REPO_SLUG")" +OWNER_NAME="$(dirname "$REPO_SLUG")" +REPO_NAME="$(basename "$REPO_SLUG")" export OWNER_NAME REPO_NAME envsubst < webpage/README.md > webpage/README-complete.md mv webpage/README-complete.md webpage/README.md @@ -18,8 +25,8 @@ mv webpage/README-complete.md webpage/README.md git config --global push.default simple git config --global user.email "$(git log --max-count=1 --format='%ae')" git config --global user.name "$(git log --max-count=1 --format='%an')" -git checkout "$TRAVIS_BRANCH" -git remote set-url origin "git@github.com:$TRAVIS_REPO_SLUG.git" +git checkout "$BRANCH" +git remote set-url origin "git@github.com:$REPO_SLUG.git" # Decrypt and add SSH key eval "$(ssh-agent -s)" @@ -50,22 +57,22 @@ manubot webpage \ --timestamp \ --no-ots-cache \ --checkout=gh-pages \ - --version="$TRAVIS_COMMIT" + --version="$COMMIT" # Commit message MESSAGE="\ $(git log --max-count=1 --format='%s') [ci skip] This build is based on -https://github.com/$TRAVIS_REPO_SLUG/commit/$TRAVIS_COMMIT. +https://github.com/$REPO_SLUG/commit/$COMMIT. -This commit was created by the following Travis CI build and job: -$TRAVIS_BUILD_WEB_URL -$TRAVIS_JOB_WEB_URL +This commit was created by the following CI build and job: +$BUILD_WEB_URL +$JOB_WEB_URL The full commit message that triggered this build is copied below: -$TRAVIS_COMMIT_MESSAGE +$COMMIT_MESSAGE " # Deploy the manubot outputs to output diff --git a/output/README.md b/output/README.md index 8c0fd1c6..fbdc3a6d 100644 --- a/output/README.md +++ b/output/README.md @@ -2,7 +2,7 @@ The `output` branch contains files automatically generated by the manuscript build process. It consists of the contents of the `output` directory of the `master` branch. -These files are not tracked in `master`, but instead written to the `output` branch by continuous Travis CI builds. +These files are not tracked in `master`, but instead written to the `output` branch by continuous integration builds. ## Files diff --git a/webpage/README.md b/webpage/README.md index fbbe25ad..9e22c56d 100644 --- a/webpage/README.md +++ b/webpage/README.md @@ -1,15 +1,14 @@ # Output directory containing the formatted manuscript -The [`gh-pages`](https://github.com/$TRAVIS_REPO_SLUG/tree/gh-pages) branch hosts the contents of this directory at https://$OWNER_NAME.github.io/$REPO_NAME/. -The permalink for this webpage version is https://$OWNER_NAME.github.io/$REPO_NAME/v/$TRAVIS_COMMIT/. -To redirect to the permalink for the latest manuscript version at anytime, use the link https://$OWNER_NAME.github.io/$REPO_NAME/v/freeze/. +The [`gh-pages`](https://github.com/$REPO_SLUG/tree/gh-pages) branch hosts the contents of this directory at . +The permalink for this webpage version is . +To redirect to the permalink for the latest manuscript version at anytime, use the link . ## Files This directory contains the following files, which are mostly ignored on the `master` branch: + [`index.html`](index.html) is an HTML manuscript. -+ [`github-pandoc.css`](github-pandoc.css) sets the display style for `index.html`. + [`manuscript.pdf`](manuscript.pdf) is a PDF manuscript. The `v` directory contains directories for each manuscript version. @@ -25,7 +24,7 @@ Therefore, `.ots` files are initially incomplete and should be upgraded at a lat The `manubot webpage` call during continuous deployment identifies files matched by `webpage/v/**/*.ots` and attempts to upgrade them. You can also manually upgrade timestamps, by running the following in the `gh-pages` branch: -```sh +```shell ots upgrade v/*/*.ots rm v/*/*.ots.bak git add v/*/*.ots @@ -36,4 +35,4 @@ Verifying timestamps with the `ots verify` command requires running a local bitc ## Source The manuscripts in this directory were built from -[`$TRAVIS_COMMIT`](https://github.com/$TRAVIS_REPO_SLUG/commit/$TRAVIS_COMMIT). +[`$COMMIT`](https://github.com/$REPO_SLUG/commit/$COMMIT). From af52dea6154ea825bc6c75b4779bcbd82e3c52ca Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Fri, 17 Jan 2020 15:57:48 -0500 Subject: [PATCH 08/24] Tweaks following up GitHub Actions --- .github/workflows/manubot.yaml | 1 - README.md | 2 +- SETUP.md | 2 +- USAGE.md | 3 ++- ci/deploy.sh | 7 ++----- 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/workflows/manubot.yaml b/.github/workflows/manubot.yaml index 355c20f4..b56123ac 100644 --- a/.github/workflows/manubot.yaml +++ b/.github/workflows/manubot.yaml @@ -35,6 +35,5 @@ jobs: env: MANUBOT_SSH_PRIVATE_KEY: ${{ secrets.MANUBOT_SSH_PRIVATE_KEY }} BUILD_WEB_URL: https://github.com/${{ github.repository }}/commit/${{ github.sha }}/checks - COMMIT_MESSAGE: ${{ github.event.head_commit.message }} shell: bash --login {0} run: bash ci/deploy.sh diff --git a/README.md b/README.md index fd26266f..d806e795 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![HTML Manuscript](https://img.shields.io/badge/manuscript-HTML-blue.svg)](https://manubot.github.io/rootstock/) [![PDF Manuscript](https://img.shields.io/badge/manuscript-PDF-blue.svg)](https://manubot.github.io/rootstock/manuscript.pdf) -[![GitHub Actions Status](https://github.com/manubot/rootstock/workflows/manubot/badge.svg)](https://github.com/manubot/rootstock/actions) +[![GitHub Actions Status](https://github.com/manubot/rootstock/workflows/Manubot/badge.svg)](https://github.com/manubot/rootstock/actions) [![Travis Build Status](https://travis-ci.com/manubot/rootstock.svg?branch=master)](https://travis-ci.com/manubot/rootstock) diff --git a/SETUP.md b/SETUP.md index 0af07ca0..3035f61f 100644 --- a/SETUP.md +++ b/SETUP.md @@ -123,7 +123,7 @@ cat ci/deploy.key.txt && echo Next, go to the GitHub repository settings page (URL echoed above). Click "Add a new secret". For "Name", enter `MANUBOT_SSH_PRIVATE_KEY`. -Next, copy-paste the content of `deploy.key.txt` into "Value" +Next, copy-paste the content of `ci/deploy.key.txt` into "Value" (printed above by `cat`, including any trailing `=` characters if present). ### GitHub Actions diff --git a/USAGE.md b/USAGE.md index d93e244c..7cae369b 100644 --- a/USAGE.md +++ b/USAGE.md @@ -131,6 +131,7 @@ Citing a DOI containing parentheses [@doi:my-doi]. This syntax is also used by [`pandoc-url2cite`](https://github.com/phiresky/pandoc-url2cite). Make sure to place these link reference definitions in their own paragraphs. +These paragraphs can be in any of the content Markdown files. Another method for defining tags is to define `pandoc.citekey-aliases` in `metadata.yaml`: @@ -141,7 +142,7 @@ pandoc: tag:my-doi: doi:10.1016/S0022-2836(05)80360-2 ``` -For backwards compatability, tags can also be defined in `content/citation-tags.tsv`. +For backwards compatibility, tags can also be defined in `content/citation-tags.tsv`. If `citation-tags.tsv` defines the tag `study-x`, then this study can be cited like `@tag:study-x`. This method is deprecated. diff --git a/ci/deploy.sh b/ci/deploy.sh index 5ef1ed60..e3c103aa 100755 --- a/ci/deploy.sh +++ b/ci/deploy.sh @@ -61,7 +61,8 @@ manubot webpage \ # Commit message MESSAGE="\ -$(git log --max-count=1 --format='%s') [ci skip] +$(git log --max-count=1 --format='%s') +[ci skip] This build is based on https://github.com/$REPO_SLUG/commit/$COMMIT. @@ -69,10 +70,6 @@ https://github.com/$REPO_SLUG/commit/$COMMIT. This commit was created by the following CI build and job: $BUILD_WEB_URL $JOB_WEB_URL - -The full commit message that triggered this build is copied below: - -$COMMIT_MESSAGE " # Deploy the manubot outputs to output From eab9b2ae8c62121bee0967de7f81b2456c99604c Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Sat, 18 Jan 2020 19:26:15 -0500 Subject: [PATCH 09/24] CI: do not run deploy.sh if secrets are unset merges https://github.com/manubot/rootstock/pull/302 GitHub Actions: do not run deploy.sh if secrets.MANUBOT_SSH_PRIVATE_KEY is not set resulting in `env: MANUBOT_SSH_PRIVATE_KEY: ""` https://github.community/t5/GitHub-Actions/If-expression-with-context-variable/m-p/34560/highlight/true#M1959 Travis CI: condition deploy on MANUBOT_SSH_PRIVATE_KEY being set or variable name expansion for encrypted_*. https://unix.stackexchange.com/a/290296/294987 https://wiki.bash-hackers.org/syntax/pe#variable_name_expansion --- .github/workflows/manubot.yaml | 8 +++++++- .travis.yml | 4 ++-- SETUP.md | 2 +- ci/deploy.sh | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/manubot.yaml b/.github/workflows/manubot.yaml index b56123ac..de6f3559 100644 --- a/.github/workflows/manubot.yaml +++ b/.github/workflows/manubot.yaml @@ -36,4 +36,10 @@ jobs: MANUBOT_SSH_PRIVATE_KEY: ${{ secrets.MANUBOT_SSH_PRIVATE_KEY }} BUILD_WEB_URL: https://github.com/${{ github.repository }}/commit/${{ github.sha }}/checks shell: bash --login {0} - run: bash ci/deploy.sh + run: | + if [ "$MANUBOT_SSH_PRIVATE_KEY" != "" ]; then + bash ci/deploy.sh + else + echo >&2 "Skipping deployment because the MANUBOT_SSH_PRIVATE_KEY secret is not set. + Instructions at https://github.com/manubot/rootstock/blob/master/SETUP.md#deploy-key" + fi diff --git a/.travis.yml b/.travis.yml index 8edfab99..c836c6ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,8 +15,8 @@ cache: - ci/cache deploy: provider: script - script: bash -o xtrace ci/deploy.sh + script: bash ci/deploy.sh skip_cleanup: true on: branch: master - condition: $TRAVIS_EVENT_TYPE = "push" + condition: '[[ $TRAVIS_EVENT_TYPE = "push" && (-v MANUBOT_SSH_PRIVATE_KEY || "${!encrypted_*}" != "") ]]' diff --git a/SETUP.md b/SETUP.md index 3035f61f..54da435c 100644 --- a/SETUP.md +++ b/SETUP.md @@ -105,7 +105,7 @@ cat ci/deploy.key.pub ``` Go to the GitHub settings URL echoed above in a browser, and click "Add deploy key". -For "Title", add a description like "Manubot Travis Deploy Key". +For "Title", add a description like "Manubot Deploy Key". Copy-paste the contents of the `ci/deploy.key.pub` text file (printed above by `cat`) into the "Key" text box. Check the "Allow write access" box below. Finally, click "Add key". diff --git a/ci/deploy.sh b/ci/deploy.sh index e3c103aa..7e2a1aea 100755 --- a/ci/deploy.sh +++ b/ci/deploy.sh @@ -35,7 +35,7 @@ set +o xtrace # disable xtrace in subshell for private key operations if [ -v MANUBOT_SSH_PRIVATE_KEY ]; then base64 --decode <<< "$MANUBOT_SSH_PRIVATE_KEY" | ssh-add - else -echo "DeprecationWarning: Loading deploy.key from an encrypted file. +echo >&2 "DeprecationWarning: Loading deploy.key from an encrypted file. In the future, using the MANUBOT_SSH_PRIVATE_KEY environment variable may be required." openssl aes-256-cbc \ -K $encrypted_9befd6eddffe_key \ From f6b623157304c46f5f77578a15d1f353674e814e Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Sat, 18 Jan 2020 19:33:09 -0500 Subject: [PATCH 10/24] Attempt to fix .travis.yml syntax error https://travis-ci.com/manubot/rootstock/builds/145087566#L2163 travis_run_after_success: command not found --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c836c6ee..8bdbe0a4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,4 +19,4 @@ deploy: skip_cleanup: true on: branch: master - condition: '[[ $TRAVIS_EVENT_TYPE = "push" && (-v MANUBOT_SSH_PRIVATE_KEY || "${!encrypted_*}" != "") ]]' + condition: $TRAVIS_EVENT_TYPE = "push" && (-v MANUBOT_SSH_PRIVATE_KEY || "${!encrypted_*}" != "") From 42669ced1c37168c867dc50fecaeff3f566d6a57 Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Tue, 28 Jan 2020 14:08:25 -0500 Subject: [PATCH 11/24] Fix get_rootstock_commit on CI merges https://github.com/manubot/rootstock/pull/303 SETUP manubot upgrade instructions. add --no-rebase to git pull Upgrade Manubot to fix get_rootstock_commit GitHub Actions: fetch entire commit history to support get_rootstock_commit --- .github/workflows/manubot.yaml | 3 +++ SETUP.md | 2 +- build/environment.yml | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/manubot.yaml b/.github/workflows/manubot.yaml index de6f3559..cdf3d604 100644 --- a/.github/workflows/manubot.yaml +++ b/.github/workflows/manubot.yaml @@ -13,6 +13,9 @@ jobs: steps: - name: Checkout Repository uses: actions/checkout@v2 + with: + # fetch entire commit history to support get_rootstock_commit + fetch-depth: 0 - name: Install Environment uses: goanpeca/setup-miniconda@v1 with: diff --git a/SETUP.md b/SETUP.md index 54da435c..e06b5984 100644 --- a/SETUP.md +++ b/SETUP.md @@ -245,7 +245,7 @@ Second, pull the new commits from rootstock, but do not automerge: git config remote.rootstock.url || git remote add rootstock https://github.com/manubot/rootstock.git # pull the new commits from rootstock -git pull --no-ff --no-commit rootstock master +git pull --no-ff --no-rebase --no-commit rootstock master ``` If all goes well, there won't be any conflicts. diff --git a/build/environment.yml b/build/environment.yml index 8fab1791..c6fa7512 100644 --- a/build/environment.yml +++ b/build/environment.yml @@ -19,7 +19,7 @@ dependencies: - watchdog=0.9.0 - pip: - errorhandler==2.0.1 - - git+https://github.com/manubot/manubot@6a35918777228197b96e57e195320e42d6039fe1 + - git+https://github.com/manubot/manubot@e18fed8cfb4c7fb9b5b39aa45bbba4aeadff6c9a - jsonref==0.2 - opentimestamps-client==0.7.0 - opentimestamps==0.4.1 From 713000d09150f49e966efbe98fac5ff5f6397d67 Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Wed, 29 Jan 2020 10:45:25 -0500 Subject: [PATCH 12/24] GitHub Actions: version artifact name merges https://github.com/manubot/rootstock/pull/305 Create artifacts that are named like manuscript-32632624-d1c4caf and contain the GitHub Actions run-id as well as the head of the triggering commit hash. Note that on a pull request, this is the commit that was added to the PR and not the auto-generated merge commit that the action is actually evaluating. --- .github/workflows/manubot.yaml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/manubot.yaml b/.github/workflows/manubot.yaml index cdf3d604..a14b5836 100644 --- a/.github/workflows/manubot.yaml +++ b/.github/workflows/manubot.yaml @@ -10,7 +10,15 @@ jobs: manubot: name: Manubot runs-on: ubuntu-latest + env: + GITHUB_PULL_REQUEST_SHA: ${{ github.event.pull_request.head.sha }} steps: + - name: Set Environment Variables + run: | + TRIGGERING_SHA=${GITHUB_PULL_REQUEST_SHA:-$GITHUB_SHA} + TRIGGERING_SHA_7=${TRIGGERING_SHA::7} + echo "::set-env name=TRIGGERING_SHA_7::$TRIGGERING_SHA_7" + echo "TRIGGERING_SHA: $TRIGGERING_SHA" - name: Checkout Repository uses: actions/checkout@v2 with: @@ -24,14 +32,12 @@ jobs: auto-activate-base: false miniconda-version: 'latest' - name: Build Manuscript - env: - GITHUB_PULL_REQUEST_SHA: ${{ github.event.pull_request.head.sha }} shell: bash --login {0} run: bash build/build.sh - name: Upload Artifacts uses: actions/upload-artifact@v1 with: - name: output + name: manuscript-${{ github.run_id }}-${{ env.TRIGGERING_SHA_7 }} path: output - name: Deploy Manuscript if: github.ref == 'refs/heads/master' && github.event_name == 'push' From 8924d7d7cca38c1d07e2922f417569663eb8ab74 Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Thu, 30 Jan 2020 14:10:22 -0500 Subject: [PATCH 13/24] CI deployment: update env vars Rename environment variables for deployment to: $CI_BUILD_WEB_URL $CI_JOB_WEB_URL Fix bug with $CI_JOB_WEB_URL on GitHub Actions --- .github/workflows/manubot.yaml | 3 ++- ci/deploy.sh | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/manubot.yaml b/.github/workflows/manubot.yaml index a14b5836..ba461d52 100644 --- a/.github/workflows/manubot.yaml +++ b/.github/workflows/manubot.yaml @@ -43,7 +43,8 @@ jobs: if: github.ref == 'refs/heads/master' && github.event_name == 'push' env: MANUBOT_SSH_PRIVATE_KEY: ${{ secrets.MANUBOT_SSH_PRIVATE_KEY }} - BUILD_WEB_URL: https://github.com/${{ github.repository }}/commit/${{ github.sha }}/checks + CI_BUILD_WEB_URL: https://github.com/${{ github.repository }}/commit/${{ github.sha }}/checks + CI_JOB_WEB_URL: https://github.com/${{ github.repository }}/runs/${{ github.run_id }} shell: bash --login {0} run: | if [ "$MANUBOT_SSH_PRIVATE_KEY" != "" ]; then diff --git a/ci/deploy.sh b/ci/deploy.sh index 7e2a1aea..ac2aea63 100755 --- a/ci/deploy.sh +++ b/ci/deploy.sh @@ -10,8 +10,8 @@ set -o errexit \ # set environment variables for either Travis or GitHub Actions REPO_SLUG=${TRAVIS_REPO_SLUG:-$GITHUB_REPOSITORY} COMMIT=${TRAVIS_COMMIT:-$GITHUB_SHA} -BUILD_WEB_URL=${TRAVIS_BUILD_WEB_URL:-$BUILD_WEB_URL} -JOB_WEB_URL=${TRAVIS_JOB_WEB_URL:-"https://github.com/$GITHUB_REPOSITORY/runs/$GITHUB_ACTION"} +CI_BUILD_WEB_URL=${CI_BUILD_WEB_URL:-$TRAVIS_BUILD_WEB_URL} +CI_JOB_WEB_URL=${CI_JOB_WEB_URL:-$TRAVIS_JOB_WEB_URL} BRANCH=${TRAVIS_BRANCH:-master} # Add commit hash to the README @@ -68,8 +68,8 @@ This build is based on https://github.com/$REPO_SLUG/commit/$COMMIT. This commit was created by the following CI build and job: -$BUILD_WEB_URL -$JOB_WEB_URL +$CI_BUILD_WEB_URL +$CI_JOB_WEB_URL " # Deploy the manubot outputs to output From 40b0e5bf228e95a75c23252593d5ab4802bf89ac Mon Sep 17 00:00:00 2001 From: Olga Botvinnik Date: Thu, 30 Jan 2020 13:44:14 -0800 Subject: [PATCH 14/24] SETUP.md: add table of contents merges https://github.com/manubot/rootstock/pull/304 autogenerated by https://ecotrust-canada.github.io/markdown-toc/ --- SETUP.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/SETUP.md b/SETUP.md index e06b5984..dce3e111 100644 --- a/SETUP.md +++ b/SETUP.md @@ -1,3 +1,20 @@ +- [Cloning the manubot/rootstock repository to create a new manuscript](#cloning-the-manubot-rootstock-repository-to-create-a-new-manuscript) + * [Configuration](#configuration) + * [Create repository](#create-repository) + * [Continuous integration](#continuous-integration) + + [Deploy key](#deploy-key) + - [Add the public key to GitHub](#add-the-public-key-to-github) + - [Add the private key to GitHub](#add-the-private-key-to-github) + + [GitHub Actions](#github-actions) + + [Travis CI](#travis-ci) + + [Previewing pull request builds with AppVeyor](#previewing-pull-request-builds-with-appveyor) + + [CI clean up](#ci-clean-up) + * [README updates](#readme-updates) + * [Finalize](#finalize) +- [Merging upstream rootstock changes](#merging-upstream-rootstock-changes) + +_Table of contents generated with [markdown-toc](https://ecotrust-canada.github.io/markdown-toc/)_ + # Cloning the manubot/rootstock repository to create a new manuscript The process to create a new Manubot manuscript is a bit challenging, because it requires a few steps that are difficult to automate. From 7412f766dcc9cf134cc59415e86845e6350820fe Mon Sep 17 00:00:00 2001 From: Olga Botvinnik Date: Fri, 14 Feb 2020 14:55:51 -0800 Subject: [PATCH 15/24] .appveyor.yml: note about skipping branches with PR merges https://github.com/manubot/rootstock/pull/309 closes https://github.com/manubot/rootstock/issues/308 --- .appveyor.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.appveyor.yml b/.appveyor.yml index c4d16387..7b4aeb31 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,4 +1,7 @@ # See https://www.appveyor.com/docs/getting-started-with-appveyor-for-linux/ +# Don't build branches with a PR, since their build will be created with the PR itself. +# Otherwise there would be two builds -- one for the PR and one for the branch. +# If you're having issues with getting your PR to build, make sure there are no merge conflicts. skip_branch_with_pr: true # Enable 'Do not build on "Push" events' in the AppVeyor project settings From 7545592976f32df84951642045d022cda4f261ad Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Mon, 17 Feb 2020 17:25:12 -0500 Subject: [PATCH 16/24] Update environment on 2020-02-17 merges https://github.com/manubot/rootstock/pull/311 Includes manubot update with yamllint output for invalid metadata.yaml files. --- build/environment.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/build/environment.yml b/build/environment.yml index c6fa7512..f0d0d35a 100644 --- a/build/environment.yml +++ b/build/environment.yml @@ -8,18 +8,19 @@ dependencies: - ghp-import=0.5.5 - jinja2=2.10.3 - jsonschema=3.2.0 - - pandas=0.25.3 + - pandas=1.0.1 - pandoc=2.9 - pango=1.40.14 - - pip=19.3 + - pip=20.0 - psutil=5.6.7 - python=3.7.6 - pyyaml=5.3 - requests=2.22.0 - - watchdog=0.9.0 + - watchdog=0.10.2 + - yamllint=1.20.0 - pip: - errorhandler==2.0.1 - - git+https://github.com/manubot/manubot@e18fed8cfb4c7fb9b5b39aa45bbba4aeadff6c9a + - git+https://github.com/manubot/manubot@68ae7cfeb3928729228b5c9f0e11abbaceb7edb9 - jsonref==0.2 - opentimestamps-client==0.7.0 - opentimestamps==0.4.1 From af2ef812f4df08f985e92e68e679f16333e74ffd Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Tue, 18 Feb 2020 09:24:55 -0500 Subject: [PATCH 17/24] GH Actions: no setup deployment using GITHUB_TOKEN merges https://github.com/manubot/rootstock/pull/310 Previously secrets.GITHUB_TOKEN did not work for deployment because the commits it pushed to `gh-pages` were unable to trigger a GitHub Pages build on public repositories. However, this issue seems to have been quietly resolved. There has been no official GitHub announcement about the change, so there is a risk that it will be temporary. Deployment now uses MANUBOT_SSH_PRIVATE_KEY over MANUBOT_ACCESS_TOKEN when both are set. The idea is that if GitHub's support for GITHUB_TOKEN is temporary (since no official commitment yet), then users who have configured MANUBOT_ACCESS_TOKEN will not be affected. Only users who did not set up MANUBOT_SSH_PRIVATE_KEY will be affected, but they could then set up MANUBOT_SSH_PRIVATE_KEY without having to upgrade Manubot Rootstock to get deployment to work. --- .github/workflows/manubot.yaml | 11 +-- SETUP.md | 135 ++++++++++++++++++++------------- ci/deploy.sh | 24 +++++- 3 files changed, 106 insertions(+), 64 deletions(-) diff --git a/.github/workflows/manubot.yaml b/.github/workflows/manubot.yaml index ba461d52..f1159c7b 100644 --- a/.github/workflows/manubot.yaml +++ b/.github/workflows/manubot.yaml @@ -42,14 +42,9 @@ jobs: - name: Deploy Manuscript if: github.ref == 'refs/heads/master' && github.event_name == 'push' env: + MANUBOT_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} MANUBOT_SSH_PRIVATE_KEY: ${{ secrets.MANUBOT_SSH_PRIVATE_KEY }} CI_BUILD_WEB_URL: https://github.com/${{ github.repository }}/commit/${{ github.sha }}/checks CI_JOB_WEB_URL: https://github.com/${{ github.repository }}/runs/${{ github.run_id }} - shell: bash --login {0} - run: | - if [ "$MANUBOT_SSH_PRIVATE_KEY" != "" ]; then - bash ci/deploy.sh - else - echo >&2 "Skipping deployment because the MANUBOT_SSH_PRIVATE_KEY secret is not set. - Instructions at https://github.com/manubot/rootstock/blob/master/SETUP.md#deploy-key" - fi + shell: bash --login {0} + run: bash ci/deploy.sh diff --git a/SETUP.md b/SETUP.md index dce3e111..0483c9e0 100644 --- a/SETUP.md +++ b/SETUP.md @@ -1,24 +1,27 @@ -- [Cloning the manubot/rootstock repository to create a new manuscript](#cloning-the-manubot-rootstock-repository-to-create-a-new-manuscript) +# Table of contents + +- [Creating a new manuscript](#creating-a-new-manuscript) * [Configuration](#configuration) * [Create repository](#create-repository) * [Continuous integration](#continuous-integration) - + [Deploy key](#deploy-key) + + [GitHub Actions](#github-actions) + + [SSH Deploy Key](#ssh-deploy-key) - [Add the public key to GitHub](#add-the-public-key-to-github) - [Add the private key to GitHub](#add-the-private-key-to-github) - + [GitHub Actions](#github-actions) + [Travis CI](#travis-ci) + [Previewing pull request builds with AppVeyor](#previewing-pull-request-builds-with-appveyor) - + [CI clean up](#ci-clean-up) * [README updates](#readme-updates) * [Finalize](#finalize) - [Merging upstream rootstock changes](#merging-upstream-rootstock-changes) -_Table of contents generated with [markdown-toc](https://ecotrust-canada.github.io/markdown-toc/)_ +_generated with [markdown-toc](https://ecotrust-canada.github.io/markdown-toc/)_ -# Cloning the manubot/rootstock repository to create a new manuscript +# Creating a new manuscript -The process to create a new Manubot manuscript is a bit challenging, because it requires a few steps that are difficult to automate. +These instructions detail how to create a new manuscript based off of the [`manubot/rootstock`](https://github.com/manubot/rootstock/) repository. +The process can be a bit challenging, because it requires a few steps that are difficult to automate. However, you will only have to perform these steps once for each manuscript. + These steps should be performed in a command-line shell (terminal), starting in the directory where you want the manuscript folder be created. Setup is supported on Linux, macOS, and Windows. Windows setup requires [Git Bash](https://gitforwindows.org/) or [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/faq). @@ -81,23 +84,59 @@ git push --set-upstream origin output Manubot integrates with cloud services to perform continuous integration (CI). For Manubot that means automatically building and deploying your manuscript. -Manubot supports the following services: +Manubot supports the following CI services: + +| Service | Default | Artifacts | Deployment | Config | Private Repos | +|---------|---------|-----------|---------|--------|---------------| +| [GitHub Actions](https://github.com/features/actions) | ✔️ | ✔️ | ✔️ | [`manubot.yaml`](.github/workflows/manubot.yaml) | 2,000 minutes per month | +| [Travis CI](https://travis-ci.com) | ❌ | ❌ | ✔️ needs setup | [`.travis.yml`](.travis.yml) | 100 build trial | +| [AppVeyor](https://www.appveyor.com/) | ❌ | ✔️ with PR comments | ❌ | [`.appveyor.yml`](.appveyor.yml) | 14 day trial | + +Notes on table fields: + +- **Default**: Whether the following uncollapsed setup instructions enable the service by default. +- **Artifacts**: Manuscript outputs that are saved alongside the CI build logs. + This is especially helpful for previewing changes that are under development in a pull request. + Both GitHub Actions and AppVeyor upload the rendered manuscript as an artifact for pull request builds. + However, only AppVeyor comments on pull requests with a download link to the artifacts ([example](https://github.com/manubot/rootstock/pull/262#issuecomment-519944731)). +- **Deployment**: Whether the CI service can write outputs back to the GitHub repository (to the `output` and `gh-pages` branches). + Deployment provides GitHub Pages with the latest manuscript version to serve to the manuscript's URL. + GitHub Actions will deploy by default without any additional setup. + Travis CI will only deploy if an SSH Private Key is provided. + To avoid deploying a manuscript multiple times, disable GitHub Actions before providing an SSH Private Key to Travis. +- **Config**: File configuring what operations CI will perform. + Removing this file is one method to disable the CI service. +- **Private Repos**: Quota for private repos. + Only GitHub Actions supports cost-free builds of private repositories beyond a trial period. + All services are cost-free for public repos. + +### GitHub Actions + +GitHub Actions is the recommended default CI service because it requires no additional setup. +To use GitHub Actions only, remove configuration files for other CI services: + +```shell +# remove Travis CI config +git rm .travis.yml +# remove AppVeyor config +git rm .appveyor.yml +# remove ci/install.sh if not using neither Travis CI nor AppVeyor +git rm ci/install.sh +``` -- [GitHub Actions](https://github.com/features/actions). - Configured at [`.github/workflows/manubot.yaml`](.github/workflows/manubot.yaml) -- [Travis CI](https://travis-ci.com). - Configured at [`.travis.yml`](.travis.yml). -- [AppVeyor](https://www.appveyor.com/). - Configured at [`.appveyor.yml`](.appveyor.yml). +GitHub Actions is able to deploy without any setup using the [`GITHUB_TOKEN`](https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token) for authentication. +Deploying on Travis CI requires creating an SSH Deploy Key. +The following sections, collapsed by default, detail how to generate an SSH Deploy Key. -GitHub Actions is the default service for new manucripts since it's easiest to setup. -We recommend using either GitHub Actions or Travis CI, but not both to avoid deploying manuscripts multiple times. -AppVeyor can be used in addition to GitHub Actions or Travis CI to comment on pull request with download links to rendered PDFs. -GitHub Actions do upload rendered manuscripts as artifacts, but do not leave pull request comments. +
+Expand for SSH Deploy Key setup -### Deploy key +### SSH Deploy Key -Generate a deploy key so CI can write to the repository. +Deployment on Travis CI requires an SSH Deploy Key. +Previously, GitHub Actions also required an SSH Deploy Key, but now GitHub can deploy using the `GITHUB_TOKEN` secret. +Therefore, users following the default configuration of deploying only via GitHub Actions can skip these steps. +Otherwise, generate a deploy key so CI can write to the repository. ```sh # Generate deploy.key.pub (public) and deploy.key (private) @@ -129,6 +168,9 @@ Finally, click "Add key". #### Add the private key to GitHub +If you would like GitHub Actions to use SSH for deployment, rather than via HTTPS using `GITHUB_TOKEN`, perform the steps in this section. +**Skip this section if solely using Travis CI for deployment.** + ```sh # Print the URL for adding the private key to GitHub echo "https://github.com/$OWNER/$REPO/settings/secrets" @@ -142,19 +184,7 @@ Click "Add a new secret". For "Name", enter `MANUBOT_SSH_PRIVATE_KEY`. Next, copy-paste the content of `ci/deploy.key.txt` into "Value" (printed above by `cat`, including any trailing `=` characters if present). - -### GitHub Actions - -If you plan on only using GitHub actions, you can remove configuration files for other CI services: - -```shell -# remove Travis CI config -git rm .travis.yml -# remove AppVeyor config -git rm .appveyor.yml -# remove ci/install.sh if not using neither Travis CI nor AppVeyor -git rm ci/install.sh -``` +
Expand for Travis CI setup @@ -184,6 +214,14 @@ Make sure "Display value in build logs" remains toggled off (the default). While in the Travis CI settings, activate the [limit concurrent jobs](https://blog.travis-ci.com/2014-07-18-per-repository-concurrency-setting/) toggle and enter `1` in the value field. This ensures previous Manubot builds deploy before subsequent ones begin. + +Once the public and private deploy keys have been copied to their cloud locations, you can optionally remove the untracked files: + +```sh +# Optionally remove untracked files +rm ci/deploy.key* +``` +
@@ -201,45 +239,38 @@ The repository already contains an `.appveyor.yml` build configuration file, so AppVeyor only runs when it detects changes that are likely to affect the manuscript.
-### CI clean up - -The continuous integration configuration is now complete. -Clean up: - -```sh -# Optionally remove untracked files -rm ci/deploy.key* -``` - ## README updates -Now update `README.md` files to reference the new repository: +The continuous integration configuration should now be complete. +Now update `README.md` files to reference your new repository: -```sh +```shell # Perform substitutions sed "s/manubot\/rootstock/$OWNER\/$REPO/g" README.md > tmp && mv -f tmp README.md sed "s/manubot\.github\.io\/rootstock/$OWNER\.github\.io\/$REPO/g" README.md > tmp && mv -f tmp README.md - -# Remove deletable content file -git rm content/02.delete-me.md ``` ## Finalize -Run `git status` or `git diff --color-words` to check that the following files have unstaged changes: +The `content/02.delete-me.md` file details the Markdown syntax and formatting options available with Manubot. +Remove it to reduce the content to a blank manuscript: -+ `README.md` +```shell +# Remove deletable content file +git rm content/02.delete-me.md +``` +Run `git status` or `git diff --color-words` to double check the changes thus far. If the changes look okay, commit and push: -```sh +```shell git add --update git commit --message "Brand repo to $OWNER/$REPO" git push origin master ``` You should be good to go now. -A good first step is to modify `content/metadata.yaml` with the relevant information for your manuscript. +A good first step is to modify [`content/metadata.yaml`](content/metadata.yaml) with the relevant information for your manuscript. # Merging upstream rootstock changes diff --git a/ci/deploy.sh b/ci/deploy.sh index ac2aea63..ed025228 100755 --- a/ci/deploy.sh +++ b/ci/deploy.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -## deploy.sh: run during a Travis CI build to deploy manuscript outputs to the output and gh-pages branches on GitHub. +## deploy.sh: run during a CI build to deploy manuscript outputs to the output and gh-pages branches on GitHub. # Set options for extra caution & debugging set -o errexit \ @@ -26,8 +26,21 @@ git config --global push.default simple git config --global user.email "$(git log --max-count=1 --format='%ae')" git config --global user.name "$(git log --max-count=1 --format='%an')" git checkout "$BRANCH" + +# Configure deployment credentials +MANUBOT_DEPLOY_VIA_SSH=true git remote set-url origin "git@github.com:$REPO_SLUG.git" +if [ -v MANUBOT_SSH_PRIVATE_KEY ] && [ "$MANUBOT_SSH_PRIVATE_KEY" != "" ]; then + echo >&2 "[INFO] Detected MANUBOT_SSH_PRIVATE_KEY. Will deploy via SSH." +elif [ -v MANUBOT_ACCESS_TOKEN ] && [ "$MANUBOT_ACCESS_TOKEN" != "" ]; then + echo >&2 "[INFO] Detected MANUBOT_ACCESS_TOKEN. Will deploy via HTTPS." + MANUBOT_DEPLOY_VIA_SSH=false + git remote set-url origin "https://$MANUBOT_ACCESS_TOKEN@github.com/$REPO_SLUG.git" +else + echo >&2 "[INFO] Missing MANUBOT_SSH_PRIVATE_KEY and MANUBOT_ACCESS_TOKEN. Will deploy via SSH." +fi +if [ $MANUBOT_DEPLOY_VIA_SSH = "true" ]; then # Decrypt and add SSH key eval "$(ssh-agent -s)" ( @@ -36,7 +49,7 @@ if [ -v MANUBOT_SSH_PRIVATE_KEY ]; then base64 --decode <<< "$MANUBOT_SSH_PRIVATE_KEY" | ssh-add - else echo >&2 "DeprecationWarning: Loading deploy.key from an encrypted file. -In the future, using the MANUBOT_SSH_PRIVATE_KEY environment variable may be required." +In the future, using the MANUBOT_ACCESS_TOKEN or MANUBOT_SSH_PRIVATE_KEY environment variable may be required." openssl aes-256-cbc \ -K $encrypted_9befd6eddffe_key \ -iv $encrypted_9befd6eddffe_iv \ @@ -46,6 +59,7 @@ chmod 600 ci/deploy.key ssh-add ci/deploy.key fi ) +fi # Fetch and create gh-pages and output branches # Travis does a shallow and single branch git clone @@ -88,5 +102,7 @@ ghp-import \ --message="$MESSAGE" \ webpage -# Workaround https://github.com/travis-ci/travis-ci/issues/8082 -ssh-agent -k +if [ $MANUBOT_DEPLOY_VIA_SSH = "true" ]; then + # Workaround https://github.com/travis-ci/travis-ci/issues/8082 + ssh-agent -k +fi From d14dd7dc8503fdae86c1a5f66777b62e11a0ebc6 Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Tue, 18 Feb 2020 09:33:23 -0500 Subject: [PATCH 18/24] SETUP.md: fix double negative typo [skip ci] --- SETUP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SETUP.md b/SETUP.md index 0483c9e0..5d0d3cc7 100644 --- a/SETUP.md +++ b/SETUP.md @@ -120,7 +120,7 @@ To use GitHub Actions only, remove configuration files for other CI services: git rm .travis.yml # remove AppVeyor config git rm .appveyor.yml -# remove ci/install.sh if not using neither Travis CI nor AppVeyor +# remove ci/install.sh if using neither Travis CI nor AppVeyor git rm ci/install.sh ``` From 9bdf4c1a011adac7aa9e26225e3c9c717ba4d93a Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Tue, 18 Feb 2020 11:08:48 -0500 Subject: [PATCH 19/24] GH Actions: skip deployment on forks merges https://github.com/manubot/rootstock/pull/313 Previously deployment was governed by the presence of MANUBOT_SSH_PRIVATE_KEY, but now that GITHUB_TOKEN is supported for deployment, forks with master branch commits attempted to deploy. --- .github/workflows/manubot.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/manubot.yaml b/.github/workflows/manubot.yaml index f1159c7b..6d434e30 100644 --- a/.github/workflows/manubot.yaml +++ b/.github/workflows/manubot.yaml @@ -40,7 +40,7 @@ jobs: name: manuscript-${{ github.run_id }}-${{ env.TRIGGERING_SHA_7 }} path: output - name: Deploy Manuscript - if: github.ref == 'refs/heads/master' && github.event_name == 'push' + if: github.ref == 'refs/heads/master' && github.event_name == 'push' && !github.repository.fork env: MANUBOT_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} MANUBOT_SSH_PRIVATE_KEY: ${{ secrets.MANUBOT_SSH_PRIVATE_KEY }} From cd8ce12f739c4ea5981723bade4f1d8c8cadaf1a Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Tue, 18 Feb 2020 11:25:59 -0500 Subject: [PATCH 20/24] fixup! GH Actions: skip deployment on forks --- .github/workflows/manubot.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/manubot.yaml b/.github/workflows/manubot.yaml index 6d434e30..faa3ad08 100644 --- a/.github/workflows/manubot.yaml +++ b/.github/workflows/manubot.yaml @@ -40,7 +40,7 @@ jobs: name: manuscript-${{ github.run_id }}-${{ env.TRIGGERING_SHA_7 }} path: output - name: Deploy Manuscript - if: github.ref == 'refs/heads/master' && github.event_name == 'push' && !github.repository.fork + if: github.ref == 'refs/heads/master' && github.event_name == 'push' && !github.event.repository.fork env: MANUBOT_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} MANUBOT_SSH_PRIVATE_KEY: ${{ secrets.MANUBOT_SSH_PRIVATE_KEY }} From c25f8b8df29bf660f9bbd52521514eaedfa1273c Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Tue, 18 Feb 2020 15:31:45 -0500 Subject: [PATCH 21/24] Simplify setup by creating branches later merges https://github.com/manubot/rootstock/pull/314 * Simplify setup by creating branches later For a new manuscript, the first deploy event won't be able to fetch gh-pages and output because they were not pushed during setup. However, the deploy script now ignores the error on fetch and continues with the deployment, creating those branches at the first deployment. All subsequent deployments work as they did previously. * SETUP: Update with how to workaround GITHUB_TOKEN not triggering Pages builds. --- SETUP.md | 23 ++++++++++------------- ci/deploy.sh | 3 ++- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/SETUP.md b/SETUP.md index 5d0d3cc7..2faa2502 100644 --- a/SETUP.md +++ b/SETUP.md @@ -46,22 +46,15 @@ REPO=rootstock **Execute the remaining commands verbatim.** They do not need to be edited (if the setup works as intended). -Next you must clone `manubot/rootstock` and configure its branches and remotes: +Next you must clone `manubot/rootstock` and reconfigure the remote repositories: ```sh # Clone manubot/rootstock -git clone https://github.com/manubot/rootstock.git $REPO +git clone --single-branch https://github.com/manubot/rootstock.git $REPO cd $REPO -# Configure remotes and branches +# Configure remotes git remote add rootstock https://github.com/manubot/rootstock.git -git checkout --orphan gh-pages -git rm -r --force . -git commit --allow-empty \ - --message "Initialize empty branch" \ - --message "[ci skip]" -git checkout -b output -git checkout master # Option A: Set origin URL using its web address git remote set-url origin https://github.com/$OWNER/$REPO.git @@ -76,8 +69,6 @@ Next, push your cloned manuscript: ```sh git push --set-upstream origin master -git push --set-upstream origin gh-pages -git push --set-upstream origin output ``` ## Continuous integration @@ -124,7 +115,13 @@ git rm .appveyor.yml git rm ci/install.sh ``` -GitHub Actions is able to deploy without any setup using the [`GITHUB_TOKEN`](https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token) for authentication. +GitHub Actions is _usually_ able to deploy without any setup using the [`GITHUB_TOKEN`](https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token) for authentication. +GitHub Pages deployment using `GITHUB_TOKEN` recently started working on GitHub without an official announcement. +If it does not work for you after completing this setup, try reselecting "gh-pages branch" as the Source for GitHub Pages in the repository Settings. +GitHub Pages should now trigger on the next commit. +If not, [let us know](https://github.com/manubot/rootstock/issues/new). +For more reliable deployment on GitHub, you can also use an SSH Deploy Key instead (see below). + Deploying on Travis CI requires creating an SSH Deploy Key. The following sections, collapsed by default, detail how to generate an SSH Deploy Key. diff --git a/ci/deploy.sh b/ci/deploy.sh index ed025228..50652659 100755 --- a/ci/deploy.sh +++ b/ci/deploy.sh @@ -64,7 +64,8 @@ fi # Fetch and create gh-pages and output branches # Travis does a shallow and single branch git clone git remote set-branches --add origin gh-pages output -git fetch origin gh-pages:gh-pages output:output +git fetch origin gh-pages:gh-pages output:output || \ + echo >&2 "[INFO] could not fetch gh-pages or output from origin." # Configure versioned webpage and timestamp manubot webpage \ From cde7fa2df127e40f8644166f3a442f51f8af54b8 Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Fri, 28 Feb 2020 12:46:34 -0500 Subject: [PATCH 22/24] Update environment 2020-02-27 & citations usage merges https://github.com/manubot/rootstock/pull/315 Update environment on 2020-02-27 USAGE: clarify citation key syntax --- USAGE.md | 34 +++++++++++++++++++++++++++++----- build/environment.yml | 10 +++++----- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/USAGE.md b/USAGE.md index 7cae369b..47db46fb 100644 --- a/USAGE.md +++ b/USAGE.md @@ -76,9 +76,15 @@ We recommend always specifying the width of SVG images (even if just `width="100 ### Citations -Manubot supports Pandoc [citations](https://pandoc.org/MANUAL.html#citations) via `pandoc-citeproc`. -However, Manubot performs automated citation processing and metadata retrieval on in-text citations. -Therefore, citations must be of the following form: `@source:identifier`, where `source` is one of the options described below. +Manubot supports Pandoc [citations](https://pandoc.org/MANUAL.html#citations). +Citations are processed in 3 stages: + +1. Pandoc parses the input Markdown to locate citation keys. +2. The [`pandoc-manubot-cite`](https://github.com/manubot/manubot#pandoc-filter) filter automatically retreives the bibliographic metadata for citation keys. +3. The [`pandoc-citeproc`](https://github.com/jgm/pandoc-citeproc/blob/master/man/pandoc-citeproc.1.md) filter renders in-text citations and generates styled references. + +When using Manubot, citation keys should be formatted like `@source:identifier`, +where `source` is one of the options described below. When choosing which source to use for a citation, we recommend the following order: 1. DOI (Digital Object Identifier), cite like `@doi:10.15363/thinklab.4`. @@ -109,13 +115,31 @@ Note that multiple citations must be semicolon separated. Be careful not to cite the same study using identifiers from multiple sources. For example, the following citations all refer to the same study, but will be treated as separate references: `[@doi:10.7717/peerj.705; @pmcid:PMC4304851; @pmid:25648772]`. +Citation keys must adhere to the syntax described in the [Pandoc manual](https://pandoc.org/MANUAL.html#citations): + +> The citation key must begin with a letter, digit, or `_`, and may contain alphanumerics, `_`, and internal punctuation characters (`:.#$%&-+?<>~/`). + +To evaluate whether a citation key fully matches this syntax, try [this online regex](https://regex101.com/r/mXZyY2/latest). +If the citation key is not valid, use the [citation tag](#citation-tag) workaround below. +This is required for citation keys that contain forbidden characters such as `;` or `=` or end with a non-alphanumeric character such as `/`. + + +Prior to Rootstock commit [`6636b91`](https://github.com/manubot/rootstock/commit/6636b912c6b41593acd2041d34cd4158c1b317fb) on 2020-01-14, Manubot processed citations separately from Pandoc. +Switching to a Pandoc filter improved reliability on complex documents, but restricted the syntax of citation keys slightly. +Therefore, users upgrading Rootstock may find some citations become invalid. +By default, `pandoc-manubot-cite` does not fail upon invalid citations, although this can be changed by adding the following to `metadata.yaml`: + +```yaml +pandoc: + manubot-fail-on-errors: True +``` + #### Citation tags The system also supports citation tags, which map from one citation key (an alias) to another. Tags are recommended for the following applications: -1. A citation's identifier contains forbidden characters, such as `;` or `=`, or ends with a non-alphanumeric character other than `/`. - In these instances, you must use a tag. +1. A citation's identifier contains forbidden characters, you must use a tag. 2. A single reference is cited many times. Therefore, it might make sense to define a tag, so if the citation updates (e.g. a newer version becomes available), only a single change is required. diff --git a/build/environment.yml b/build/environment.yml index f0d0d35a..9732a606 100644 --- a/build/environment.yml +++ b/build/environment.yml @@ -6,21 +6,21 @@ dependencies: - cairocffi=0.8.0 - cffi=1.12.3 - ghp-import=0.5.5 - - jinja2=2.10.3 + - jinja2=2.11.1 - jsonschema=3.2.0 - pandas=1.0.1 - - pandoc=2.9 + - pandoc=2.9.2 - pango=1.40.14 - pip=20.0 - - psutil=5.6.7 + - psutil=5.7.0 - python=3.7.6 - pyyaml=5.3 - - requests=2.22.0 + - requests=2.23.0 - watchdog=0.10.2 - yamllint=1.20.0 - pip: - errorhandler==2.0.1 - - git+https://github.com/manubot/manubot@68ae7cfeb3928729228b5c9f0e11abbaceb7edb9 + - git+https://github.com/manubot/manubot@a022e715f266c0f116a6b38f993bd696dc62094a - jsonref==0.2 - opentimestamps-client==0.7.0 - opentimestamps==0.4.1 From c8221679dbd42ba5ec13d643a3f2364e5904b8cc Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Fri, 28 Feb 2020 14:39:22 -0500 Subject: [PATCH 23/24] Remove {{manubot.manuscript_stats.reference_counts}} reference_counts is no longer added to manuscript_stats because citation processing has been moved to pandoc-manubot-cite filter. --- content/08.methods.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/08.methods.md b/content/08.methods.md index dc76c529..b8bd7d56 100644 --- a/content/08.methods.md +++ b/content/08.methods.md @@ -13,7 +13,6 @@ To facilitate citation, we [defined](https://github.com/greenelab/deep-review/bl We supported citations to the following identifier types (in order of preference): DOIs, PubMed Central IDs, PubMed IDs, arXiv IDs, and URLs. References were automatically generated from citation metadata by querying APIs to generate [Citation Style Language](http://citationstyles.org/) (CSL) JSON items for each reference. [Pandoc](http://pandoc.org/) and [pandoc-citeproc](https://github.com/jgm/pandoc-citeproc) converted the markdown to HTML and PDF, while rendering the formatted citations and references. -In total, referenced works consisted of {{manubot.manuscript_stats.reference_counts.doi}} DOIs, {{manubot.manuscript_stats.reference_counts.pmcid}} PubMed Central records, {{manubot.manuscript_stats.reference_counts.arxiv}} arXiv manuscripts, and {{manubot.manuscript_stats.reference_counts.url}} URLs (webpages as well as manuscripts lacking standardized identifiers). We implemented continuous analysis so the manuscript was automatically regenerated whenever the source changed [@doi:10.1038/nbt.3780]. We configured Travis CI---a continuous integration service---to fetch new citation metadata and rebuild the manuscript for every commit. From d8c2b793cf522ec2c72f1846b962cdb390a928d1 Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Fri, 28 Feb 2020 15:05:28 -0500 Subject: [PATCH 24/24] Move citation tags in backmatter content/citation-tags.tsv is now deprecated --- content/90.back-matter.md | 341 ++++++++++++++++++++++++++++++++++++++ content/citation-tags.tsv | 340 ------------------------------------- 2 files changed, 341 insertions(+), 340 deletions(-) delete mode 100644 content/citation-tags.tsv diff --git a/content/90.back-matter.md b/content/90.back-matter.md index 339b33c8..8ade69ab 100644 --- a/content/90.back-matter.md +++ b/content/90.back-matter.md @@ -2,3 +2,344 @@
+ + +[@tag:Abe]: doi:10.1101/gr.634603 +[@tag:Abramoff2016_dr]: doi:10.1167/iovs.16-19964 +[@tag:Agarwal2015_targetscan]: doi:10.7554/eLife.05005 +[@tag:Aitchison2017]: url:http://papers.nips.cc/paper/6940-model-based-bayesian-inference-of-neural-activity-and-connectivity-from-all-optical-interrogation-of-a-neural-circuit +[@tag:Alipanahi2015_predicting]: doi:10.1038/nbt.3300 +[@tag:AltaeTran2016_one_shot]: doi:10.1021/acscentsci.6b00367 +[@tag:Amit2017_breast_mri]: doi:10.1117/12.2249981 +[@tag:Asgari]: doi:10.1371/journal.pone.0141287 +[@tag:blast]: doi:10.1016/S0022-2836(05)80360-2 +[@tag:Angermueller2016_dl_review]: doi:10.15252/msb.20156651 +[@tag:Angermueller2016_single_methyl]: doi:10.1186/s13059-017-1189-z +[@tag:Angermueller2017]: doi:10.1186/s13059-017-1189-z +[@tag:Artemov2016_clinical]: doi:10.1101/095653 +[@tag:Arvaniti2016_rare_subsets]: doi:10.1101/046508 +[@tag:Bach2015_on]: doi:10.1371/journal.pone.0130140 +[@tag:Bahdanu2014_neural]: arxiv:1409.0473 +[@tag:Baskin2015_drug_disc]: doi:10.1080/17460441.2016.1201262 +[@tag:Bar2015_nonmed_tl]: doi:10.1117/12.2083124 +[@tag:Barash2010_splicing_code]: doi:10.1038/nature09000 +[@tag:Baxt1991_myocardial]: doi:10.7326/0003-4819-115-11-843 +[@tag:BeaulieuJones2016_ehr_encode]: doi:10.1016/j.jbi.2016.10.007 +[@tag:Bengio2015_prec]: arxiv:1412.7024 +[@tag:Berezikov2011_mirna]: doi:10.1038/nrg3079 +[@tag:Bergstra2011_hyper]: url:https://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf +[@tag:Bergstra2012_random]: url:http://www.jmlr.org/papers/v13/bergstra12a.html +[@tag:Bracken2016_mirna]: doi:10.1038/nrg.2016.134 +[@tag:Boza]: doi:10.1371/journal.pone.0178751 +[@tag:Buggenthin2017_imaged_lineage]: doi:10.1038/nmeth.4182 +[@tag:Burlina2016_amd]: doi:10.1109/ISBI.2016.7493240 +[@tag:Chatterjee2018]: arxiv:1807.09617 +[@tag:Caruana2014_need]: arxiv:1312.6184 +[@tag:Caruana2015_intelligible]: doi:10.1145/2783258.2788613 +[@tag:Chaudhary2017_multiom_liver_cancer]: doi:10.1101/114892 +[@tag:Che2015_distill]: arxiv:1512.03542 +[@tag:Che2016_rnn]: arxiv:1606.01865 +[@tag:Chen2015_hashing]: arxiv:1504.04788 +[@tag:Chen2016_exprs_yeast]: doi:10.1186/s12859-015-0852-1 +[@tag:Chen2016_gene_expr]: doi:10.1093/bioinformatics/btw074 +[@tag:Chen2015_trans_species]: doi:10.1093/bioinformatics/btv315 +[@tag:Choi2016_retain]: arxiv:1608.05745 +[@tag:Choi2016_gram]: arxiv:1611.07012 +[@tag:Chollet2016_xception]: arxiv:1610.02357 +[@tag:Christensen2009]: doi:10.1371/journal.pgen.1000602 +[@tag:Chryssolouris1996_confidence]: doi:10.1109/72.478409 +[@tag:Ciresan2013_mitosis]: doi:10.1007/978-3-642-40763-5_51 +[@tag:Coates2013_cots_hpc]: url:http://www.jmlr.org/proceedings/papers/v28/coates13.html +[@tag:Codella2016_ensemble_melanoma]: arxiv:1610.04662 +[@tag:Consortium2012_encode]: doi:10.1038/nature11247 +[@tag:CudNN]: arxiv:1410.0759 +[@tag:Dahl2014_multi_qsar]: arxiv:1406.1231 +[@tag:Darst2018]: doi:10.1186/s12863-018-0646-3 +[@tag:Dean2012_nips_downpour]: url:http://research.google.com/archive/large_deep_networks_nips2012.html +[@tag:DeepChem]: url:https://github.com/deepchem/deepchem +[@tag:Deming2016_genetic]: arxiv:1605.07156 +[@tag:Ding]: doi:10.1186/s12859-015-0753-3 +[@tag:Ditzler]: doi:10.1186/s12859-015-0793-8 +[@tag:Ditzler2]: doi:10.1109/TNNLS.2014.2320415 +[@tag:Ditzler3]: doi:10.1109/TNB.2015.2461219 +[@tag:Dhungel2015_struct_pred_mamm]: doi:10.1007/978-3-319-24553-9_74 +[@tag:Dhungel2016_mamm]: doi:10.1007/978-3-319-46723-8_13 +[@tag:Dhungel2017_mamm_min_interv]: doi:10.1016/j.media.2017.01.009 +[@tag:Dream_tf_binding]: url:https://www.synapse.org/#!Synapse:syn6131484/wiki/402026 +[@tag:Dragonn]: url:http://kundajelab.github.io/dragonn/ +[@tag:Duvenaud2015_graph_conv]: url:http://papers.nips.cc/paper/5954-convolutional-networks-on-graphs-for-learning-molecular-fingerprints +[@tag:Edwards2015_growing_pains]: doi:10.1145/2771283 +[@tag:Ehran2009_visualizing]: url:http://www.iro.umontreal.ca/~lisa/publications2/index.php/publications/show/247 +[@tag:Elephas]: url:https://github.com/maxpumperla/elephas +[@tag:Errington2014_reproducibility]: doi:10.7554/eLife.04333 +[@tag:Eser2016_fiddle]: doi:10.1101/081380 +[@tag:Esfahani2016_melanoma]: doi:10.1109/EMBC.2016.7590963 +[@tag:Essinger2010_taxonomic]: doi:10.1109/IJCNN.2010.5596644 +[@tag:Esteva2017_skin_cancer_nature]: doi:10.1038/nature21056 +[@tag:Faruqi]: url:http://alifar76.github.io/sklearn-metrics/ +[@tag:Feinberg2018]: doi:10.1056/NEJMra1402513 +[@tag:Finnegan2017_maximum]: doi:10.1101/105957 +[@tag:Fong2017_perturb]: doi:10.1109/ICCV.2017.371 +[@tag:Fraga2005]: doi:10.1073/pnas.0500398102 +[@tag:Fu2019]: doi:10.1109/TCBB.2019.2909237 +[@tag:Gal2015_dropout]: arxiv:1506.02142 +[@tag:Gaublomme2015_th17]: doi:10.1016/j.cell.2015.11.009 +[@tag:Gargeya2017_dr]: doi:10.1016/j.ophtha.2017.02.008 +[@tag:Gawad2016_singlecell]: doi:10.1038/nrg.2015.16 +[@tag:Geras2017_multiview_mamm]: doi:10.1038/nrg.2015.16 +[@tag:Gerstein2016_scaling]: doi:10.1186/s13059-016-0917-0 +[@tag:Ghandi2014_enhanced]: doi:10.1371/journal.pcbi.1003711 +[@tag:Ghosh1992_sequence]: doi:10.1117/12.140112 +[@tag:Glorot2011_domain]: url:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.231.3442 +[@tag:Goldsborough2017_cytogan]: doi:10.1101/227645 +[@tag:Gomezb2016_automatic]: arxiv:1610.02415v1 +[@tag:Graphlab]: doi:10.14778/2212351.2212354 +[@tag:Groop1986_islet]: doi:10.2337/diab.35.2.237 +[@tag:Gultepe2014_sepsis]: doi:10.1136/amiajnl-2013-001815 +[@tag:Gulshan2016_dt]: doi:10.1001/jama.2016.17216 +[@tag:Gupta2015_exprs_yeast]: doi:10.1101/031906 +[@tag:Gupta2015_prec]: arxiv:1502.02551 +[@tag:Guetterman]: url:http://www.fasebj.org/content/30/1_Supplement/406.3 +[@tag:Hadjas2015_cc]: arxiv:1504.04343 +[@tag:He2015_images]: arxiv:1512.03385 +[@tag:Hinton2006_autoencoders]: doi:10.1126/science.1127647 +[@tag:Hinton2015_dark_knowledge]: arxiv:1503.02531 +[@tag:Hinton2015_dk]: arxiv:1503.02531v1 +[@tag:Hochreiter]: doi:10.1093/bioinformatics/btm247 +[@tag:Hoff]: doi:10.1093/nar/gkp327 +[@tag:Horton1992_assessment]: doi:10.1093/nar/20.16.4331 +[@tag:Horvath2013]: doi:10.1186/gb-2013-14-10-r115 +[@tag:Horvath2014]: doi:10.1073/pnas.1412759111 +[@tag:Houseman2012]: doi:10.1186/1471-2105-13-86 +[@tag:Houseman2016]: doi:10.1186/s12859-016-1140-4 +[@tag:Hubara2016_qnn]: arxiv:1609.07061 +[@tag:Huddar2016_predicting]: doi:10.1109/ACCESS.2016.2618775 +[@tag:Hughes2016_macromol_react]: doi:10.1021/acscentsci.6b00162 +[@tag:Iglovikov2017_baa]: doi:10.1101/234120 +[@tag:Islam2018]: doi:10.1186/s12919-018-0121-1 +[@tag:Ithapu2015_efficient]: doi:10.1016/j.jalz.2015.01.010 +[@tag:Jafari2016_skin_lesions]: doi:10.1007/s11548-017-1567-8 +[@tag:Jha2017_integrative_models]: doi:10.1101/104869 +[@tag:Johnson2017_integ_cell]: arxiv:1705.00092 +[@tag:JuanMateu2016_t1d]: doi:10.1530/EJE-15-0916 +[@tag:Kahng2017_activis]: arxiv:1704.01942 +[@tag:Kalinin2018_pgx]: arxiv:1801.08570 +[@tag:Karlin]: doi:10.1128/jb.179.12.3899-3913.1997 +[@tag:Karpathy2015_visualizing]: arxiv:1506.02078 +[@tag:Katzman2016_deepsurv]: arxiv:1606.00931 +[@tag:Kearnes2016_admet]: arxiv:1606.08793 +[@tag:Kearnes2016_graph_conv]: doi:10.1007/s10822-016-9938-8 +[@tag:Kelley2016_basset]: doi:10.1101/gr.200535.115 +[@tag:Keras]: url:https://github.com/fchollet/keras +[@tag:Kizek]: doi:10.1016/j.bjid.2015.08.013 +[@tag:Kindermans2016_investigating]: arxiv:1611.07270 +[@tag:Knights]: doi:10.1111/j.1574-6976.2010.00251.x +[@tag:Koh2016_denoising]: doi:10.1101/052118 +[@tag:Koh2017_understanding]: arxiv:1703.04730 +[@tag:Kooi2016_mamm_lesions]: doi:10.1016/j.media.2016.07.007 +[@tag:Kooi2017_mamm_tl]: doi:10.1002/mp.12110 +[@tag:Korfiatis2017]: doi:10.1007/s10278-017-0009-z +[@tag:Kraus2017_deeploc]: doi:10.15252/msb.20177551 +[@tag:Kresovich2019]: doi:10.1093/jnci/djz020 +[@tag:Krizhevsky2013_nips_cnn]: url:https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf +[@tag:Krizhevsky2014_weird_trick]: arxiv:1404.5997 +[@tag:Kwabi-Addo2007]: doi:10.1158/1078-0432.CCR-07-0085 +[@tag:Khwaja2017]: doi:10.1109/BIOCAS.2017.8325078 +[@tag:Khwaja2018]: arxiv:1810.01243 +[@tag:Lacey2016_dl_fpga]: arxiv:1602.04283 +[@tag:Laird2010]: doi:10.1038/nrg2732 +[@tag:Lakhani2017_radiography]: doi:10.1148/radiol.2017162326 +[@tag:Lanchantin2016_motif]: arxiv:1608.03644 +[@tag:Lee2016_deeptarget]: arxiv:1603.09123v2 +[@tag:Lee2016_emr_oct_amd]: doi:10.1101/094276 +[@tag:Lei2016_rationalizing]: arxiv:1606.04155 +[@tag:Leibig2016_dr]: doi:10.1101/084210 +[@tag:Levy2019]: doi:10.1101/692665 +[@tag:Levy-Jurgenson2018]: doi:10.1101/491357 +[@tag:Li2014_minibatch]: doi:10.1145/2623330.2623612 +[@tag:Li2016_variation]: doi:10.1126/science.aad9417 +[@tag:Liang2015_exprs_cancer]: doi:10.1109/TCBB.2014.2377729 +[@tag:Lin2017_why_dl_works]: arxiv:1608.08225v3 +[@tag:Lipton2016_missing]: arxiv:1606.04130 +[@tag:Lipton2015_lstm]: arxiv:1510.07641 +[@tag:Litjens2016_histopath_survey]: doi:10.1038/srep26286 +[@tag:Litjens2017_medimage_survey]: doi:10.1016/j.media.2017.07.005 +[@tag:Lisboa2006_review]: doi:10.1016/j.neunet.2005.10.007 +[@tag:Liu2013]: doi:10.1038/nbt.2487 +[@tag:Liu]: doi:10.1371/journal.pone.0053253 +[@tag:Liu2016_towards]: arxiv:1604.07043 +[@tag:Liu2016_sc_transcriptome]: doi:10.12688/f1000research.7223.1 +[@tag:Lodato2015_neurons]: doi:10.1126/science.aab1785 +[@tag:Lowe2012_kaggle]: url:http://blogs.sciencemag.org/pipeline/archives/2012/12/11/did_kaggle_predict_drug_candidate_activities_or_not +[@tag:lmat]: doi:10.1093/bioinformatics/btt389 +[@tag:Lundberg2016_an]: arxiv:1611.07478 +[@tag:Lusci2015_irv]: doi:10.1186/s13321-015-0110-6 +[@tag:Lusci2013_rnn]: doi:10.1021/ci400187y +[@tag:Ma2015_qsar_merck]: doi:10.1021/ci500747n +[@tag:Maaten2008_tsne]: url:http://www.jmlr.org/papers/v9/vandermaaten08a.html +[@tag:Mahendran2014_understanding]: arxiv:1412.0035 +[@tag:Mahendran2016_salient]: doi:10.1007/978-3-319-46466-4_8 +[@tag:Mahendran2016_visualizing]: doi:10.1007/s11263-016-0911-8 +[@tag:Mahmood]: doi:10.1016/S0140-6736(13)61752-3 +[@tag:Mapreduce]: doi:10.1145/1327452.1327492 +[@tag:Mayr2016_deep_tox]: doi:10.3389/fenvs.2015.00080 +[@tag:McHardy]: doi:10.1038/nmeth976 +[@tag:McHardy2]: doi:10.7717/peerj.1603 +[@tag:Meissner2008]: doi:10.1038/nature07107 +[@tag:Metaphlan]: doi:10.1038/nmeth.2066 +[@tag:Meng2016_mllib]: arxiv:1505.06807 +[@tag:Min2016_deepenhancer]: doi:10.1109/BIBM.2016.7822593 +[@tag:Momeni2018]: doi:10.1101/438341 +[@tag:Moritz2015_sparknet]: arxiv:1511.06051 +[@tag:Mordvintsev2015_inceptionism]: url:http://googleresearch.blogspot.co.uk/2015/06/inceptionism-going-deeper-into-neural.html +[@tag:Mrzelj]: url:https://repozitorij.uni-lj.si/IzpisGradiva.php?id=85515 +[@tag:matis]: doi:10.1016/S0097-8485(96)80015-5 +[@tag:nbc]: doi:10.1093/bioinformatics/btq619 +[@tag:Murdoch2017_automatic]: arxiv:1702.02540 +[@tag:Nazor2012]: doi:10.1016/j.stem.2012.02.013 +[@tag:Nemati2016_rl]: doi:10.1109/EMBC.2016.7591355 +[@tag:Ni2018]: doi:10.1101/385849 +[@tag:Nguyen2014_adversarial]: arxiv:1412.1897v4 +[@tag:Ngiam2011]: url:https://ai.stanford.edu/~ang/papers/icml11-MultimodalDeepLearning.pdf +[@tag:Nie2016_3d_survival]: doi:10.1007/978-3-319-46723-8_25 +[@tag:NIH2016_genome_cost]: url:https://www.genome.gov/27565109/the-cost-of-sequencing-a-human-genome/ +[@tag:Nih_curiosity]: url:https://www.nigms.nih.gov/Education/Documents/curiosity.pdf +[@tag:Olivecrona2017_drug_design]: arxiv:1704.07555 +[@tag:Osokin2017_biogan]: arxiv:1708.04692 +[@tag:onecodex]: url:https://www.onecodex.com/ +[@tag:Papernot2017_pate]: url:https://openreview.net/forum?id=HkwoSDPgg +[@tag:Park2016_deepmirgene]: arxiv:1605.00017 +[@tag:Parnamaa2017]: doi:10.1534/g3.116.033654 +[@tag:Pan2018]: doi:10.1101/438218 +[@tag:Pawlowski2016]: doi:10.1101/085118 +[@tag:Peng2019]: doi:10.1101/527044 +[@tag:Pereira2016_docking]: doi:10.1021/acs.jcim.6b00355 +[@tag:PerezSianes2016_screening]: doi:10.1007/978-3-319-40126-3_2 +[@tag:Phymm]: doi:10.1038/nmeth.1358 +[@tag:Poplin2016_deepvariant]: doi:10.1101/092890 +[@tag:Pratt2016_dr]: doi:10.1016/j.procs.2016.07.014 +[@tag:Quach2017]: doi:10.18632/aging.101168 +[@tag:Quang2017_factor]: doi:10.1101/151274 +[@tag:Qin2017_onehot]: doi:10.1371/journal.pcbi.1005403 +[@tag:Qiu2017_graph_embedding]: doi:10.1101/110668 +[@tag:Qiu2018]: doi:10.1101/406066 +[@tag:Ragoza2016_protein]: arxiv:1612.02751 +[@tag:RAD2010_view_cc]: doi:10.1145/1721654.1721672 +[@tag:Radford_dcgan]: arxiv:1511.06434v2 +[@tag:Rajkomar2017_radiographs]: doi:10.1007/s10278-016-9914-9 +[@tag:Rakhlin2018_histology]: doi:10.1101/259911 +[@tag:Ramsundar2015_multitask_drug]: arxiv:1502.02072 +[@tag:Ranganath2016_deep]: arxiv:1608.02158 +[@tag:Raina2009_gpu]: doi:10.1145/1553374.1553486 +[@tag:Relton2010]: doi:10.1371/journal.pmed.1000356 +[@tag:Ribeiro2016_lime]: arxiv:1602.04938 +[@tag:Robertson2005]: doi:10.1038/nrg1655 +[@tag:Rogers2010_fingerprints]: doi:10.1021/ci100050t +[@tag:Roth2015_view_agg_cad]: doi:10.1109/TMI.2015.2482920 +[@tag:Romero2017_diet]: url:https://openreview.net/pdf?id=Sk-oDY9ge +[@tag:Rosenberg2015_synthetic_seqs]: doi:10.1016/j.cell.2015.09.054 +[@tag:Russakovsky2015_imagenet]: doi:10.1007/s11263-015-0816-y +[@tag:Sa2015_buckwild]: pmcid:PMC4907892 +[@tag:Salas2018_GR]: doi:10.1101/gr.233213.117 +[@tag:Salas2018]: doi:10.1186/s13059-018-1448-7 +[@tag:Salzberg]: doi:10.1186/1471-2105-11-544 +[@tag:Schatz2010_dna_cloud]: doi:10.1038/nbt0710-691 +[@tag:Schmidhuber2014_dnn_overview]: doi:10.1016/j.neunet.2014.09.003 +[@tag:Scotti2016_missplicing]: doi:10.1038/nrg.2015.3 +[@tag:Segata]: doi:10.1371/journal.pcbi.1004977 +[@tag:Segler2017_drug_design]: arxiv:1701.01329 +[@tag:Seide2014_parallel]: doi:10.1109/ICASSP.2014.6853593 +[@tag:Setty2015_seqgl]: doi:10.1371/journal.pcbi.1004271 +[@tag:Selvaraju2016_grad]: arxiv:1610.02391 +[@tag:Serden]: doi:10.1016/S0168-8510(02)00208-7 +[@tag:Shaham2016_batch_effects]: doi:10.1093/bioinformatics/btx196 +[@tag:Shapely]: doi:10.1515/9781400881970-018 +[@tag:Shen2017_medimg_review]: doi:10.1146/annurev-bioeng-071516-044442 +[@tag:Shin2016_cad_tl]: doi:10.1109/TMI.2016.2528162 +[@tag:Shrikumar2017_learning]: arxiv:1704.02685 +[@tag:Shrikumar2017_reversecomplement]: doi:10.1101/103663 +[@tag:Simonyan2013_deep]: arxiv:1312.6034 +[@tag:Singh2017_attentivechrome]: arxiv:1708.00339 +[@tag:Singh2016_deepchrome]: arxiv:1607.02078 +[@tag:Singh2016_tsk]: doi:10.1109/TCBB.2016.2609918 +[@tag:Silver2016_alphago]: doi:10.1038/nature16961 +[@tag:Sonderby]: doi:10.1007/978-3-319-21233-3_6 +[@tag:Soueidan]: doi:10.1515/metgen-2016-0001 +[@tag:Spark]: doi:10.1145/2934664 +[@tag:Speech_recognition]: url:http://www.businessinsider.com/ibm-edges-closer-to-human-speech-recognition-2017-3 +[@tag:Springenberg2014_striving]: arxiv:1412.6806 +[@tag:Stein2010_cloud]: doi:10.1186/gb-2010-11-5-207 +[@tag:Stenstrom2005_latent]: doi:10.2337/diabetes.54.suppl_2.S68 +[@tag:Stormo2000_dna]: doi:10.1093/bioinformatics/16.1.16 +[@tag:Stratnikov]: doi:10.1186/2049-2618-1-11 +[@tag:Strobelt2016_visual]: arxiv:1606.07461 +[@tag:Su2015_gpu]: arxiv:1507.01239 +[@tag:Subramanian2016_bace1]: doi:10.1021/acs.jcim.6b00290 +[@tag:Sun2016_ensemble]: arxiv:1606.00575 +[@tag:Sundararajan2017_axiomatic]: arxiv:1703.01365 +[@tag:Sutskever]: arxiv:1409.3215 +[@tag:Swamidass2009_irv]: doi:10.1021/ci8004379 +[@tag:Tan2014_psb]: doi:10.1142/9789814644730_0014 +[@tag:Tan2015_adage]: doi:10.1128/mSystems.00025-15 +[@tag:Tan2016_eadage]: doi:10.1101/078659 +[@tag:TAC-ELM]: doi:10.1142/S0219720012500151 +[@tag:TensorFlow]: arxiv:1603.04467 +[@tag:Teschendorff2017]: doi:10.2217/epi-2016-0153 +[@tag:Tian2019]: doi:10.1186/s12864-019-5488-5 +[@tag:Titus2017]: doi:10.1093/hmg/ddx275 +[@tag:Torracinta2016_deep_snp]: doi:10.1101/097469 +[@tag:Torracinta2016_sim]: doi:10.1101/079087 +[@tag:Tu1996_anns]: doi:10.1016/S0895-4356(96)00002-9 +[@tag:Unterthiner2014_screening]: url:http://www.bioinf.at/publications/2014/NIPS2014a.pdf +[@tag:Vanhoucke2011_cpu]: url:https://research.google.com/pubs/pub37631.html +[@tag:Vera2016_sc_analysis]: doi:10.1146/annurev-genet-120215-034854 +[@tag:Vervier]: doi:10.1093/bioinformatics/btv683 +[@tag:Wallach2015_atom_net]: arxiv:1510.02855 +[@tag:Wang2016_breast_cancer]: arxiv:1606.05718 +[@tag:Wang2016_methyl]: doi:10.1038/srep19598 +[@tag:Wang2016_protein_contact]: doi:10.1371/journal.pcbi.1005324 +[@tag:Wasson1985_clinical]: doi:10.1056/NEJM198509263131306 +[@tag:WayGreene2017_eval]: arxiv:1711.04828 +[@tag:WayGreene2017_tybalt]: doi:10.1101/174474 +[@tag:Wilhelm-Benartzi2013]: doi:10.1038/bjc.2013.496 +[@tag:Word2Vec]: arxiv:1301.3781 +[@tag:wgsquikr]: doi:10.1371/journal.pone.0091784 +[@tag:Wu2017_molecule_net]: doi:10.1039/C7SC02664A +[@tag:Xiang]: doi:10.1016/S0167-9473(99)00098-5 +[@tag:Xiong2011_bayesian]: doi:10.1093/bioinformatics/btr444 +[@tag:Xiong2015_splicing_code]: doi:10.1126/science.1254806 +[@tag:Xu2015_show]: arxiv:1502.03044 +[@tag:Yasushi2016_cgbvs_dnn]: doi:10.1002/minf.201600045 +[@tag:yok]: doi:10.1186/1471-2105-12-20 +[@tag:Yoon2016_cancer_reports]: doi:10.1007/978-3-319-47898-2_21 +[@tag:Yosinski2014]: url:https://papers.nips.cc/paper/5347-how-transferable-are-features-in-deep-neural-networks +[@tag:Yosinksi2015_understanding]: arxiv:1506.06579 +[@tag:Yu2016_melanoma_resnet]: doi:10.1109/TMI.2016.2642839 +[@tag:Zeiler2013_visualizing]: arxiv:1311.2901 +[@tag:Zeng2015]: doi:10.1186/s12859-015-0553-9 +[@tag:Zeng2016_convolutional]: doi:10.1093/bioinformatics/btw255 +[@tag:Zhang2015_multitask_tl]: doi:10.1145/2783258.2783304 +[@tag:Zhang2017_generalization]: arxiv:1611.03530v2 +[@tag:Zhang2019]: doi:10.1186/s12885-019-5932-6 +[@tag:Zhou2015_deep_sea]: doi:10.1038/nmeth.3547 +[@tag:Zhu2016_advers_mamm]: doi:10.1101/095786 +[@tag:Zhu2016_mult_inst_mamm]: doi:10.1101/095794 +[@tag:Zintgraf2017_visualizing]: arxiv:1702.04595 +[@tag:goodfellow2016deep]: url:http://www.deeplearningbook.org/ +[@tag:li2016joint]: url:https://dl.acm.org/citation.cfm?id=3061018 +[@tag:world2004international]: url:http://www.who.int/classifications/icd/en/ +[@tag:ghahramani_protect]: arxiv:1707.02476 +[@tag:uncertainty_types]: arxiv:1703.04977 +[@tag:uncertainty_multi_task]: arxiv:1705.07115 +[@tag:guo_calibration]: arxiv:1706.04599 +[@tag:platt_scaling]: url:http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.41.1639 +[@tag:out_dist_baseline]: arxiv:1610.02136 +[@tag:temp_out_dist]: arxiv:1706.02690 +[@tag:ai_safety]: arxiv:1606.06565 +[@tag:strong_adversary]: arxiv:1705.07263 +[@tag:retinopathy_uncertainty]: doi:10.1038/s41598-017-17876-z +[@tag:bayesian_hypernets]: arxiv:1710.04759 +[@tag:mcclure_bayesian]: arxiv:1611.01639 +[@tag:uncertainty_ensembles]: arxiv:1612.01474 +[@tag:domain_adapt_uncertainty]: arxiv:1505.07818 +[@tag:gal_thesis]: url:http://www.cs.ox.ac.uk/people/yarin.gal/website/thesis/thesis.pdf diff --git a/content/citation-tags.tsv b/content/citation-tags.tsv deleted file mode 100644 index b4eb9efe..00000000 --- a/content/citation-tags.tsv +++ /dev/null @@ -1,340 +0,0 @@ -tag citation -Abe doi:10.1101/gr.634603 -Abramoff2016_dr doi:10.1167/iovs.16-19964 -Agarwal2015_targetscan doi:10.7554/eLife.05005 -Aitchison2017 url:http://papers.nips.cc/paper/6940-model-based-bayesian-inference-of-neural-activity-and-connectivity-from-all-optical-interrogation-of-a-neural-circuit -Alipanahi2015_predicting doi:10.1038/nbt.3300 -AltaeTran2016_one_shot doi:10.1021/acscentsci.6b00367 -Amit2017_breast_mri doi:10.1117/12.2249981 -Asgari doi:10.1371/journal.pone.0141287 -blast doi:10.1016/S0022-2836(05)80360-2 -Angermueller2016_dl_review doi:10.15252/msb.20156651 -Angermueller2016_single_methyl doi:10.1186/s13059-017-1189-z -Angermueller2017 doi:10.1186/s13059-017-1189-z -Artemov2016_clinical doi:10.1101/095653 -Arvaniti2016_rare_subsets doi:10.1101/046508 -Bach2015_on doi:10.1371/journal.pone.0130140 -Bahdanu2014_neural arxiv:1409.0473 -Baskin2015_drug_disc doi:10.1080/17460441.2016.1201262 -Bar2015_nonmed_tl doi:10.1117/12.2083124 -Barash2010_splicing_code doi:10.1038/nature09000 -Baxt1991_myocardial doi:10.7326/0003-4819-115-11-843 -BeaulieuJones2016_ehr_encode doi:10.1016/j.jbi.2016.10.007 -Bengio2015_prec arxiv:1412.7024 -Berezikov2011_mirna doi:10.1038/nrg3079 -Bergstra2011_hyper url:https://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf -Bergstra2012_random url:http://www.jmlr.org/papers/v13/bergstra12a.html -Bracken2016_mirna doi:10.1038/nrg.2016.134 -Boza doi:10.1371/journal.pone.0178751 -Buggenthin2017_imaged_lineage doi:10.1038/nmeth.4182 -Burlina2016_amd doi:10.1109/ISBI.2016.7493240 -Chatterjee2018 arxiv:1807.09617 -Caruana2014_need arxiv:1312.6184 -Caruana2015_intelligible doi:10.1145/2783258.2788613 -Chaudhary2017_multiom_liver_cancer doi:10.1101/114892 -Che2015_distill arxiv:1512.03542 -Che2016_rnn arxiv:1606.01865 -Chen2015_hashing arxiv:1504.04788 -Chen2016_exprs_yeast doi:10.1186/s12859-015-0852-1 -Chen2016_gene_expr doi:10.1093/bioinformatics/btw074 -Chen2015_trans_species doi:10.1093/bioinformatics/btv315 -Choi2016_retain arxiv:1608.05745 -Choi2016_gram arxiv:1611.07012 -Chollet2016_xception arxiv:1610.02357 -Christensen2009 doi:10.1371/journal.pgen.1000602 -Chryssolouris1996_confidence doi:10.1109/72.478409 -Ciresan2013_mitosis doi:10.1007/978-3-642-40763-5_51 -Coates2013_cots_hpc url:http://www.jmlr.org/proceedings/papers/v28/coates13.html -Codella2016_ensemble_melanoma arxiv:1610.04662 -Consortium2012_encode doi:10.1038/nature11247 -CudNN arxiv:1410.0759 -Dahl2014_multi_qsar arxiv:1406.1231 -Darst2018 doi:10.1186/s12863-018-0646-3 -Dean2012_nips_downpour url:http://research.google.com/archive/large_deep_networks_nips2012.html -DeepChem url:https://github.com/deepchem/deepchem -Deming2016_genetic arxiv:1605.07156 -Ding doi:10.1186/s12859-015-0753-3 -Ditzler doi:10.1186/s12859-015-0793-8 -Ditzler2 doi:10.1109/TNNLS.2014.2320415 -Ditzler3 doi:10.1109/TNB.2015.2461219 -Dhungel2015_struct_pred_mamm doi:10.1007/978-3-319-24553-9_74 -Dhungel2016_mamm doi:10.1007/978-3-319-46723-8_13 -Dhungel2017_mamm_min_interv doi:10.1016/j.media.2017.01.009 -Dream_tf_binding url:https://www.synapse.org/#!Synapse:syn6131484/wiki/402026 -Dragonn url:http://kundajelab.github.io/dragonn/ -Duvenaud2015_graph_conv url:http://papers.nips.cc/paper/5954-convolutional-networks-on-graphs-for-learning-molecular-fingerprints -Edwards2015_growing_pains doi:10.1145/2771283 -Ehran2009_visualizing url:http://www.iro.umontreal.ca/~lisa/publications2/index.php/publications/show/247 -Elephas url:https://github.com/maxpumperla/elephas -Errington2014_reproducibility doi:10.7554/eLife.04333 -Eser2016_fiddle doi:10.1101/081380 -Esfahani2016_melanoma doi:10.1109/EMBC.2016.7590963 -Essinger2010_taxonomic doi:10.1109/IJCNN.2010.5596644 -Esteva2017_skin_cancer_nature doi:10.1038/nature21056 -Faruqi url:http://alifar76.github.io/sklearn-metrics/ -Feinberg2018 doi:10.1056/NEJMra1402513 -Finnegan2017_maximum doi:10.1101/105957 -Fong2017_perturb doi:10.1109/ICCV.2017.371 -Fraga2005 doi:10.1073/pnas.0500398102 -Fu2019 doi:10.1109/TCBB.2019.2909237 -Gal2015_dropout arxiv:1506.02142 -Gaublomme2015_th17 doi:10.1016/j.cell.2015.11.009 -Gargeya2017_dr doi:10.1016/j.ophtha.2017.02.008 -Gawad2016_singlecell doi:10.1038/nrg.2015.16 -Geras2017_multiview_mamm doi:10.1038/nrg.2015.16 -Gerstein2016_scaling doi:10.1186/s13059-016-0917-0 -Ghandi2014_enhanced doi:10.1371/journal.pcbi.1003711 -Ghosh1992_sequence doi:10.1117/12.140112 -Glorot2011_domain url:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.231.3442 -Goldsborough2017_cytogan doi:10.1101/227645 -Gomezb2016_automatic arxiv:1610.02415v1 -Graphlab doi:10.14778/2212351.2212354 -Groop1986_islet doi:10.2337/diab.35.2.237 -Gultepe2014_sepsis doi:10.1136/amiajnl-2013-001815 -Gulshan2016_dt doi:10.1001/jama.2016.17216 -Gupta2015_exprs_yeast doi:10.1101/031906 -Gupta2015_prec arxiv:1502.02551 -Guetterman url:http://www.fasebj.org/content/30/1_Supplement/406.3 -Hadjas2015_cc arxiv:1504.04343 -He2015_images arxiv:1512.03385 -Hinton2006_autoencoders doi:10.1126/science.1127647 -Hinton2015_dark_knowledge arxiv:1503.02531 -Hinton2015_dk arxiv:1503.02531v1 -Hochreiter doi:10.1093/bioinformatics/btm247 -Hoff doi:10.1093/nar/gkp327 -Horton1992_assessment doi:10.1093/nar/20.16.4331 -Horvath2013 doi:10.1186/gb-2013-14-10-r115 -Horvath2014 doi:10.1073/pnas.1412759111 -Houseman2012 doi:10.1186/1471-2105-13-86 -Houseman2016 doi:10.1186/s12859-016-1140-4 -Hubara2016_qnn arxiv:1609.07061 -Huddar2016_predicting doi:10.1109/ACCESS.2016.2618775 -Hughes2016_macromol_react doi:10.1021/acscentsci.6b00162 -Iglovikov2017_baa doi:10.1101/234120 -Islam2018 doi:10.1186/s12919-018-0121-1 -Ithapu2015_efficient doi:10.1016/j.jalz.2015.01.010 -Jafari2016_skin_lesions doi:10.1007/s11548-017-1567-8 -Jha2017_integrative_models doi:10.1101/104869 -Johnson2017_integ_cell arxiv:1705.00092 -JuanMateu2016_t1d doi:10.1530/EJE-15-0916 -Kahng2017_activis arxiv:1704.01942 -Kalinin2018_pgx arxiv:1801.08570 -Karlin doi:10.1128/jb.179.12.3899-3913.1997 -Karpathy2015_visualizing arxiv:1506.02078 -Katzman2016_deepsurv arxiv:1606.00931 -Kearnes2016_admet arxiv:1606.08793 -Kearnes2016_graph_conv doi:10.1007/s10822-016-9938-8 -Kelley2016_basset doi:10.1101/gr.200535.115 -Keras url:https://github.com/fchollet/keras -Kizek doi:10.1016/j.bjid.2015.08.013 -Kindermans2016_investigating arxiv:1611.07270 -Knights doi:10.1111/j.1574-6976.2010.00251.x -Koh2016_denoising doi:10.1101/052118 -Koh2017_understanding arxiv:1703.04730 -Kooi2016_mamm_lesions doi:10.1016/j.media.2016.07.007 -Kooi2017_mamm_tl doi:10.1002/mp.12110 -Korfiatis2017 doi:10.1007/s10278-017-0009-z -Kraus2017_deeploc doi:10.15252/msb.20177551 -Kresovich2019 doi:10.1093/jnci/djz020 -Krizhevsky2013_nips_cnn url:https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf -Krizhevsky2014_weird_trick arxiv:1404.5997 -Kwabi-Addo2007 doi:10.1158/1078-0432.CCR-07-0085 -Khwaja2017 doi:10.1109/BIOCAS.2017.8325078 -Khwaja2018 arxiv:1810.01243 -Lacey2016_dl_fpga arxiv:1602.04283 -Laird2010 doi:10.1038/nrg2732 -Lakhani2017_radiography doi:10.1148/radiol.2017162326 -Lanchantin2016_motif arxiv:1608.03644 -Lee2016_deeptarget arxiv:1603.09123v2 -Lee2016_emr_oct_amd doi:10.1101/094276 -Lei2016_rationalizing arxiv:1606.04155 -Leibig2016_dr doi:10.1101/084210 -Levy2019 doi:10.1101/692665 -Levy-Jurgenson2018 doi:10.1101/491357 -Li2014_minibatch doi:10.1145/2623330.2623612 -Li2016_variation doi:10.1126/science.aad9417 -Liang2015_exprs_cancer doi:10.1109/TCBB.2014.2377729 -Lin2017_why_dl_works arxiv:1608.08225v3 -Lipton2016_missing arxiv:1606.04130 -Lipton2015_lstm arxiv:1510.07641 -Litjens2016_histopath_survey doi:10.1038/srep26286 -Litjens2017_medimage_survey doi:10.1016/j.media.2017.07.005 -Lisboa2006_review doi:10.1016/j.neunet.2005.10.007 -Liu2013 doi:10.1038/nbt.2487 -Liu doi:10.1371/journal.pone.0053253 -Liu2016_towards arxiv:1604.07043 -Liu2016_sc_transcriptome doi:10.12688/f1000research.7223.1 -Lodato2015_neurons doi:10.1126/science.aab1785 -Lowe2012_kaggle url:http://blogs.sciencemag.org/pipeline/archives/2012/12/11/did_kaggle_predict_drug_candidate_activities_or_not -lmat doi:10.1093/bioinformatics/btt389 -Lundberg2016_an arxiv:1611.07478 -Lusci2015_irv doi:10.1186/s13321-015-0110-6 -Lusci2013_rnn doi:10.1021/ci400187y -Ma2015_qsar_merck doi:10.1021/ci500747n -Maaten2008_tsne url:http://www.jmlr.org/papers/v9/vandermaaten08a.html -Mahendran2014_understanding arxiv:1412.0035 -Mahendran2016_salient doi:10.1007/978-3-319-46466-4_8 -Mahendran2016_visualizing doi:10.1007/s11263-016-0911-8 -Mahmood doi:10.1016/S0140-6736(13)61752-3 -Mapreduce doi:10.1145/1327452.1327492 -Mayr2016_deep_tox doi:10.3389/fenvs.2015.00080 -McHardy doi:10.1038/nmeth976 -McHardy2 doi:10.7717/peerj.1603 -Meissner2008 doi:10.1038/nature07107 -Metaphlan doi:10.1038/nmeth.2066 -Meng2016_mllib arxiv:1505.06807 -Min2016_deepenhancer doi:10.1109/BIBM.2016.7822593 -Momeni2018 doi:10.1101/438341 -Moritz2015_sparknet arxiv:1511.06051 -Mordvintsev2015_inceptionism url:http://googleresearch.blogspot.co.uk/2015/06/inceptionism-going-deeper-into-neural.html -Mrzelj url:https://repozitorij.uni-lj.si/IzpisGradiva.php?id=85515 -matis doi:10.1016/S0097-8485(96)80015-5 -nbc doi:10.1093/bioinformatics/btq619 -Murdoch2017_automatic arxiv:1702.02540 -Nazor2012 doi:10.1016/j.stem.2012.02.013 -Nemati2016_rl doi:10.1109/EMBC.2016.7591355 -Ni2018 doi:10.1101/385849 -Nguyen2014_adversarial arxiv:1412.1897v4 -Ngiam2011 url:https://ai.stanford.edu/~ang/papers/icml11-MultimodalDeepLearning.pdf -Nie2016_3d_survival doi:10.1007/978-3-319-46723-8_25 -NIH2016_genome_cost url:https://www.genome.gov/27565109/the-cost-of-sequencing-a-human-genome/ -Nih_curiosity url:https://www.nigms.nih.gov/Education/Documents/curiosity.pdf -Olivecrona2017_drug_design arxiv:1704.07555 -Osokin2017_biogan arxiv:1708.04692 -onecodex url:https://www.onecodex.com/ -Papernot2017_pate url:https://openreview.net/forum?id=HkwoSDPgg -Park2016_deepmirgene arxiv:1605.00017 -Parnamaa2017 doi:10.1534/g3.116.033654 -Pan2018 doi:10.1101/438218 -Pawlowski2016 doi:10.1101/085118 -Peng2019 doi:10.1101/527044 -Pereira2016_docking doi:10.1021/acs.jcim.6b00355 -PerezSianes2016_screening doi:10.1007/978-3-319-40126-3_2 -Phymm doi:10.1038/nmeth.1358 -Poplin2016_deepvariant doi:10.1101/092890 -Pratt2016_dr doi:10.1016/j.procs.2016.07.014 -Quach2017 doi:10.18632/aging.101168 -Quang2017_factor doi:10.1101/151274 -Qin2017_onehot doi:10.1371/journal.pcbi.1005403 -Qiu2017_graph_embedding doi:10.1101/110668 -Qiu2018 doi:10.1101/406066 -Ragoza2016_protein arxiv:1612.02751 -RAD2010_view_cc doi:10.1145/1721654.1721672 -Radford_dcgan arxiv:1511.06434v2 -Rajkomar2017_radiographs doi:10.1007/s10278-016-9914-9 -Rakhlin2018_histology doi:10.1101/259911 -Ramsundar2015_multitask_drug arxiv:1502.02072 -Ranganath2016_deep arxiv:1608.02158 -Raina2009_gpu doi:10.1145/1553374.1553486 -Relton2010 doi:10.1371/journal.pmed.1000356 -Ribeiro2016_lime arxiv:1602.04938 -Robertson2005 doi:10.1038/nrg1655 -Rogers2010_fingerprints doi:10.1021/ci100050t -Roth2015_view_agg_cad doi:10.1109/TMI.2015.2482920 -Romero2017_diet url:https://openreview.net/pdf?id=Sk-oDY9ge -Rosenberg2015_synthetic_seqs doi:10.1016/j.cell.2015.09.054 -Russakovsky2015_imagenet doi:10.1007/s11263-015-0816-y -Sa2015_buckwild pmcid:PMC4907892 -Salas2018_GR doi:10.1101/gr.233213.117 -Salas2018 doi:10.1186/s13059-018-1448-7 -Salzberg doi:10.1186/1471-2105-11-544 -Schatz2010_dna_cloud doi:10.1038/nbt0710-691 -Schmidhuber2014_dnn_overview doi:10.1016/j.neunet.2014.09.003 -Scotti2016_missplicing doi:10.1038/nrg.2015.3 -Segata doi:10.1371/journal.pcbi.1004977 -Segler2017_drug_design arxiv:1701.01329 -Seide2014_parallel doi:10.1109/ICASSP.2014.6853593 -Setty2015_seqgl doi:10.1371/journal.pcbi.1004271 -Selvaraju2016_grad arxiv:1610.02391 -Serden doi:10.1016/S0168-8510(02)00208-7 -Shaham2016_batch_effects doi:10.1093/bioinformatics/btx196 -Shapely doi:10.1515/9781400881970-018 -Shen2017_medimg_review doi:10.1146/annurev-bioeng-071516-044442 -Shin2016_cad_tl doi:10.1109/TMI.2016.2528162 -Shrikumar2017_learning arxiv:1704.02685 -Shrikumar2017_reversecomplement doi:10.1101/103663 -Simonyan2013_deep arxiv:1312.6034 -Singh2017_attentivechrome arxiv:1708.00339 -Singh2016_deepchrome arxiv:1607.02078 -Singh2016_tsk doi:10.1109/TCBB.2016.2609918 -Silver2016_alphago doi:10.1038/nature16961 -Sonderby doi:10.1007/978-3-319-21233-3_6 -Soueidan doi:10.1515/metgen-2016-0001 -Spark doi:10.1145/2934664 -Speech_recognition url:http://www.businessinsider.com/ibm-edges-closer-to-human-speech-recognition-2017-3 -Springenberg2014_striving arxiv:1412.6806 -Stein2010_cloud doi:10.1186/gb-2010-11-5-207 -Stenstrom2005_latent doi:10.2337/diabetes.54.suppl_2.S68 -Stormo2000_dna doi:10.1093/bioinformatics/16.1.16 -Stratnikov doi:10.1186/2049-2618-1-11 -Strobelt2016_visual arxiv:1606.07461 -Su2015_gpu arxiv:1507.01239 -Subramanian2016_bace1 doi:10.1021/acs.jcim.6b00290 -Sun2016_ensemble arxiv:1606.00575 -Sundararajan2017_axiomatic arxiv:1703.01365 -Sutskever arxiv:1409.3215 -Swamidass2009_irv doi:10.1021/ci8004379 -Tan2014_psb doi:10.1142/9789814644730_0014 -Tan2015_adage doi:10.1128/mSystems.00025-15 -Tan2016_eadage doi:10.1101/078659 -TAC-ELM doi:10.1142/S0219720012500151 -TensorFlow arxiv:1603.04467 -Teschendorff2017 doi:10.2217/epi-2016-0153 -Tian2019 doi:10.1186/s12864-019-5488-5 -Titus2017 doi:10.1093/hmg/ddx275 -Torracinta2016_deep_snp doi:10.1101/097469 -Torracinta2016_sim doi:10.1101/079087 -Tu1996_anns doi:10.1016/S0895-4356(96)00002-9 -Unterthiner2014_screening url:http://www.bioinf.at/publications/2014/NIPS2014a.pdf -Vanhoucke2011_cpu url:https://research.google.com/pubs/pub37631.html -Vera2016_sc_analysis doi:10.1146/annurev-genet-120215-034854 -Vervier doi:10.1093/bioinformatics/btv683 -Wallach2015_atom_net arxiv:1510.02855 -Wang2016_breast_cancer arxiv:1606.05718 -Wang2016_methyl doi:10.1038/srep19598 -Wang2016_protein_contact doi:10.1371/journal.pcbi.1005324 -Wasson1985_clinical doi:10.1056/NEJM198509263131306 -WayGreene2017_eval arxiv:1711.04828 -WayGreene2017_tybalt doi:10.1101/174474 -Wilhelm-Benartzi2013 doi:10.1038/bjc.2013.496 -Word2Vec arxiv:1301.3781 -wgsquikr doi:10.1371/journal.pone.0091784 -Wu2017_molecule_net doi:10.1039/C7SC02664A -Xiang doi:10.1016/S0167-9473(99)00098-5 -Xiong2011_bayesian doi:10.1093/bioinformatics/btr444 -Xiong2015_splicing_code doi:10.1126/science.1254806 -Xu2015_show arxiv:1502.03044 -Yasushi2016_cgbvs_dnn doi:10.1002/minf.201600045 -yok doi:10.1186/1471-2105-12-20 -Yoon2016_cancer_reports doi:10.1007/978-3-319-47898-2_21 -Yosinski2014 url:https://papers.nips.cc/paper/5347-how-transferable-are-features-in-deep-neural-networks -Yosinksi2015_understanding arxiv:1506.06579 -Yu2016_melanoma_resnet doi:10.1109/TMI.2016.2642839 -Zeiler2013_visualizing arxiv:1311.2901 -Zeng2015 doi:10.1186/s12859-015-0553-9 -Zeng2016_convolutional doi:10.1093/bioinformatics/btw255 -Zhang2015_multitask_tl doi:10.1145/2783258.2783304 -Zhang2017_generalization arxiv:1611.03530v2 -Zhang2019 doi:10.1186/s12885-019-5932-6 -Zhou2015_deep_sea doi:10.1038/nmeth.3547 -Zhu2016_advers_mamm doi:10.1101/095786 -Zhu2016_mult_inst_mamm doi:10.1101/095794 -Zintgraf2017_visualizing arxiv:1702.04595 -goodfellow2016deep url:http://www.deeplearningbook.org/ -li2016joint url:https://dl.acm.org/citation.cfm?id=3061018 -world2004international url:http://www.who.int/classifications/icd/en/ -ghahramani_protect arxiv:1707.02476 -uncertainty_types arxiv:1703.04977 -uncertainty_multi_task arxiv:1705.07115 -guo_calibration arxiv:1706.04599 -platt_scaling url:http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.41.1639 -out_dist_baseline arxiv:1610.02136 -temp_out_dist arxiv:1706.02690 -ai_safety arxiv:1606.06565 -strong_adversary arxiv:1705.07263 -retinopathy_uncertainty doi:10.1038/s41598-017-17876-z -bayesian_hypernets arxiv:1710.04759 -mcclure_bayesian arxiv:1611.01639 -uncertainty_ensembles arxiv:1612.01474 -domain_adapt_uncertainty arxiv:1505.07818 -gal_thesis url:http://www.cs.ox.ac.uk/people/yarin.gal/website/thesis/thesis.pdf