RTF_Paragraph.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using System;
  2. using System.Collections.Generic;
  3. namespace FastReport.RichTextParser
  4. {
  5. /// <summary>
  6. /// This class represents a RTF text paragraph.
  7. /// </summary>
  8. internal class RTF_Paragraph : RTF_CommonRichElement
  9. {
  10. private Paragraph paragraph;
  11. public List<Run> Runs { get { return paragraph.runs; } }
  12. public Paragraph Paragraph { get { return paragraph; } }
  13. internal override RichObject RichObject
  14. {
  15. get
  16. {
  17. RichObject rich = new RichObject();
  18. rich.type = RichObject.Type.Paragraph;
  19. rich.pargraph = paragraph;
  20. rich.size = paragraph.size;
  21. return rich;
  22. }
  23. }
  24. public void Fix(RTF_Parser parser)
  25. {
  26. paragraph.format = parser.current_paragraph_format;
  27. }
  28. internal void AddString(RTF_Parser parser, string text)
  29. {
  30. Run run = new Run(text, parser.current_run_format);
  31. if (parser.ListItem)
  32. {
  33. if(parser.current_paragraph_format.list_id == null)
  34. parser.current_paragraph_format.list_id = new List<Run>();
  35. parser.current_paragraph_format.list_id.Add(run);
  36. }
  37. else
  38. {
  39. if (parser.Control != "pntxta" && parser.PreviousTag != "pntxtb")
  40. Runs.Add(run);
  41. else
  42. ; // run = null;
  43. }
  44. paragraph.size += text.Length;
  45. }
  46. internal override bool Parse(RTF_Parser parser, RTF_Header header)
  47. {
  48. bool status = true;
  49. Style style;
  50. if (parser.Text.Length != 0)
  51. {
  52. AddString(parser, parser.Text);
  53. }
  54. switch (parser.Control)
  55. {
  56. case "pard":
  57. parser.ResetParagraphFormat();
  58. parser.insideTable = false;
  59. break;
  60. case "intbl":
  61. //System.Diagnostics.Trace.WriteLine(@"\intbl");
  62. parser.insideTable = true;
  63. break;
  64. case "tab":
  65. AddString(parser, "\t");
  66. break;
  67. case "line":
  68. AddString(parser, "\r");
  69. break;
  70. case "emdash":
  71. AddString(parser, "—");
  72. break;
  73. case "endash":
  74. AddString(parser, "–");
  75. break;
  76. case "s":
  77. parser.ListItem = false; // Disable list
  78. style = header.FindStyle(parser, (int)parser.Number);
  79. parser.current_paragraph_format = style.paragraph_style;
  80. parser.current_run_format = style.run_style;
  81. break;
  82. case "widctlpar":
  83. // Tell to the resterizer do not break first and last lines
  84. break;
  85. default:
  86. status = RTF_DocumentParser.ParseParagraphFormat(parser);
  87. if (status == true)
  88. break;
  89. status = RTF_DocumentParser.ParseRunFormat(parser, header);
  90. ////if (status == true)
  91. //// break;
  92. ////if(parser.Status == ParserStatus.CloseBlock)
  93. ////{
  94. //// return true;
  95. ////}
  96. break;
  97. }
  98. return status;
  99. }
  100. internal RTF_Paragraph(RTF_Parser parser)
  101. {
  102. paragraph = new Paragraph();
  103. paragraph.runs = new List<Run>();
  104. paragraph.size = 1;
  105. paragraph.format = parser.current_paragraph_format;
  106. }
  107. }
  108. }