PrettyPrint.Mod 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. MODULE PrettyPrint; (** AUTOR "GF"; PURPOSE "pretty printing of Oberon programs"; *)
  2. (* ----------------------------------------------------------
  3. Usage:
  4. PrettyPrint.Convert
  5. <filename> <filename> ... ~
  6. The real printing on a postscript printer can be done in the Oberon subsystem:
  7. Desktops.PrintDoc <printer name> PPr/<filename> ~
  8. ----------------------------------------------------------- *)
  9. IMPORT Commands, Files, Strings, Streams, Texts, TextUtilities, SyntaxHighlighter;
  10. CONST
  11. PPDir = "PPr";
  12. VAR
  13. highlighterU, highlighterL: SyntaxHighlighter.Highlighter;
  14. out, err: Streams.Writer;
  15. PROCEDURE CheckSubDirectory( CONST dname: ARRAY OF CHAR ): BOOLEAN;
  16. VAR
  17. enum: Files.Enumerator;
  18. fname, cname: ARRAY 64 OF CHAR; time, date, size: LONGINT; flags: SET;
  19. BEGIN
  20. cname := "./"; Strings.Append( cname, dname );
  21. NEW( enum );
  22. enum.Open( "./*", {} );
  23. WHILE enum.GetEntry( fname, flags, time, date, size ) DO
  24. IF fname = cname THEN RETURN TRUE END
  25. END;
  26. RETURN FALSE
  27. END CheckSubDirectory;
  28. (* convert program sources into syntax highlighted Oberon Texts in subdir 'PPr' *)
  29. PROCEDURE Convert*( context: Commands.Context ); (* {filename} ~ *)
  30. VAR
  31. filename, dest: ARRAY 64 OF CHAR; format, l: LONGINT; res: WORD;
  32. f: Files.File; text: Texts.Text;
  33. highlighter: SyntaxHighlighter.Highlighter;
  34. BEGIN
  35. out := context.out; err := context.error;
  36. out.String( "PrettyPrint.Convert" ); out.Ln;
  37. IF ~CheckSubDirectory( PPDir ) THEN Files.CreateDirectory( PPDir, res ) END;
  38. IF highlighterU = NIL THEN LoadHighlighter END;
  39. IF highlighterU # NIL THEN
  40. WHILE context.arg.GetString( filename ) DO
  41. out.String( " " ); out.String( filename );
  42. l := Strings.Length( filename );
  43. IF filename[l-3] = 'm' THEN highlighter := highlighterL ELSE highlighter := highlighterU END;
  44. f := Files.Old( filename );
  45. IF f = NIL THEN
  46. err.String( " : file not found" ); err.Ln;
  47. ELSE
  48. NEW( text );
  49. TextUtilities.LoadAuto( text, filename, format, res );
  50. SyntaxHighlighter.HighlightText( text, highlighter );
  51. dest := PPDir; Strings.Append( dest, "/" ); Strings.Append( dest, filename );
  52. TextUtilities.StoreOberonText( text, dest, res );
  53. out.String( " => " ); out.String( dest ); out.Ln;
  54. END
  55. END
  56. ELSE
  57. err.String( "Highlighter 'PrintOberon' not found" ); err.Ln
  58. END;
  59. out.Update; err.Update
  60. END Convert;
  61. PROCEDURE LoadHighlighter;
  62. VAR res: WORD; msg: ARRAY 128 OF CHAR;
  63. BEGIN
  64. Commands.Call( "SyntaxHighlighter.Open PrettyPrintHighlighter.XML", {}, res, msg );
  65. highlighterU := SyntaxHighlighter.GetHighlighter( "PrintOberon" );
  66. highlighterL := SyntaxHighlighter.GetHighlighter( "printoberon" );
  67. Commands.Call( "SyntaxHighlighter.Open SyntaxHighlighter.XML", {}, res, msg );
  68. END LoadHighlighter;
  69. BEGIN
  70. highlighterU := NIL;
  71. highlighterL := NIL
  72. END PrettyPrint.
  73. System.Free PrettyPrint ~
  74. PrettyPrint.Convert PrettyPrint.Mod Huffman.mod Xyz.Mod ~