/* Part of SWI-Prolog
Author: Jan Wielemaker
E-mail: J.Wielemaker@vu.nl
WWW: http://www.swi-prolog.org
Copyright (c) 1997-2023, University of Amsterdam
VU University Amsterdam
SWI-Prolog Solutions b.v.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
*/
:- module(latex2html4pl, []).
:- use_module(latex2html,
[ latex2html_module/0,
tex_load_commands/1,
translate_table/3,
clean_tt/2,
add_to_index/2,
add_to_index/1,
translate_section/5,
translate_section/4,
op(_,_,_)
]).
:- autoload(library(apply),[maplist/3,maplist/2]).
:- autoload(library(lists),[append/3,delete/3]).
:- autoload(library(occurs),[sub_term/2]).
:- autoload(library(readutil),[read_line_to_codes/2]).
:- latex2html_module.
:- tex_load_commands(pl).
/*******************************
* MACROS *
*******************************/
#(defitem(Class,Label), [ html(Begin), Label, html(''),
html('
')
]) :-
format(atom(Begin), '', [Class]).
#(defitem(Label), [ html(''), Label,
html('')
]).
#(predtag(Value), [ html(''), Value,
html('')
]).
#(mod(Module), [ html(''), Module,
html('')
]).
/*******************************
* ENVIRONMENTS *
*******************************/
list_command(tags, _, html(''), html('
')).
env(tabularlp([{_}], Tokens), HTML) :-
translate_table(ll, Tokens, HTML).
/*******************************
* INDEX HACK *
*******************************/
cmd(+, index, nospace('\\+')).
cmd(=, index, nospace('\\=')).
/*******************************
* COMMANDS *
*******************************/
cmd(spaces({X}), html(Spaces)) :-
atom_number(X, N),
n_list(N, ' ', L),
atomic_list_concat(L, Spaces).
cmd(hrule, html('
')).
cmd(bug({TeX}), #footnote(bug, +TeX)).
cmd(fileext({Ext}), #code(Text)) :-
format(string(Text), '.~w', [Ext]).
cmd(var( {A1}), #var(+A1)).
cmd(arg( {A1}), #var(+A1)).
cmd(metafile( {A1}), #code(+A1)).
cmd(file( {A0}), #code(A1)) :-
clean_tt(A0, A1).
cmd(clib( {A1}), #code(+A1)).
cmd(cglobalvar( {A1}), #code(+A1)).
cmd(ctype( {A1}), #code(+A1)).
cmd(type( {A1}), #code(+A1)).
cmd(pllib( {A1}), #code([library, #embrace(+A1)])).
cmd(hook( {_A1}), #i(#embrace(hook))).
cmd(env( {A1}), #code(+A1)).
cmd(program( {A1}), #b(A1)).
cmd(exam( {A1}), #code(+A1)).
cmd(jargon( {A1}), #em(+A1)).
cmd(chr( {A1}), #code(+A1)).
cmd(const( {A1}), #code(+A1)).
cmd(resource( {A1}), #code(A1)).
cmd(key( {A1}), #code(+A1)).
cmd(plflag( {A1}), #code(+A1)).
cmd(module( {A1}), #code(+A1)).
cmd(except( {A1}), #code(+A1)).
cmd(op( {A1}), #strong(+A1)).
cmd(cmdlineoption( {A1}), #strong(+A1)).
cmd(menu({A1},{[]}), #strong(+A1)).
cmd(menu({A1},{A2}), [#strong(+A1), ' ', #embrace(#code(+A2))]).
cmd(longoption( {A1},{[]}), [#strong([nospace(--), +A1])]).
cmd(longoption( {A1},{A2}), [#strong([nospace(--), +A1,
nospace(=)]), #var(+A2)]).
cmd(fmtseq( {A1}), #code(A1)).
cmd(versionshort, _, nospace(Version)) :-
current_prolog_flag(version, V),
Major is V // 10000,
Minor is (V // 100) mod 100,
Patch is V mod 100,
atomic_list_concat([Major, Minor, Patch], '.', Version).
cmd(bnfor, '|').
cmd(bnfmeta({Meta}), [nospace('<'), #var(+Meta), nospace('>')]).
cmd(argoption({RawName}, {ArgName}),
[ #strong(Name), ' ', #var(ArgName)
]) :-
clean_tt(RawName, Name).
cmd(predref({RawName}, {Arity}), #lref(pred, RefName, Text)) :-
clean_name(RawName, Name),
predicate_refname(Name, Arity, RefName),
format(string(Text), '~w/~w', [Name, Arity]).
cmd(funcref({RawName}, {Arity}), #lref(function, RefName, Text)) :-
clean_name(RawName, Name),
function_refname(Name, Arity, RefName),
format(string(Text), '~w/~w', [Name, Arity]).
cmd(dcgref({RawName}, {DCGArity}), #lref(pred, RefName, Text)) :-
clean_name(RawName, Name),
atom_number(DCGArity, Arity),
dcg_refname(Name, Arity, RefName),
format(string(Text), '~w//~w', [Name, Arity]).
cmd(qpredref({Module}, {RawName}, {Arity}), #lref(pred, RefName, Text)) :-
clean_name(RawName, Name),
predicate_refname(Module:Name, Arity, RefName),
format(string(Text), '~w:~w/~w', [Module, Name, Arity]).
cmd(qdcgref({Module}, {RawName}, {DCGArity}), #lref(pred, RefName, Text)) :-
clean_name(RawName, Name),
atom_number(DCGArity, Arity),
dcg_refname(Module:Name, Arity, RefName),
format(string(Text), '~w:~w//~w', [Module, Name, DCGArity]).
cmd(nopredref({RawName}, {Arity}), Text) :-
clean_name(RawName, Name),
format(string(Text), '~w/~w', [Name, Arity]).
cmd(libpredref({RawName}, {Arity}), Text) :-
clean_name(RawName, Name),
format(string(Text), '~w/~w', [Name, Arity]).
cmd(nodcgref({RawName}, {Arity}), Text) :-
clean_name(RawName, Name),
format(string(Text), '~w//~w', [Name, Arity]).
cmd(prologflag({Name}), #lref(flag, RefName, Name)) :-
atom_concat('flag:', Name, RefName).
cmd(functor({Name}, {Arity}), #code([+Name, nospace(/), +Arity])).
cmd(compound({Name}, {Args}), #code([+Name, #embrace(+Args)])).
cmd(term({Name}, {[]}), #code([+Name])) :- !.
cmd(term({Name}, {Args}), #code([+Name, #embrace(+Args)])).
cmd(errorterm({Name}, {Args}), #code([+Name, #embrace(+Args)])).
cmd(infixterm({RawName},{A1},{A2}), #code([+A1, Op, +A2])) :-
clean_name(RawName, Name),
( nospace_op(Name)
-> Op = nospace(Name)
; Op = Name
).
cmd(prefixterm({RawName},{A1}), #code([+A1, Name])) :-
clean_name(RawName, Name).
cmd(manref({RawName}, {Section}),
[#strong(Name), #embrace(Section)]) :-
clean_tt(RawName, Name).
cmd(cfuncref({RawName}, {Args}),
#lref(func, RefName, [Name, #embrace(+Args)])) :-
clean_name(RawName, Name),
cfunction_refname(Name, RefName).
cmd(definition({Tag}),
#defitem(#b(+Tag))).
cmd('DCG'(A,B,C), X) :-
cmd(predicate(A,B,C), X).
cmd(predicate(A, {RawName}, {'0'}, {_}),
#defitem(Class, Content)) :-
pred_class(A, Class),
pred_tag(A, Content, [#label(RefName, #strong(Name))]),
clean_name(RawName, Name),
predicate_refname(Name, 0, RefName),
add_to_index(RefName, +RefName).
cmd(predicate(A, {RawName}, {Arity}, {Args}),
#defitem(Class, Content)) :-
pred_class(A, Class),
pred_tag(A, Content,
[#label(RefName, [#strong(Name), #embrace(#var(+Args))])]),
clean_name(RawName, Name),
predicate_refname(Name, Arity, RefName),
add_to_index(RefName, +RefName).
cmd(function(A, {RawName}, {'0'}, {_}),
#defitem(Class, Content)) :-
pred_class(A, Class),
pred_tag(A, Content, [#label(RefName, #strong(Name))]),
clean_name(RawName, Name),
function_refname(Name, 0, RefName),
add_to_index(RefName, +RefName).
cmd(function(A, {RawName}, {Arity}, {Args}),
#defitem(Class, Content)) :-
pred_class(A, Class),
pred_tag(A, Content,
[#label(RefName, [#strong(Name), #embrace(#var(+Args))])]),
clean_name(RawName, Name),
function_refname(Name, Arity, RefName),
add_to_index(RefName, +RefName).
cmd(dictfunction(A, {RawName}, {Arity}, {Args}),
#defitem(Class, Content)) :-
pred_class(A, Class),
pred_tag(A, Content,
[#label(RefName, [#strong(Name), #embrace(#var(+Args))])]),
clean_name(RawName, Name),
format(string(RefName), 'm-~w-~w', [Name, Arity]),
add_to_index(RefName, +RefName).
cmd(qpredicate(A, {RawM}, {RawName}, {'0'}, {_}),
#defitem(Class, Content)) :-
pred_class(A, Class),
pred_tag(A, Content, [#label(RefName, [#mod(Module), nospace(:), #strong(Name)])]),
clean_name(RawM, Module),
clean_name(RawName, Name),
predicate_refname(Module:Name, 0, RefName),
add_to_index(RefName, +RefName).
cmd(qpredicate(A, {RawM}, {RawName}, {Arity}, {Args}),
#defitem(Class, Content)) :-
pred_class(A, Class),
pred_tag(A, Content,
[#label(RefName, [#mod(Module), nospace(:), #strong(Name), #embrace(#var(+Args))])]),
clean_name(RawM, Module),
clean_name(RawName, Name),
predicate_refname(Module:Name, Arity, RefName),
add_to_index(RefName, +RefName).
cmd(dcg(A, {RawName}, {'0'}, {_}),
#defitem(pubdef, Content)) :-
pred_tag(A, Content, [#label(RefName, #strong(Name)), #code(//)]),
clean_name(RawName, Name),
dcg_refname(Name, 0, RefName),
add_to_index(RefName, +RefName).
cmd(dcg(A, {RawName}, {ArityS}, {Args}),
#defitem(pubdef, Content)) :-
pred_tag(A, Content,
[ #label(RefName,
[ #strong(Name), #embrace(#var(+Args))
]),
#code(//)
]),
clean_name(RawName, Name),
atom_number(ArityS, Arity),
dcg_refname(Name, Arity, RefName),
add_to_index(RefName, +RefName).
cmd(directive(A, {RawName}, {'0'}, {_}),
#defitem(pubdef, Content)) :-
pred_tag(A, Content,
[ #label(RefName,
[ ':- ', #strong(Name)
])
]),
clean_name(RawName, Name),
predicate_refname(Name, 0, RefName),
add_to_index(RefName, +RefName).
cmd(directive(A, {RawName}, {Arity}, {Args}),
#defitem(pubdef, Content)) :-
pred_tag(A, Content,
[ #label(RefName,
[ ':- ', #strong(Name), #embrace(#var(+Args))
])
]),
clean_name(RawName, Name),
predicate_refname(Name, Arity, RefName),
add_to_index(RefName, +RefName).
cmd(cfunction({RType}, {RawName}, {Args}),
#defitem(pubdef, #label(RefName,
[ #var(+RType), ' ', #strong(+RawName),
#embrace(#var(+Args))
]))) :-
clean_name(RawName, Name),
cfunction_refname(Name, RefName),
add_to_index(RefName, +RefName).
cmd(cmacro({RType}, {Name}, {Args}),
#defitem(pubdef, #label(RefName,
[ #var(+RType), ' ', #strong(Name),
#embrace(#var(+Args))
]))) :-
cfunction_refname(Name, RefName),
add_to_index(RefName, +RefName).
cmd(resitem({Resource}),
#defitem(pubdef, #label(Resource,
[ #strong(Resource)
]))) :-
add_to_index(Resource, +Resource).
cmd(prefixop(A, {RawName}, {Arg}),
#defitem(pubdef, Content)) :-
pred_tag(A, Content,
#label(RefName, [#strong(Name), ' ', #var(+Arg)])),
clean_name(RawName, Name),
predicate_refname(Name, 1, RefName),
add_to_index(RefName, +RefName).
cmd(prefixfunction(A, {RawName}, {Arg}),
#defitem(pubdef, Content)) :-
pred_tag(A, Content,
#label(RefName, [#strong(Name), ' ', #var(Arg)])),
clean_name(RawName, Name),
function_refname(Name, 1, RefName),
add_to_index(RefName, +RefName).
cmd(infixop(A, {RawName}, {Arg1}, {Arg2}),
#defitem(pubdef, Content)) :-
pred_tag(A, Content,
#label(RefName,
[ #var(Arg1), ' ', #strong(Name), ' ', #var(Arg2)
])),
clean_name(RawName, Name),
predicate_refname(Name, 2, RefName),
add_to_index(RefName, +RefName).
cmd(infixfunction(A, {RawName}, {Arg1}, {Arg2}),
#defitem(pubdef, Content)) :-
pred_tag(A, Content,
#label(RefName,
[ #var(Arg1), ' ', #strong(Name), ' ', #var(Arg2)
])),
clean_name(RawName, Name),
function_refname(Name, 2, RefName),
add_to_index(RefName, +RefName).
cmd(constitem({Name}), #defitem(#label(RefName, #strong(+Name)))) :-
clean_name(Name, RefName),
add_to_index(RefName, +RefName).
cmd(termitem({Name}, {[]}), #defitem(#strong(+Name))).
cmd(termitem({Name}, {Arg}),
#defitem([#strong(+Name), #embrace(#var(+Arg))])).
cmd(curltermitem({Arg}),
#defitem([#embrace("{}", #var(+Arg))])).
cmd(dictitem({Name}, {Arg}),
#defitem([#strong(+Name), #embrace("{}", #var(+Arg))])).
cmd(prefixtermitem({Name}, {Right}),
#defitem([#strong(+Name), ' ', #var(+Right)])).
cmd(infixtermitem({Name}, {Left}, {Right}),
#defitem([#var(+Left), Sep, #strong(+Name), Sep, #var(+Right)])) :-
clean_name(Name, Clean),
( nospace_op(Clean)
-> Sep = []
; Sep = ' '
).
cmd(prologflagitem({Name}, {Type}, {Access}),
#defitem(pubdef, #label(RefName, [#strong(Name), #embrace([#var(Type)|Change])]))) :-
atom_concat('flag:', Name, RefName),
( Access == r
-> Change = []
; Change = nospace(', changeable')
).
cmd(fmtchar({Name}), [html(''), #code(+Name), html('
')]).
cmd(optionval({Value}), #defitem(#strong(+Value))).
cmd(cmdlineoptionitem(M, {Option}, {Arg}),
#defitem([#strong(+Option), Sep, #var(+Arg)])) :-
( M = *
-> Sep = []
; Sep = [' ']
).
cmd(longoptionitem({Name}, {[]}), #defitem(#strong([nospace(--), +Name]))).
cmd(longoptionitem({Name}, {Arg}), #defitem(#strong([nospace(--), +Name,
nospace(=),
#var(+Arg)]))).
cmd(optionarg({Option}, {Arg}),
#defitem([#strong(Option), #var(Arg)])).
cmd(traceoption({CharSpec}, {Name}, {Description}),
[ #defitem([#strong(Name), ' ', #embrace(#code(Char))]),
+Description
]) :-
clean_name(CharSpec, Char).
cmd(pleaseoption({Name}, {Type}, {Default}),
#defitem([ #strong(Name), ' ', #embrace(#var(Type)), ' ',
'Default:', ' ', Default
])).
cmd(featureoption({Name}, {Type}),
#defitem([#strong(Name), ' ', #embrace(#var(Type))])).
cmd(menuitem({Name}, {[]}),
#defitem(#label(RefName, #strong(+Name)))) :-
clean_name(Name, RefName0),
atom_concat('menu:', RefName0, RefName),
atomic_list_concat(Name, ' ', Atom),
add_to_index(Atom, +RefName).
cmd(menuitem({Name}, {Arg}),
#defitem([#label(RefName, #strong(+Name)), ' ', #embrace(#var(+Arg))])) :-
clean_name(Name, RefName0),
atom_concat('menu:', RefName0, RefName),
atomic_list_concat(Name, ' ', Atom),
add_to_index(Atom, +RefName).
cmd(escapeitem({Name}), #defitem(#code([nospace('\\'), +Name]))).
cmd(ttdef({Def}), #defitem(#code(+Def))).
cmd(predicatesummary({RawName}, {Arity}, {Summary}),
#row([#predref(Name, Arity), +Summary])) :-
clean_name(RawName, Name).
cmd(dcgsummary({RawName}, {Arity}, {Summary}),
#row([#dcgref(Name, Arity), +Summary])) :-
clean_name(RawName, Name).
cmd(oppredsummary({RawName}, {Arity}, {_Assoc}, {_Pri}, {Summary}),
#row([#predref(Name, Arity), +Summary])) :-
clean_name(RawName, Name).
cmd(functionsummary({RawName}, {Arity}, {Summary}),
#row([#funcref(Name, Arity), +Summary])) :-
clean_name(RawName, Name).
cmd(opfuncsummary({RawName}, {Arity}, {_Assoc}, {_Pri}, {Summary}),
#row([#funcref(Name, Arity), +Summary])) :-
clean_name(RawName, Name).
cmd(opsummary({Pri}, {Assoc}, {RawName}, {Summary}),
#row([Pri, Assoc, Name, +Summary])) :-
clean_name(RawName, Name).
cmd(texcmd({Name}), #code([nospace(\), Name])).
cmd(texenv({Name}), #code(Name)).
cmd(texmode({Name}), #var(Name)).
% C++ Documentation (packages/cpp)
cmd(classitem({Class}),
#defitem(#label(RefName, #strong(Class)))) :-
format(string(RefName), 'class:~w', [Class]).
cmd(constructor({Class}, {Args}),
#defitem([#strong([Class, ::, Class]), #embrace(#var(+Args))])).
cmd(destructor({Class}),
#defitem([#strong([~, Class]), #embrace(#var(''))])).
cmd(cppcast({Class}, {Type}),
#defitem([#strong([Class, '::operator', Type]), #embrace(#var(void))])).
cmd(nodescription, []).
% Some XPCE things
cmd(class({Name}), #lref(Label, Name)) :-
atom_concat('class:', Name, Label),
add_to_index(Name).
cmd(noclass({Name}), #i(Name)).
cmd(menuref({A1}), #lref(RefName, Name)) :-
clean_name(A1, RefName0),
atom_concat('menu:', RefName0, RefName),
atomic_list_concat(A1, ' ', Name),
add_to_index(Name).
% Glossary support
cmd(glossitem({Term}), #defitem(#label(RefName, #strong(Term)))) :-
canonicalise_glossitem(Term, Ref),
format(string(RefName), 'gloss:~w', [Ref]).
cmd(g({Term}), #lref(gloss, RefName, Term)) :-
canonicalise_glossitem(Term, Ref),
format(string(RefName), 'gloss:~w', [Ref]).
% library stuff
cmd(libdoc({Name}, {Summary}),
[HTML, #label(SecLabel, [], Tag)]) :-
atom_concat('sec:', Name, SecLabel),
filebase(Name, File),
format(atom(Label), '~w:', [library(Name)]),
translate_section(2, -,
[Label, Summary],
HTML,
File),
tex:label_tag(SecLabel, Tag).
cmd(libsummary({Name}),
[HTML, #label(SecLabel, [], Tag)]) :-
path_minus(Name, RefName),
atom_concat('sec:summary-lib-', RefName, SecLabel),
format(atom(Label), '~w', [library(Name)]),
translate_section(3, -, [Label], HTML),
tex:label_tag(SecLabel, Tag).
%! path_minus(+Path, -Minus) is det.
%
% Replace / in paths with -. / is not allowed in SGML NAME
% attributes.
path_minus(Path, Minus) :-
sub_atom(Path, _, _, _, /),
!,
atomic_list_concat(Segments, /, Path),
atomic_list_concat(Segments, -, Minus).
path_minus(Path, Path).
filebase(Name, File) :-
atom_codes(Name, Codes),
select_csym(Codes, Alnums),
atom_codes(File, Alnums).
select_csym([], []).
select_csym([H|T0], [H|T]) :-
code_type(H, csymf),
!,
select_csym(T0, T).
select_csym([_|T0], T) :-
select_csym(T0, T).
pred_tag([], L, L).
pred_tag([Value], [#predtag(#embrace("[]", +Value))|L], L).
pred_class([Opt], Class) :-
sub_term(Tag, Opt),
atom(Tag),
sub_atom(Tag, _, _, _, multifile),
!,
Class = multidef.
pred_class(_, pubdef).
/*******************************
* GLOSSARY *
*******************************/
canonicalise_glossitem(In, Out) :-
downcase_atom(In, In1),
atom_codes(In1, Chars0),
( append(CharsPre, [0'[|_], Chars0)
-> remove_trailing_spaces(CharsPre, Chars1)
; Chars1 = Chars0
),
( append(Chars2, [0's], Chars1)
-> true
; Chars2 = Chars1
),
maplist(canonical_char, Chars2, Chars),
atom_codes(Out0, Chars),
canonical(Out0, Out).
canonical(unified, unify) :- !.
canonical(bound, binding) :- !.
canonical(proven, prove) :- !.
canonical(succeeded, succeed) :- !.
canonical(compiled, compile) :- !.
canonical(propertie, property) :- !. % s has alredy gone
canonical(X, X).
canonical_char(0' , 0'-) :- !.
canonical_char(0'_, 0'-) :- !.
canonical_char(X, X).
remove_trailing_spaces([], []).
remove_trailing_spaces([0' |T], []) :-
maplist(=(0' ), T),
!. % '
remove_trailing_spaces([H|T0], [H|T]) :-
remove_trailing_spaces(T0, T).
/*******************************
* PlDoc KEYWORDS *
*******************************/
cmd(tag({Tag}),
[ html(''), +Tag, html('') ]).
cmd(mtag({Tag}),
[ html(''), +Tag, html('') ]).
cmd(param({Param}, {Description}),
[ html(''),
html(''), +Param, html(' | '),
html(' -'), +Description, html(' | '),
html(' |
')
]).
cmd(arg({Param}, {Description}),
[ html(''),
html(''), +Param, html(' | '),
html(' -'), +Description, html(' | '),
html(' |
')
]).
/*******************************
* C *
*******************************/
cmd(backslash, #code(\)).
cmd(bsl, #code(\)).
cmd(Cmd, HTML) :-
urldef(Cmd, Atom),
!,
HTML = #code(Atom).
/*******************************
* LATEX SPECIAL SEQUENCES *
*******************************/
% NOTE: This code is copied from doc_latex.pl from PlDoc.
%! urldef(?DefName, ?String)
%
% True if \DefName is a urldef for String. UrlDefs are LaTeX
% sequences that can be used to represent strings with symbols in
% fragile environments. Whenever a word can be expressed with a
% urldef, we will do this to enhance the robustness of the
% generated LaTeX code.
:- dynamic
urldef/2,
urldefs_loaded/1.
%! load_urldefs.
%! load_urldefs(+File)
%
% Load =|\urldef|= definitions from File and populate
% urldef_name/2. See =|pldoc.sty|= for details.
load_urldefs :-
urldefs_loaded(_),
!.
load_urldefs :-
absolute_file_name(library('pldoc/pldoc.sty'), File,
[ access(read) ]),
load_urldefs(File).
load_urldefs(File) :-
urldefs_loaded(File),
!.
load_urldefs(File) :-
open(File, read, In),
call_cleanup(( read_line_to_codes(In, L0),
process_urldefs(L0, In)),
close(In)),
assert(urldefs_loaded(File)).
process_urldefs(end_of_file, _) :- !.
process_urldefs(Line, In) :-
( phrase(urldef(Name, String), Line)
-> assert(urldef(Name, String))
; true
),
read_line_to_codes(In, L2),
process_urldefs(L2, In).
urldef(Name, String) -->
"\\urldef{\\", string(NameS), "}\\satom{", string(StringS), "}",
ws,
( "%"
-> string(_)
; []
),
eol,
!,
{ atom_codes(Name, NameS),
atom_codes(String, StringS)
}.
ws --> [C], { C =< 32 }, !, ws.
ws --> [].
string([]) --> [].
string([H|T]) --> [H], string(T).
eol([],[]).
clean_name([\Special], Out) :-
urldef(Special, Out),
!.
clean_name([\tt, Out], Out) :- !.
clean_name([' '|T], Out) :-
!,
clean_name(T, Out).
clean_name($(Out), Out) :- !.
clean_name([Out], Out) :- !.
clean_name(\($), $) :- !.
clean_name(\Special, Out) :-
urldef(Special, Out),
!.
clean_name(X, X) :-
atomic(X),
!.
clean_name(L, Out) :-
maplist(clean_name, L, L2),
delete(L2, [], L3),
atomic_list_concat(L3, Out).
nospace_op(:).
%! predicate_refname(+Name, +Arity, -Ref) is det.
%! dcg_refname(+Name, +Arity, -Ref) is det.
%
% Reference name for predicates.
predicate_refname(Name, Arity, Ref) :-
pred_refname(Name, Arity, Ref, /).
dcg_refname(Name, Arity, Ref) :-
pred_refname(Name, Arity, Ref, //).
pred_refname(Module:Name, Arity, Ref, Type) :-
!,
format(atom(Ref), '~w:~w~w~w', [Module, Name, Type, Arity]).
pred_refname(Symbol, Arity, Ref, Type) :-
symbol_name(Symbol, Name),
!,
format(atom(Ref), '~w~w~w', [Name, Type, Arity]).
pred_refname(Name, Arity, Ref, Type) :-
format(atom(Ref), '~w~w~w', [Name, Type, Arity]).
%! function_refname(+Name, +Arity, -Ref)
%
% Reference name for arithmetic functions.
function_refname(Symbol, Arity, Ref) :-
symbol_name(Symbol, Name),
!,
format(string(Ref), 'f-~w/~w', [Name, Arity]).
function_refname(Name, Arity, Ref) :-
format(string(Ref), 'f-~w/~w', [Name, Arity]).
%! cfunction_refname(+Name, +Arity, -Ref)
%
% Reference name for C API functions.
cfunction_refname(Op, Ref) :-
sub_atom(Op, B, _, A, '::operator'),
!,
sub_atom(Op, 0, B, _, Prefix),
sub_atom(Op, _, A, 0, Postfix0),
normalize_space(atom(Postfix), Postfix0),
( symbol_name(Postfix, Name)
-> true
; Name = Postfix
),
format(atom(Ref), '~w~w()', [Prefix, Name]).
cfunction_refname(Name, Ref) :-
format(atom(Ref), '~w()', [Name]).
:- if(false).
symbol_name('->', send_arrow).
symbol_name('<-', get_arrow).
:- else.
symbol_name(_,_) :- fail.
:- endif.
n_list(0, _, []) :- !.
n_list(N, X, [X|T]) :-
N > 0,
N2 is N - 1,
n_list(N2, X, T).
:- load_urldefs.