From 0b38f339f120c35b94d32da95b2b2e216bf118a9 Mon Sep 17 00:00:00 2001 From: Cimbali Date: Tue, 25 May 2021 16:18:01 +0200 Subject: [PATCH] Add R documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Contains the R base + recommended package help pages converted to HTML. Equivalent to the fullrefman.pdf generated from source, which is also called « The R Reference Index » on https://cran.r-project.org/manuals.html Currently does not include reference manuals and miscellanea (FAQ, etc.) Script building the documentation: ```bash set -e set -o pipefail DEVDOCSROOT=/path/to/devdocs/docs/r RSOURCEDIR=${TMPDIR:-/tmp}/R/latest RBUILDDIR=${TMPDIR:-/tmp}/R/build RLATEST=https://cran.r-project.org/src/base/R-latest.tar.gz R="$RBUILDDIR/bin/R" libdir="$RBUILDDIR/library" docdir=$RBUILDDIR/doc makevars="$RSOURCEDIR/share/make/vars.mk" if [ ! -f "$R" ] ; then if [ ! -d "$RSOURCEDIR" ]; then mkdir -p "$RSOURCEDIR" && curl "$RLATEST" | tar -C "$RSOURCEDIR" -xzf - --strip-components=1 fi [ -d "$RBUILDDIR" ] || mkdir -p "$RBUILDDIR" [ -f "$RBUILDDIR/config.status" ] || (cd "$RBUILDDIR" && "$RSOURCEDIR/configure") make -C "$RBUILDDIR" && make -C "$RBUILDDIR" docs fi mkdir -p "$DEVDOCSROOT/doc" && cp -r "$docdir"/* "$DEVDOCSROOT/doc/" find "$libdir" -type d -name 'html' -printf '%P\n' | while read d; do mkdir -p "$DEVDOCSROOT/library/$d" cp -r "$libdir/$d"/* "$DEVDOCSROOT/library/$d/" done R_PKGS_BASE="`sed -n 's/^R_PKGS_BASE *= *//p' $makevars`" R_PKGS_RECOMMENDED="`sed -n 's/^R_PKGS_RECOMMENDED *= *//p' $makevars`" cat < 716 bytes public/icons/docs/r/16@2x.png | Bin 0 -> 1430 bytes public/icons/docs/r/SOURCE | 1 + 7 files changed, 130 insertions(+) create mode 100644 lib/docs/filters/r/clean_html.rb create mode 100644 lib/docs/filters/r/entries.rb create mode 100644 lib/docs/scrapers/r.rb create mode 100644 public/icons/docs/r/16.png create mode 100644 public/icons/docs/r/16@2x.png create mode 100644 public/icons/docs/r/SOURCE diff --git a/assets/javascripts/templates/pages/about_tmpl.coffee b/assets/javascripts/templates/pages/about_tmpl.coffee index b86236b0..3138546a 100644 --- a/assets/javascripts/templates/pages/about_tmpl.coffee +++ b/assets/javascripts/templates/pages/about_tmpl.coffee @@ -676,6 +676,11 @@ credits = [ '2012-2018 The Qt Company Ltd', 'GFDL', 'https://doc.qt.io/qt-5/licensing.html' + ], [ + 'R', + '1999--2012 R Foundation for Statistical Computing', + 'GPL', + 'https://svn.r-project.org/R/trunk/COPYING' ], [ 'Ramda', '2013-2020 Scott Sauyet and Michael Hurley', diff --git a/lib/docs/filters/r/clean_html.rb b/lib/docs/filters/r/clean_html.rb new file mode 100644 index 00000000..28ea571d --- /dev/null +++ b/lib/docs/filters/r/clean_html.rb @@ -0,0 +1,34 @@ +module Docs + class R + class CleanHtmlFilter < Filter + def call + slug_parts = slug.split('/') + if slug_parts[0] == 'library' + title = at_css('h2') + title.inner_html = "#{slug_parts[3]} #{title.content}" + + summary = at_css('table[summary]') + summary.remove if summary + + elsif slug_parts[-2] == 'manual' + css('span[id] + h1, span[id] + h2, span[id] + h3, span[id] + h4, span[id] + h5, span[id] + h6').each do |node| + id = node.previous['id'] + node.previous.remove + node['id'] = id.sub(/-1$/, '') if id + end + css('table.menu, div.header, hr').remove + + css('.footnote h5').each do |node| + anchor = node.at_css('a[id]') + footnote = node.next_sibling + footnote.inner_html = "#{anchor.text} #{footnote.inner_html}" + footnote['id'] = anchor['id'] + node.remove + end + end + + doc + end + end + end +end diff --git a/lib/docs/filters/r/entries.rb b/lib/docs/filters/r/entries.rb new file mode 100644 index 00000000..b54c2c21 --- /dev/null +++ b/lib/docs/filters/r/entries.rb @@ -0,0 +1,59 @@ +module Docs + class R + class EntriesFilter < Docs::EntriesFilter + + @@include_manual = false + @@include_misc = false + + def initialize(*) + super + end + + def slug_parts + slug.split('/') + end + + def is_package? + slug_parts[0] == 'library' + end + + def is_manual? + slug_parts[-2] == 'manual' + end + + def get_name + return slug_parts[3] + ' − ' + at_css('h2').content if is_package? + title = at_css('h1.settitle') + title ? title.content : at_css('h1, h2').content + end + + def get_type + return slug_parts[1] if is_package? + return at_css('h1.settitle').content if is_manual? + 'Miscellaneous' + end + + def include_default_entry? + if is_manual? or slug_parts[-1] == '00Index' or slug_parts[-1] == 'index' + return false + end + is_package? or self.include_misc + end + + def additional_entries + return [] unless is_manual? and self.include_manual + + entries = [] + css('div.contents > ul > li').each do |node| + node.css('a').each do |link| + link_name = link.content.sub /^[0-9A-Z]+(\.[0-9]+)* /, '' + entries << [link_name, link['href'].split('#')[1], name] + end + end + return entries + end + + private + end + end +end diff --git a/lib/docs/scrapers/r.rb b/lib/docs/scrapers/r.rb new file mode 100644 index 00000000..7c577d5a --- /dev/null +++ b/lib/docs/scrapers/r.rb @@ -0,0 +1,31 @@ +module Docs + class R < FileScraper + self.name = 'R' + self.slug = 'r' + self.type = 'simple' + self.release = '4.1.0' + self.links = { + home: 'https://www.r-project.org/', + code: 'https://svn.r-project.org/R/' + } + + self.root_path = 'doc/html/packages.html' + + html_filters.push 'r/entries', 'r/clean_html' + + options[:skip_links] = false + + options[:attribution] = <<-HTML + Copyright (©) 1999--2012 R Foundation for Statistical Computing.
+ Licensed under the GNU General Public License. + HTML + + # Never want those + options[:skip] = %w( + doc/html/packages-head-utf8.html + doc/html/SearchOn.html + doc/html/Search.html + ) + + end +end diff --git a/public/icons/docs/r/16.png b/public/icons/docs/r/16.png new file mode 100644 index 0000000000000000000000000000000000000000..2b0c75dafe883e6fbae065fe359b5d3076fffb06 GIT binary patch literal 716 zcmV;-0yF)IP)z`5f0Jm31#SnphGam}2#Dk>5Pis?y{@k2$!~zc!NJ1WG_H_r zAQ=EOl19P^I!GrO&4`sl65fJrrsRr^~eD}^CGc$>$l2u8ZH%l~=Y&y+tH(oAj-dq0ZSO`ZU0E4?R z<9*q~A)` zFQ0r}k~dq>{-R`=Q$Zkq{$biT+RX&QEFh6cj2_(I&`Qjd0huksUvj&$4aTN}yG403 zwKTgd(V(EBEE;M0<6l_S)Y~lSvLrL9X1Klj)`}yyik_shGvk* y1yT$V-8C~Cxf&nOfa~On8G_A-_{>87f1dAp^6H)r>&2M>0000*`58W}{T z_)ie{E6SmHZAp!WMmlvVnbXt>iK(F`Q`0SVo4R}7=jo4o@BHq!dzTKOe?0JUzxTc8 zp67YadCz$-@WB3OGxz#~s;a7#)YR0hP{_%kgA7S>sK#KBjm^zh>-~Oz>wP7#W5>~l zQ&O%^voPZ!j+Qi3Qj#Q)f)w)vB^@K}LD1|%$fcp?Fdxw-CqLe zYmq7O)VaV;NcvXLFR;$h;^K+tyjctcs(KsKI+$cWfJu}lh)M~^U<)mtpEKvBpV|oQ z*|UEb!Tplb5~!A>N?ENaDwELJ7|_dd`ncaqz1`6Id|@i(?*i1-t+S@ zNx2DBUj#X4%9KezMgtCcqh=MQYyf}&fMECqVt5UO*Ot0rpu@gkD6o87<70x^Ch8GM z`{&J@HP-ChT~jRSd$l`UgrxI6!?A^hh3DOh1~0CuGhl8QBkUjkbg$vs7X&mxSn}SO zhGQ^xugFw@&p8t3iwpyjVA~^F*b*;z*oeCYkE93&N&~p=g990TMZ2C7ti^nXRwKx8 zdr^0YNUSKHJo#|q%HAEg=Q|_v9c%3u5sZeO)N^YMpVZngavY#$A2u{$dgx*R&5 z5}KSxE9sI$i<+ovGSY%1j6%aZ&OmJ1y*6q=ZL*Q_Jm3IycFG9$k?12?V=61R=gHtV zNyanB8yypReERh1|9FEBe0^6P5N_K$gm@7K$H}&m3<5B~TPji?E*n{YS<-4rIZko$ z(f@DT8Xx0S+0bl$K$n$P8MNBZz1V|I&flI7?HjAHuTxu=Lmn?bh4+j8} zoX|W=ow`$k=p5$@)+TK#FE39|T#EKRA1CeCM6Ar~b7Rt&zV+*@)YPR57XyF;08^(< zZIo3p$v@p45gs7)8`Jgh#*JJ2Wo2bfIQTt*pCR??o4J3LPt3f&ljOiq$WB|dXi*d3 zxeYgMs_f-U3T`1aKK^y96C^i%bg=jApv52$c$HvQL(B!VN`m8V*CE|oP?X*9!|hhz z%w@|KUW;PJ)VHEyb4%{fobp~h`<@mxicu8^mi*hof$LS68<9!1OllyZ|Y@$vn4%4$%ztKQ`Zxh zTYNETAKs%Gh1rdegrEi1{@w>Sf{wRb=dDf6xwNscIf|2%h=AYkzX@OifDIcqY|bV_ z&-d_c+Wng=bLNFD)I>oYv)7(FWCW6#;hcATbV0G9t}20F6-3%1um%8i0Y z`hM-X^-~wLIlUP0^-JqoCo#wEC!y5`47>1E=}92c1)a6n)9$gYehb>N_I~OT5?4mu zI!S=-E+fWaapB97t$+^1xi^Y4X9bFY4$eSFW{CMROoI*AFa#jkF&E-^ir6+o;jtXq kG5`!{bh$Iw5A43%zu#XxiA?H}RsaA107*qoM6N<$f>}nP=l}o! literal 0 HcmV?d00001 diff --git a/public/icons/docs/r/SOURCE b/public/icons/docs/r/SOURCE new file mode 100644 index 00000000..c02c1e37 --- /dev/null +++ b/public/icons/docs/r/SOURCE @@ -0,0 +1 @@ +https://svn.r-project.org/R/trunk/doc/html/Rlogo.svg