diff options
Diffstat (limited to 'appl/ebook/reader.m')
| -rw-r--r-- | appl/ebook/reader.m | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/appl/ebook/reader.m b/appl/ebook/reader.m new file mode 100644 index 00000000..cf0824ae --- /dev/null +++ b/appl/ebook/reader.m @@ -0,0 +1,120 @@ + +# the public interface to this looks like: +# Reader: module { +# PATH: con "/dis/ebook/reader.dis"; +# init: fn(displ: ref Draw->Display); +# Datasource: adt { +# new: fn(f: string, win: ref Tk->Toplevel, width: int, evch: string): (ref Datasource, string); +# copy: fn(d: self ref Datasource): ref Datasource; +# mark: fn(d: self ref Datasource): ref Mark; +# goto: fn(d: self ref Datasource, m: ref Mark); +# atmark: fn(d: self ref Datasource, m: ref Mark): int; +# next: fn(d: self ref Datasource, linkch: chan of (string, string, string)): string; +# +# linestart: fn(d: self ref Datasource, w: string, y: int): int; +# linkoffset: fn(d: self ref Datasource, w: string, s: string): int; +# }; +# }; + + +Reader: module { + PATH: con "/dis/ebook/reader.dis"; + init: fn(displ: ref Draw->Display); + Datasource: adt { + x: ref Xml->Parser; + t: ref Text; + title: string; + win: ref Tk->Toplevel; + evch: string; # tk channel on which to send events + tags: list of ref Xml->Item.Tag; + width: int; + filename: string; + error: string; + item: ref Xml->Item; + imark: ref Xml->Mark; # mark at start of item + fontinfo: list of ref Fontinfo; + styles: list of ref Stylesheet->Style; + stylesheet: ref Stylesheet->Sheet; + linkch: chan of (string, string, string); # (linkname, widgetname, internal reference) + warningch: chan of (Xml->Locator, string); + startmark: ref Reader->Mark; # mark start of body for copy() + fallbacks: list of (string, string); + + # public interface consists solely of the following few methods, along with the Mark adt. + new: fn(f: string, fallbacks: list of (string, string), win: ref Tk->Toplevel, width: int, evch: string, warningch: chan of (Xml->Locator, string)): (ref Datasource, string); + copy: fn(d: self ref Datasource): ref Datasource; + mark: fn(d: self ref Datasource): ref Mark; + str2mark: fn(d: self ref Datasource, s: string): ref Mark; + mark2str: fn(d: self ref Datasource, m: ref Mark): string; + goto: fn(d: self ref Datasource, m: ref Mark); + atmark: fn(d: self ref Datasource, m: ref Mark): int; + next: fn(d: self ref Datasource, linkch: chan of (string, string, string)): (Block, string); + fileoffset: fn(d: self ref Datasource): int; + + rectforfileoffset: fn(t: self ref Datasource, w: string, fileoffset: int): (int, Draw->Rect); + fileoffsetnearyoffset: fn(t: self ref Datasource, w: string, yoffset: int): int; + linestart: fn(d: self ref Datasource, w: string, y: int): int; + linkoffset: fn(d: self ref Datasource, w: string, s: string): int; + event: fn(d: self ref Datasource, e: string): ref Event; + }; + + Block: adt { + w: string; + tmargin, bmargin: int; + }; + + Event: adt { + pick { + Link => + url: string; + Texthit => + fileoffset: int; + } + }; + + Mark: adt { + xmark: ref Xml->Mark; + eq: fn(m1: self ref Mark, m2: ref Mark): int; + fileoffset: fn(m: self ref Mark): int; + }; + + Text: adt { + win: ref Tk->Toplevel; + w: string; + tags: array of list of (string, int); # hash of (attrs, tagnum); holds all currently used tags in widget + max: int; # max tagnum + href: string; + margins: list of Margin; # margins of enclosing blocks + margin: Margin; # current margin values + outertmargin: int; + outerbmargin: int; + needspace: int; # vspace waiting + lastwhite: int; # did the last text hold trailing whitespace? + startofline: int; + style: ref Stylesheet->Style; + fontinfo: ref Fontinfo; + evch: string; + + new: fn(win: ref Tk->Toplevel, w: string, width: int, evch: string): ref Text; + addtext: fn(t: self ref Text, text: string, ws1, ws2: int, fileoffset: int); + gettag: fn(t: self ref Text, s: string): string; + linebreak: fn(t: self ref Text); + addmark: fn(t: self ref Text): string; + widgetname: fn(t: self ref Text, t: int): string; + addwidget: fn(t: self ref Text, w: string, fileoffset: int, invisible: int); + startblock: fn(t: self ref Text); + endblock: fn(t: self ref Text); + finalise: fn(t: self ref Text, addvspace: int); + vspace: fn(t: self ref Text, h: int); + }; + + Margin: adt { + l, r, b, textindent: int; + }; + + Fontinfo: adt { + path: string; + em: int; + ex: int; + }; +}; |
