├── .Rbuildignore ├── .github └── workflows │ └── main.yml ├── .gitignore ├── 01-intro.Rmd ├── 02-literature.Rmd ├── 03-method.Rmd ├── 04-application.Rmd ├── 05-summary.Rmd ├── 06-references.Rmd ├── DESCRIPTION ├── README.md ├── _bookdown.yml ├── _bookdown_files └── bspagedjs_files │ └── figure-html │ ├── nice-fig-1.png │ └── unnamed-chunk-3-1.png ├── _output.yml ├── book.bib ├── bspagedjs.Rproj ├── build.R ├── index.Rmd ├── mathjax.html ├── package-lock.json ├── package.json ├── packages.bib └── style.css /.Rbuildignore: -------------------------------------------------------------------------------- 1 | ^.*\.Rproj$ 2 | ^\.Rproj\.user$ 3 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | 2 | on: 3 | push: 4 | branches: 5 | - master 6 | - main 7 | 8 | name: book-workflow 9 | 10 | jobs: 11 | bookdown: 12 | name: Render Book 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v2 16 | 17 | - uses: r-lib/actions/setup-r@v1 18 | 19 | - uses: r-lib/actions/setup-pandoc@v1 20 | 21 | - name: Cache R packages 22 | uses: actions/cache@v1 23 | with: 24 | path: ${{ env.R_LIBS_USER }} 25 | key: ${{ hashFiles('DESCRIPTION') }}-2 26 | 27 | - name: Install dependencies 28 | run: Rscript -e 'install.packages("remotes")' -e 'options(install.packages.check.source = "both")' -e 'remotes::install_deps(dependencies = TRUE)' -e 'remotes::install_github("rstudio/bslib")' 29 | 30 | - name: Why oh why 31 | run: Rscript -e 'requireNamespace("bslib")' 32 | 33 | - name: Render book html 34 | run: Rscript -e 'bookdown::render_book("index.Rmd")' 35 | 36 | - uses: actions/setup-node@v1 37 | 38 | - name: Install paged-js 39 | run: | 40 | npm install . -g 41 | npm install -g pagedjs-cli pagedjs --unsafe-perm=true 42 | 43 | - name: PDF 44 | run: Rscript -e 'source("build.R")' 45 | 46 | - name: Commit results 47 | run: | 48 | git config --global user.email "maelle.salmon@yahoo.se" 49 | git config --global user.name "Maëlle Salmon" 50 | cd docs 51 | git init 52 | git add . 53 | git commit -m 'new book' 54 | git push https://${{github.actor}}:${{secrets.GITHUB_TOKEN}}@github.com/${{github.repository}}.git HEAD:gh-pages --force 55 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .Rhistory 2 | .RData 3 | .Rproj.user 4 | node_modules 5 | docs 6 | -------------------------------------------------------------------------------- /01-intro.Rmd: -------------------------------------------------------------------------------- 1 | # Introduction {#intro} 2 | 3 | [Book PDF](result.pdf) 4 | 5 | You can label chapter and section titles using `{#label}` after them, e.g., we can reference Chapter \@ref(intro). If you do not manually label them, there will be automatic labels anyway, e.g., Chapter \@ref(methods). 6 | 7 |
8 |
9 |
10 | 11 | When \(a \ne 0\), there are two solutions to \(ax^2 + bx + c = 0\) and they are 12 | $$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$ 13 | 14 | ::: {.alert .alert-dismissible .alert-warning} 15 | BAD IDEA!! 16 | ::: 17 | 18 | Info 19 | 20 | Figures and tables with captions will be placed in `figure` and `table` environments, respectively. 21 | 22 | ```{r nice-fig, fig.cap='Here is a nice figure!', out.width='80%', fig.asp=.75, fig.align='center'} 23 | par(mar = c(4, 4, .1, .1)) 24 | plot(pressure, type = 'b', pch = 19) 25 | ``` 26 | 27 | Reference a figure by its code chunk label with the `fig:` prefix, e.g., see Figure \@ref(fig:nice-fig). Similarly, you can reference tables generated from `knitr::kable()`, e.g., see Table \@ref(tab:nice-tab). 28 | 29 | ## More! 30 | 31 | blabla 32 | 33 | ## Table 34 | 35 | ```{r nice-tab, tidy=FALSE} 36 | knitr::kable( 37 | head(iris, 20), caption = 'Here is a nice table!', 38 | booktabs = TRUE 39 | ) 40 | ``` 41 | 42 | You can write citations, too. For example, we are using the **bookdown** package [@R-bookdown] in this sample book, which was built on top of R Markdown and **knitr** [@xie2015]. 43 | -------------------------------------------------------------------------------- /02-literature.Rmd: -------------------------------------------------------------------------------- 1 | # Literature 2 | 3 | Here is a review of existing methods. 4 | -------------------------------------------------------------------------------- /03-method.Rmd: -------------------------------------------------------------------------------- 1 | # Methods 2 | 3 | We describe our methods in this chapter. 4 | -------------------------------------------------------------------------------- /04-application.Rmd: -------------------------------------------------------------------------------- 1 | # Applications 2 | 3 | Some _significant_ applications are demonstrated in this chapter. 4 | 5 | ## Example one 6 | 7 | ## Example two 8 | -------------------------------------------------------------------------------- /05-summary.Rmd: -------------------------------------------------------------------------------- 1 | # Final Words 2 | 3 | We have finished a nice book. 4 | -------------------------------------------------------------------------------- /06-references.Rmd: -------------------------------------------------------------------------------- 1 | `r if (knitr::is_html_output()) ' 2 | # References {-} 3 | '` 4 | -------------------------------------------------------------------------------- /DESCRIPTION: -------------------------------------------------------------------------------- 1 | Package: bspagedjs 2 | Title: bookdown::bs4_book() and pagedjs-cli fun 3 | Version: 0.0.0.9000 4 | Authors@R: 5 | person(given = "Maëlle", 6 | family = "Salmon", 7 | role = c("cre", "aut"), 8 | email = "msmaellesalmon@gmail.com", 9 | comment = c(ORCID = "0000-0002-2815-0399")) 10 | Description: What the package does (one paragraph). 11 | License: MIT + file LICENSE 12 | Encoding: UTF-8 13 | LazyData: true 14 | Roxygen: list(markdown = TRUE) 15 | RoxygenNote: 7.1.1.9000 16 | Suggests: 17 | bookdown (>= 0.21.3), 18 | bslib, 19 | downlit, 20 | xml2, 21 | fs 22 | Remotes: 23 | rstudio/bookdown, 24 | rstudio/bslib, 25 | r-lib/downlit, 26 | rstudio/htmltools, 27 | yihui/xfun 28 | URL: https://github.com/maelle/bspagedjs 29 | BugReports: https://github.com/maelle/bspagedjs/issues 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Book PDF without LaTeX? :sunglasses: 2 | 3 | This is a minimal example of a book based on R Markdown and **bookdown** (https://github.com/rstudio/bookdown). 4 | 5 | ## Result 6 | 7 | * [HTML](https://maelle.github.io/bspagedjs/index.html) 8 | * [PDF](https://maelle.github.io/bspagedjs/result.pdf) 9 | 10 | 11 | ## Context 12 | 13 | This uses the `bs4_book()` template for HTML and then for getting a PDF 14 | 15 | * tweaks of the HTML and merging of all chapters 16 | * some print CSS, see [stylesheet](style.css) 17 | * pagedjs-cli. 18 | 19 | See [build.R](build.R) 20 | 21 | Why use this and not LaTeX? 22 | 23 | * procrastination? :see_no_evil: 24 | * not having to redefine colors, environments for the LaTeX output 25 | * not having to knit the same Rmd's twice for the two outputs (which also excludes using pagedown). 26 | 27 | Why not pagedown? 28 | 29 | * I want a non paginated HTML in the browser, and I want the PDF to be pre-generated. 30 | 31 | 32 | ## What's needed? 33 | 34 | * dev bookdown and co to use `bs4_book()` 35 | * a stylesheet with print CSS 36 | * mathjax without loading messages see [mathjax.html](mathjax.html) (or no mathjax if your book does not feature equations) 37 | 38 | So in `_output.yml` e.g. 39 | 40 | ```yaml 41 | bookdown::bs4_book: 42 | theme: 43 | bootswatch: "litera" 44 | primary: "#982a31" 45 | fg: "#2b2121" 46 | bg: "#ffffff" 47 | repo: https://github.com/maelle/bspagedjs 48 | css: style.css 49 | mathjax: NULL 50 | includes: 51 | in_header: mathjax.html 52 | ``` 53 | 54 | * pagedjs-cli (locally, or using GitHub Actions) 55 | -------------------------------------------------------------------------------- /_bookdown.yml: -------------------------------------------------------------------------------- 1 | book_filename: "bspagedjs" 2 | delete_merged_file: true 3 | language: 4 | ui: 5 | chapter_name: "Chapter " 6 | output_dir: docs 7 | -------------------------------------------------------------------------------- /_bookdown_files/bspagedjs_files/figure-html/nice-fig-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maelle/bspagedjs/bea19c3ca1143d7b94b76bfe7567d0db8006f82d/_bookdown_files/bspagedjs_files/figure-html/nice-fig-1.png -------------------------------------------------------------------------------- /_bookdown_files/bspagedjs_files/figure-html/unnamed-chunk-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maelle/bspagedjs/bea19c3ca1143d7b94b76bfe7567d0db8006f82d/_bookdown_files/bspagedjs_files/figure-html/unnamed-chunk-3-1.png -------------------------------------------------------------------------------- /_output.yml: -------------------------------------------------------------------------------- 1 | bookdown::bs4_book: 2 | theme: 3 | bootswatch: "litera" 4 | primary: "#982a31" 5 | fg: "#2b2121" 6 | bg: "#ffffff" 7 | repo: https://github.com/maelle/bspagedjs 8 | css: style.css 9 | mathjax: NULL 10 | includes: 11 | in_header: mathjax.html 12 | -------------------------------------------------------------------------------- /book.bib: -------------------------------------------------------------------------------- 1 | @Book{xie2015, 2 | title = {Dynamic Documents with {R} and knitr}, 3 | author = {Yihui Xie}, 4 | publisher = {Chapman and Hall/CRC}, 5 | address = {Boca Raton, Florida}, 6 | year = {2015}, 7 | edition = {2nd}, 8 | note = {ISBN 978-1498716963}, 9 | url = {http://yihui.org/knitr/}, 10 | } 11 | -------------------------------------------------------------------------------- /bspagedjs.Rproj: -------------------------------------------------------------------------------- 1 | Version: 1.0 2 | 3 | RestoreWorkspace: Default 4 | SaveWorkspace: Default 5 | AlwaysSaveHistory: Default 6 | 7 | EnableCodeIndexing: Yes 8 | UseSpacesForTab: Yes 9 | NumSpacesForTab: 2 10 | Encoding: UTF-8 11 | 12 | RnwWeave: Sweave 13 | LaTeX: pdfLaTeX 14 | 15 | AutoAppendNewline: Yes 16 | StripTrailingWhitespace: Yes 17 | 18 | BuildType: Website 19 | -------------------------------------------------------------------------------- /build.R: -------------------------------------------------------------------------------- 1 | # the nice HTML book 2 | bookdown::render_book("index.Rmd") 3 | 4 | # the place where we tweak, merge and print HTMLs 5 | if (fs::dir_exists("docs2")) fs::dir_delete("docs2") 6 | fs::dir_copy("docs", "docs2") 7 | 8 | htmls <- fs::dir_ls("docs2", glob = "*.html") 9 | 10 | tweak_page <- function(page_path) { 11 | # put TOC at the beginning and fix text 12 | page <- xml2::read_html(page_path) 13 | page_toc <- xml2::xml_find_first(page, ".//nav[@id='toc']") 14 | toc_title <- xml2::xml_find_first(page_toc, "h2") 15 | xml2::xml_text(toc_title) <- "In this chapter" 16 | source_title <- xml2::xml_find_first(page_toc, "//a[@id='book-edit']") 17 | xml2::xml_text(source_title) <- "Edit this chapter" 18 | 19 | xml2::xml_add_sibling( 20 | xml2::xml_find_first(page, ".//main[@id='content']//h1"), 21 | page_toc, 22 | where = "after" 23 | ) 24 | xml2::xml_remove(page_toc) 25 | 26 | # fix cross-refs 27 | hrefs <- xml2::xml_find_all(page, ".//a") 28 | xml2::xml_attr(hrefs, "href") <- gsub("^.*\\.html#", "#", xml2::xml_attr(hrefs, "href")) 29 | 30 | xml2::write_html(page, page_path) 31 | } 32 | 33 | lapply(htmls, tweak_page) 34 | 35 | # Now we'll add the main content of all pages to index dot html 36 | page1 <- xml2::read_html("docs2/index.html") 37 | 38 | 39 | 40 | get_contents <- function(page_path, main = xml2::xml_find_first(page1, ".//main[@id='content']")) { 41 | page <- xml2::read_html(page_path) 42 | contents <- xml2::xml_contents(xml2::xml_find_first(page, ".//main[@id='content']")) 43 | 44 | for (i in contents) { 45 | xml2::xml_add_child(main, i) 46 | } 47 | } 48 | 49 | # Important to get HTMLs in the right order, thanks book TOC 50 | ordered_htmls <- xml2::xml_attr( 51 | xml2::xml_find_all(page1, ".//ul[contains(@class, 'book-toc')]//li//a"), 52 | "href" 53 | ) 54 | ordered_htmls <- ordered_htmls[ordered_htmls!="index.html"] 55 | ordered_htmls <- file.path("docs2", ordered_htmls) 56 | 57 | lapply(ordered_htmls, get_contents) 58 | 59 | # fix toc links 60 | toc <- xml2::xml_find_first(page1, ".//nav") 61 | active <- xml2::xml_find_first(toc, ".//a[@class='active']") 62 | xml2::xml_attr(active, "class") <- '' 63 | toc_links <- xml2::xml_find_all(toc, ".//a[@class='']") 64 | xml2::xml_attr(toc_links, "href") <- paste0( 65 | "#", 66 | gsub( 67 | "\\.html$", 68 | "", 69 | xml2::xml_attr(toc_links, "href") 70 | ) 71 | ) 72 | # fix first anchor 73 | xml2::xml_attr(toc_links[1], "href") <- xml2::xml_attr(xml2::xml_find_first(page1, ".//a[@class='anchor']"), "href") 74 | 75 | for (i in rev(xml2::xml_contents(toc))) { 76 | 77 | xml2::xml_add_sibling( 78 | xml2::xml_child(xml2::xml_find_first(page1, ".//main[@id='content']")), 79 | i, 80 | .where = "before" 81 | ) 82 | } 83 | 84 | 85 | xml2::write_html(page1, "docs2/index.html") 86 | 87 | # Print! 88 | system("pagedjs-cli ./docs2/index.html -o docs/result.pdf -w 227 -h 291") 89 | -------------------------------------------------------------------------------- /index.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "A Minimal Book Example" 3 | author: "Yihui Xie" 4 | date: "`r Sys.Date()`" 5 | site: bookdown::bookdown_site 6 | documentclass: book 7 | bibliography: [book.bib, packages.bib] 8 | biblio-style: apalike 9 | link-citations: yes 10 | description: "This is a minimal example of using the bookdown package to write a book. The output format for this example is bookdown::gitbook." 11 | --- 12 | 13 | # Prerequisites 14 | 15 | This is a _sample_ book written in **Markdown**. You can use anything that Pandoc's Markdown supports, e.g., a math equation $a^2 + b^2 = c^2$. 16 | 17 | The **bookdown** package can be installed from CRAN or Github: 18 | 19 | ```{r eval=FALSE} 20 | install.packages("bookdown") 21 | # or the development version 22 | # devtools::install_github("rstudio/bookdown") 23 | ``` 24 | 25 | Remember each Rmd file contains one and only one chapter, and a chapter is defined by the first-level heading `#`. 26 | 27 | To compile this example to PDF, you need XeLaTeX. You are recommended to install TinyTeX (which includes XeLaTeX): . 28 | 29 | ```{r include=FALSE} 30 | # automatically create a bib database for R packages 31 | knitr::write_bib(c( 32 | .packages(), 'bookdown', 'knitr', 'rmarkdown' 33 | ), 'packages.bib') 34 | ``` 35 | -------------------------------------------------------------------------------- /mathjax.html: -------------------------------------------------------------------------------- 1 | 4 | 6 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "testsite", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/polyfill": { 8 | "version": "7.12.1", 9 | "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.12.1.tgz", 10 | "integrity": "sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==", 11 | "requires": { 12 | "core-js": "^2.6.5", 13 | "regenerator-runtime": "^0.13.4" 14 | } 15 | }, 16 | "@babel/runtime": { 17 | "version": "7.12.5", 18 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", 19 | "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", 20 | "requires": { 21 | "regenerator-runtime": "^0.13.4" 22 | } 23 | }, 24 | "@pdf-lib/fontkit": { 25 | "version": "0.0.4", 26 | "resolved": "https://registry.npmjs.org/@pdf-lib/fontkit/-/fontkit-0.0.4.tgz", 27 | "integrity": "sha512-MfwaMqLKRuXXOuTisAUiie+cBH/Wo50SPBDQB5tmVqEHpJGkyh7eYi/xPgFugtPHEeWP6INUk5t9L7IAbV7jmw==", 28 | "requires": { 29 | "pako": "^1.0.6" 30 | } 31 | }, 32 | "@pdf-lib/standard-fonts": { 33 | "version": "0.0.4", 34 | "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-0.0.4.tgz", 35 | "integrity": "sha512-2pg8hXnChVAF6aSFraXtwB0cx/AgE15FvuLJbdPJSq9LYp1xMp0lapH4+t1HsdD9cA05rnWYLqlEBwS4YK1jLg==", 36 | "requires": { 37 | "base64-arraybuffer": "^0.1.5", 38 | "pako": "^1.0.6" 39 | } 40 | }, 41 | "@types/mime-types": { 42 | "version": "2.1.0", 43 | "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", 44 | "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=" 45 | }, 46 | "accepts": { 47 | "version": "1.3.7", 48 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 49 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 50 | "requires": { 51 | "mime-types": "~2.1.24", 52 | "negotiator": "0.6.2" 53 | } 54 | }, 55 | "agent-base": { 56 | "version": "5.1.1", 57 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", 58 | "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" 59 | }, 60 | "ansi-regex": { 61 | "version": "5.0.0", 62 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 63 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 64 | }, 65 | "ansi-styles": { 66 | "version": "4.3.0", 67 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 68 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 69 | "requires": { 70 | "color-convert": "^2.0.1" 71 | } 72 | }, 73 | "array-flatten": { 74 | "version": "1.1.1", 75 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 76 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 77 | }, 78 | "async-limiter": { 79 | "version": "1.0.1", 80 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 81 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" 82 | }, 83 | "balanced-match": { 84 | "version": "1.0.0", 85 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 86 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 87 | }, 88 | "base64-arraybuffer": { 89 | "version": "0.1.5", 90 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", 91 | "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" 92 | }, 93 | "body-parser": { 94 | "version": "1.19.0", 95 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 96 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 97 | "requires": { 98 | "bytes": "3.1.0", 99 | "content-type": "~1.0.4", 100 | "debug": "2.6.9", 101 | "depd": "~1.1.2", 102 | "http-errors": "1.7.2", 103 | "iconv-lite": "0.4.24", 104 | "on-finished": "~2.3.0", 105 | "qs": "6.7.0", 106 | "raw-body": "2.4.0", 107 | "type-is": "~1.6.17" 108 | } 109 | }, 110 | "brace-expansion": { 111 | "version": "1.1.11", 112 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 113 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 114 | "requires": { 115 | "balanced-match": "^1.0.0", 116 | "concat-map": "0.0.1" 117 | } 118 | }, 119 | "buffer-crc32": { 120 | "version": "0.2.13", 121 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 122 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 123 | }, 124 | "buffer-from": { 125 | "version": "1.1.1", 126 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 127 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 128 | }, 129 | "bytes": { 130 | "version": "3.1.0", 131 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 132 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 133 | }, 134 | "chalk": { 135 | "version": "3.0.0", 136 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 137 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 138 | "requires": { 139 | "ansi-styles": "^4.1.0", 140 | "supports-color": "^7.1.0" 141 | } 142 | }, 143 | "clear-cut": { 144 | "version": "2.0.2", 145 | "resolved": "https://registry.npmjs.org/clear-cut/-/clear-cut-2.0.2.tgz", 146 | "integrity": "sha1-CC2zLsqkSjWKewhoUv4dVIC77tE=" 147 | }, 148 | "cli-cursor": { 149 | "version": "3.1.0", 150 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 151 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 152 | "requires": { 153 | "restore-cursor": "^3.1.0" 154 | } 155 | }, 156 | "cli-spinners": { 157 | "version": "2.5.0", 158 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", 159 | "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==" 160 | }, 161 | "clone": { 162 | "version": "1.0.4", 163 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 164 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" 165 | }, 166 | "color-convert": { 167 | "version": "2.0.1", 168 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 169 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 170 | "requires": { 171 | "color-name": "~1.1.4" 172 | } 173 | }, 174 | "color-name": { 175 | "version": "1.1.4", 176 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 177 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 178 | }, 179 | "commander": { 180 | "version": "3.0.2", 181 | "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", 182 | "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" 183 | }, 184 | "concat-map": { 185 | "version": "0.0.1", 186 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 187 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 188 | }, 189 | "concat-stream": { 190 | "version": "1.6.2", 191 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 192 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 193 | "requires": { 194 | "buffer-from": "^1.0.0", 195 | "inherits": "^2.0.3", 196 | "readable-stream": "^2.2.2", 197 | "typedarray": "^0.0.6" 198 | } 199 | }, 200 | "content-disposition": { 201 | "version": "0.5.3", 202 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 203 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 204 | "requires": { 205 | "safe-buffer": "5.1.2" 206 | } 207 | }, 208 | "content-type": { 209 | "version": "1.0.4", 210 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 211 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 212 | }, 213 | "cookie": { 214 | "version": "0.4.0", 215 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 216 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 217 | }, 218 | "cookie-signature": { 219 | "version": "1.0.6", 220 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 221 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 222 | }, 223 | "core-js": { 224 | "version": "2.6.11", 225 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", 226 | "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" 227 | }, 228 | "core-util-is": { 229 | "version": "1.0.2", 230 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 231 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 232 | }, 233 | "css-tree": { 234 | "version": "1.0.0-alpha.39", 235 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", 236 | "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", 237 | "requires": { 238 | "mdn-data": "2.0.6", 239 | "source-map": "^0.6.1" 240 | } 241 | }, 242 | "d": { 243 | "version": "1.0.1", 244 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", 245 | "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", 246 | "requires": { 247 | "es5-ext": "^0.10.50", 248 | "type": "^1.0.1" 249 | } 250 | }, 251 | "debug": { 252 | "version": "2.6.9", 253 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 254 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 255 | "requires": { 256 | "ms": "2.0.0" 257 | } 258 | }, 259 | "defaults": { 260 | "version": "1.0.3", 261 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", 262 | "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", 263 | "requires": { 264 | "clone": "^1.0.2" 265 | } 266 | }, 267 | "depd": { 268 | "version": "1.1.2", 269 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 270 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 271 | }, 272 | "destroy": { 273 | "version": "1.0.4", 274 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 275 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 276 | }, 277 | "ee-first": { 278 | "version": "1.1.1", 279 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 280 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 281 | }, 282 | "encodeurl": { 283 | "version": "1.0.2", 284 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 285 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 286 | }, 287 | "es5-ext": { 288 | "version": "0.10.53", 289 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", 290 | "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", 291 | "requires": { 292 | "es6-iterator": "~2.0.3", 293 | "es6-symbol": "~3.1.3", 294 | "next-tick": "~1.0.0" 295 | } 296 | }, 297 | "es6-iterator": { 298 | "version": "2.0.3", 299 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 300 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", 301 | "requires": { 302 | "d": "1", 303 | "es5-ext": "^0.10.35", 304 | "es6-symbol": "^3.1.1" 305 | } 306 | }, 307 | "es6-symbol": { 308 | "version": "3.1.3", 309 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", 310 | "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", 311 | "requires": { 312 | "d": "^1.0.1", 313 | "ext": "^1.1.2" 314 | } 315 | }, 316 | "escape-html": { 317 | "version": "1.0.3", 318 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 319 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 320 | }, 321 | "escape-string-regexp": { 322 | "version": "1.0.5", 323 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 324 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 325 | }, 326 | "etag": { 327 | "version": "1.8.1", 328 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 329 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 330 | }, 331 | "event-emitter": { 332 | "version": "0.3.5", 333 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 334 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", 335 | "requires": { 336 | "d": "1", 337 | "es5-ext": "~0.10.14" 338 | } 339 | }, 340 | "express": { 341 | "version": "4.17.1", 342 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 343 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 344 | "requires": { 345 | "accepts": "~1.3.7", 346 | "array-flatten": "1.1.1", 347 | "body-parser": "1.19.0", 348 | "content-disposition": "0.5.3", 349 | "content-type": "~1.0.4", 350 | "cookie": "0.4.0", 351 | "cookie-signature": "1.0.6", 352 | "debug": "2.6.9", 353 | "depd": "~1.1.2", 354 | "encodeurl": "~1.0.2", 355 | "escape-html": "~1.0.3", 356 | "etag": "~1.8.1", 357 | "finalhandler": "~1.1.2", 358 | "fresh": "0.5.2", 359 | "merge-descriptors": "1.0.1", 360 | "methods": "~1.1.2", 361 | "on-finished": "~2.3.0", 362 | "parseurl": "~1.3.3", 363 | "path-to-regexp": "0.1.7", 364 | "proxy-addr": "~2.0.5", 365 | "qs": "6.7.0", 366 | "range-parser": "~1.2.1", 367 | "safe-buffer": "5.1.2", 368 | "send": "0.17.1", 369 | "serve-static": "1.14.1", 370 | "setprototypeof": "1.1.1", 371 | "statuses": "~1.5.0", 372 | "type-is": "~1.6.18", 373 | "utils-merge": "1.0.1", 374 | "vary": "~1.1.2" 375 | } 376 | }, 377 | "ext": { 378 | "version": "1.4.0", 379 | "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", 380 | "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", 381 | "requires": { 382 | "type": "^2.0.0" 383 | }, 384 | "dependencies": { 385 | "type": { 386 | "version": "2.1.0", 387 | "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", 388 | "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" 389 | } 390 | } 391 | }, 392 | "extract-zip": { 393 | "version": "1.7.0", 394 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", 395 | "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", 396 | "requires": { 397 | "concat-stream": "^1.6.2", 398 | "debug": "^2.6.9", 399 | "mkdirp": "^0.5.4", 400 | "yauzl": "^2.10.0" 401 | } 402 | }, 403 | "fd-slicer": { 404 | "version": "1.1.0", 405 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 406 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 407 | "requires": { 408 | "pend": "~1.2.0" 409 | } 410 | }, 411 | "finalhandler": { 412 | "version": "1.1.2", 413 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 414 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 415 | "requires": { 416 | "debug": "2.6.9", 417 | "encodeurl": "~1.0.2", 418 | "escape-html": "~1.0.3", 419 | "on-finished": "~2.3.0", 420 | "parseurl": "~1.3.3", 421 | "statuses": "~1.5.0", 422 | "unpipe": "~1.0.0" 423 | } 424 | }, 425 | "forwarded": { 426 | "version": "0.1.2", 427 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 428 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 429 | }, 430 | "fresh": { 431 | "version": "0.5.2", 432 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 433 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 434 | }, 435 | "fs.realpath": { 436 | "version": "1.0.0", 437 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 438 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 439 | }, 440 | "glob": { 441 | "version": "7.1.6", 442 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 443 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 444 | "requires": { 445 | "fs.realpath": "^1.0.0", 446 | "inflight": "^1.0.4", 447 | "inherits": "2", 448 | "minimatch": "^3.0.4", 449 | "once": "^1.3.0", 450 | "path-is-absolute": "^1.0.0" 451 | } 452 | }, 453 | "has-flag": { 454 | "version": "4.0.0", 455 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 456 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 457 | }, 458 | "http-errors": { 459 | "version": "1.7.2", 460 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 461 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 462 | "requires": { 463 | "depd": "~1.1.2", 464 | "inherits": "2.0.3", 465 | "setprototypeof": "1.1.1", 466 | "statuses": ">= 1.5.0 < 2", 467 | "toidentifier": "1.0.0" 468 | } 469 | }, 470 | "https-proxy-agent": { 471 | "version": "4.0.0", 472 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", 473 | "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", 474 | "requires": { 475 | "agent-base": "5", 476 | "debug": "4" 477 | }, 478 | "dependencies": { 479 | "debug": { 480 | "version": "4.2.0", 481 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", 482 | "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", 483 | "requires": { 484 | "ms": "2.1.2" 485 | } 486 | }, 487 | "ms": { 488 | "version": "2.1.2", 489 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 490 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 491 | } 492 | } 493 | }, 494 | "hyphenopoly": { 495 | "version": "3.4.0", 496 | "resolved": "https://registry.npmjs.org/hyphenopoly/-/hyphenopoly-3.4.0.tgz", 497 | "integrity": "sha512-FZM+oRkCSGh18RdAo38OuUM1YcteWndUlWWKrTdhoDEARAIDPwuEyib2/ugZtkgL07lDcu/nWi13F1j85Hi5Sw==" 498 | }, 499 | "iconv-lite": { 500 | "version": "0.4.24", 501 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 502 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 503 | "requires": { 504 | "safer-buffer": ">= 2.1.2 < 3" 505 | } 506 | }, 507 | "inflight": { 508 | "version": "1.0.6", 509 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 510 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 511 | "requires": { 512 | "once": "^1.3.0", 513 | "wrappy": "1" 514 | } 515 | }, 516 | "inherits": { 517 | "version": "2.0.3", 518 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 519 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 520 | }, 521 | "ipaddr.js": { 522 | "version": "1.9.1", 523 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 524 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 525 | }, 526 | "is-interactive": { 527 | "version": "1.0.0", 528 | "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", 529 | "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" 530 | }, 531 | "isarray": { 532 | "version": "1.0.0", 533 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 534 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 535 | }, 536 | "katex": { 537 | "version": "0.11.1", 538 | "resolved": "https://registry.npmjs.org/katex/-/katex-0.11.1.tgz", 539 | "integrity": "sha512-5oANDICCTX0NqYIyAiFCCwjQ7ERu3DQG2JFHLbYOf+fXaMoH8eg/zOq5WSYJsKMi/QebW+Eh3gSM+oss1H/bww==", 540 | "requires": { 541 | "commander": "^2.19.0" 542 | }, 543 | "dependencies": { 544 | "commander": { 545 | "version": "2.20.3", 546 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 547 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 548 | } 549 | } 550 | }, 551 | "lodash": { 552 | "version": "4.17.20", 553 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 554 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 555 | }, 556 | "log-symbols": { 557 | "version": "3.0.0", 558 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", 559 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", 560 | "requires": { 561 | "chalk": "^2.4.2" 562 | }, 563 | "dependencies": { 564 | "ansi-styles": { 565 | "version": "3.2.1", 566 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 567 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 568 | "requires": { 569 | "color-convert": "^1.9.0" 570 | } 571 | }, 572 | "chalk": { 573 | "version": "2.4.2", 574 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 575 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 576 | "requires": { 577 | "ansi-styles": "^3.2.1", 578 | "escape-string-regexp": "^1.0.5", 579 | "supports-color": "^5.3.0" 580 | } 581 | }, 582 | "color-convert": { 583 | "version": "1.9.3", 584 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 585 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 586 | "requires": { 587 | "color-name": "1.1.3" 588 | } 589 | }, 590 | "color-name": { 591 | "version": "1.1.3", 592 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 593 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 594 | }, 595 | "has-flag": { 596 | "version": "3.0.0", 597 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 598 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 599 | }, 600 | "supports-color": { 601 | "version": "5.5.0", 602 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 603 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 604 | "requires": { 605 | "has-flag": "^3.0.0" 606 | } 607 | } 608 | } 609 | }, 610 | "mathjax": { 611 | "version": "3.1.2", 612 | "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.1.2.tgz", 613 | "integrity": "sha512-BojKspBv4nNWzO1wC6VEI+g9gHDOhkaGHGgLxXkasdU4pwjdO5AXD5M/wcLPkXYPjZ/N+6sU8rjQTlyvN2cWiQ==" 614 | }, 615 | "mdn-data": { 616 | "version": "2.0.6", 617 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", 618 | "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==" 619 | }, 620 | "media-typer": { 621 | "version": "0.3.0", 622 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 623 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 624 | }, 625 | "merge-descriptors": { 626 | "version": "1.0.1", 627 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 628 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 629 | }, 630 | "methods": { 631 | "version": "1.1.2", 632 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 633 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 634 | }, 635 | "mime": { 636 | "version": "1.6.0", 637 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 638 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 639 | }, 640 | "mime-db": { 641 | "version": "1.44.0", 642 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 643 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 644 | }, 645 | "mime-types": { 646 | "version": "2.1.27", 647 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 648 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 649 | "requires": { 650 | "mime-db": "1.44.0" 651 | } 652 | }, 653 | "mimic-fn": { 654 | "version": "2.1.0", 655 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 656 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 657 | }, 658 | "minimatch": { 659 | "version": "3.0.4", 660 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 661 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 662 | "requires": { 663 | "brace-expansion": "^1.1.7" 664 | } 665 | }, 666 | "minimist": { 667 | "version": "1.2.5", 668 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 669 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 670 | }, 671 | "mkdirp": { 672 | "version": "0.5.5", 673 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 674 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 675 | "requires": { 676 | "minimist": "^1.2.5" 677 | } 678 | }, 679 | "ms": { 680 | "version": "2.0.0", 681 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 682 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 683 | }, 684 | "mute-stream": { 685 | "version": "0.0.8", 686 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 687 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 688 | }, 689 | "negotiator": { 690 | "version": "0.6.2", 691 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 692 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 693 | }, 694 | "next-tick": { 695 | "version": "1.0.0", 696 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", 697 | "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" 698 | }, 699 | "node-fetch": { 700 | "version": "2.6.1", 701 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 702 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 703 | }, 704 | "on-finished": { 705 | "version": "2.3.0", 706 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 707 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 708 | "requires": { 709 | "ee-first": "1.1.1" 710 | } 711 | }, 712 | "once": { 713 | "version": "1.4.0", 714 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 715 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 716 | "requires": { 717 | "wrappy": "1" 718 | } 719 | }, 720 | "onetime": { 721 | "version": "5.1.2", 722 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 723 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 724 | "requires": { 725 | "mimic-fn": "^2.1.0" 726 | } 727 | }, 728 | "ora": { 729 | "version": "4.1.1", 730 | "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", 731 | "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", 732 | "requires": { 733 | "chalk": "^3.0.0", 734 | "cli-cursor": "^3.1.0", 735 | "cli-spinners": "^2.2.0", 736 | "is-interactive": "^1.0.0", 737 | "log-symbols": "^3.0.0", 738 | "mute-stream": "0.0.8", 739 | "strip-ansi": "^6.0.0", 740 | "wcwidth": "^1.0.1" 741 | } 742 | }, 743 | "pagedjs": { 744 | "version": "0.1.43", 745 | "resolved": "https://registry.npmjs.org/pagedjs/-/pagedjs-0.1.43.tgz", 746 | "integrity": "sha512-aShTeMKnF64b1ywLBt/yv2ZCw6ypxsmbRchJ/0Fd3qOodqywPLofyKsCrkgZnWtQGRZ2KeBLO+zv0r3oKprPcQ==", 747 | "requires": { 748 | "@babel/polyfill": "^7.10.1", 749 | "@babel/runtime": "^7.10.2", 750 | "clear-cut": "^2.0.2", 751 | "css-tree": "1.0.0-alpha.39", 752 | "event-emitter": "^0.3.5" 753 | } 754 | }, 755 | "pagedjs-cli": { 756 | "version": "0.0.10", 757 | "resolved": "https://registry.npmjs.org/pagedjs-cli/-/pagedjs-cli-0.0.10.tgz", 758 | "integrity": "sha512-KdQQ6dSIt5xOjsBYlxK/UbpkFhVqknDvI1xP11k6X3Wz/D00uC6/rvKsZlPGkGaCArlh1UOd2tkmGu+m7KURpw==", 759 | "requires": { 760 | "commander": "^3.0.2", 761 | "express": "^4.17.1", 762 | "hyphenopoly": "^3.2.1", 763 | "katex": "^0.11.1", 764 | "lodash": "^4.17.15", 765 | "mathjax": "^3.0.0", 766 | "node-fetch": "^2.6.0", 767 | "ora": "^4.0.2", 768 | "pagedjs": "0.1.34", 769 | "pdf-lib": "0.6.4", 770 | "puppeteer": "^2.0.0", 771 | "replace-ext": "^1.0.0" 772 | }, 773 | "dependencies": { 774 | "css-tree": { 775 | "version": "1.0.0-alpha.29", 776 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", 777 | "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", 778 | "requires": { 779 | "mdn-data": "~1.1.0", 780 | "source-map": "^0.5.3" 781 | } 782 | }, 783 | "mdn-data": { 784 | "version": "1.1.4", 785 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", 786 | "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" 787 | }, 788 | "pagedjs": { 789 | "version": "0.1.34", 790 | "resolved": "https://registry.npmjs.org/pagedjs/-/pagedjs-0.1.34.tgz", 791 | "integrity": "sha512-ilBSaChoy8gulel16LTz8IkFDrZdVRkSBqW+TNmmDLGzo2g32EVXekc9mHQ76LnH7KTrAU3uJns80PwQlE22nQ==", 792 | "requires": { 793 | "@babel/polyfill": "^7.4.4", 794 | "@babel/runtime": "^7.4.4", 795 | "css-tree": "1.0.0-alpha.29", 796 | "event-emitter": "^0.3.5", 797 | "lodash": "^4.17.11" 798 | } 799 | }, 800 | "source-map": { 801 | "version": "0.5.7", 802 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 803 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 804 | } 805 | } 806 | }, 807 | "pako": { 808 | "version": "1.0.11", 809 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 810 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 811 | }, 812 | "parseurl": { 813 | "version": "1.3.3", 814 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 815 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 816 | }, 817 | "path-is-absolute": { 818 | "version": "1.0.1", 819 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 820 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 821 | }, 822 | "path-to-regexp": { 823 | "version": "0.1.7", 824 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 825 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 826 | }, 827 | "pdf-lib": { 828 | "version": "0.6.4", 829 | "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-0.6.4.tgz", 830 | "integrity": "sha512-5gkZnUgud2q/UDLNIKiHUdrrh8jadKRdMVnr+gdlCRctx+NooU/84iQAplmcy3AQmwMltCD6q8VVzVZJ8XZ8qw==", 831 | "requires": { 832 | "@pdf-lib/fontkit": "^0.0.4", 833 | "@pdf-lib/standard-fonts": "^0.0.4", 834 | "lodash": "^4.17.4", 835 | "pako": "^1.0.6", 836 | "png-ts": "^0.0.3", 837 | "proxy-polyfill": "^0.3.0" 838 | } 839 | }, 840 | "pend": { 841 | "version": "1.2.0", 842 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 843 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 844 | }, 845 | "png-ts": { 846 | "version": "0.0.3", 847 | "resolved": "https://registry.npmjs.org/png-ts/-/png-ts-0.0.3.tgz", 848 | "integrity": "sha512-Qwn3yMfbrbaN86QjrDAqD1UVJc4AV4hvBCx5Dv9libLd6D20xKtgOFs/UcvD0nnjxWlgS12kEVWCDFd9ZtwB+g==", 849 | "requires": { 850 | "pako": "^1.0.6" 851 | } 852 | }, 853 | "process-nextick-args": { 854 | "version": "2.0.1", 855 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 856 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 857 | }, 858 | "progress": { 859 | "version": "2.0.3", 860 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 861 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 862 | }, 863 | "proxy-addr": { 864 | "version": "2.0.6", 865 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 866 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 867 | "requires": { 868 | "forwarded": "~0.1.2", 869 | "ipaddr.js": "1.9.1" 870 | } 871 | }, 872 | "proxy-from-env": { 873 | "version": "1.1.0", 874 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 875 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 876 | }, 877 | "proxy-polyfill": { 878 | "version": "0.3.2", 879 | "resolved": "https://registry.npmjs.org/proxy-polyfill/-/proxy-polyfill-0.3.2.tgz", 880 | "integrity": "sha512-ENKSXOMCewnQTOyqrQXxEjIhzT6dy572mtehiItbDoIUF5Sv5UkmRUc8kowg2MFvr232Uo8rwRpNg3V5kgTKbA==" 881 | }, 882 | "puppeteer": { 883 | "version": "2.1.1", 884 | "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", 885 | "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", 886 | "requires": { 887 | "@types/mime-types": "^2.1.0", 888 | "debug": "^4.1.0", 889 | "extract-zip": "^1.6.6", 890 | "https-proxy-agent": "^4.0.0", 891 | "mime": "^2.0.3", 892 | "mime-types": "^2.1.25", 893 | "progress": "^2.0.1", 894 | "proxy-from-env": "^1.0.0", 895 | "rimraf": "^2.6.1", 896 | "ws": "^6.1.0" 897 | }, 898 | "dependencies": { 899 | "debug": { 900 | "version": "4.2.0", 901 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", 902 | "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", 903 | "requires": { 904 | "ms": "2.1.2" 905 | } 906 | }, 907 | "mime": { 908 | "version": "2.4.6", 909 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", 910 | "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" 911 | }, 912 | "ms": { 913 | "version": "2.1.2", 914 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 915 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 916 | } 917 | } 918 | }, 919 | "qs": { 920 | "version": "6.7.0", 921 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 922 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 923 | }, 924 | "range-parser": { 925 | "version": "1.2.1", 926 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 927 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 928 | }, 929 | "raw-body": { 930 | "version": "2.4.0", 931 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 932 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 933 | "requires": { 934 | "bytes": "3.1.0", 935 | "http-errors": "1.7.2", 936 | "iconv-lite": "0.4.24", 937 | "unpipe": "1.0.0" 938 | } 939 | }, 940 | "readable-stream": { 941 | "version": "2.3.7", 942 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 943 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 944 | "requires": { 945 | "core-util-is": "~1.0.0", 946 | "inherits": "~2.0.3", 947 | "isarray": "~1.0.0", 948 | "process-nextick-args": "~2.0.0", 949 | "safe-buffer": "~5.1.1", 950 | "string_decoder": "~1.1.1", 951 | "util-deprecate": "~1.0.1" 952 | } 953 | }, 954 | "regenerator-runtime": { 955 | "version": "0.13.7", 956 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", 957 | "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" 958 | }, 959 | "replace-ext": { 960 | "version": "1.0.1", 961 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", 962 | "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" 963 | }, 964 | "restore-cursor": { 965 | "version": "3.1.0", 966 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 967 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 968 | "requires": { 969 | "onetime": "^5.1.0", 970 | "signal-exit": "^3.0.2" 971 | } 972 | }, 973 | "rimraf": { 974 | "version": "2.7.1", 975 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 976 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 977 | "requires": { 978 | "glob": "^7.1.3" 979 | } 980 | }, 981 | "safe-buffer": { 982 | "version": "5.1.2", 983 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 984 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 985 | }, 986 | "safer-buffer": { 987 | "version": "2.1.2", 988 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 989 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 990 | }, 991 | "send": { 992 | "version": "0.17.1", 993 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 994 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 995 | "requires": { 996 | "debug": "2.6.9", 997 | "depd": "~1.1.2", 998 | "destroy": "~1.0.4", 999 | "encodeurl": "~1.0.2", 1000 | "escape-html": "~1.0.3", 1001 | "etag": "~1.8.1", 1002 | "fresh": "0.5.2", 1003 | "http-errors": "~1.7.2", 1004 | "mime": "1.6.0", 1005 | "ms": "2.1.1", 1006 | "on-finished": "~2.3.0", 1007 | "range-parser": "~1.2.1", 1008 | "statuses": "~1.5.0" 1009 | }, 1010 | "dependencies": { 1011 | "ms": { 1012 | "version": "2.1.1", 1013 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1014 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1015 | } 1016 | } 1017 | }, 1018 | "serve-static": { 1019 | "version": "1.14.1", 1020 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1021 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1022 | "requires": { 1023 | "encodeurl": "~1.0.2", 1024 | "escape-html": "~1.0.3", 1025 | "parseurl": "~1.3.3", 1026 | "send": "0.17.1" 1027 | } 1028 | }, 1029 | "setprototypeof": { 1030 | "version": "1.1.1", 1031 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1032 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1033 | }, 1034 | "signal-exit": { 1035 | "version": "3.0.3", 1036 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1037 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 1038 | }, 1039 | "source-map": { 1040 | "version": "0.6.1", 1041 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1042 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1043 | }, 1044 | "statuses": { 1045 | "version": "1.5.0", 1046 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1047 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1048 | }, 1049 | "string_decoder": { 1050 | "version": "1.1.1", 1051 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1052 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1053 | "requires": { 1054 | "safe-buffer": "~5.1.0" 1055 | } 1056 | }, 1057 | "strip-ansi": { 1058 | "version": "6.0.0", 1059 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1060 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1061 | "requires": { 1062 | "ansi-regex": "^5.0.0" 1063 | } 1064 | }, 1065 | "supports-color": { 1066 | "version": "7.2.0", 1067 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1068 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1069 | "requires": { 1070 | "has-flag": "^4.0.0" 1071 | } 1072 | }, 1073 | "toidentifier": { 1074 | "version": "1.0.0", 1075 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1076 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1077 | }, 1078 | "type": { 1079 | "version": "1.2.0", 1080 | "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", 1081 | "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" 1082 | }, 1083 | "type-is": { 1084 | "version": "1.6.18", 1085 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1086 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1087 | "requires": { 1088 | "media-typer": "0.3.0", 1089 | "mime-types": "~2.1.24" 1090 | } 1091 | }, 1092 | "typedarray": { 1093 | "version": "0.0.6", 1094 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1095 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1096 | }, 1097 | "unpipe": { 1098 | "version": "1.0.0", 1099 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1100 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1101 | }, 1102 | "util-deprecate": { 1103 | "version": "1.0.2", 1104 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1105 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1106 | }, 1107 | "utils-merge": { 1108 | "version": "1.0.1", 1109 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1110 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1111 | }, 1112 | "vary": { 1113 | "version": "1.1.2", 1114 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1115 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1116 | }, 1117 | "wcwidth": { 1118 | "version": "1.0.1", 1119 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 1120 | "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", 1121 | "requires": { 1122 | "defaults": "^1.0.3" 1123 | } 1124 | }, 1125 | "wrappy": { 1126 | "version": "1.0.2", 1127 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1128 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1129 | }, 1130 | "ws": { 1131 | "version": "6.2.1", 1132 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", 1133 | "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", 1134 | "requires": { 1135 | "async-limiter": "~1.0.0" 1136 | } 1137 | }, 1138 | "yauzl": { 1139 | "version": "2.10.0", 1140 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1141 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 1142 | "requires": { 1143 | "buffer-crc32": "~0.2.3", 1144 | "fd-slicer": "~1.1.0" 1145 | } 1146 | } 1147 | } 1148 | } 1149 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "testsite", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "pagedjs": "^0.1.40", 13 | "pagedjs-cli": "0.0.10" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages.bib: -------------------------------------------------------------------------------- 1 | @Manual{R-base, 2 | title = {R: A Language and Environment for Statistical Computing}, 3 | author = {{R Core Team}}, 4 | organization = {R Foundation for Statistical Computing}, 5 | address = {Vienna, Austria}, 6 | year = {2020}, 7 | url = {https://www.R-project.org/}, 8 | } 9 | 10 | @Manual{R-bookdown, 11 | title = {bookdown: Authoring Books and Technical Documents with R Markdown}, 12 | author = {Yihui Xie}, 13 | year = {2020}, 14 | note = {R package version 0.21.3}, 15 | url = {https://github.com/rstudio/bookdown}, 16 | } 17 | 18 | @Manual{R-devtools, 19 | title = {devtools: Tools to Make Developing R Packages Easier}, 20 | author = {Hadley Wickham and Jim Hester and Winston Chang}, 21 | year = {2020}, 22 | note = {R package version 2.3.2}, 23 | url = {https://CRAN.R-project.org/package=devtools}, 24 | } 25 | 26 | @Manual{R-knitr, 27 | title = {knitr: A General-Purpose Package for Dynamic Report Generation in R}, 28 | author = {Yihui Xie}, 29 | year = {2020}, 30 | note = {R package version 1.30}, 31 | url = {https://yihui.org/knitr/}, 32 | } 33 | 34 | @Manual{R-lookup, 35 | title = {lookup: Lookup R function definitions, including compiled code, S3 and 36 | S4 methods}, 37 | author = {Jim Hester and Hadley Wickham and Gábor Csárdi}, 38 | year = {2020}, 39 | note = {R package version 0.0.0.9000}, 40 | } 41 | 42 | @Manual{R-reprex, 43 | title = {reprex: Prepare Reproducible Example Code via the Clipboard}, 44 | author = {Jennifer Bryan and Jim Hester and David Robinson and Hadley Wickham}, 45 | year = {2020}, 46 | note = {https://reprex.tidyverse.org, 47 | https://github.com/tidyverse/reprex#readme}, 48 | } 49 | 50 | @Manual{R-rmarkdown, 51 | title = {rmarkdown: Dynamic Documents for R}, 52 | author = {JJ Allaire and Yihui Xie and Jonathan McPherson and Javier Luraschi and Kevin Ushey and Aron Atkins and Hadley Wickham and Joe Cheng and Winston Chang and Richard Iannone}, 53 | year = {2020}, 54 | note = {R package version 2.5.3}, 55 | url = {https://github.com/rstudio/rmarkdown}, 56 | } 57 | 58 | @Manual{R-usethis, 59 | title = {usethis: Automate Package and Project Setup}, 60 | author = {Hadley Wickham and Jennifer Bryan}, 61 | year = {2020}, 62 | note = {https://usethis.r-lib.org, https://github.com/r-lib/usethis}, 63 | } 64 | 65 | @Book{bookdown2016, 66 | title = {bookdown: Authoring Books and Technical Documents with {R} Markdown}, 67 | author = {Yihui Xie}, 68 | publisher = {Chapman and Hall/CRC}, 69 | address = {Boca Raton, Florida}, 70 | year = {2016}, 71 | note = {ISBN 978-1138700109}, 72 | url = {https://github.com/rstudio/bookdown}, 73 | } 74 | 75 | @Book{knitr2015, 76 | title = {Dynamic Documents with {R} and knitr}, 77 | author = {Yihui Xie}, 78 | publisher = {Chapman and Hall/CRC}, 79 | address = {Boca Raton, Florida}, 80 | year = {2015}, 81 | edition = {2nd}, 82 | note = {ISBN 978-1498716963}, 83 | url = {https://yihui.org/knitr/}, 84 | } 85 | 86 | @InCollection{knitr2014, 87 | booktitle = {Implementing Reproducible Computational Research}, 88 | editor = {Victoria Stodden and Friedrich Leisch and Roger D. Peng}, 89 | title = {knitr: A Comprehensive Tool for Reproducible Research in {R}}, 90 | author = {Yihui Xie}, 91 | publisher = {Chapman and Hall/CRC}, 92 | year = {2014}, 93 | note = {ISBN 978-1466561595}, 94 | url = {http://www.crcpress.com/product/isbn/9781466561595}, 95 | } 96 | 97 | @Book{rmarkdown2018, 98 | title = {R Markdown: The Definitive Guide}, 99 | author = {Yihui Xie and J.J. Allaire and Garrett Grolemund}, 100 | publisher = {Chapman and Hall/CRC}, 101 | address = {Boca Raton, Florida}, 102 | year = {2018}, 103 | note = {ISBN 9781138359338}, 104 | url = {https://bookdown.org/yihui/rmarkdown}, 105 | } 106 | 107 | @Book{rmarkdown2020, 108 | title = {R Markdown Cookbook}, 109 | author = {Yihui Xie and Christophe Dervieux and Emily Riederer}, 110 | publisher = {Chapman and Hall/CRC}, 111 | address = {Boca Raton, Florida}, 112 | year = {2020}, 113 | note = {ISBN 9780367563837}, 114 | url = {https://bookdown.org/yihui/rmarkdown-cookbook}, 115 | } 116 | 117 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | @media print { 2 | .btn.btn-outline-primary.d-lg-none.ml-2.mt-1 { 3 | display: none; 4 | } 5 | 6 | .prev { 7 | display: none; 8 | } 9 | .next { 10 | display: none; 11 | } 12 | 13 | .bg-primary.text-light.mt-5 { 14 | display: none; 15 | } 16 | 17 | .book-extra a::after { 18 | content: " (" attr(href) ")"; 19 | } 20 | 21 | .book-extra { 22 | border-bottom: 1px solid #ccc; 23 | padding-bottom: 0.5rem; 24 | } 25 | 26 | 27 | main img { 28 | max-width: 100%; 29 | max-height: calc(0.5 * (var(--pagedjs-width) - var(--pagedjs-margin-left) - var(--pagedjs-margin-right))); 30 | width: auto; 31 | } 32 | 33 | 34 | 35 | @page { 36 | @bottom-left { 37 | content: "Page " counter(page) " of " counter(pages); 38 | } 39 | } 40 | 41 | .section.level1 h1 { 42 | break-before: page; 43 | string-set: title content(text) 44 | } 45 | 46 | 47 | @page { 48 | @bottom-right { 49 | content: string(title) 50 | } 51 | } 52 | @page { 53 | size: 227mm 291mm; 54 | margin: 10mm 15mm; 55 | } 56 | .d-flex.align-items-start.justify-content-between h1 { 57 | display: none; 58 | } 59 | 60 | 61 | } 62 | --------------------------------------------------------------------------------