2
0

ETHConv.txt 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. MODULE StdETHConv;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Std/Mod/ETHConv.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT
  5. Fonts, Files, Stores, Ports, Views,
  6. TextModels, TextRulers, TextViews,
  7. Stamps := StdStamps, Clocks := StdClocks, StdFolds;
  8. CONST
  9. V2Tag = -4095; (* 01 F0 *)
  10. V4Tag = 496; (* F0 01 *)
  11. TYPE
  12. FontDesc = RECORD
  13. typeface: Fonts.Typeface;
  14. size: INTEGER;
  15. style: SET;
  16. weight: INTEGER
  17. END;
  18. VAR default: Fonts.Font;
  19. PROCEDURE Split (name: ARRAY OF CHAR; VAR d: FontDesc);
  20. VAR i: INTEGER; ch: CHAR;
  21. BEGIN
  22. i := 0; ch := name[0];
  23. WHILE (ch < "0") OR (ch >"9") DO
  24. d.typeface[i] := ch; INC(i); ch := name[i]
  25. END;
  26. d.typeface[i] := 0X;
  27. d.size := 0;
  28. WHILE ("0" <= ch) & (ch <= "9") DO
  29. d.size := d.size * 10 + (ORD(ch) - 30H); INC(i); ch := name[i]
  30. END;
  31. CASE ch OF
  32. "b": d.style := {}; d.weight := Fonts.bold
  33. | "i": d.style := {Fonts.italic}; d.weight := Fonts.normal
  34. | "j": d.style := {Fonts.italic}; d.weight := Fonts.bold
  35. | "m": d.style := {}; d.weight := Fonts.bold
  36. ELSE d.style := {}; d.weight := Fonts.normal (* unknown style *)
  37. END
  38. END Split;
  39. PROCEDURE ThisFont (name: ARRAY OF CHAR): Fonts.Font;
  40. VAR d: FontDesc;
  41. BEGIN
  42. Split(name, d);
  43. IF d.typeface = "Syntax" THEN d.typeface := default.typeface END;
  44. IF d.size = 10 THEN d.size := default.size
  45. ELSE d.size := (d.size - 2) * Ports.point
  46. END;
  47. RETURN Fonts.dir.This(d.typeface, d.size, d.style, d.weight)
  48. END ThisFont;
  49. PROCEDURE ThisChar (ch: CHAR): CHAR;
  50. BEGIN
  51. CASE ORD(ch) OF
  52. 80H: ch := 0C4X | 81H: ch := 0D6X | 82H: ch := 0DCX
  53. | 83H: ch := 0E4X | 84H: ch := 0F6X | 85H: ch := 0FCX
  54. | 86H: ch := 0E2X | 87H: ch := 0EAX | 88H: ch := 0EEX | 89H: ch := 0F4X | 8AH: ch := 0FBX
  55. | 8BH: ch := 0E0X | 8CH: ch := 0E8X | 8DH: ch := 0ECX | 8EH: ch := 0F2X | 8FH: ch := 0F9X
  56. | 90H: ch := 0E9X
  57. | 91H: ch := 0EBX | 92H: ch := 0EFX
  58. | 93H: ch := 0E7X
  59. | 94H: ch := 0E1X
  60. | 95H: ch := 0F1X
  61. | 9BH: ch := TextModels.hyphen
  62. | 9FH: ch := TextModels.nbspace
  63. | 0ABH: ch := 0DFX
  64. ELSE
  65. ch := 0BFX (* use inverted question mark for unknown character codes *)
  66. END;
  67. RETURN ch
  68. END ThisChar;
  69. PROCEDURE ^ LoadTextBlock (r: Stores.Reader; t: TextModels.Model);
  70. PROCEDURE StdFold (VAR r: Stores.Reader): Views.View;
  71. CONST colLeft = 0; colRight = 1; expRight = 2; expLeft = 3;
  72. VAR k: BYTE; state: BOOLEAN; hidden: TextModels.Model; fold: StdFolds.Fold;
  73. BEGIN
  74. r.ReadByte(k);
  75. CASE k MOD 4 OF
  76. | colLeft: state := StdFolds.collapsed
  77. | colRight: state := StdFolds.collapsed
  78. | expRight: state := StdFolds.expanded
  79. | expLeft: state := StdFolds.expanded
  80. END;
  81. IF (k MOD 4 IN {colLeft, expLeft}) & (k < 4) THEN
  82. hidden := TextModels.dir.New(); LoadTextBlock(r, hidden);
  83. ELSE hidden := NIL;
  84. END;
  85. fold := StdFolds.dir.New(state, "", hidden);
  86. RETURN fold;
  87. END StdFold;
  88. PROCEDURE LoadTextBlock (r: Stores.Reader; t: TextModels.Model);
  89. VAR r0: Stores.Reader; wr: TextModels.Writer;
  90. org, len: INTEGER; en, ano, i, n: BYTE; col, voff, ch: CHAR; tag: INTEGER;
  91. fname: ARRAY 32 OF CHAR;
  92. attr: ARRAY 32 OF TextModels.Attributes;
  93. mod, proc: ARRAY 32 OF ARRAY 32 OF CHAR;
  94. PROCEDURE ReadNum (VAR n: INTEGER);
  95. VAR s: BYTE; ch: CHAR; y: INTEGER;
  96. BEGIN
  97. s := 0; y := 0; r.ReadXChar(ch);
  98. WHILE ch >= 80X DO
  99. INC(y, ASH(ORD(ch)-128, s)); INC(s, 7); r.ReadXChar(ch)
  100. END;
  101. n := ASH((ORD(ch) + 64) MOD 128 - 64, s) + y
  102. END ReadNum;
  103. PROCEDURE ReadSet (VAR s: SET);
  104. VAR x: INTEGER;
  105. BEGIN
  106. ReadNum(x); s := BITS(x)
  107. END ReadSet;
  108. PROCEDURE Elem (VAR r: Stores.Reader; span: INTEGER);
  109. VAR v: Views.View; end, ew, eh, n, indent: INTEGER; eno, version: BYTE;
  110. p: TextRulers.Prop; opts: SET;
  111. BEGIN
  112. r.ReadInt(ew); r.ReadInt(eh); r.ReadByte(eno);
  113. IF eno > en THEN en := eno; r.ReadXString(mod[eno]); r.ReadXString(proc[eno]) END;
  114. end := r.Pos() + span;
  115. IF (mod[eno] = "ParcElems") OR (mod[eno] = "StyleElems") THEN
  116. r.ReadByte(version);
  117. NEW(p);
  118. p.valid := {TextRulers.first .. TextRulers.tabs};
  119. ReadNum(indent); ReadNum(p.left);
  120. p.first := p.left + indent;
  121. ReadNum(n); p.right := p.left + n;
  122. ReadNum(p.lead);
  123. ReadNum(p.grid);
  124. ReadNum(p.dsc); p.asc := p.grid - p.dsc;
  125. ReadSet(opts); p.opts.val := {};
  126. IF ~(0 IN opts) THEN p.grid := 1 END;
  127. IF 1 IN opts THEN INCL(p.opts.val, TextRulers.leftAdjust) END;
  128. IF 2 IN opts THEN INCL(p.opts.val, TextRulers.rightAdjust) END;
  129. IF 3 IN opts THEN INCL(p.opts.val, TextRulers.pageBreak) END;
  130. INCL(p.opts.val, TextRulers.rightFixed);
  131. p.opts.mask := {TextRulers.leftAdjust .. TextRulers.pageBreak, TextRulers.rightFixed};
  132. ReadNum(n); p.tabs.len := n;
  133. i := 0; WHILE i < p.tabs.len DO ReadNum(p.tabs.tab[i].stop); INC(i) END;
  134. v := TextRulers.dir.NewFromProp(p);
  135. wr.WriteView(v, ew, eh)
  136. ELSIF mod[eno] = "StampElems" THEN
  137. v := Stamps.New();
  138. wr.WriteView(v, ew, eh)
  139. ELSIF mod[eno] = "ClockElems" THEN
  140. v := Clocks.New();
  141. wr.WriteView(v, ew, eh)
  142. ELSIF mod[eno] = "FoldElems" THEN
  143. v := StdFold(r);
  144. wr.WriteView(v, ew, eh);
  145. END;
  146. r.SetPos(end)
  147. END Elem;
  148. BEGIN
  149. (* skip inner text tags (legacy from V2) *)
  150. r.ReadXInt(tag);
  151. IF tag # V2Tag THEN r.SetPos(r.Pos()-2) END;
  152. (* load text block *)
  153. org := r.Pos(); r.ReadInt(len); INC(org, len - 2);
  154. r0.ConnectTo(r.rider.Base()); r0.SetPos(org);
  155. wr := t.NewWriter(NIL); wr.SetPos(0);
  156. n := 0; en := 0; r.ReadByte(ano);
  157. WHILE ano # 0 DO
  158. IF ano > n THEN
  159. n := ano; r.ReadXString(fname);
  160. attr[n] := TextModels.NewFont(wr.attr, ThisFont(fname))
  161. END;
  162. r.ReadXChar(col); r.ReadXChar(voff); r.ReadInt(len);
  163. wr.SetAttr(attr[ano]);
  164. IF len > 0 THEN
  165. WHILE len # 0 DO
  166. r0.ReadXChar(ch);
  167. IF ch >= 80X THEN ch := ThisChar(ch) END;
  168. IF (ch >= " ") OR (ch = TextModels.tab) OR (ch = TextModels.line) THEN
  169. wr.WriteChar(ch)
  170. END;
  171. DEC(len)
  172. END
  173. ELSE
  174. Elem(r, -len); r0.ReadXChar(ch)
  175. END;
  176. r.ReadByte(ano)
  177. END;
  178. r.ReadInt(len);
  179. r.SetPos(r.Pos() + len);
  180. END LoadTextBlock;
  181. PROCEDURE ImportOberon* (f: Files.File): TextModels.Model;
  182. VAR r: Stores.Reader; t: TextModels.Model; tag: INTEGER;
  183. BEGIN
  184. r.ConnectTo(f); r.SetPos(0);
  185. r.ReadXInt(tag);
  186. IF tag = ORD("o") + 256 * ORD("B") THEN
  187. (* ignore file header of Oberon for Windows and DOSOberon files *)
  188. r.SetPos(34); r.ReadXInt(tag)
  189. END;
  190. ASSERT((tag = V2Tag) OR (tag = V4Tag), 100);
  191. t := TextModels.dir.New();
  192. LoadTextBlock(r, t);
  193. RETURN t;
  194. END ImportOberon;
  195. PROCEDURE ImportETHDoc* (f: Files.File; OUT s: Stores.Store);
  196. VAR t: TextModels.Model;
  197. BEGIN
  198. ASSERT(f # NIL, 20);
  199. t := ImportOberon(f);
  200. IF t # NIL THEN s := TextViews.dir.New(t) END
  201. END ImportETHDoc;
  202. BEGIN
  203. default := Fonts.dir.Default()
  204. END StdETHConv.