diff options
29 files changed, 399 insertions, 1 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.am b/Build/source/texk/texlive/linked_scripts/Makefile.am index fc690d65b94..2f2e27e0d66 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.am +++ b/Build/source/texk/texlive/linked_scripts/Makefile.am @@ -57,6 +57,7 @@ texmf_shell_scripts = \ adhocfilelist/adhocfilelist.sh \ bibexport/bibexport.sh \ checklistings/checklistings.sh \ + ctanbib/ctanbib \ dtxgen/dtxgen \ installfont/installfont-tl \ latexfileversion/latexfileversion \ diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.in b/Build/source/texk/texlive/linked_scripts/Makefile.in index 27c46a0807d..d22a7d5d633 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.in +++ b/Build/source/texk/texlive/linked_scripts/Makefile.in @@ -270,6 +270,7 @@ texmf_shell_scripts = \ adhocfilelist/adhocfilelist.sh \ bibexport/bibexport.sh \ checklistings/checklistings.sh \ + ctanbib/ctanbib \ dtxgen/dtxgen \ installfont/installfont-tl \ latexfileversion/latexfileversion \ diff --git a/Build/source/texk/texlive/linked_scripts/ctanbib/ctanbib b/Build/source/texk/texlive/linked_scripts/ctanbib/ctanbib new file mode 100755 index 00000000000..7f8ac74cb85 --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/ctanbib/ctanbib @@ -0,0 +1,139 @@ +#!/usr/bin/env texlua +kpse.set_program_name("luatex") +-- ctanbib -- export ctan entries to bib format +-- Copyright: Michal Hoftich <michal.h21@gmail.com> (2014-2018) +-- +-- This work may be distributed and/or modified under the +-- conditions of the LaTeX Project Public License, either version 1.3 +-- of this license or (at your option) any later version. +-- The latest version of this license is in +-- http://www.latex-project.org/lppl.txt +-- and version 1.3 or later is part of all distributions of LaTeX +-- version 2005/12/01 or later. +-- +-- This work has the LPPL maintenance status `maintained'. +-- +-- The Current Maintainer of this work is Michal Hoftich + +if #arg < 1 or arg[1]=="--help" or arg[1]=="-h" then + print [[ctanbib - convert ctan package information to bibtex format + Usage: + texlua ctanbib <package name> + + This command will bibtex entry to the terminal output + ]] + os.exit(1) +elseif arg[1]=="--version" or arg[1]=="-v" then + print "ctanbib version v0.1a" + os.exit(1) +end + +local pkgname = arg[1] +local url = "https://www.ctan.org/xml/pkg/" .. pkgname + +-- change that for different title scheme +local titleformat = "The %s package" + +local bibtexformat = [[ +@manual{$package, +title = {$title}, +subtitle = {$subtitle}, +author = {$author}, +url = {$url}, +urldate = {$urldate}, +date = {$date}, +version = {$version} +} +]] + +local dom = require('luaxml-domobject') + + +local load_xml = function(url) + local command = io.popen("wget -qO- ".. url,"r") + + local info = command:read("*all") + command:close() + + if string.len(info) == 0 then + return false + end + return dom.parse(info) +end + +local get_authors = function(a) + local retrieved_authors = {} + for _, author in ipairs(a) do + local current = {} + current[#current+1] = author:get_attribute("familyname") + current[#current+1] = author:get_attribute("givenname") + table.insert(retrieved_authors, table.concat(current, ", ")) + end + return table.concat(retrieved_authors," and ") +end + +local get_title = function(record) + local title = record:query_selector("name")[1] + if title then + title = title:get_text() + title = title:gsub("^(.)", function(a) return unicode.utf8.upper(a) end) + else + title = pkgname + end + return string.format(titleformat, title) +end + + +local get_url = function(record) + local home = record:query_selector("home")[1] + if home then return home:get_attribute("href") end + return "http://www.ctan.org/pkg/"..pkgname +end + +local get_caption = function(record) + local caption = record:query_selector("caption")[1] + if caption then return caption:get_text() end + return nil +end + +local get_version = function(record) + local version = record:query_selector("version")[1] + if version then + return version:get_attribute("number"), version:get_attribute("date") + end +end + +local bibtex_escape = function(a) + local a = a or "" + return a:gsub("([%$%{%}])", function(x) return '\\'..x end) +end + +local compile = function(template, records) + return template:gsub("$([a-z]+)", function(a) + return bibtex_escape(records[a]) or "" + end) +end + +local record = load_xml(url) + +if not record then + print("Cannot find entry for package "..pkgname) + os.exit(1) +end + +-- root element is also saved, so we use this trick +-- local record = entry.entry + +local e = {} + +e.author = get_authors(record:query_selector("authorref")) +e.package = pkgname +e.title = get_title(record) +e.subtitle = get_caption(record) +e.url = get_url(record) +e.version, e.date = get_version(record) +e.urldate = os.date("%Y-%m-%d") + +local result = compile(bibtexformat, e) + +print(result) diff --git a/Build/source/texk/texlive/linked_scripts/scripts.lst b/Build/source/texk/texlive/linked_scripts/scripts.lst index 212205f921e..13b45dfc51f 100644 --- a/Build/source/texk/texlive/linked_scripts/scripts.lst +++ b/Build/source/texk/texlive/linked_scripts/scripts.lst @@ -2,6 +2,7 @@ texmf_scripts=' adhocfilelist/adhocfilelist.sh bibexport/bibexport.sh checklistings/checklistings.sh +ctanbib/ctanbib dtxgen/dtxgen installfont/installfont-tl latexfileversion/latexfileversion diff --git a/Master/bin/aarch64-linux/ctanbib b/Master/bin/aarch64-linux/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/aarch64-linux/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/amd64-freebsd/ctanbib b/Master/bin/amd64-freebsd/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/amd64-freebsd/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/amd64-netbsd/ctanbib b/Master/bin/amd64-netbsd/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/amd64-netbsd/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/armhf-linux/ctanbib b/Master/bin/armhf-linux/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/armhf-linux/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/i386-cygwin/ctanbib b/Master/bin/i386-cygwin/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/i386-cygwin/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/i386-freebsd/ctanbib b/Master/bin/i386-freebsd/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/i386-freebsd/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/i386-linux/ctanbib b/Master/bin/i386-linux/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/i386-linux/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/i386-netbsd/ctanbib b/Master/bin/i386-netbsd/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/i386-netbsd/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/i386-solaris/ctanbib b/Master/bin/i386-solaris/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/i386-solaris/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/sparc-solaris/ctanbib b/Master/bin/sparc-solaris/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/sparc-solaris/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/win32/ctanbib.exe b/Master/bin/win32/ctanbib.exe Binary files differnew file mode 100755 index 00000000000..5777d90a17a --- /dev/null +++ b/Master/bin/win32/ctanbib.exe diff --git a/Master/bin/x86_64-cygwin/ctanbib b/Master/bin/x86_64-cygwin/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/x86_64-cygwin/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/x86_64-darwin/ctanbib b/Master/bin/x86_64-darwin/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/x86_64-darwin/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/x86_64-darwinlegacy/ctanbib b/Master/bin/x86_64-darwinlegacy/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/x86_64-darwinlegacy/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/x86_64-linux/ctanbib b/Master/bin/x86_64-linux/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/x86_64-linux/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/x86_64-linuxmusl/ctanbib b/Master/bin/x86_64-linuxmusl/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/x86_64-linuxmusl/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/bin/x86_64-solaris/ctanbib b/Master/bin/x86_64-solaris/ctanbib new file mode 120000 index 00000000000..04302f54f16 --- /dev/null +++ b/Master/bin/x86_64-solaris/ctanbib @@ -0,0 +1 @@ +../../texmf-dist/scripts/ctanbib/ctanbib
\ No newline at end of file diff --git a/Master/texmf-dist/doc/support/ctanbib/README.md b/Master/texmf-dist/doc/support/ctanbib/README.md new file mode 100644 index 00000000000..edd016e5619 --- /dev/null +++ b/Master/texmf-dist/doc/support/ctanbib/README.md @@ -0,0 +1,25 @@ +# The `ctanbib` package + +This script can generate BibTeX records for LaTeX packages hosted on CTAN. + + +## Usage + + ctanbib graphicx + +More details can be found on [TeX.sx](https://tex.stackexchange.com/a/200856/2891) + + +Copyright: 2018 Michal Hoftich + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3 +of this license or (at your option) any later version. +The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This work has the LPPL maintenance status `maintained'. + +The Current Maintainer of this work is Michal Hoftich. diff --git a/Master/texmf-dist/doc/support/ctanbib/ctanbib-doc.pdf b/Master/texmf-dist/doc/support/ctanbib/ctanbib-doc.pdf Binary files differnew file mode 100644 index 00000000000..74fa918fa00 --- /dev/null +++ b/Master/texmf-dist/doc/support/ctanbib/ctanbib-doc.pdf diff --git a/Master/texmf-dist/doc/support/ctanbib/ctanbib-doc.tex b/Master/texmf-dist/doc/support/ctanbib/ctanbib-doc.tex new file mode 100644 index 00000000000..3a6c3a77ee6 --- /dev/null +++ b/Master/texmf-dist/doc/support/ctanbib/ctanbib-doc.tex @@ -0,0 +1,72 @@ +\documentclass{ltxdoc} +\newcommand\package[1]{\texttt{#1}} +\usepackage{longtable} +\usepackage{tabularx} +\newenvironment{changelog}{\longtable{@{} l p{30em}}}{\endlongtable} +\newcommand\change[2]{#1 & #2\\} +\title{The \texttt{ctanbib} package} +\author{Michal Hoftich\\\url{michal.h21@gmail.com}} +\date{\gitdate, version \gitversion} +\usepackage{hyperref} +\usepackage{fontspec} +\setmainfont{TeX Gyre Schola} +\setmonofont[Scale=MatchLowercase]{Inconsolatazi4} +\usepackage{microtype} +\begin{document} +\maketitle + +\section{Introduction} +This package provides script named \package{ctanbib} which can be used for retrieving of the bibliographic information for packages hosted on CTAN. + +\section{Usage} + + +It can be used in the following way: + + +\noindent\package{ctanbib $\langle$packagename$\rangle$ > filename.bib} + +\section{Example} + +\begin{verbatim} +ctanbib latex +\end{verbatim} + +\noindent This invocation will print data in the Bib\LaTeX\ format to the standard output: + +\begin{verbatim} +@manual{latex, +title = {The Latex package}, +subtitle = {A TeX macro package that defines LaTeX}, +author = {Lamport, Leslie and The LaTeX Team}, +url = {http://www.latex-project.org/}, +urldate = {2018-08-23}, +date = {2018-04-01}, +version = {PL 5} +} +\end{verbatim} + +\section{License} + +Permission is granted to copy, distribute and/or modify this software +under the terms of the LaTeX Project Public License, version 1.3. + +\section{Acknowledgements} + +This package was created thanks to TeX.sx user +Daniel\footnote{\url{https://tex.stackexchange.com/users/3751/daniel}}. Lukas +C. Bossert had useful comments which led to update of the original script and +it's eventual release on CTAN. + +\section{Changelog} + +\begin{changelog} + \change{2018-08-23}{Version 0.1 released.} + \change{2018-08-23}{Created documentation.} + \change{2018-08-21}{Rewrote the script to use the DOM api provided by LuaXML. This provides greater flexibility in the XML processing.} + \change{2018-08-20}{Fixed the script for the current XML format provided by CTAN.} + \change{2014-09-12}{Initial version of the script have been released in answer on TeX.sx\footnote{\url{https://tex.stackexchange.com/a/200856/2891}}.} +\end{changelog} + + +\end{document} diff --git a/Master/texmf-dist/scripts/ctanbib/ctanbib b/Master/texmf-dist/scripts/ctanbib/ctanbib new file mode 100755 index 00000000000..7f8ac74cb85 --- /dev/null +++ b/Master/texmf-dist/scripts/ctanbib/ctanbib @@ -0,0 +1,139 @@ +#!/usr/bin/env texlua +kpse.set_program_name("luatex") +-- ctanbib -- export ctan entries to bib format +-- Copyright: Michal Hoftich <michal.h21@gmail.com> (2014-2018) +-- +-- This work may be distributed and/or modified under the +-- conditions of the LaTeX Project Public License, either version 1.3 +-- of this license or (at your option) any later version. +-- The latest version of this license is in +-- http://www.latex-project.org/lppl.txt +-- and version 1.3 or later is part of all distributions of LaTeX +-- version 2005/12/01 or later. +-- +-- This work has the LPPL maintenance status `maintained'. +-- +-- The Current Maintainer of this work is Michal Hoftich + +if #arg < 1 or arg[1]=="--help" or arg[1]=="-h" then + print [[ctanbib - convert ctan package information to bibtex format + Usage: + texlua ctanbib <package name> + + This command will bibtex entry to the terminal output + ]] + os.exit(1) +elseif arg[1]=="--version" or arg[1]=="-v" then + print "ctanbib version v0.1a" + os.exit(1) +end + +local pkgname = arg[1] +local url = "https://www.ctan.org/xml/pkg/" .. pkgname + +-- change that for different title scheme +local titleformat = "The %s package" + +local bibtexformat = [[ +@manual{$package, +title = {$title}, +subtitle = {$subtitle}, +author = {$author}, +url = {$url}, +urldate = {$urldate}, +date = {$date}, +version = {$version} +} +]] + +local dom = require('luaxml-domobject') + + +local load_xml = function(url) + local command = io.popen("wget -qO- ".. url,"r") + + local info = command:read("*all") + command:close() + + if string.len(info) == 0 then + return false + end + return dom.parse(info) +end + +local get_authors = function(a) + local retrieved_authors = {} + for _, author in ipairs(a) do + local current = {} + current[#current+1] = author:get_attribute("familyname") + current[#current+1] = author:get_attribute("givenname") + table.insert(retrieved_authors, table.concat(current, ", ")) + end + return table.concat(retrieved_authors," and ") +end + +local get_title = function(record) + local title = record:query_selector("name")[1] + if title then + title = title:get_text() + title = title:gsub("^(.)", function(a) return unicode.utf8.upper(a) end) + else + title = pkgname + end + return string.format(titleformat, title) +end + + +local get_url = function(record) + local home = record:query_selector("home")[1] + if home then return home:get_attribute("href") end + return "http://www.ctan.org/pkg/"..pkgname +end + +local get_caption = function(record) + local caption = record:query_selector("caption")[1] + if caption then return caption:get_text() end + return nil +end + +local get_version = function(record) + local version = record:query_selector("version")[1] + if version then + return version:get_attribute("number"), version:get_attribute("date") + end +end + +local bibtex_escape = function(a) + local a = a or "" + return a:gsub("([%$%{%}])", function(x) return '\\'..x end) +end + +local compile = function(template, records) + return template:gsub("$([a-z]+)", function(a) + return bibtex_escape(records[a]) or "" + end) +end + +local record = load_xml(url) + +if not record then + print("Cannot find entry for package "..pkgname) + os.exit(1) +end + +-- root element is also saved, so we use this trick +-- local record = entry.entry + +local e = {} + +e.author = get_authors(record:query_selector("authorref")) +e.package = pkgname +e.title = get_title(record) +e.subtitle = get_caption(record) +e.url = get_url(record) +e.version, e.date = get_version(record) +e.urldate = os.date("%Y-%m-%d") + +local result = compile(bibtexformat, e) + +print(result) diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index 1f5fa1f7465..a71d78e7469 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -191,7 +191,8 @@ my @TLP_working = qw( cryptocode cryst cs csbulletin cslatex csplain csquotes csquotes-de css-colors cstypo csvsimple cstex - ctan-o-mat ctan_chk ctanify ctanupload ctable ctablestack ctex ctex-faq + ctan-o-mat ctan_chk ctanbib ctanify ctanupload + ctable ctablestack ctex ctex-faq cursolatex cuisine currency currfile currvita curve curve2e curves custom-bib cutwin cv cv4tw cweb-latex diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds index 14275fa3271..4c1d7bccab9 100755 --- a/Master/tlpkg/libexec/ctan2tds +++ b/Master/tlpkg/libexec/ctan2tds @@ -2901,6 +2901,7 @@ $standardttf = '\.ttf|\.TTC'; 'convbkmk' => '\.rb$', 'crossrefware' => '\.pl$', 'ctan-o-mat' => 'ctan-o-mat$', + 'ctanbib' => 'ctanbib$', 'ctanify' => '^ctanify$', 'ctanupload' => '\.pl$', 'de-macro' => 'de-macro', diff --git a/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc b/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc index 5a0e108d016..2f65fc52adb 100644 --- a/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc @@ -17,6 +17,7 @@ depend checklistings depend chktex depend ctan-o-mat depend ctan_chk +depend ctanbib depend ctanify depend ctanupload depend ctie diff --git a/Master/tlpkg/tlpsrc/ctanbib.tlpsrc b/Master/tlpkg/tlpsrc/ctanbib.tlpsrc new file mode 100644 index 00000000000..dca338c719c --- /dev/null +++ b/Master/tlpkg/tlpsrc/ctanbib.tlpsrc @@ -0,0 +1 @@ +binpattern f bin/${ARCH}/${PKGNAME} |