summaryrefslogtreecommitdiff
path: root/support/ctanbib/ctanbib
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/ctanbib/ctanbib
Initial commit
Diffstat (limited to 'support/ctanbib/ctanbib')
-rwxr-xr-xsupport/ctanbib/ctanbib169
1 files changed, 169 insertions, 0 deletions
diff --git a/support/ctanbib/ctanbib b/support/ctanbib/ctanbib
new file mode 100755
index 0000000000..10666696b5
--- /dev/null
+++ b/support/ctanbib/ctanbib
@@ -0,0 +1,169 @@
+#!/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
+
+local bibtype = "manual"
+if #arg < 1 or arg[1]=="--help" or arg[1]=="-h" then
+ print([[ctanbib - convert ctan package information to bibtex format
+Usage:
+ctanbib [options] <package name>
+Available options:
+ -c,--ctan Use @ctan type instead of @manual
+ -h,--help Print this message
+ -v,--version Print version info
+ ]])
+ os.exit(1)
+elseif arg[1]=="--version" or arg[1]=="-v" then
+ print "ctanbib version v0.1c"
+ os.exit(1)
+elseif arg[1]=="--ctan" or arg[1]=="-c" then
+ table.remove(arg, 1)
+ bibtype = "ctan"
+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 command = io.popen("curl -sS ".. url,"r")
+
+ local info = command:read("*all")
+ command:close()
+
+ if string.len(info) == 0 then
+ return false
+ end
+ return dom.parse(info)
+end
+
+local bibtex_escape = function(a)
+ local a = a or ""
+ return a:gsub("([%$%{%}%\\])", function(x)
+ if x == "\\" then return "\\textbackslash " end
+ return '\\'..x
+ end)
+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")
+ -- the author is an organization
+ if #current == 1 then
+ table.insert(retrieved_authors, "{" .. current[1] .. "}")
+ else
+ table.insert(retrieved_authors, table.concat(current, ", "))
+ end
+ 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, bibtex_escape(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 bibtex_escape(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 ctan_url = function(record)
+ local ctan = record:query_selector("ctan")[1]
+ -- some package don't contain the CTAN path
+ if not ctan then return get_url(record) end
+ local path = ctan:get_attribute("path")
+ return path
+end
+
+
+local compile = function(template, records)
+ return template:gsub("$([a-z]+)", function(a)
+ return 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)
+-- use the CTAN path as url for the CTAN type
+if bibtype == "ctan" then
+ e.url = ctan_url(record)
+end
+e.version, e.date = get_version(record)
+e.urldate = os.date("%Y-%m-%d")
+
+local result = compile(bibtexformat, e)
+-- update the bibliography type
+result = result:gsub("^@manual", "@" .. bibtype)
+
+print(result)