/**
* @Программа: flangdoc.fln
* @Версия:0.1 (draft)
* @Автор: А.В. Манцивода
* @Дата начала разработки: 12-10-2003
* @Дата последнего изменения: 14-10-2003
* @Описание: Программа автоматически формирует информацию о встроенных
* функциях Флэнга в стиле JavaDoc на основе xml-описания встроенных
* функций, подготовленных в системе Мета-1 (файл flangdoc.xml).
* @Использование: Запустить программу и вызвать функцию main().
*
* @Точка входа: main()
*/
main() :-
contents := newVector(0),
createChaptersPages(^chapEnum),
createContents(),
writeHTML("abc.html", genABC(^wholeList), "w")
;
/* FUNCTIONS CHAPTER PAGES */
createChaptersPages(DocEnum) :-
exhausted(DocEnum), !, true
;
createChaptersPages(DocEnum) :-
Chapter = eValue(DocEnum),
Title = getXText(Chapter, "/item/title"),
ChapID = getXAttr(Chapter, "identifier"),
FileName = ChapID+".html",
pageName := FileName,
Conts = _Title; ,
vAdd(^contents, [Conts, ]),
FuncEnum = eXElem(Chapter, "/item/item"),
HTML = htmlPattern(createPage(FuncEnum, Title)),
writeHTML(ChapID+".html", HTML, "w"),
createChaptersPages(eNext(DocEnum))
;
createContents() :-
writeHTML("fldocConts.html", htmlPattern([createHeader("Встроенные функции Флэнга", "", ""), ^contents]), "w");
createPage(FuncEnum, Title) :-
overviewTab := newVector(0),
FunCollection = collectFunc(FuncEnum),
[
createHeader(Title, "", "")
,
_overviewTable(^overviewTab);
_FunCollection;
]
;
overviewTable(Conts) :-
;
overviewItem(FunctionType, FuncCall, Descr) :-
_FunctionType;
_FuncCall; _sNorm(Descr);
;
collectFunc(Enum) :- exhausted(Enum), !, [];
collectFunc(Enum) :-
El1 = eValue(Enum),
ID = getXAttr(El1, "identifier"),
(
El = isIDREF(ID) /* reference to another description, has the form "ID-IDREF" */
## El = El1
),
[functionDescr(El) | collectFunc(eNext(Enum))];
/* FUNCTION DESCRIPTION */
functionDescr(FuncArticle):-
ID = getXAttr(FuncArticle, "identifier"),
Name = getXText(FuncArticle, "/item/title"),
DetailFile = ID+".html",
DetailsLink = "detail/"+DetailFile,
writeHTML(DetailsLink, underConstruction(Name), "w"),
ArgsEnum = eXElem(FuncArticle, "/item/metadata/lom/general/Arguments"),
ArgList = functionArgList(ArgsEnum),
write(Name+nl()),
FT = getXText(FuncArticle, "/item/metadata/lom/general/ResultType"),
FuncType = functionType(FT),
FunCall = functionCall(Name, FuncType, ArgList),
FunDescr = getXText(FuncArticle, "/item/metadata/lom/general/FunDescr"),
Notes = getXText(FuncArticle, "/item/metadata/lom/general/Notes"),
vAdd(^overviewTab, overviewItem(FuncType, funcOverviewCall(Name, ArgList, "#"+ID), FunDescr)),
hPut(^wholeList, Name, ^pageName+"#"+ID),
FunctionArgumentList =
foreach X in ArgList
[
[_, Var, Des] = X,
functionArgument(Var, Des)
],
_"";
_Name;
_FunCall;
_FunDescr+" "+Notes;
Аргументы:
_FunctionArgumentList;
Подробнее...
;
functionArgList(ArgEnum) :-
ArgVector =
foreach Arg in ArgEnum
[
Name = getXText(Arg, "/Arguments/Argument"),
Type = getXText(Arg, "/Arguments/Type"),
Descr = getXText(Arg, "/Arguments/Desription"),
[functionType(Type), Name, Descr]
],
vToL(enum(ArgVector));
/* формат вызова функции в статье */
functionCall(FunName, FunType, ArgList) :-
Pos = sIndexOf(FunName, "/"),
Pos>>0, !,
ShortName = subString(FunName, 0, Pos),
_[FunType," "];_ShortName;(_showArgs(ArgList);)
;
/* infix */
functionCall(FunName, FunType, [[T1, N1, _], [T2, N2, _]]) :-
_[FunType," (", T1, ")", N1, " ", FunName, " (", T2, ")", N2];
;
/* prefix */
functionCall(FunName, FunType, [[T1, N1, _]]) :-
_[FunType, " ", FunName, "(", T1, ")", N1];
;
/* constant */
functionCall(FunName, FunType, []) :-
_[FunType, " ", FunName];
;
/* формат вызова функции в обзорной таблице */
funcOverviewCall(FunName, ArgList, Ref) :-
Pos = sIndexOf(FunName, "/"),
Pos>>0, !,
ShortName = subString(FunName, 0, Pos),
_ShortName; (_showArgs(ArgList);)
;
/* infix */
funcOverviewCall(FunName, [[T1, N1, _], [T2, N2, _]], Ref) :-
_["(", T1, ")", N1, " ", _FunName; , " (", T2, ")", N2];
;
/* prefix */
funcOverviewCall(FunName, [[T1, N1, _]], Ref) :-
_[_FunName; , "(", T1, ")", N1];
;
/* constant */
funcOverviewCall(FunName, [], Ref) :-
_[_FunName; ];
;
showArgs([]) :- !, "";
showArgs([[Type, Name, _]]) :- !, [Type, " ", Name];
showArgs([[Type, Name, _] | Rest]) :- [Type, " ", Name+", " | showArgs(Rest)];
functionType(Type) :-
Pos = sIndexOf(Type, "/"),
Pos>>0, !,
Type1 = subString(Type, 0, Pos),
Rest = subString(Type, Pos+1, sLength(Type)),
TypeLink = hGet(^typesHash, Type1),
[_Type1; , "/" | functionType(Rest)]
;
functionType(Type) :-
TypeLink = hGet(^typesHash, Type),
[_Type; ]
;
/* Формат описания переменной для функции */
functionArgument(Variable, Descr) :-
_Variable;
- _Descr;
;
argumentInCall(ArgName, ArgType) :- 1;
/* GENERATE ABC */
genABC(H) :-
List = vToL(eKeys(H)),
Sorted = qsort(List),
Conts = genABChtml(Sorted, H),
Флэнг. Встроенные функции
Функции по алфавиту
_Conts;
;
genABChtml([], H) :- [];
genABChtml([X|Y], H) :-
[_X; , | genABChtml(Y, H)];
/* PARAMETERS AND ACCESS FUNCTIONS*/
/* загружаем XML-документ с описанием Флэнга */
?- document := readXML("flangdoc.xml", "w");
/* выделяем блок организаций "встроенные функции Флэнга" */
?- builtins:=getXElem(^document,"//organization[@identifier='builtins']");
/* организуем перечисление по главам блока встроенных функций */
?- chapEnum:= eXElem(^builtins, "/organization/item");
/* хэш для коллекционирования полного списка функций */
?- wholeList := newHash([]);
/* создаем таблицу типов данных с линками на информацию о типах */
typesHashCreate():-
typesHash := newHash(
[
"Hash"/"./types/hash.html",
"Vector"/"./types/vector.html",
"Integer"/"./types/Integer.html",
"Float"/"./types/float.html",
"Enumeration"/"./types/enum.html",
"List"/"./types/list.html",
"Object"/"./types/object.html",
"Boolean"/"./types/boolean.html",
"String"/"./types/string.html"
])
;
?- typesHashCreate();
getFunctionsEnum(Chapter) :-
eXElem(Chapter, "/item/item")
;
/* vToL формирует элементы перечисления в виде списка */
vToL(Enum) :- exhausted(Enum), !, [];
vToL(Enum) :- El = eValue(Enum), [El|vToL(eNext(Enum))];
htmlPattern(Conts) :-
Флэнг. Встроенные функции
_Conts;
;
createHeader(Title, Back, Forward) :-
[
,
,
Встроенные функции Флэнга _Title;
,
,
,
]
;
under1Construction(Fun) :-
Подробная информация по функции '_Fun;'_" ";
разрабатывается
;
underConstruction(Fun) :-
Flang Page Under Construction
Подробное описание функции '_Fun;'_" "; разрабатывается
flang@teaCode.com
;
/* СОРТИРОВКА */
qsort(List) :- qsort(List, Res, []), !, Res;
qsort([X|L], R, R0) :-
partition(L, X, L1, L2),
qsort(L2, R1, R0),
qsort(L1, R, [X|R1])
;
qsort([], R, R);
partition([X|L],Y, Res1, Res2) :-
X <= Y,
Res1 = [X|L1],
partition(L,Y,L1,Res2)
##
Res2 = [X|L2],
partition(L,Y,Res1,L2)
;
partition([],X,[],[]);
/* description reference check */
isIDREF(Str) :- sMatch("/(\w+)-IDREF/", Str), getByREF(sGroup(1));
getByREF(Str) :- XPath = "//item[@identifier='"+Str+"']", getXElem(^builtins, XPath);
/* getByREF(Str) :- XPath = "//item", getXElem(^builtins, "//item"); */
/************* ОТЛАДОЧНЫЕ ФУНКЦИИ ***********/
?- f:=getFunctionsEnum(eValue(^chapEnum));
t(X) :- trace("level", X);
w() :- writeHTML("ff.htm", functionDescr(eValue(^f)), "w");
w1() :- writeHTML("ff.htm", htmlPattern(createPage(^f)), "w");
w2() :- writeHTML("fff.htm", overviewTable(), "w");
w3() :- writeHTML("fff.htm", htmlPattern(createHeader("hehe", "haha", "hoho")), "w");
r() :- reload(fd);
?- defaultEnc("a");