summaryrefslogtreecommitdiff
path: root/Build/source/texk
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2008-02-08 12:26:02 +0000
committerNorbert Preining <preining@logic.at>2008-02-08 12:26:02 +0000
commit3c800d1e518a69c076342180fef189cd8870ed3d (patch)
tree2e26f1e29d85b667f5fee62cdd3b34b2713117b4 /Build/source/texk
parent5573230bc68ca22debcf48f1632d99555c7b9212 (diff)
add texdoc lua version
git-svn-id: svn://tug.org/texlive/trunk@6557 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk')
-rwxr-xr-xBuild/source/texk/texlive/texdoc345
-rw-r--r--Build/source/texk/texlive/texdoc.man225
2 files changed, 570 insertions, 0 deletions
diff --git a/Build/source/texk/texlive/texdoc b/Build/source/texk/texlive/texdoc
new file mode 100755
index 00000000000..7c66896497d
--- /dev/null
+++ b/Build/source/texk/texlive/texdoc
@@ -0,0 +1,345 @@
+#!/usr/bin/env texlua
+-- $Id$
+--[[ Written in lua by Frank Küster (2007) based on the shell script by
+Thomas Esser, David Aspinall, and Simon Wilkinson.
+Public domain.]]
+--[[ Changelog
+ 0.3 2007-06-28
+ - added changelog
+ - better OS detection for default viewer settings
+ - removed some debugging code
+ - -s now works in dirs without ls-R, too
+
+ 0.2 2007-06-28
+ - implemented reading of configuration from texmf.cnf
+ - fixed "-s" option
+
+ 0.1
+ - initial public release
+]]
+
+progname = 'texdoc';
+version = '0.3';
+usage = ' Usage: ' .. progname ..' [-h|--help] name\
+ -h|--help\t\t Show this help\
+ -V|--version\t\t Print the version of the program\
+ -v|--verbose\t\t Show the command being used to display the documentation\
+ -l|--list\t\t List matching files, do not start a viewer.\
+ -s|--search\t\t search for name as a pattern';
+
+
+if not arg[1] then
+ print (usage);
+ return
+end
+
+mode = 'view';
+verbose = false;
+while table.maxn(arg) > 0 and string.match(arg[1],'^%-') do
+ curr_arg = table.remove(arg,1)
+ if string.match (curr_arg,'-h') or string.match (curr_arg,'--help') then
+ print (usage);
+ os.exit(0);
+ elseif string.match (curr_arg,'-V') or string.match (curr_arg,'--version') then
+ print (progname .. ' version: ' .. version );
+ os.exit(0);
+ elseif string.match (curr_arg,'-v') or string.match (curr_arg,'--verbose') then
+ verbose = true;
+ elseif string.match (curr_arg,'-l') or string.match (curr_arg,'--list' ) then
+ mode = 'list';
+ elseif string.match (curr_arg,'-s') or string.match (curr_arg,'--search' ) then
+ mode = 'search';
+ end
+end
+
+--[[ function definitions ]]
+function list_iter (t)
+ local i = 0
+ local n = table.getn(t)
+ return function ()
+ i = i + 1
+ if i <= n then return t[i] end
+ end
+end
+
+
+-- [[ functions for the search option ]]
+no_lsr_doctrees = {};
+function get_lsr_files ()
+ local lsr_files = {};
+ local pathlist = kpse.expand_braces('$TEXDOCS');
+ for path in string.gmatch(pathlist, "[^:;]+") do
+ path = string.gsub(path,'//$','')
+ local tree_root
+ tree_root = string.gsub(path,'doc$','')
+ tree_root = string.gsub(tree_root,'^!!','')
+ if lfs.isfile(tree_root .. "ls-R") then
+ table.insert(lsr_files,tree_root .. "ls-R")
+ else
+ if not string.match(path,'^%.$') and lfs.isdir(path) then
+ table.insert(no_lsr_doctrees,path)
+ end
+ end -- does lsRfile exist?
+ end -- for path
+ local i = 0
+ local n = table.getn(lsr_files)
+ -- TODO: We completely ignore trees without ls-R files. Since I
+ -- don't know how to get the output of "find" without resorting to
+ -- temporary files, anyway, I don't care.
+ return function ()
+ i = i +1
+ if i <= n then return lsr_files[i] end
+ end
+
+end -- get_lsr_files()
+
+function deluaficate(oldpat)
+ local newpat
+ -- better use long strings here, no escaping of \ needed there.
+ newpat = string.gsub(oldpat,'([^\\])%-','%1%%%-')
+ newpat = string.gsub(newpat,'\\','')
+ return newpat
+end --deluaficate
+
+docdirs = {}
+docfiles = {}
+function pattern_search (pattern)
+ pattern = deluaficate(pattern)
+ -- populate docdirs and doclines list
+ for database in get_lsr_files() do
+ local texmf_tree = string.gsub(database,'ls%-R$','')
+ is_docline = false
+ local this_dir -- changed to each individual docdir
+ for line in io.lines(database) do
+ if string.match(line,'^./') then
+ -- a directory
+ this_dir = string.gsub(line,'^./',texmf_tree)
+ this_dir = string.gsub(this_dir,':$','/')
+ if string.match(line,'^./doc') then
+ -- the next file lines are in docdir "this_dir"
+ is_docline = true
+ -- save it in the docdirs table
+ table.insert(docdirs,this_dir)
+ else
+ is_docline = false
+ end -- docdir
+ elseif string.match(line,'^%s*$') then
+ -- empty line, do nothing
+ -- now we have only file lines left, are they a docline?
+ elseif is_docline then
+ local fullpath = this_dir .. line
+-- print(fullpath)
+ table.insert(docfiles,fullpath)
+ end -- line starting with ./
+ end -- for line
+ end -- for database
+ for no_lsr_dir in list_iter(no_lsr_doctrees) do
+ recurse_tree(no_lsr_dir)
+ end
+
+ print("Directories that match:")
+ for dir in list_iter(docdirs) do
+ if string.match(dir,pattern) then
+ print (dir)
+ end
+ end -- for dir
+ print()
+ print("Files that match:")
+ for file in list_iter(docfiles) do
+ if string.match(file,pattern) then
+ print (file)
+ end
+ end -- for file
+
+end -- function pattern_search()
+
+function recurse_tree (path)
+ for file in lfs.dir(path) do
+ if file ~= "." and file ~= ".." then
+ local f = path..'/'..file
+ local attr = lfs.attributes (f)
+ if attr then -- else stale symlink
+ if attr.mode == "directory" then
+ table.insert(docdirs,f)
+ recurse_tree (f)
+ else
+ table.insert(docfiles,f)
+ end
+ end
+ end
+ end
+ end --function recurse_tree
+
+
+--[[ functions for parsing texmf.cnf ]]
+function set_var_from_texmf(oldvalue,texmfvar)
+ local newvalue
+ newvalue = kpse.var_value(texmfvar)
+ if newvalue then
+ return newvalue
+ else
+ return oldvalue
+ end
+end
+function set_listvar_from_texmf(oldvalue,texmfvar)
+ local list_as_string
+ local templist = {}
+ list_as_string = set_var_from_texmf('',texmfvar)
+ for element in string.gmatch(list_as_string,'[^,;:]+') do
+ table.insert(templist,element)
+ end
+ if table.maxn(templist) > 0 then
+ return templist
+ else
+ return oldvalue
+ end
+end -- set_listvar_from_texmf
+
+function set_listvar_from_expand_braces(oldvalue,texmfvar)
+ local list_as_string
+ local templist = {}
+ list_as_string = kpse.expand_braces(texmfvar)
+ for element in string.gmatch(list_as_string,'[^,;:]*:') do
+ element = string.gsub(element,':','')
+ table.insert(templist,element)
+ end
+ if table.maxn(templist) > 0 then
+ return templist
+ else
+ return oldvalue
+ end
+end -- set_listvar_from_expand_braces
+
+--[[ initialize kpathsea ]]
+kpse.set_program_name("texdoc")
+
+-- [[ initialize some variables ]]
+texdoc_formats = {'dvi','pdf','ps','txt','html'}
+
+-- can be done with: if (os.type == "windows") then
+if string.find(os.getenv("PATH"),";") then
+ -- probably Windows (or OS/2)
+ -- which commands should we use for unzipping?
+ texdoc_unzip = {
+ gz = "gzip -d -c ",
+ bz2 = "bzip2 -d -c "
+ };
+ texdoc_viewer = {
+ dvi = '(start /wait %s ) &',
+ html = '(start /wait %s) &',
+ pdf = '(start /wait %s) &',
+ ps = '(start /wait %s) &',
+ txt = '(start /wait %s) &',
+ tex = '(start /wait %s) &'
+ };
+ rmfile_command = 'del /F ';
+ rmdir_command = 'rmdir ';
+else
+ -- probably UNIX-like
+ texdoc_unzip = {
+ gz = "gzip -d -c ",
+ bz2 = "bzip2 -d -c "
+ };
+ texdoc_viewer = {
+ dvi = '(xdvi %s ) &',
+ html = '(see %s) &',
+ pdf = '(xpdf %s) &',
+ ps = '(gv %s) &',
+ txt = '(less %s )',
+ tex = '(less %s )'
+ };
+ rmfile_command = 'rm -f ';
+ rmdir_command = 'rmdir ';
+end
+
+texdoc_zipformats = {'','gz','bz2'};
+texdoc_formats = {'','dvi','html','pdf','ps','txt','tex'};
+extlist = {'','.dvi', '.dvi.gz', '.dvi.bz2', '.pdf', '.pdf.gz', '.pdf.bz2', '.ps', '.ps.gz', '.ps.bz2', '.txt', '.txt.gz', '.txt.bz2', '.html'};
+
+-- [[ override hardcoded variables with values from texmf.cnf ]]
+rmfile_command = set_var_from_texmf(rmfile_command,'TEXDOC_RMFILE')
+rmdir_command = set_var_from_texmf(rmdir_command,'TEXDOC_RMDIR')
+texdoc_formats = set_listvar_from_texmf(texdoc_formats,'TEXDOC_FORMATS')
+for format in list_iter(texdoc_formats) do
+ viewer_var = 'TEXDOC_VIEWER_' .. string.upper(format)
+ texdoc_viewer[format] = set_var_from_texmf(texdoc_viewer[format],viewer_var)
+end
+texdoc_zipformats = set_listvar_from_texmf(texdoc_zipformats,'TEXDOC_ZIPFORMATS')
+for zipext in list_iter(texdoc_zipformats) do
+ viewer_var = 'TEXDOC_UNZIP_' .. string.upper(zipext)
+ texdoc_unzip[zipext] = set_var_from_texmf(texdoc_unzip[zipext],viewer_var)
+end
+extlist = set_listvar_from_expand_braces(extlist,'$TEXDOCEXT');
+-- we want an empty string for ext at the beginning, so that it works
+-- to specify the complete filename. Doesn't matter when there's one
+-- more empty string, but we can easily avoid two in a row
+if not extlist[1] == '' then
+ insert(extlist,1,'')
+end
+
+
+for docname in list_iter (arg) do
+ if string.match(mode,'search') then
+ pattern_search(docname);
+ elseif string.match(mode,'view') or string.match(mode,'list') then
+ for ext in list_iter(extlist) do
+ filename = kpse.find_file(docname .. ext , "TeX system documentation")
+
+ if filename then
+ if string.match (mode, 'list') then
+ print(filename);
+ else
+ -- mode is view, is unzipping needed?
+ zipext = string.match(ext,'%..*%.(.*)');
+ if zipext then
+ unzip_command = texdoc_unzip[zipext];
+ viewext = string.match(ext,'%.(.*)%..*$');
+ basebame_pattern = '.*/(.*%.' .. viewext .. ')';
+ basename = string.match(filename,basebame_pattern);
+
+ -- uncompress only once per file, in case it is given more
+ -- than once (dvi besides ps or so)
+ -- TODO: to be done
+
+ tmpdir = os.tmpdir("/tmp/texdoc.XXXXXX");
+
+ unzip_commandline = unzip_command .. filename .. " > " .. tmpdir .. "/" .. basename;
+ if os.execute(unzip_commandline) then
+ filename = tmpdir .. "/" .. basename;
+ else
+ print("Error executing \n" .. unzip_commandline);
+ end
+ viewer_replacement = filename .. ';' .. rmfile_command .. filename .. ';' .. rmdir_command .. tmpdir;
+ else
+ if ext == '' then
+ -- fallback if complete filename has been specified
+ ext = string.match(filename,'.*(%..*)$')
+ if not ext then
+ -- still no extension for filenames like README
+ ext = 'txt';
+ end
+ end
+ viewer_replacement = filename;
+ viewext = string.match(ext,'%.(.*)$');
+ if not viewext or not texdoc_viewer[viewext] then
+ -- complete filename specified, unknown extension, use "txt"
+ viewext = 'txt'
+ end
+ end -- zipped or not
+ view_command = string.gsub(texdoc_viewer[viewext],'%%s',viewer_replacement)
+ if verbose then
+ print(view_command);
+ end
+ view_result = os.execute(view_command);
+ if view_result then
+ do break end;
+ else
+ print("Error executing \n" .. view_command);
+ end
+ end -- list or view
+ end -- found a filename with that extension or not?
+ end -- for ext
+ end -- if construct "case mode in"
+end -- for docname
+
+-- cleanup_tmpdir();
diff --git a/Build/source/texk/texlive/texdoc.man b/Build/source/texk/texlive/texdoc.man
new file mode 100644
index 00000000000..e2bbcdeca5b
--- /dev/null
+++ b/Build/source/texk/texlive/texdoc.man
@@ -0,0 +1,225 @@
+.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.32
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sh \" Subsection heading
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. \*(C+ will
+.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+'br\}
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. nr % 0
+. rr F
+.\}
+.\"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.hy 0
+.if n .na
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "TEXDOC 1"
+.TH TEXDOC 1 "2007-06-05" "perl v5.8.8" "User Contributed Perl Documentation"
+.SH "NAME"
+texdoc \- Search for NAME in the TeX documentation and start a viewer.
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+\&\fBtexdoc\fR
+[\fB\-h|\-\-help\fR]
+[\fB\-v|\-\-verbose\fR]
+[\fB\-V|\-\-version\fR]
+[\fB\-l|\-\-list\fR]
+[\fB\-S|\-\-search\fR]
+[\fIname|pattern\fR]
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+\fBtexdoc\fR is a script which attempts to find and display
+documentation for tex files. Without any options, the file
+\fBname\fR\fI.ext\fR is displayed, where \fI.ext\fR is one of the
+extensions defined in the variable \s-1TEXDOCEXT\s0 in
+\&\fBtexmf.cnf\fR. The viewer used for displaying the file can be
+customized.
+
+\fBtexdoc\fR accepts compressed files, too. You can also specify the
+complete filename, e.g. to decide which of two files with equal
+basename you want., In this case, however, access to compressed files
+is not possible.
+.SH "OPTIONS"
+.IP "\fB\-h\fR, \fB\-\-help\fR" 4
+Display a usage message
+.IP "\fB\-V\fR, \fB\-\-version\fR" 4
+Display version information and exit
+.IP "\fB\-v\fR, \fB\-\-verbose\fR" 4
+verbose mode: show viewer command
+.IP "\fB\-l\fR, \fB\-\-list\fR" 4
+Just list all files that match \fIname\fR, do not start a viewer.
+.IP "\fB\-S\fR, \fB\-\-search\fR \fIpattern\fR" 4
+\&\fIpattern\fR is treated as a lua pattern (similar to basic regular
+expressions, with `%' as escape character instead of `\\'). The output first lists all
+directory names which match \fIpattern\fR and then all files.
+Currently, directories without an ls-R file are ignored.
+.SH "VARIABLES"
+.RS 4
+.IP "TEXDOCS = .;$TEXMF/doc//"
+Specifies the directories where TeX documentation is stored
+.IP "\s-1TEXDOCEXT\s0 = {:.pdf:.ps:.dvi:.txt:.tex}{:.gz:.bz2}:.html" 4
+Recognized formats for documentation, the first match wins. The
+default uses standard kpathsea brace notation. `html' should be last
+in order to prevent the catalogue entry from being shown when other
+documentation exists.
+.IP "\s-1TEXDOC_VIEWER_\fBFORMAT\fR\s0 = (command %s) &" 4
+Defines the viewer to be used for \fBFORMAT\fR,
+e.g. \fITEXDOC_VIEWER_DVI\fR. The filename (and tempfile cleanup
+commands, if needed after decompression) is substituted for `%s'. If
+the viewer does not put itself in the background, the command must be
+enclosed in parentheses and the `&' sign appended, as shown in the
+example for \fIcommand\fR.
+.IP "\s-1TEXDOC_UNZIP_\fBFORMAT\fR\s0 = command -a -c " 4
+This variable specifies the command which is used to uncompress a file
+compressed as \fBFORMAT\fR. It result must go to \fIstdout\fR.
+.IP "\s-1TEXDOC_FORMATS\s0 = pdf,dvi,ps,txt,tex" 4
+The formats for which a viewer is defined in \fItexmf.cnf\fR (order
+does not matter).
+.IP "\s-1TEXDOC_ZIPFORMATS\s0 = gz,bz2" 4
+The compression formats for which a decompression command is defined
+in \fItexmf.cnf\fR.
+.IP "\s-1TEXDOC_RMFILE\s0 = rm -f" 4
+The command used to remove a file on the target system. This is used
+for temporary files which are needed for viewing compressed documents.
+.IP "\s-1TEXDOC_RMDIR\s0 = rmdir" 4
+The command used to remove a directory on the target system. This is
+used for temporary directories which are needed for viewing compressed
+documents.
+.SH "BUGS"
+Currently no bugs are known, but there are some limitations:
+.IP "Specifying the filename, complete with extension"
+This doesn't work for compressed files.
+.IP manpage
+The manpage has been written on a template created by pod2man, and its
+source contains a lot of (probably) useless cruft at the beginning.
+.SH "HISTORY"
+Original version by David Aspinall <da@dcs.ed.ac.uk>
+.Sp
+Rewritten for use with bash 2 and teTeX under Linux by Simon Wilkinson
+<sxw@dcs.ed.ac.uk>
+.Sp
+Changes for web2c\-7.2 resp. teTeX\-0.9 and portability fixes by
+Thomas Esser <te@dbs.uni\-hannover.de>, Jun 14 1998
+.Sp
+Support for compressed documentation implemented by adopting changes
+made by debian. Thomas Esser, Dec. 2004.
+.Sp
+Rewritten using texlua by Frank Küster <frank@kuesterei.ch>. Changed
+the \-s option to use ls-R instead of \fIfind\fR, May/June 2007.
+
+