#!/usr/local/bin/vipsi /* create online book from easy source ***TODO*** Tables authoritative file: /pub/Develop/projects/vipsi/libs/BOOK.vl */ var Startzeit = now var Statistics = {} var LibDir = "/usr/local/lib/vipsi/" var NumFiles = 0 var Seed = 0 if !exists verbose var verbose=0 then /* ---- Defaults ---------------------- */ var SourceFile = "*.toc" // list of source files, wildcards allowed var TargetDir = "" var FilenameIndex = "index.html" var FilenameBook = "z%%.htm" // name for target files; %% = sequential number var SplitFileSize = 20000 // limit for splitting chapters into multiple files var TabWidth = 4 // used to detab
 sections
var XrefMaxWords	= 4		// max. significant words for automatic cross links generation
var PageTocMinCount	= 2		// min. number of links in TOC of single file for TOC present; else no TOC




/* ----	Basic Html Templates ----------------------------
		Template.Page 		für normale Seiten
		Template.Index		für die Startseite
		Template.Split		für die TOC-Seite von Kapiteln, die gesplittet wurden
*/
var Template.Page =
«


%%TITLE%%




%%HEADLINE0%%%%HEADLINE1%%

[<prev]     [next>]

%%HEADLINE2%%%%HEADLINE3%%%%HEADLINE4%%%%HEADLINE5%%%%HEADLINE6%% %%TOC%%%%BODY%% » // Headlines as they appear at top of a page // called for %%HEADLINEx%% proc Style.Headline( i /* Buch[i] */ ) { var Tag = name Buch[i] var Url = Buch[i].Filename var Label = Buch[i].Text if Tag=="h0" var r = «\n

» #Label# «

» try r #= «\n

» #TocTitle# «

» del TocTitle then return r else return «\n<»#Tag#« class="head">» #Label# «» then } // Headlines as they appear in a TOC // called in preparation for %%TOC%% proc Style.TocItem ( i /* Buch[i] */ ) { var Label = Buch[i].Text var Url = "#" # Buch[i].Anker try Url = Buch[i].Filename # Url then return «

» #Label# «

» } // Table of contents: // called for %%TOC%% proc Style.Toc ( i /* Buch[i] */, TocListe ) { return exists Buch[i].Split || count TocListe >= PageTocMinCount ? «\n
»#TEXT.JoinText(TocListe,nl)#«
» : "" } // Querverweis-Linklist-Popup: // for Xref proc Style.Linklist ( Label, Linklist ) // Linklist = { {Url="",Label=""}, ... } { var i=0, Links="", id = ++Seed var ID="" do ID #= charstr('A'+id%26) id/=26 while id>=1 loop if count Linklist==1 return «» #Label# «» else do while ++i <= count Linklist Links #= «
» #Linklist[i].Label# «» loop return «»#Links[5 to]#«\ »#Label#«» then } /* ********************************************************************* TAG DEFINITIONS ********************************************************************* */ proc SkipBlock(i) // --> next block { var Tag = name Buch[i++] do while i <= count Buch && contains_tag(Tag,name Buch[i]) // rekursion notwendig, weil manche tags nur indirekt enthalten sein können, z.b. h4>ol>li i = SkipBlock(i) loop return i } proc SizeofBlock(i) { var j = SkipBlock(i) var n = 0 do n += count string(Buch[i]) while ++i < j loop return n } proc ReadContainedTags(i) { var Tag = name Buch[i++] do while i <= count Buch var Subtag = name Buch[i] while contains_tag(Tag,Subtag) i = Tags.@Subtag.Read(i) loop return i } proc WriteContainedTags(F,i) { var Tag = name Buch[i++] do while i <= count Buch var Subtag = name Buch[i] while contains_tag(Tag,Subtag) i = Tags.@Subtag.Write(F,i) loop return i } proc WriteStartTag(F,i) { var id = name Buch[i] try id #= « class=» # Buch[i].Class then // if exists try id #= « style="» # Buch[i].Style # «"» then // if exists try id #= « id=» # Buch[i].Anker then // if exists put #F, nl, "<" # id # ">" } proc WriteText(F,i) { put #F, Buch[i].Text } proc WriteEndTag(F,i) { put #F, "" } // default read/write handler proc r0(i) { if verbose put "["#name Buch[i]#"]" then return ReadContainedTags(i) } proc w0(F,i) { WriteStartTag(F,i); WriteText(F,i); WriteEndTag(F,i); return i+1 } /* ---- Tag Handler ------------------------------------------------------------------------- Class = PARA paragraphs: enthalten keine anderen Tags: z.B.

BLOCK Block-Tags: enthalten andere Tags: alle Headlines und z.B.