XMLTransformer.Mod 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. MODULE XMLTransformer; (** AUTHOR "Simon L. Keel"; PURPOSE "transforming XML to BB-text"; *)
  2. IMPORT
  3. Strings, XML, XMLObjects, Commands, Files, Modules;
  4. TYPE
  5. String = Strings.String;
  6. XMLPluginProcInfo = POINTER TO RECORD
  7. name, procedure : ARRAY 128 OF CHAR;
  8. next : XMLPluginProcInfo;
  9. END;
  10. TransformProc = PROCEDURE (element : XML.Element) : XML.Container;
  11. VAR
  12. xmlPluginProcs : XMLPluginProcInfo;
  13. PROCEDURE Transform*(elem : XML.Element) : XML.Container;
  14. VAR
  15. transformProc : TransformProc;
  16. container : XML.Container;
  17. s, name : String;
  18. BEGIN
  19. s := elem.GetName();
  20. name := Strings.UpperCaseInNew(s^);
  21. transformProc := FindProcedure(name^);
  22. IF transformProc # NIL THEN
  23. RETURN transformProc(elem);
  24. ELSE
  25. NEW(container);
  26. RETURN container;
  27. END;
  28. END Transform;
  29. PROCEDURE AddContentsOf*(source, target : XML.Container);
  30. VAR
  31. enum: XMLObjects.Enumerator;
  32. p : ANY;
  33. BEGIN
  34. enum := source.GetContents();
  35. WHILE (enum.HasMoreElements()) DO
  36. p := enum.GetNext();
  37. target.AddContent(p(XML.Content));
  38. END;
  39. END AddContentsOf;
  40. PROCEDURE TransformElemsIn*(container : XML.Container) : XML.Container;
  41. VAR
  42. c : XML.Container;
  43. enum: XMLObjects.Enumerator;
  44. p : ANY;
  45. BEGIN
  46. NEW(c);
  47. enum := container.GetContents();
  48. WHILE (enum.HasMoreElements()) DO
  49. p := enum.GetNext();
  50. IF p IS XML.Element THEN
  51. AddContentsOf(Transform(p(XML.Element)), c);
  52. END;
  53. END;
  54. RETURN c;
  55. END TransformElemsIn;
  56. PROCEDURE GetNewParagraph*(style : ARRAY OF CHAR) : XML.Element;
  57. VAR
  58. paragraph : XML.Element;
  59. styleAttrPar : XML.Attribute;
  60. s : String;
  61. BEGIN
  62. NEW(paragraph); paragraph.SetName("Paragraph");
  63. NEW(styleAttrPar); s := Strings.NewString("style"); styleAttrPar.SetName(s^);
  64. styleAttrPar.SetValue(style);
  65. paragraph.AddAttribute(styleAttrPar);
  66. RETURN paragraph;
  67. END GetNewParagraph;
  68. PROCEDURE GetNewSpan*(style : ARRAY OF CHAR) : XML.Element;
  69. VAR
  70. span : XML.Element;
  71. styleAttrPar : XML.Attribute;
  72. s : String;
  73. BEGIN
  74. NEW(span); span.SetName("Span");
  75. NEW(styleAttrPar); s := Strings.NewString("style"); styleAttrPar.SetName(s^);
  76. styleAttrPar.SetValue(style);
  77. span.AddAttribute(styleAttrPar);
  78. RETURN span;
  79. END GetNewSpan;
  80. PROCEDURE FindProcedure(name : ARRAY OF CHAR) : TransformProc;
  81. VAR
  82. transformProc : TransformProc;
  83. moduleName, procedureName : Modules.Name; msg : ARRAY 32 OF CHAR; res : WORD;
  84. cur : XMLPluginProcInfo;
  85. BEGIN {EXCLUSIVE}
  86. Strings.Delete(name, 0, 3);
  87. cur := xmlPluginProcs;
  88. WHILE cur # NIL DO
  89. IF cur.name = name THEN
  90. Commands.Split(cur.procedure, moduleName, procedureName, res, msg);
  91. IF (res = Commands.Ok) THEN
  92. GETPROCEDURE(moduleName, procedureName, transformProc);
  93. RETURN transformProc;
  94. END;
  95. END;
  96. cur := cur.next
  97. END;
  98. RETURN NIL
  99. END FindProcedure;
  100. PROCEDURE Register*(context : Commands.Context);
  101. VAR c : XMLPluginProcInfo;
  102. BEGIN {EXCLUSIVE}
  103. NEW(c);
  104. context.arg.SkipWhitespace; context.arg.String(c.name);
  105. context.arg.SkipWhitespace; context.arg.String(c.procedure);
  106. c.next := xmlPluginProcs; xmlPluginProcs := c;
  107. StoreXMLPlugins;
  108. END Register;
  109. PROCEDURE StoreXMLPlugins;
  110. VAR f : Files.File;
  111. w : Files.Writer;
  112. cur : XMLPluginProcInfo;
  113. res : WORD;
  114. n0, n1 : ARRAY 64 OF CHAR;
  115. BEGIN
  116. n0 := "XMLPluginConfig.dat"; n1 := "XMLPluginConfig.dat.Bak";
  117. Files.Rename(n0, n1, res);
  118. f := Files.New("XMLPluginConfig.dat");
  119. Files.OpenWriter(w, f, 0);
  120. Files.Register(f);
  121. cur := xmlPluginProcs;
  122. WHILE cur # NIL DO
  123. w.Char('"'); w.String(cur.name); w.Char('"'); w.Char(09X);
  124. w.Char('"'); w.String(cur.procedure); w.Char('"'); w.Ln;
  125. cur := cur.next;
  126. END;
  127. w.Update
  128. END StoreXMLPlugins;
  129. PROCEDURE LoadXMLPlugins;
  130. VAR f : Files.File;
  131. r : Files.Reader;
  132. c : XMLPluginProcInfo;
  133. BEGIN
  134. f := Files.Old("XMLPluginConfig.dat");
  135. IF f # NIL THEN
  136. Files.OpenReader(r, f, 0);
  137. WHILE r.res = 0 DO
  138. NEW(c);
  139. r.String(c.name); r.SkipWhitespace;
  140. r.String(c.procedure);
  141. IF r.res = 0 THEN c.next := xmlPluginProcs; xmlPluginProcs:= c END;
  142. r.SkipLn
  143. END
  144. END
  145. END LoadXMLPlugins;
  146. BEGIN
  147. LoadXMLPlugins;
  148. END XMLTransformer.