summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/texdoc/config.tlu
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/scripts/texdoc/config.tlu')
-rw-r--r--Master/texmf-dist/scripts/texdoc/config.tlu583
1 files changed, 0 insertions, 583 deletions
diff --git a/Master/texmf-dist/scripts/texdoc/config.tlu b/Master/texmf-dist/scripts/texdoc/config.tlu
deleted file mode 100644
index cb72343c6ad..00000000000
--- a/Master/texmf-dist/scripts/texdoc/config.tlu
+++ /dev/null
@@ -1,583 +0,0 @@
--- config.tlu: configuration handling for texdoc
---
--- Manuel Pégourié-Gonnard and the TeX Live team, GPLv3,
--- see texdoclib.tlu for details
-
--------------------------- hide the config table --------------------------
-
--- config is read-only (but not "deep" read-only)
-function set_read_only(table, name)
- assert(next(table) == nil,
- 'Internal error: '..name..' should be empty at this point.')
- local ro = 'Internal error: attempt to update read-only table '
- local real = {}
- setmetatable(table, {
- __index = real,
- __newindex = function () error(ro..name..'.') end,
- })
- return function(k, v) real[k] = v end
-end
-
-real_set_config = set_read_only(config, 'config')
-
-
-------------------------- general config functions ------------------------
-
--- set a config parameter, but don't overwrite it if already set
--- three special types: *_list (list), *_switch (boolean), *_level (number)
-function set_config_element (key, value, context)
- local is_known = false -- is key a valid option?
- local option
- for _, option in ipairs(C.known_options) do
- if string.match(key, '^'..option..'$') then is_known = true break end
- end
- -- warn and exit if key is not a known option
- if not is_known then config_warn(key, nil, context, true) return end
- -- exit if key is already set (/!\ must test for nil, not false)
- if not (config[key] == nil) then
- if context.src ~= 'def' then
- deb_print('config', "Ignoring '"..key.."="..value.."' "
- ..context_to_string(context)..'.')
- end
- return nil
- end
- -- record the source of the setting
- real_set_config(key..'_src', context.src)
- -- detect the type of the key
- if string.match(key, '_list$') then
- -- coma-separated list
- local values
- if value == '' then
- values = {}
- else
- values = string.explode(value, ',')
- end
- local inverse = {}
- for i, j in ipairs(values) do -- sanitize values...
- j = string.gsub(j, '%s*$', '')
- j = string.gsub(j, '^%s*', '')
- values[i] = j
- inverse[j] = i -- ... and build inverse mapping on the way
- end
- real_set_config(key, values)
- real_set_config(key..'_inv', inverse)
- real_set_config(key..'_max', #values)
- elseif string.find (key, '_switch$') then
- -- boolean
- if value == 'true' then
- real_set_config(key, true)
- elseif value == 'false' then
- real_set_config(key, false)
- else
- config_warn (key, value, context)
- end
- elseif string.find (key, '_level$') then
- -- integer
- local val = tonumber (value)
- if val then
- real_set_config(key, val)
- else
- config_warn (key, value, context)
- end
- else -- string
- real_set_config(key, value)
- end
- -- special case: if we just set debug_list, print version info now
- if key == 'debug_list' then
- deb_print('version', C.fullname..' version '..C.version)
- end
- -- now tell what we have just done, for debugging
- deb_print('config',
- "Setting '"..key.."="..value.."' "..context_to_string(context)..'.')
-end
-
--- a helper function for warning messages in the above
-function config_warn (key, value, context, unknown)
- local begin = unknown
- and 'Unknown option "'..key..'"'
- or 'Illegal value "'..tostring(value)..'" for option "'..key..'"'
- local ending = '. Skipping.'
- err_print('warning', begin..' '..context_to_string(context)..ending)
-end
-
--- interpreting 'context' for the previous functions
-function context_to_string(context)
- if not context then return '(no context)' end
- if context.src == 'cl' then
- return 'from command line option "'..context.name..'"'
- elseif context.src == 'env' then
- return 'from environment variable "'..context.name..'"'
- elseif context.src == 'loc' then
- return 'from operating system locale'
- elseif context.src == 'file' then
- return 'in file "'..context.file..'" on line '..context.line
- elseif context.src == 'def' then
- return 'from built-in defaults'
- else
- return 'from unkown source (should not happen, please report)'
- end
-end
-
--- set a whole list, also whithout overwriting
-function set_config_list (conf, context)
- for key, value in pairs(conf) do
- set_config_element (key, value, context)
- end
-end
-
------------------------- options from command line ------------------------
-
--- set config from the command line
--- Please make sure to update C.usage_msg accordingly
--- and set a default value in setup_config_from_defaults() if relevant.
-function setup_config_from_cl(arg)
- local curr_arg
- local action = true
- local function set_config_elt(key, val)
- set_config_element(key, val, {src='cl', name=curr_arg})
- end
-
- -- modified Alternative Get Opt
- -- cf. http://lua-users.org/wiki/AlternativeGetOpt
- local function getopt(arg, options)
- local tmp
- local tab = {}
- local saved_arg = { table.unpack(arg) }
- for k, v in ipairs(saved_arg) do
- if string.sub(v, 1, 2) == "--" then
- table.remove(arg, 1)
- local x = string.find(v, "=", 1, true)
- if x then tab[string.sub(v, 3, x-1)] = string.sub(v, x+1)
- else tab[string.sub(v, 3)] = true
- end
- elseif string.sub(v, 1, 1) == "-" then
- table.remove(arg, 1)
- local y = 2
- local l = string.len(v)
- local jopt
- while (y <= l) do
- jopt = string.sub(v, y, y)
- if string.find(options, jopt, 1, true) then
- if y < l then
- tmp = string.sub(v, y+1)
- y = l
- else
- table.remove(arg, 1)
- tmp = saved_arg[k + 1]
- end
- if string.match(tmp, '^%-') then
- tab[jopt] = false
- else
- tab[jopt] = tmp
- end
- else
- tab[jopt] = true
- end
- y = y + 1
- end
- end
- end
- return tab
- end
-
- opts = getopt(arg, 'd')
- for k, v in pairs(opts) do
- if #k == 1 then
- curr_arg = '-' .. k
- else
- curr_arg = '--' .. k
- end
-
- -- action
- if (curr_arg == '-h') or (curr_arg == '--help') then
- action = 'help'
- elseif (curr_arg == '-V') or (curr_arg == '--version') then
- action = 'version'
- elseif (curr_arg == '-f') or (curr_arg == '--files') then
- action = 'files'
- elseif curr_arg == '--just-view' then
- action = 'view'
- -- mode
- elseif (curr_arg == '-w') or (curr_arg == '--view') then
- set_config_elt('mode', 'view')
- elseif (curr_arg == '-m') or (curr_arg == '--mixed') then
- set_config_elt('mode', 'mixed')
- elseif (curr_arg == '-l') or (curr_arg == '--list') then
- set_config_elt('mode', 'list')
- elseif (curr_arg == '-s') or (curr_arg == '--showall') then
- set_config_elt ('mode', 'showall')
- -- interaction
- elseif (curr_arg == '-I') or (curr_arg == '--nointeract') then
- set_config_elt('interact_switch', 'false')
- elseif (curr_arg == '-i') or (curr_arg == '--interact') then
- set_config_elt('interact_switch', 'true')
- -- output format
- elseif (curr_arg == '-M') or (curr_arg == '--machine') then
- set_config_elt('machine_switch', 'true')
- -- debug
- elseif (curr_arg == '-d') or (curr_arg == '--debug') then
- if v == true then v = 'all' end
- set_config_elt('debug_list', v)
- elseif curr_arg == '-D' then
- set_config_elt('debug_list', 'all')
- -- verbosity
- elseif (curr_arg == '-q') or (curr_arg == '--quiet') then
- set_config_elt('verbosity_level', C.min_verbosity)
- elseif (curr_arg == '-v') or (curr_arg == '--verbose') then
- set_config_elt('verbosity_level', C.max_verbosity)
- -- problem
- else
- err_print('error', "unknown option: "..curr_arg)
- err_print('error', C.error_msg)
- return false
- end
- end
- return action
-end
-
-------------------------- config from environment --------------------------
-
--- set config from environment if available
-function setup_config_from_env ()
- local function set_config_elt_from_vars(key, vars)
- for _, var in ipairs(vars) do
- local value = os.getenv(var)
- if value then
- set_config_element(key, value, {src='env', name=var})
- end
- end
- end
- set_config_elt_from_vars('viewer_pdf',
- {"PDFVIEWER_texdoc", "PDFVIEWER", "TEXDOCVIEW_pdf", "TEXDOC_VIEWER_PDF"})
- set_config_elt_from_vars('viewer_ps',
- {"PSVIEWER_texdoc", "PSVIEWER", "TEXDOCVIEW_ps", "TEXDOC_VIEWER_PS"})
- set_config_elt_from_vars('viewer_dvi',
- {"DVIVIEWER_texdoc", "DVIVIEWER", "TEXDOCVIEW_dvi", "TEXDOC_VIEWER_DVI"})
- set_config_elt_from_vars('viewer_html',
- {"BROWSER_texdoc", "BROWSER", "TEXDOCVIEW_html", "TEXDOC_VIEWER_HTML"})
- set_config_elt_from_vars('viewer_md',
- {"MDVIEWER_texdoc", "PAGER", "TEXDOCVIEW_md", "TEXDOC_VIEWER_MD"})
- set_config_elt_from_vars('viewer_txt',
- {"PAGER_texdoc", "PAGER", "TEXDOCVIEW_txt", "TEXDOC_VIEWER_TXT"})
-end
-
----------------------- options and aliases from files ----------------------
-
--- set config+aliases from a particular config file assumed to exist
-function read_config_file(configfile)
- local cnf = assert(io.open(configfile, 'r'))
- local lineno = 0
- while true do
- local line=cnf:read('*line')
- lineno = lineno + 1
- if line == nil then break end -- EOF
- line = string.gsub(line, '%s*#.*$', '') -- comments begin with #
- line = string.gsub(line, '%s*$', '') -- remove trailing spaces
- line = string.gsub(line, '^%s*', '') -- remove leading spaces
- -- try to interpret the line
- local ok = string.match(line, '^%s*$')
- or confline_to_alias(line, configfile, lineno)
- or confline_to_score(line, configfile, lineno)
- or confline_to_config(line, configfile, lineno)
- -- complain if it failed
- if not ok then
- err_print('warning',
- 'syntax error in '..configfile..' at line '..lineno..'.')
- end
- end
- cnf:close()
-end
-
--- interpret a confline as a config setting or return false
-function confline_to_config(line, file, pos)
- local key, val = string.match(line, '^([%a%d_]+)%s*=%s*(.+)')
- if key and val then
- set_config_element(key, val, {src='file', file=file, line=pos})
- return true
- end
- return false
-end
-
--- return the list of configuration files
-function get_config_files()
- -- get names
- local platform = string.match (kpse.var_value ('SELFAUTOLOC'), '.*/(.*)$')
- local names = {
- 'texdoc-'..platform..'.cnf',
- 'texdoc.cnf',
- 'texdoc-dist.cnf',
- }
- -- get dirs
- local sep = (os.type == 'windows') and ';' or ':'
- local texmf_texdoc = kpse.expand_path('$TEXMF/texdoc')
- local dirs = texmf_texdoc:explode(sep)
- -- merge them
- local ret = {}
- for _, dir in ipairs(dirs) do
- for _, name in ipairs(names) do
- local pathname = dir .. '/' .. name
- if lfs.isfile(pathname) then
- table.insert(ret, pathname)
- end
- end
- end
- return ret
-end
-
--- the config_files table is shared by the next two functions
-do
-local config_files = {}
-
--- set config/aliases from all config files
-function setup_config_from_files ()
- local file_list = get_config_files()
- for i, file in ipairs (file_list) do
- local status = config.lastfile_switch and 'disabled' or 'active'
- config_files[i] = {
- path = file,
- status = status,
- }
- if status == 'active' then
- read_config_file (file)
- end
- end
-end
-
--- now a special information function (see -f,--file option)
-function show_config_files (print_fun, verbose)
- local pref = verbose and ' ' or ''
- print_fun("Configuration files are:")
- for i, file in ipairs (config_files) do
- print_fun(pref..file.status..'\t'..w32_path(file.path))
- end
- if verbose then
- print_fun('Recommended file(s) for personal settings:')
- local sep = (os.type == 'windows') and ';' or ':'
- local texmfhomes = string.explode(kpse.var_value('TEXMFHOME'), sep)
- for _, home in ipairs(texmfhomes) do
- print_fun(pref..home..'/texdoc/texdoc.cnf')
- end
- end
-end
-
-end -- scope of config_files
-
----------------------- config from locale settings -------------------------
-
-function setup_config_from_locale()
- local current = os.setlocale(nil, "all")
- os.setlocale("", "all")
- local native = os.setlocale(nil, "time")
- os.setlocale(current, "all")
- local lang = string.match(native, "^[a-z][a-z]")
- if lang then
- set_config_element("lang", lang, {src="loc"})
- end
-end
-
----------------------- options from built-in defaults ----------------------
-
--- for default viewer on general Unix, we have a list; the following two
--- functions are used to check in the path which program is available
-
--- check if "name" is the name of a file in the path
--- Warning: to be used only on Unix! (separators, and PATH irrelevant on win32)
--- the value of PATH is cached
-do local path_list = string.explode(os.getenv("PATH"), ':')
-function is_in_path(name)
- for _, path in ipairs(path_list) do
- if lfs.isfile(path..'/'..name) then return true end
- end
- return false
-end
-end
-
--- guess a viewer from a list:
--- - xdg-open from freedesktop if available
--- - try detecting desktop environments
--- - or return the first element of "list" whose name is found in path
--- - or nil
--- caches results of desktop environment detection
-do local de_viewer
-function guess_viewer(cmds)
- -- try the freedesktop method
- if is_in_path('xdg-open') then
- return '(xdg-open %s) &'
- end
- -- try desktop environment
- if not de_viewer then de_viewer = desktop_environment_viewer() end
- if de_viewer then return de_viewer end
- -- or look along path
- for _, cmd in ipairs(cmds) do
- if is_in_path(cmd[1]) then return cmd[2] end
- end
-end
-end
-
--- returns a viewer specific to a desktop environement if relevant
--- doesn't work on windows (uses io.popen)
--- logic stolen from xdg-open (http://www.freedesktop.org/) and adapted
-function desktop_environment_viewer()
- if os.getenv('KDE_SESSION_VERSION') and is_in_path('kde-open') then
- return '(kde-open %s) &' -- kde 4 (or greater)
- end
- if os.getenv('KDE_FULL_SESSION') and is_in_path('kfmclient') then
- return '(kfmclient exec %s) &' -- kde < 4
- end
- if os.getenv('GNOME_DESKTOP_SESSION_ID') then -- gnome
- if is_in_path('gvfs-open') then return '(gvfs-open %s) &' end
- if is_in_path('gnome-open') then return '(gnome-open %s) &' end
- end
- if not is_in_path('xprop') then return end
- local xprop_fh = io.popen('xprop -root _DT_SAVE_MODE 2>/dev/null')
- local xprop_out = xprop_fh:read('*line')
- xprop_fh:close()
- if xprop_out and string.find(xprop_out, '= "xfce4"$') then -- xfce
- return '(exo-open %s) &'
- end
-end
-
--- set viewers from defaults (done only if necessary)
-function get_default_viewers()
- local function set_config_ls(ls) set_config_list(ls, {src='def'}) end
- if (os.type == "windows") then
- set_config_ls {
- -- Use 'start' to get file associations.
- -- We need to quote the filenames, but the first quoted argument
- -- is considered as the title by start, so we provide a dummy title.
- -- Also, since the command line parser removes quotes if there
- -- is no space inside, the dummy title must contain spaces.
- viewer_dvi = 'start "texdoc dvi viewer"',
- viewer_html = 'start "texdoc html viewer"',
- viewer_pdf = 'start "texdoc pdf viewer"',
- viewer_ps = 'start "texdoc ps viewer"',
- -- 'more' is always available.
- -- However, we can't assume texdoc is called from a cmd.exe window
- -- (it can be run from the start->run menu), hence we make sure
- -- to open a new window if needed.
- viewer_txt = 'start cmd /k more',
- viewer_md = viewer_txt,
- }
- elseif (os.name == 'macosx') then
- set_config_ls {
- viewer_dvi = 'open',
- viewer_html = 'open',
- viewer_pdf = 'open',
- viewer_ps = 'open',
- viewer_txt = 'less',
- viewer_md = viewer_txt,
- }
- else -- generic Unix
- set_config_ls {
- viewer_dvi = guess_viewer {
- {'xdvi', '(xdvi %s) &'},
- {'evince', '(evince %s) &'},
- {'okular', '(okular %s) &'},
- {'kdvi', '(kdvi %s) &'},
- {'xgdvi', '(xgdvi %s) &'},
- {'spawg', '(spawg %s) &'},
- {'spawx11', '(spawx11 %s) &'},
- {'tkdvi', '(tkdvi %s) &'},
- {'dvilx', '(dvilx %s) &'},
- {'advi', '(advi %s) &'},
- {'xdvik-ja', '(xdvik-ja %s) &'},
- {'see', '(see %s) &'}
- },
- viewer_html = guess_viewer {
- {'firefox', '(firefox %s) &'},
- {'seamonkey', '(seamonkey %s) &'},
- {'mozilla', '(mozilla %s) &'},
- {'konqueror', '(konqueror %s) &'},
- {'epiphany', '(epiphany %s) &'},
- {'opera', '(opera %s) &'},
- {'w3m', 'w3m'},
- {'links', 'links'},
- {'lynx', 'lynx'},
- {'see', 'see'}
- },
- viewer_pdf = guess_viewer {
- {'xpdf', '(xpdf %s) &'},
- {'evince', '(evince %s) &'},
- {'okular', '(okular %s) &'},
- {'kpdf', '(kpdf %s) &'},
- {'acroread', '(xpdf %s) &'},
- {'see', '(see %s) &'}
- },
- viewer_ps = guess_viewer {
- {'gv', '(gv %s) &'},
- {'evince', '(evince %s) &'},
- {'okular', '(okular %s) &'},
- {'kghostview', '(kghostview %s) &'},
- {'see', '(see %s) &'}
- },
- viewer_txt = guess_viewer {
- {'most', 'most'},
- {'less', 'less'},
- {'more', 'more'}
- },
- viewer_md = viewer_txt,
- }
- end
-end
-
--- set some fall-back default values if no previous value is set
-function setup_config_from_defaults()
- local function set_config_ls(ls) set_config_list(ls, {src='def'}) end
- local function set_config_elt(key, val)
- set_config_element(key, val, {src='def'})
- end
- -- various, platform independent, stuff
- set_config_ls {
- mode = 'view',
- interact_switch = 'true',
- machine_switch = 'false',
- ext_list = 'pdf, htm, html, txt, ps, dvi, ',
- basename_list = 'readme, 00readme',
- badext_list = 'txt, ',
- badbasename_list = 'readme, 00readme',
- suffix_list = '',
- verbosity_level = C.def_verbosity,
- debug_list = '',
- max_lines = '20',
- fuzzy_level = '5',
- }
- -- zip-related options
- set_config_ls {
- zipext_list = '',
- rm_file = 'rm -f',
- rm_dir = 'rmdir',
- }
-end
-
--------------------------- set all configuration ---------------------------
-
--- populate the config and alias arrays
-function setup_config_and_alias(arg)
- -- setup config from all sources
- local ret = setup_config_from_cl(arg)
- setup_config_from_env()
- setup_config_from_files()
- setup_config_from_locale()
- setup_config_from_defaults()
- -- machine mode implies no interaction
- if config.machine_switch == true then
- real_set_config('interact_switch', false)
- end
- -- debug implies verbose
- if #config.debug_list > 0 then
- real_set_config('verbosity_level', tonumber(C.max_verbosity))
- end
- -- we were waiting for config.debug_list to be known to do this
- show_config_files(function(s) deb_print('files', s) end)
- -- propagated return value of _from_cl()
- return ret
-end
-
-return {
- setup_config_and_alias = setup_config_and_alias,
- get_default_viewers = get_default_viewers,
- show_config_files = show_config_files,
- read_config_file = read_config_file,
-}
-
--- vim: ft=lua: