RTF_Paragraph.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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.paragraph = 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. if (paragraph.format.tab_positions != null)
  28. paragraph.format.tab_positions.Sort();
  29. }
  30. internal void AddString(RTF_Parser parser, string text)
  31. {
  32. Run run = new Run(text, parser.current_run_format);
  33. if (parser.ListItem)
  34. {
  35. if (parser.current_paragraph_format.list_id == null)
  36. parser.current_paragraph_format.list_id = new List<Run>();
  37. parser.current_paragraph_format.list_id.Add(run);
  38. }
  39. else
  40. {
  41. if (parser.Control != "pntxta" && parser.PreviousTag != "pntxtb" && parser.PreviousTag != "sn" && parser.PreviousTag != "sv")
  42. Runs.Add(run);
  43. else
  44. ; // run = null;
  45. }
  46. paragraph.size += text.Length;
  47. }
  48. internal override bool Parse(RTF_Parser parser, RTF_Header header)
  49. {
  50. bool status = true;
  51. Style style;
  52. if (parser.Text.Length != 0 && parser.PreviousTag != "pntxta")
  53. {
  54. AddString(parser, parser.Text);
  55. }
  56. switch (parser.Control)
  57. {
  58. case "pard":
  59. parser.ResetParagraphFormat();
  60. parser.insideTable = false;
  61. break;
  62. case "intbl":
  63. //System.Diagnostics.Trace.WriteLine(@"\intbl");
  64. parser.insideTable = true;
  65. break;
  66. case "tab":
  67. AddString(parser, "\t");
  68. parser.skip_space_counter = 8;
  69. break;
  70. case "line":
  71. AddString(parser, "\r");
  72. break;
  73. case "emdash":
  74. AddString(parser, "—");
  75. break;
  76. case "endash":
  77. AddString(parser, "–");
  78. break;
  79. case "s":
  80. parser.ListItem = false; // Disable list
  81. style = header.FindStyle(parser, (int)parser.Number);
  82. parser.current_paragraph_format = style.paragraph_style;
  83. parser.current_run_format.Assign(style.run_style);
  84. break;
  85. case "widctlpar":
  86. // Tell to the resterizer do not break first and last lines
  87. break;
  88. default:
  89. status = RTF_DocumentParser.ParseParagraphFormat(parser);
  90. if (status == true)
  91. break;
  92. status = RTF_DocumentParser.ParseRunFormat(parser, header);
  93. ////if (status == true)
  94. //// break;
  95. ////if(parser.Status == ParserStatus.CloseBlock)
  96. ////{
  97. //// return true;
  98. ////}
  99. break;
  100. }
  101. return status;
  102. }
  103. internal RTF_Paragraph(RTF_Parser parser)
  104. {
  105. paragraph = new Paragraph();
  106. paragraph.runs = new List<Run>();
  107. paragraph.size = 1;
  108. paragraph.format = parser.current_paragraph_format;
  109. }
  110. }
  111. }