taskjuggler 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (545) hide show
  1. data/CHANGELOG +160 -0
  2. data/benchmarks/UTF-8-Strings.rb +58 -0
  3. data/data/css/tjreport.css +7 -2
  4. data/doc/AppConfig.html +10 -4
  5. data/doc/Arguments.html +10 -4
  6. data/doc/CHANGELOG.html +171 -5
  7. data/doc/COPYING.html +10 -4
  8. data/doc/Object.html +11 -107
  9. data/doc/README.html +10 -4
  10. data/doc/RuntimeConfig.html +10 -4
  11. data/doc/String.html +16 -11
  12. data/doc/StringIO.html +10 -4
  13. data/doc/TaskJuggler.html +506 -435
  14. data/doc/TaskJuggler/Account.html +10 -4
  15. data/doc/TaskJuggler/AccountAttribute.html +10 -4
  16. data/doc/TaskJuggler/AccountScenario.html +10 -4
  17. data/doc/TaskJuggler/Allocation.html +69 -60
  18. data/doc/TaskJuggler/AllocationAttribute.html +10 -4
  19. data/doc/TaskJuggler/AttributeBase.html +10 -4
  20. data/doc/TaskJuggler/AttributeDefinition.html +10 -4
  21. data/doc/TaskJuggler/BatchProcessor.html +202 -192
  22. data/doc/TaskJuggler/Booking.html +10 -4
  23. data/doc/TaskJuggler/BookingListAttribute.html +10 -4
  24. data/doc/TaskJuggler/BooleanAttribute.html +10 -4
  25. data/doc/TaskJuggler/CSVFile.html +10 -4
  26. data/doc/TaskJuggler/CellSettingPattern.html +10 -4
  27. data/doc/TaskJuggler/CellSettingPatternList.html +10 -4
  28. data/doc/TaskJuggler/Charge.html +10 -4
  29. data/doc/TaskJuggler/ChargeListAttribute.html +10 -4
  30. data/doc/TaskJuggler/ChargeSet.html +10 -4
  31. data/doc/TaskJuggler/ChargeSetListAttribute.html +10 -4
  32. data/doc/TaskJuggler/ColumnListAttribute.html +10 -4
  33. data/doc/TaskJuggler/ColumnTable.html +10 -4
  34. data/doc/TaskJuggler/Daemon.html +71 -52
  35. data/doc/TaskJuggler/DateAttribute.html +10 -4
  36. data/doc/TaskJuggler/DefinitionListAttribute.html +10 -4
  37. data/doc/TaskJuggler/DependencyListAttribute.html +10 -4
  38. data/doc/TaskJuggler/DurationAttribute.html +10 -4
  39. data/doc/TaskJuggler/{MacroParser.html → FileList.html} +58 -173
  40. data/doc/TaskJuggler/{RichTextException.html → FileRecord.html} +59 -80
  41. data/doc/TaskJuggler/FixnumAttribute.html +10 -4
  42. data/doc/TaskJuggler/FlagListAttribute.html +10 -4
  43. data/doc/TaskJuggler/FloatAttribute.html +10 -4
  44. data/doc/TaskJuggler/FormatListAttribute.html +10 -4
  45. data/doc/TaskJuggler/GanttChart.html +10 -4
  46. data/doc/TaskJuggler/GanttContainer.html +14 -8
  47. data/doc/TaskJuggler/GanttHeader.html +10 -4
  48. data/doc/TaskJuggler/GanttHeaderScaleItem.html +10 -4
  49. data/doc/TaskJuggler/GanttLine.html +29 -24
  50. data/doc/TaskJuggler/GanttLoadStack.html +10 -4
  51. data/doc/TaskJuggler/GanttMilestone.html +10 -4
  52. data/doc/TaskJuggler/GanttRouter.html +10 -4
  53. data/doc/TaskJuggler/GanttTaskBar.html +20 -10
  54. data/doc/TaskJuggler/HTMLDocument.html +10 -4
  55. data/doc/TaskJuggler/HTMLGraphics.html +10 -4
  56. data/doc/TaskJuggler/Interval.html +10 -4
  57. data/doc/TaskJuggler/IntervalListAttribute.html +10 -4
  58. data/doc/TaskJuggler/JobInfo.html +10 -4
  59. data/doc/TaskJuggler/Journal.html +227 -160
  60. data/doc/TaskJuggler/JournalEntry.html +10 -4
  61. data/doc/TaskJuggler/JournalEntryList.html +158 -72
  62. data/doc/TaskJuggler/KeywordArray.html +21 -9
  63. data/doc/TaskJuggler/KeywordDocumentation.html +612 -475
  64. data/doc/TaskJuggler/Limits.html +13 -8
  65. data/doc/TaskJuggler/Limits/Limit.html +10 -4
  66. data/doc/TaskJuggler/LimitsAttribute.html +10 -4
  67. data/doc/TaskJuggler/ListAttributeBase.html +10 -4
  68. data/doc/TaskJuggler/Log.html +10 -4
  69. data/doc/TaskJuggler/LogFile.html +10 -4
  70. data/doc/TaskJuggler/LogicalAttribute.html +10 -4
  71. data/doc/TaskJuggler/LogicalExpression.html +11 -5
  72. data/doc/TaskJuggler/LogicalExpressionAttribute.html +10 -4
  73. data/doc/TaskJuggler/LogicalFlag.html +10 -4
  74. data/doc/TaskJuggler/LogicalFunction.html +132 -124
  75. data/doc/TaskJuggler/LogicalOperation.html +10 -4
  76. data/doc/TaskJuggler/Macro.html +16 -10
  77. data/doc/TaskJuggler/MacroTable.html +44 -38
  78. data/doc/TaskJuggler/ManagerResponsibilities.html +10 -4
  79. data/doc/TaskJuggler/ManagerStatusRecord.html +10 -4
  80. data/doc/TaskJuggler/Message.html +92 -68
  81. data/doc/TaskJuggler/MessageHandler.html +349 -28
  82. data/doc/TaskJuggler/Navigator.html +10 -4
  83. data/doc/TaskJuggler/NavigatorElement.html +10 -4
  84. data/doc/TaskJuggler/NikuProject.html +10 -4
  85. data/doc/TaskJuggler/NikuReport.html +10 -4
  86. data/doc/TaskJuggler/NikuResource.html +10 -4
  87. data/doc/TaskJuggler/NodeListAttribute.html +10 -4
  88. data/doc/TaskJuggler/OnShiftCache.html +10 -4
  89. data/doc/TaskJuggler/ProcessIntercom.html +118 -111
  90. data/doc/TaskJuggler/ProcessIntercomIface.html +75 -22
  91. data/doc/TaskJuggler/Project.html +886 -913
  92. data/doc/TaskJuggler/ProjectBroker.html +442 -331
  93. data/doc/TaskJuggler/ProjectBrokerIface.html +95 -38
  94. data/doc/TaskJuggler/ProjectFileParser.html +320 -317
  95. data/doc/TaskJuggler/ProjectFileScanner.html +336 -339
  96. data/doc/TaskJuggler/ProjectRecord.html +119 -56
  97. data/doc/TaskJuggler/ProjectServer.html +282 -237
  98. data/doc/TaskJuggler/ProjectServerIface.html +45 -39
  99. data/doc/TaskJuggler/PropertyAttribute.html +10 -4
  100. data/doc/TaskJuggler/PropertyList.html +177 -173
  101. data/doc/TaskJuggler/PropertySet.html +11 -5
  102. data/doc/TaskJuggler/PropertyTreeNode.html +194 -191
  103. data/doc/TaskJuggler/Query.html +280 -256
  104. data/doc/TaskJuggler/RTFHandlers.html +10 -4
  105. data/doc/TaskJuggler/RTFNavigator.html +33 -26
  106. data/doc/TaskJuggler/RTFQuery.html +135 -169
  107. data/doc/TaskJuggler/RTFReport.html +63 -56
  108. data/doc/TaskJuggler/RTFReportLink.html +58 -47
  109. data/doc/TaskJuggler/RTFWithQuerySupport.html +666 -0
  110. data/doc/TaskJuggler/RealFormat.html +10 -4
  111. data/doc/TaskJuggler/RealFormatAttribute.html +10 -4
  112. data/doc/TaskJuggler/ReferenceAttribute.html +10 -4
  113. data/doc/TaskJuggler/Report.html +333 -290
  114. data/doc/TaskJuggler/ReportBase.html +182 -174
  115. data/doc/TaskJuggler/ReportContext.html +10 -4
  116. data/doc/TaskJuggler/ReportServer.html +144 -126
  117. data/doc/TaskJuggler/ReportServerIface.html +50 -44
  118. data/doc/TaskJuggler/ReportServerRecord.html +38 -32
  119. data/doc/TaskJuggler/ReportServlet.html +144 -137
  120. data/doc/TaskJuggler/ReportTable.html +10 -4
  121. data/doc/TaskJuggler/ReportTableCell.html +169 -164
  122. data/doc/TaskJuggler/ReportTableColumn.html +10 -4
  123. data/doc/TaskJuggler/ReportTableLegend.html +10 -4
  124. data/doc/TaskJuggler/ReportTableLine.html +10 -4
  125. data/doc/TaskJuggler/Resource.html +121 -115
  126. data/doc/TaskJuggler/ResourceListAttribute.html +10 -4
  127. data/doc/TaskJuggler/ResourceListRE.html +10 -4
  128. data/doc/TaskJuggler/ResourceScenario.html +13 -7
  129. data/doc/TaskJuggler/RichText.html +61 -37
  130. data/doc/TaskJuggler/RichTextAttribute.html +10 -4
  131. data/doc/TaskJuggler/RichTextDocument.html +91 -81
  132. data/doc/TaskJuggler/RichTextElement.html +378 -317
  133. data/doc/TaskJuggler/RichTextFunctionExample.html +10 -4
  134. data/doc/TaskJuggler/RichTextFunctionHandler.html +16 -11
  135. data/doc/TaskJuggler/RichTextImage.html +10 -4
  136. data/doc/TaskJuggler/RichTextIntermediate.html +138 -70
  137. data/doc/TaskJuggler/RichTextParser.html +48 -40
  138. data/doc/TaskJuggler/RichTextScanner.html +328 -906
  139. data/doc/TaskJuggler/RichTextSnip.html +59 -57
  140. data/doc/TaskJuggler/RichTextSyntaxRules.html +458 -369
  141. data/doc/TaskJuggler/Scenario.html +10 -4
  142. data/doc/TaskJuggler/ScenarioData.html +33 -30
  143. data/doc/TaskJuggler/ScenarioListAttribute.html +10 -4
  144. data/doc/TaskJuggler/Scoreboard.html +10 -4
  145. data/doc/TaskJuggler/SheetHandlerBase.html +315 -191
  146. data/doc/TaskJuggler/SheetReceiver.html +334 -313
  147. data/doc/TaskJuggler/SheetSender.html +10 -4
  148. data/doc/TaskJuggler/Shift.html +10 -4
  149. data/doc/TaskJuggler/ShiftAssignment.html +10 -4
  150. data/doc/TaskJuggler/ShiftAssignments.html +10 -4
  151. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +10 -4
  152. data/doc/TaskJuggler/ShiftScenario.html +10 -4
  153. data/doc/TaskJuggler/SimpleQueryExpander.html +697 -0
  154. data/doc/TaskJuggler/SortListAttribute.html +10 -4
  155. data/doc/TaskJuggler/SourceFileInfo.html +10 -4
  156. data/doc/TaskJuggler/StatusSheetReceiver.html +10 -4
  157. data/doc/TaskJuggler/StatusSheetReport.html +10 -4
  158. data/doc/TaskJuggler/StatusSheetSender.html +10 -4
  159. data/doc/TaskJuggler/StringAttribute.html +10 -4
  160. data/doc/TaskJuggler/SymbolAttribute.html +10 -4
  161. data/doc/TaskJuggler/SyntaxReference.html +260 -230
  162. data/doc/TaskJuggler/TOCEntry.html +99 -42
  163. data/doc/TaskJuggler/TSResourceRecord.html +10 -4
  164. data/doc/TaskJuggler/TSTaskRecord.html +10 -4
  165. data/doc/TaskJuggler/TableColumnDefinition.html +10 -4
  166. data/doc/TaskJuggler/TableOfContents.html +54 -12
  167. data/doc/TaskJuggler/TableReport.html +877 -872
  168. data/doc/TaskJuggler/Task.html +117 -68
  169. data/doc/TaskJuggler/TaskDependency.html +10 -4
  170. data/doc/TaskJuggler/TaskListAttribute.html +10 -4
  171. data/doc/TaskJuggler/TaskListRE.html +10 -4
  172. data/doc/TaskJuggler/TaskScenario.html +1681 -1563
  173. data/doc/TaskJuggler/TextFormatter.html +10 -4
  174. data/doc/TaskJuggler/TextParser.html +567 -534
  175. data/doc/TaskJuggler/TextParser/Pattern.html +128 -118
  176. data/doc/TaskJuggler/TextParser/Rule.html +26 -15
  177. data/doc/TaskJuggler/TextParser/StackElement.html +10 -4
  178. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +22 -16
  179. data/doc/TaskJuggler/TextParser/TokenDoc.html +10 -4
  180. data/doc/TaskJuggler/TextReport.html +15 -6
  181. data/doc/TaskJuggler/TextScanner.html +319 -287
  182. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +16 -10
  183. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +23 -17
  184. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +17 -11
  185. data/doc/TaskJuggler/TextScanner/StreamHandle.html +102 -96
  186. data/doc/TaskJuggler/TimeSheet.html +138 -175
  187. data/doc/TaskJuggler/TimeSheetReceiver.html +10 -4
  188. data/doc/TaskJuggler/TimeSheetRecord.html +65 -58
  189. data/doc/TaskJuggler/TimeSheetReport.html +47 -42
  190. data/doc/TaskJuggler/TimeSheetSender.html +10 -4
  191. data/doc/TaskJuggler/TimeSheetSummary.html +91 -83
  192. data/doc/TaskJuggler/TimeSheets.html +22 -16
  193. data/doc/TaskJuggler/Tj3AppBase.html +10 -4
  194. data/doc/TaskJuggler/Tj3Client.html +399 -365
  195. data/doc/TaskJuggler/Tj3Daemon.html +107 -94
  196. data/doc/TaskJuggler/Tj3SheetAppBase.html +10 -4
  197. data/doc/TaskJuggler/Tj3SsReceiver.html +10 -4
  198. data/doc/TaskJuggler/Tj3SsSender.html +10 -4
  199. data/doc/TaskJuggler/Tj3TsReceiver.html +10 -4
  200. data/doc/TaskJuggler/Tj3TsSender.html +10 -4
  201. data/doc/TaskJuggler/Tj3TsSummary.html +10 -4
  202. data/doc/TaskJuggler/TjException.html +10 -4
  203. data/doc/TaskJuggler/TjTime.html +145 -140
  204. data/doc/TaskJuggler/TjpExample.html +10 -4
  205. data/doc/TaskJuggler/TjpExportRE.html +122 -118
  206. data/doc/TaskJuggler/TjpSyntaxRules.html +4065 -4052
  207. data/doc/TaskJuggler/URLParameter.html +10 -4
  208. data/doc/TaskJuggler/UserManual.html +162 -155
  209. data/doc/TaskJuggler/VimSyntax.html +1028 -0
  210. data/doc/TaskJuggler/WebServer.html +45 -27
  211. data/doc/TaskJuggler/WorkingHours.html +10 -4
  212. data/doc/TaskJuggler/WorkingHoursAttribute.html +10 -4
  213. data/doc/TaskJuggler/XMLBlob.html +10 -4
  214. data/doc/TaskJuggler/XMLComment.html +10 -4
  215. data/doc/TaskJuggler/XMLDocument.html +10 -4
  216. data/doc/TaskJuggler/XMLElement.html +10 -4
  217. data/doc/TaskJuggler/XMLNamedText.html +10 -4
  218. data/doc/TaskJuggler/XMLText.html +10 -4
  219. data/doc/index.html +735 -677
  220. data/doc/lib/AccountScenario_rb.html +1 -1
  221. data/doc/lib/Account_rb.html +1 -1
  222. data/doc/lib/Allocation_rb.html +1 -1
  223. data/doc/lib/AppConfig_rb.html +1 -1
  224. data/doc/lib/AttributeBase_rb.html +1 -1
  225. data/doc/lib/AttributeDefinition_rb.html +1 -1
  226. data/doc/lib/Attributes_rb.html +1 -1
  227. data/doc/lib/BatchProcessor_rb.html +1 -1
  228. data/doc/lib/Booking_rb.html +1 -1
  229. data/doc/lib/ChargeSet_rb.html +1 -1
  230. data/doc/lib/Charge_rb.html +1 -1
  231. data/doc/lib/{Message_rb.html → FileList_rb.html} +3 -5
  232. data/doc/lib/HTMLDocument_rb.html +1 -1
  233. data/doc/lib/Interval_rb.html +1 -1
  234. data/doc/lib/Journal_rb.html +1 -1
  235. data/doc/lib/KeywordArray_rb.html +1 -1
  236. data/doc/lib/KeywordDocumentation_rb.html +1 -1
  237. data/doc/lib/Limits_rb.html +1 -1
  238. data/doc/lib/LogFile_rb.html +1 -1
  239. data/doc/lib/Log_rb.html +1 -1
  240. data/doc/lib/LogicalExpression_rb.html +1 -1
  241. data/doc/lib/LogicalFunction_rb.html +1 -1
  242. data/doc/lib/LogicalOperation_rb.html +1 -1
  243. data/doc/lib/MacroTable_rb.html +1 -3
  244. data/doc/lib/MessageHandler_rb.html +1 -1
  245. data/doc/lib/ProjectFileParser_rb.html +1 -1
  246. data/doc/lib/ProjectFileScanner_rb.html +1 -1
  247. data/doc/lib/Project_rb.html +4 -2
  248. data/doc/lib/PropertyList_rb.html +1 -1
  249. data/doc/lib/PropertySet_rb.html +1 -1
  250. data/doc/lib/PropertyTreeNode_rb.html +1 -1
  251. data/doc/lib/Query_rb.html +1 -1
  252. data/doc/lib/RTFHandlers_rb.html +1 -1
  253. data/doc/lib/RTFNavigator_rb.html +1 -1
  254. data/doc/lib/RTFQuery_rb.html +2 -2
  255. data/doc/lib/RTFReportLink_rb.html +4 -2
  256. data/doc/lib/RTFReport_rb.html +1 -1
  257. data/doc/lib/{MacroParser_rb.html → RTFWithQuerySupport_rb.html} +4 -6
  258. data/doc/lib/RealFormat_rb.html +1 -1
  259. data/doc/lib/ResourceScenario_rb.html +1 -1
  260. data/doc/lib/Resource_rb.html +1 -1
  261. data/doc/lib/RichTextDocument_rb.html +1 -1
  262. data/doc/lib/RichTextElement_rb.html +1 -1
  263. data/doc/lib/RichTextFunctionExample_rb.html +1 -1
  264. data/doc/lib/RichTextFunctionHandler_rb.html +1 -1
  265. data/doc/lib/RichTextParser_rb.html +1 -1
  266. data/doc/lib/RichTextScanner_rb.html +3 -1
  267. data/doc/lib/RichTextSnip_rb.html +1 -1
  268. data/doc/lib/RichTextSyntaxRules_rb.html +1 -1
  269. data/doc/lib/RichText_rb.html +3 -1
  270. data/doc/lib/RuntimeConfig_rb.html +1 -1
  271. data/doc/lib/ScenarioData_rb.html +2 -2
  272. data/doc/lib/Scenario_rb.html +1 -1
  273. data/doc/lib/Scoreboard_rb.html +1 -1
  274. data/doc/lib/SheetHandlerBase_rb.html +5 -1
  275. data/doc/lib/SheetReceiver_rb.html +3 -1
  276. data/doc/lib/SheetSender_rb.html +1 -1
  277. data/doc/lib/ShiftAssignments_rb.html +1 -1
  278. data/doc/lib/ShiftScenario_rb.html +1 -1
  279. data/doc/lib/Shift_rb.html +1 -1
  280. data/doc/lib/SimpleQueryExpander_rb.html +67 -0
  281. data/doc/lib/SourceFileInfo_rb.html +1 -1
  282. data/doc/lib/StatusSheetReceiver_rb.html +1 -1
  283. data/doc/lib/StatusSheetSender_rb.html +1 -1
  284. data/doc/lib/SyntaxReference_rb.html +1 -1
  285. data/doc/lib/TOCEntry_rb.html +1 -1
  286. data/doc/lib/TableColumnDefinition_rb.html +1 -1
  287. data/doc/lib/TableOfContents_rb.html +1 -1
  288. data/doc/lib/TaskDependency_rb.html +1 -1
  289. data/doc/lib/TaskJuggler_rb.html +1 -1
  290. data/doc/lib/TaskScenario_rb.html +1 -1
  291. data/doc/lib/Task_rb.html +1 -1
  292. data/doc/lib/TextFormatter_rb.html +1 -1
  293. data/doc/lib/TextParser/Pattern_rb.html +1 -1
  294. data/doc/lib/TextParser/Rule_rb.html +1 -1
  295. data/doc/lib/TextParser/StackElement_rb.html +1 -1
  296. data/doc/lib/TextParser/TokenDoc_rb.html +1 -1
  297. data/doc/lib/TextParser_rb.html +3 -1
  298. data/doc/lib/TextScanner_rb.html +1 -3
  299. data/doc/lib/TimeSheetReceiver_rb.html +1 -1
  300. data/doc/lib/TimeSheetSender_rb.html +1 -1
  301. data/doc/lib/TimeSheetSummary_rb.html +1 -1
  302. data/doc/lib/TimeSheets_rb.html +1 -1
  303. data/doc/lib/Tj3AppBase_rb.html +1 -1
  304. data/doc/lib/Tj3Config_rb.html +1 -1
  305. data/doc/lib/Tj3SheetAppBase_rb.html +1 -1
  306. data/doc/lib/TjException_rb.html +1 -1
  307. data/doc/lib/TjTime_rb.html +1 -1
  308. data/doc/lib/TjpExample_rb.html +1 -1
  309. data/doc/lib/TjpSyntaxRules_rb.html +1 -1
  310. data/doc/lib/URLParameter_rb.html +1 -1
  311. data/doc/lib/UTF8String_rb.html +1 -1
  312. data/doc/lib/UserManual_rb.html +1 -1
  313. data/doc/lib/{ruby-signal-bug_rb.html → VimSyntax_rb.html} +17 -4
  314. data/doc/lib/WorkingHours_rb.html +1 -1
  315. data/doc/lib/XMLDocument_rb.html +1 -1
  316. data/doc/lib/XMLElement_rb.html +1 -1
  317. data/doc/lib/daemon/Daemon_rb.html +1 -1
  318. data/doc/lib/daemon/ProcessIntercom_rb.html +1 -1
  319. data/doc/lib/daemon/ProjectBroker_rb.html +1 -1
  320. data/doc/lib/daemon/ProjectServer_rb.html +1 -1
  321. data/doc/lib/daemon/ReportServer_rb.html +1 -3
  322. data/doc/lib/daemon/WebServer_rb.html +1 -1
  323. data/doc/lib/deep_copy_rb.html +1 -1
  324. data/doc/lib/reports/CSVFile_rb.html +1 -1
  325. data/doc/lib/reports/ColumnTable_rb.html +1 -1
  326. data/doc/lib/reports/GanttChart_rb.html +1 -1
  327. data/doc/lib/reports/GanttContainer_rb.html +1 -1
  328. data/doc/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
  329. data/doc/lib/reports/GanttHeader_rb.html +1 -1
  330. data/doc/lib/reports/GanttLine_rb.html +1 -1
  331. data/doc/lib/reports/GanttLoadStack_rb.html +1 -1
  332. data/doc/lib/reports/GanttMilestone_rb.html +1 -1
  333. data/doc/lib/reports/GanttRouter_rb.html +1 -1
  334. data/doc/lib/reports/GanttTaskBar_rb.html +1 -1
  335. data/doc/lib/reports/HTMLGraphics_rb.html +1 -1
  336. data/doc/lib/reports/Navigator_rb.html +1 -1
  337. data/doc/lib/reports/NikuReport_rb.html +1 -1
  338. data/doc/lib/reports/ReportBase_rb.html +1 -1
  339. data/doc/lib/reports/ReportContext_rb.html +1 -1
  340. data/doc/lib/reports/ReportTableCell_rb.html +1 -1
  341. data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
  342. data/doc/lib/reports/ReportTableLegend_rb.html +1 -1
  343. data/doc/lib/reports/ReportTableLine_rb.html +1 -1
  344. data/doc/lib/reports/ReportTable_rb.html +1 -1
  345. data/doc/lib/reports/Report_rb.html +1 -1
  346. data/doc/lib/reports/ResourceListRE_rb.html +1 -1
  347. data/doc/lib/reports/StatusSheetReport_rb.html +1 -1
  348. data/doc/lib/reports/TableReport_rb.html +1 -1
  349. data/doc/lib/reports/TaskListRE_rb.html +1 -1
  350. data/doc/lib/reports/TextReport_rb.html +1 -1
  351. data/doc/lib/reports/TimeSheetReport_rb.html +1 -1
  352. data/doc/lib/reports/TjpExportRE_rb.html +1 -1
  353. data/doc/lib/taskjuggler3_rb.html +1 -1
  354. data/doc/lib/tj3client_rb.html +1 -1
  355. data/doc/lib/tj3d_rb.html +1 -1
  356. data/doc/lib/tj3man_rb.html +1 -1
  357. data/doc/lib/tj3ss_receiver_rb.html +1 -1
  358. data/doc/lib/tj3ss_sender_rb.html +1 -1
  359. data/doc/lib/tj3ts_receiver_rb.html +1 -1
  360. data/doc/lib/tj3ts_sender_rb.html +1 -1
  361. data/doc/lib/tj3ts_summary_rb.html +1 -1
  362. data/lib/Allocation.rb +8 -5
  363. data/lib/BatchProcessor.rb +7 -3
  364. data/lib/FileList.rb +58 -0
  365. data/lib/Journal.rb +73 -33
  366. data/lib/KeywordArray.rb +4 -0
  367. data/lib/KeywordDocumentation.rb +45 -11
  368. data/lib/Limits.rb +0 -1
  369. data/lib/LogicalExpression.rb +1 -1
  370. data/lib/LogicalFunction.rb +14 -12
  371. data/lib/MacroTable.rb +3 -4
  372. data/lib/MessageHandler.rb +136 -7
  373. data/lib/Project.rb +72 -86
  374. data/lib/ProjectFileParser.rb +30 -33
  375. data/lib/ProjectFileScanner.rb +7 -16
  376. data/lib/PropertyList.rb +25 -27
  377. data/lib/PropertySet.rb +1 -1
  378. data/lib/PropertyTreeNode.rb +9 -12
  379. data/lib/Query.rb +5 -4
  380. data/lib/RTFNavigator.rb +2 -1
  381. data/lib/RTFQuery.rb +4 -11
  382. data/lib/RTFReport.rb +2 -1
  383. data/lib/RTFReportLink.rb +10 -4
  384. data/lib/RTFWithQuerySupport.rb +45 -0
  385. data/lib/Resource.rb +20 -20
  386. data/lib/ResourceScenario.rb +3 -3
  387. data/lib/RichText.rb +15 -7
  388. data/lib/RichTextDocument.rb +8 -4
  389. data/lib/RichTextElement.rb +35 -12
  390. data/lib/RichTextFunctionHandler.rb +11 -12
  391. data/lib/RichTextParser.rb +5 -3
  392. data/lib/RichTextScanner.rb +144 -565
  393. data/lib/RichTextSnip.rb +3 -7
  394. data/lib/RichTextSyntaxRules.rb +51 -32
  395. data/lib/ScenarioData.rb +16 -25
  396. data/lib/SheetHandlerBase.rb +59 -2
  397. data/lib/SheetReceiver.rb +36 -18
  398. data/lib/SimpleQueryExpander.rb +58 -0
  399. data/lib/SyntaxReference.rb +9 -5
  400. data/lib/TOCEntry.rb +2 -0
  401. data/lib/TableOfContents.rb +4 -0
  402. data/lib/Task.rb +23 -12
  403. data/lib/TaskJuggler.rb +72 -33
  404. data/lib/TaskScenario.rb +131 -53
  405. data/lib/TextParser.rb +43 -30
  406. data/lib/TextParser/Pattern.rb +17 -13
  407. data/lib/TextParser/Rule.rb +5 -0
  408. data/lib/TextScanner.rb +46 -25
  409. data/lib/TimeSheetSummary.rb +9 -7
  410. data/lib/TimeSheets.rb +14 -23
  411. data/lib/Tj3Config.rb +1 -1
  412. data/lib/TjTime.rb +1 -2
  413. data/lib/TjpSyntaxRules.rb +128 -104
  414. data/lib/UTF8String.rb +0 -1
  415. data/lib/UserManual.rb +5 -4
  416. data/lib/VimSyntax.rb +223 -0
  417. data/lib/daemon/Daemon.rb +9 -0
  418. data/lib/daemon/ProcessIntercom.rb +19 -4
  419. data/lib/daemon/ProjectBroker.rb +149 -68
  420. data/lib/daemon/ProjectServer.rb +119 -79
  421. data/lib/daemon/ReportServer.rb +42 -31
  422. data/lib/daemon/WebServer.rb +21 -2
  423. data/lib/deep_copy.rb +1 -1
  424. data/lib/reports/GanttContainer.rb +2 -2
  425. data/lib/reports/GanttLine.rb +2 -3
  426. data/lib/reports/GanttTaskBar.rb +7 -3
  427. data/lib/reports/Report.rb +62 -57
  428. data/lib/reports/ReportBase.rb +6 -4
  429. data/lib/reports/ReportTableCell.rb +13 -14
  430. data/lib/reports/TableReport.rb +2 -1
  431. data/lib/reports/TextReport.rb +3 -0
  432. data/lib/reports/TimeSheetReport.rb +2 -3
  433. data/lib/reports/TjpExportRE.rb +0 -2
  434. data/lib/tj3client.rb +31 -3
  435. data/lib/tj3d.rb +8 -1
  436. data/manual/Day_To_Day_Juggling +2 -95
  437. data/manual/How_To_Contribute +2 -1
  438. data/manual/Rich_Text_Attributes +37 -3
  439. data/manual/Software +203 -0
  440. data/test/MessageChecker.rb +4 -4
  441. data/test/TestSuite/HTML-Reports/Alerts.html +172 -0
  442. data/test/TestSuite/HTML-Reports/CellText.html +758 -0
  443. data/test/TestSuite/HTML-Reports/ColumnPeriods.html +156 -0
  444. data/test/TestSuite/HTML-Reports/IsOngoing.html +172 -0
  445. data/test/TestSuite/HTML-Reports/LogicalFunctions.html +245 -0
  446. data/test/TestSuite/HTML-Reports/Query.html +31 -0
  447. data/test/TestSuite/HTML-Reports/css/tjmanual.css +14 -0
  448. data/test/TestSuite/HTML-Reports/css/tjreport.css +233 -21
  449. data/test/TestSuite/HTML-Reports/depArrows.html +842 -0
  450. data/test/TestSuite/HTML-Reports/scripts/scripts/wz_tooltip.js +1301 -0
  451. data/test/TestSuite/HTML-Reports/scripts/wz_tooltip.js +20 -20
  452. data/test/TestSuite/ReportGenerator/Correct/Alerts.tjp +48 -0
  453. data/test/TestSuite/ReportGenerator/Correct/Macros.tjp +57 -0
  454. data/test/TestSuite/ReportGenerator/Correct/refs/Alerts-1.csv +386 -0
  455. data/test/TestSuite/ReportGenerator/Correct/refs/Macros-1.csv +6 -0
  456. data/test/TestSuite/ReportGenerator/{Correct → Errors}/css/tjmanual.css +0 -0
  457. data/test/TestSuite/ReportGenerator/{Correct → Errors}/css/tjreport.css +0 -0
  458. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/details.png +0 -0
  459. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-green.png +0 -0
  460. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-red.png +0 -0
  461. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-yellow.png +0 -0
  462. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/resource.png +0 -0
  463. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/resourcegroup.png +0 -0
  464. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/task.png +0 -0
  465. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/taskgroup.png +0 -0
  466. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-down.png +0 -0
  467. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-flat.png +0 -0
  468. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-up.png +0 -0
  469. data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.html +26 -0
  470. data/test/TestSuite/ReportGenerator/{Correct → Errors}/scripts/wz_tooltip.js +0 -0
  471. data/test/TestSuite/Scheduler/Correct/Allocate.html +3210 -0
  472. data/test/TestSuite/Scheduler/Correct/Allocate.tjp +19 -0
  473. data/test/TestSuite/Scheduler/Correct/Container.html +22 -22
  474. data/test/TestSuite/Scheduler/Correct/Limits.html +4964 -0
  475. data/test/TestSuite/Scheduler/Correct/Shift.html +1707 -417
  476. data/test/TestSuite/Scheduler/Correct/Shift2.html +9 -9
  477. data/test/TestSuite/Scheduler/Correct/css/tjreport.css +6 -2
  478. data/test/TestSuite/Scheduler/Errors/css/tjmanual.css +66 -0
  479. data/test/TestSuite/Scheduler/Errors/css/tjreport.css +407 -0
  480. data/test/TestSuite/Scheduler/Errors/icons/details.png +0 -0
  481. data/test/TestSuite/Scheduler/Errors/icons/flag-green.png +0 -0
  482. data/test/TestSuite/Scheduler/Errors/icons/flag-red.png +0 -0
  483. data/test/TestSuite/Scheduler/Errors/icons/flag-yellow.png +0 -0
  484. data/test/TestSuite/Scheduler/Errors/icons/resource.png +0 -0
  485. data/test/TestSuite/Scheduler/Errors/icons/resourcegroup.png +0 -0
  486. data/test/TestSuite/Scheduler/Errors/icons/task.png +0 -0
  487. data/test/TestSuite/Scheduler/Errors/icons/taskgroup.png +0 -0
  488. data/test/TestSuite/Scheduler/Errors/icons/trend-down.png +0 -0
  489. data/test/TestSuite/Scheduler/Errors/icons/trend-flat.png +0 -0
  490. data/test/TestSuite/Scheduler/Errors/icons/trend-up.png +0 -0
  491. data/test/TestSuite/Scheduler/Errors/loop_detected_1.tjp +1 -1
  492. data/test/TestSuite/Scheduler/Errors/loop_detected_10.tjp +1 -1
  493. data/test/TestSuite/Scheduler/Errors/loop_detected_11.tjp +1 -1
  494. data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +1 -1
  495. data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +1 -1
  496. data/test/TestSuite/Scheduler/Errors/loop_detected_14.tjp +1 -1
  497. data/test/TestSuite/Scheduler/Errors/loop_detected_2.tjp +1 -1
  498. data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +1 -1
  499. data/test/TestSuite/Scheduler/Errors/loop_detected_4.tjp +1 -1
  500. data/test/TestSuite/Scheduler/Errors/loop_detected_5.tjp +1 -1
  501. data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +1 -1
  502. data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +1 -1
  503. data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +1 -1
  504. data/test/TestSuite/Scheduler/Errors/loop_detected_9.tjp +1 -1
  505. data/test/TestSuite/Scheduler/Errors/scripts/wz_tooltip.js +1301 -0
  506. data/test/TestSuite/Scheduler/Errors/task_pred_before.tjp +11 -0
  507. data/test/TestSuite/Scheduler/Errors/task_pred_before_gd.tjp +11 -0
  508. data/test/TestSuite/Scheduler/Errors/task_pred_before_gl.tjp +11 -0
  509. data/test/TestSuite/Scheduler/Errors/task_succ_after.tjp +12 -0
  510. data/test/TestSuite/Scheduler/Errors/task_succ_after_gd.tjp +12 -0
  511. data/test/TestSuite/Scheduler/Errors/task_succ_after_gl.tjp +12 -0
  512. data/test/TestSuite/StatusSheets/dev2.tji +22 -0
  513. data/test/TestSuite/StatusSheets/resrep.tji +7 -0
  514. data/test/TestSuite/StatusSheets/run +6 -4
  515. data/test/TestSuite/StatusSheets/tj3d.log +312 -0
  516. data/test/TestSuite/Syntax/Correct/Managers.html +263 -0
  517. data/test/TestSuite/Syntax/Correct/tutorial.tjp +1 -2
  518. data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
  519. data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +1 -1
  520. data/test/TestSuite/TimeSheets/acceptable_intervals +1 -0
  521. data/test/TestSuite/TimeSheets/resrep.tji +7 -0
  522. data/test/TestSuite/TimeSheets/run +6 -5
  523. data/test/TestSuite/TimeSheets/statussheets.log +1 -0
  524. data/test/TestSuite/TimeSheets/ts.tji +351 -0
  525. data/test/TestSuite/TimeSheets/tsdef.tji +2 -0
  526. data/test/test_PropertySet.rb +2 -2
  527. data/test/test_RichText.rb +178 -387
  528. data/test/test_SimpleQueryExpander.rb +55 -0
  529. data/test/test_deep_copy.rb +2 -2
  530. metadata +854 -834
  531. data/lib/MacroParser.rb +0 -77
  532. data/lib/Message.rb +0 -56
  533. data/lib/ruby-signal-bug.rb +0 -43
  534. data/test/TestSuite/HTML-Reports/TimeSheet.html +0 -79
  535. data/test/TestSuite/HTML-Reports/reference.html +0 -51
  536. data/test/TestSuite/ReportGenerator/Correct/Journal.html +0 -63
  537. data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +0 -3
  538. data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +0 -2
  539. data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +0 -26
  540. data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +0 -2
  541. data/test/TestSuite/Scheduler/Correct/Booking2.html +0 -603
  542. data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +0 -108
  543. data/test/TestSuite/StatusSheetTemplates/project.tji +0 -35
  544. data/test/TestSuite/StatusSheetTemplates/project.tjp +0 -56
  545. data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +0 -32
@@ -39,13 +39,9 @@ class TaskJuggler
39
39
  File.open(fileName) do |file|
40
40
  file.each_line { |line| text += line }
41
41
  end
42
- begin
43
- rText = RichText.new(text, @document.functionHandlers)
44
- @richText = rText.generateIntermediateFormat(sectionCounter)
45
- rescue RichTextException => msg
46
- $stderr.puts "Error in RichText of file '#{fileName}'\n" +
47
- "Line #{msg.lineNo}: #{msg.text}\n" +
48
- "#{msg.line}"
42
+ rText = RichText.new(text, @document.functionHandlers,
43
+ MessageHandler.new(true))
44
+ unless (@richText = rText.generateIntermediateFormat(sectionCounter))
49
45
  exit
50
46
  end
51
47
 
@@ -30,8 +30,8 @@ class TaskJuggler
30
30
 
31
31
  # This is the entry node.
32
32
  def rule_richtext
33
- pattern(%w( !sections !blankLines . ), lambda {
34
- el = RichTextElement.new(@richTextI, :richtext, @val[0])
33
+ pattern(%w( !sections . ), lambda {
34
+ RichTextElement.new(@richTextI, :richtext, @val[0])
35
35
  })
36
36
  end
37
37
 
@@ -46,16 +46,17 @@ class TaskJuggler
46
46
  pattern(%w( $HLINE !blankLines ), lambda {
47
47
  RichTextElement.new(@richTextI, :hline, @val[0])
48
48
  })
49
- pattern(%w( !paragraph ), lambda {
49
+ pattern(%w( !paragraph !blankLines ), lambda {
50
50
  @val[0]
51
51
  })
52
- pattern(%w( $PRE ), lambda {
53
- RichTextElement.new(@richTextI, :pre, @val[0])
52
+ pattern(%w( !pre !blankLines ), lambda {
53
+ RichTextElement.new(@richTextI, :pre, @val[0].join)
54
54
  })
55
- pattern(%w( !bulletList1 ), lambda {
55
+ pattern(%w( !bulletList1 !blankLines ), lambda {
56
+
56
57
  RichTextElement.new(@richTextI, :bulletlist1, @val[0])
57
58
  })
58
- pattern(%w( !numberList1 ), lambda {
59
+ pattern(%w( !numberList1 !blankLines ), lambda {
59
60
  @numberListCounter = [ 0, 0, 0, 0 ]
60
61
  RichTextElement.new(@richTextI, :numberlist1, @val[0])
61
62
  })
@@ -79,9 +80,15 @@ class TaskJuggler
79
80
  })
80
81
  end
81
82
 
83
+ def rule_pre
84
+ repeatable
85
+ pattern(%w( $PRE ), lambda {
86
+ @val[0]
87
+ })
88
+ end
89
+
82
90
  def rule_title1
83
91
  pattern(%w( $TITLE1 !space !text $TITLE1END ), lambda {
84
- @val[2][-1].appendSpace = false
85
92
  el = RichTextElement.new(@richTextI, :title1, @val[2])
86
93
  @sectionCounter[0] += 1
87
94
  @sectionCounter[1] = @sectionCounter[2] = 0
@@ -92,7 +99,6 @@ class TaskJuggler
92
99
 
93
100
  def rule_title2
94
101
  pattern(%w( $TITLE2 !space !text $TITLE2END ), lambda {
95
- @val[2][-1].appendSpace = false
96
102
  el = RichTextElement.new(@richTextI, :title2, @val[2])
97
103
  @sectionCounter[1] += 1
98
104
  @sectionCounter[2] = 0
@@ -103,7 +109,6 @@ class TaskJuggler
103
109
 
104
110
  def rule_title3
105
111
  pattern(%w( $TITLE3 !space !text $TITLE3END ), lambda {
106
- @val[2][-1].appendSpace = false
107
112
  el = RichTextElement.new(@richTextI, :title3, @val[2])
108
113
  @sectionCounter[2] += 1
109
114
  @sectionCounter[3] = 0
@@ -114,7 +119,6 @@ class TaskJuggler
114
119
 
115
120
  def rule_title4
116
121
  pattern(%w( $TITLE4 !space !text $TITLE4END ), lambda {
117
- @val[2][-1].appendSpace = false
118
122
  el = RichTextElement.new(@richTextI, :title4, @val[2])
119
123
  @sectionCounter[3] += 1
120
124
  el.data = @sectionCounter.dup
@@ -125,7 +129,7 @@ class TaskJuggler
125
129
  def rule_bulletList1
126
130
  optional
127
131
  repeatable
128
- pattern(%w( $BULLET1 !text $LINEBREAK), lambda {
132
+ pattern(%w( $BULLET1 !text ), lambda {
129
133
  RichTextElement.new(@richTextI, :bulletitem1, @val[1])
130
134
  })
131
135
  pattern(%w( !bulletList2 ), lambda {
@@ -135,7 +139,7 @@ class TaskJuggler
135
139
 
136
140
  def rule_bulletList2
137
141
  repeatable
138
- pattern(%w( $BULLET2 !text $LINEBREAK), lambda {
142
+ pattern(%w( $BULLET2 !text ), lambda {
139
143
  RichTextElement.new(@richTextI, :bulletitem2, @val[1])
140
144
  })
141
145
  pattern(%w( !bulletList3 ), lambda {
@@ -145,7 +149,7 @@ class TaskJuggler
145
149
 
146
150
  def rule_bulletList3
147
151
  repeatable
148
- pattern(%w( $BULLET3 !text $LINEBREAK), lambda {
152
+ pattern(%w( $BULLET3 !text ), lambda {
149
153
  RichTextElement.new(@richTextI, :bulletitem3, @val[1])
150
154
  })
151
155
  pattern(%w( !bulletList4 ), lambda {
@@ -155,15 +159,14 @@ class TaskJuggler
155
159
 
156
160
  def rule_bulletList4
157
161
  repeatable
158
- pattern(%w( $BULLET4 !text $LINEBREAK), lambda {
162
+ pattern(%w( $BULLET4 !text ), lambda {
159
163
  RichTextElement.new(@richTextI, :bulletitem4, @val[1])
160
164
  })
161
165
  end
162
166
 
163
167
  def rule_numberList1
164
- optional
165
168
  repeatable
166
- pattern(%w( $NUMBER1 !text $LINEBREAK), lambda {
169
+ pattern(%w( $NUMBER1 !text ), lambda {
167
170
  el = RichTextElement.new(@richTextI, :numberitem1, @val[1])
168
171
  @numberListCounter[0] += 1
169
172
  el.data = @numberListCounter.dup
@@ -177,7 +180,7 @@ class TaskJuggler
177
180
 
178
181
  def rule_numberList2
179
182
  repeatable
180
- pattern(%w( $NUMBER2 !text $LINEBREAK), lambda {
183
+ pattern(%w( $NUMBER2 !text ), lambda {
181
184
  el = RichTextElement.new(@richTextI, :numberitem2, @val[1])
182
185
  @numberListCounter[1] += 1
183
186
  el.data = @numberListCounter.dup
@@ -191,7 +194,7 @@ class TaskJuggler
191
194
 
192
195
  def rule_numberList3
193
196
  repeatable
194
- pattern(%w( $NUMBER3 !text $LINEBREAK), lambda {
197
+ pattern(%w( $NUMBER3 !text ), lambda {
195
198
  el = RichTextElement.new(@richTextI, :numberitem3, @val[1])
196
199
  @numberListCounter[2] += 1
197
200
  el.data = @numberListCounter.dup
@@ -205,7 +208,7 @@ class TaskJuggler
205
208
 
206
209
  def rule_numberList4
207
210
  repeatable
208
- pattern(%w( $NUMBER4 !text $LINEBREAK), lambda {
211
+ pattern(%w( $NUMBER4 !text ), lambda {
209
212
  el = RichTextElement.new(@richTextI, :numberitem4, @val[1])
210
213
  @numberListCounter[3] += 1
211
214
  el.data = @numberListCounter.dup
@@ -214,12 +217,19 @@ class TaskJuggler
214
217
  end
215
218
 
216
219
  def rule_paragraph
217
- pattern(%w( !text $LINEBREAK ), lambda {
220
+ pattern(%w( !text ), lambda {
218
221
  RichTextElement.new(@richTextI, :paragraph, @val[0])
219
222
  })
220
223
  end
221
224
 
222
225
  def rule_text
226
+ pattern(%w( !textWithSpace ), lambda {
227
+ @val[0].last.appendSpace = false
228
+ @val[0]
229
+ })
230
+ end
231
+
232
+ def rule_textWithSpace
223
233
  repeatable
224
234
  pattern(%w( !plainTextWithLinks ), lambda {
225
235
  @val[0]
@@ -264,33 +274,41 @@ class TaskJuggler
264
274
  @val[0]
265
275
  })
266
276
  pattern(%w( $REF !refToken !moreRefToken $REFEND !space ), lambda {
267
- if @val[1].index(':')
268
- protocol, locator = @val[1].split(':')
277
+ v1 = @val[1].join
278
+ if v1.index(':')
279
+ protocol, locator = v1.split(':')
269
280
  else
270
281
  protocol = nil
271
282
  end
272
283
  el = nil
273
284
  if protocol == 'File'
274
285
  el = RichTextElement.new(@richTextI, :img)
286
+ unless (index = locator.rindex('.'))
287
+ error('rt_file_no_ext', "File name without extension: #{locator}")
288
+ end
289
+ extension = locator[index + 1..-1].downcase
290
+ unless %w( jpg gif png svg ).include?(extension)
291
+ error('rt_file_bad_ext', "Unsupported file type: #{extension}")
292
+ end
275
293
  el.data = img = RichTextImage.new(locator)
276
294
  @val[2].each do |token|
277
295
  if token[0, 4] == 'alt='
278
296
  img.altText = token[4..-1]
279
- elsif %w( top middle bottom baseline sub super text-top text-bottom).
280
- include?(token)
297
+ elsif %w( top middle bottom baseline sub super text-top
298
+ text-bottom ).include?(token)
281
299
  img.verticalAlign = token
282
300
  else
283
301
  error('rt_bad_file_option',
284
302
  "Unknown option '#{token}' for file reference " +
285
- "#{@val[1]}.")
303
+ "#{v1}.")
286
304
  end
287
305
  end
288
306
  else
289
307
  el = RichTextElement.new(@richTextI, :ref,
290
308
  RichTextElement.new(@richTextI,
291
309
  :text, @val[2].empty? ?
292
- @val[1] : @val[2]))
293
- el.data = @val[1]
310
+ v1 : @val[2]))
311
+ el.data = v1
294
312
  el.appendSpace = !@val[4].empty?
295
313
  end
296
314
  el
@@ -309,11 +327,12 @@ class TaskJuggler
309
327
  repeatable
310
328
  optional
311
329
  pattern(%w( _| !refToken ), lambda {
312
- @val[1]
330
+ @val[1].join
313
331
  })
314
332
  end
315
333
 
316
334
  def rule_refToken
335
+ repeatable
317
336
  pattern(%w( $WORD ), lambda {
318
337
  @val[0]
319
338
  })
@@ -325,9 +344,9 @@ class TaskJuggler
325
344
  RichTextElement.new(@richTextI, :text, @val[0])
326
345
  })
327
346
  pattern(%w( $QUERY ), lambda {
328
- # The ${attribute} syntax is a shortcut for an embedded query inline
329
- # function. It can only be used within a ReportTableCell context that
330
- # provides a property and a scope property.
347
+ # The <-attributeID-> syntax is a shortcut for an embedded query
348
+ # inline function. It can only be used within a ReportTableCell
349
+ # context that provides a property and a scope property.
331
350
  el = RichTextElement.new(@richTextI, :inlinefunc)
332
351
  # Data is a 2 element Array with the function name and a Hash for the
333
352
  # arguments.
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
  require 'TjException'
15
- require 'Message'
15
+ require 'MessageHandler'
16
16
 
17
17
  class TaskJuggler
18
18
 
@@ -31,36 +31,27 @@ class TaskJuggler
31
31
  @attributes[attributeName].value
32
32
  end
33
33
 
34
- def error(id, text, abort = true, sourceFileInfo = nil)
35
- message = Message.new(id, 'error', text, @property,
36
- @project.scenario(@scenarioIdx),
37
- sourceFileInfo.nil? ?
38
- @property.sourceFileInfo : sourceFileInfo)
39
- @project.sendMessage(message)
40
- raise TjException.new, "Scheduling error" if abort
34
+ def error(id, text, sourceFileInfo = nil, property = nil)
35
+ @project.messageHandler.error(
36
+ id, text, sourceFileInfo || @property.sourceFileInfo, nil,
37
+ property || @property,
38
+ @project.scenario(@scenarioIdx))
41
39
  end
42
40
 
43
- def warning(id, text)
44
- message = Message.new(id, 'warning', text, @property,
45
- @project.scenario(@scenarioIdx),
46
- @property.sourceFileInfo)
47
- @project.sendMessage(message)
41
+ def warning(id, text, sourceFileInfo = nil, property = nil)
42
+ @project.messageHandler.warning(
43
+ id, text, sourceFileInfo || @property.sourceFileInfo, nil,
44
+ property || @property,
45
+ @project.scenario(@scenarioIdx))
48
46
  end
49
47
 
50
- def info(id, text, property = nil)
51
- property = @property if property.nil?
52
- message = Message.new(id, 'info', text, property,
53
- @project.scenario(@scenarioIdx),
54
- property.sourceFileInfo)
55
- @project.sendMessage(message)
48
+ def info(id, text, sourceFileInfo = nil, property = nil)
49
+ @project.messageHandler.info(
50
+ id, text, sourceFileInfo || @property.sourceFileInfo, nil,
51
+ property || @property,
52
+ @project.scenario(@scenarioIdx))
56
53
  end
57
54
 
58
- # Not sure why this method was put there. If needed, it should in
59
- # PropertyTreeNode!
60
- #def query_id(query)
61
- # query.sortable = query.string = @property.fullId
62
- #end
63
-
64
55
  end
65
56
 
66
57
  end
@@ -11,8 +11,9 @@
11
11
  #
12
12
 
13
13
  require 'mail'
14
-
15
14
  require 'UTF8String'
15
+ require 'RichText'
16
+ require 'HTMLDocument'
16
17
 
17
18
  class TaskJuggler
18
19
 
@@ -152,6 +153,24 @@ class TaskJuggler
152
153
  end
153
154
  end
154
155
 
156
+ # Like SheetHandlerBase::sendEmail but interpretes the _message_ as
157
+ # RichText markup. The generated mail will have a text/plain and a
158
+ # text/html part.
159
+ def sendRichTextEmail(to, subject, message, attachment = nil, from = nil,
160
+ inReplyTo = nil)
161
+ rti = RichText.new(message).generateIntermediateFormat
162
+ rti.lineWidth = 72
163
+ rti.indent = 2
164
+ rti.titleIndent = 0
165
+ rti.listIndent = 2
166
+ rti.parIndent = 2
167
+ rti.preIndent = 4
168
+ rti.sectionNumbers = false
169
+
170
+ # Send out the email.
171
+ sendEmail(to, subject, rti, attachment, from, inReplyTo)
172
+ end
173
+
155
174
  def sendEmail(to, subject, message, attachment = nil, from = nil,
156
175
  inReplyTo = nil)
157
176
  Mail.defaults do
@@ -162,12 +181,20 @@ class TaskJuggler
162
181
  end
163
182
 
164
183
  begin
184
+ self_ = self
165
185
  mail = Mail.new do
166
186
  subject subject
167
187
  text_part do
168
188
  content_type [ 'text', 'plain', { 'charset' => 'UTF-8' } ]
169
189
  content_transfer_encoding 'quoted-printable'
170
- body message.to_quoted_printable
190
+ body message.to_s.to_quoted_printable
191
+ end
192
+ if message.is_a?(RichTextIntermediate)
193
+ html_part do
194
+ content_type 'text/html; charset=UTF-8'
195
+ content_transfer_encoding 'quoted-printable'
196
+ body self_.htmlMailBody(message).to_quoted_printable
197
+ end
171
198
  end
172
199
  end
173
200
  mail.to = to
@@ -210,6 +237,36 @@ class TaskJuggler
210
237
  end
211
238
  end
212
239
 
240
+ def htmlMailBody(message)
241
+ html = HTMLDocument.new
242
+ head = html.generateHead("TaskJuggler Report - #{@name}",
243
+ 'description' => 'TaskJuggler Report',
244
+ 'keywords' => 'taskjuggler, project, management')
245
+
246
+ auxSrcDir = AppConfig.dataDirs('data/css')[0]
247
+ cssFileName = (auxSrcDir ? auxSrcDir + '/tjreport.css' : '')
248
+ # Raise an error if we haven't found the data directory
249
+ if auxSrcDir.nil? || !File.exists?(cssFileName)
250
+ dataDirError(cssFileName)
251
+ end
252
+ cssFile = IO.read(cssFileName)
253
+ if cssFile.empty?
254
+ raise TjException.new, <<"EOT"
255
+ Cannot read '#{cssFileName}'. Make sure the file is not empty and you have
256
+ read access permission.
257
+ EOT
258
+ end
259
+ head << XMLElement.new('meta', 'http-equiv' => 'Content-Style-Type',
260
+ 'content' => 'text/css; charset=utf-8')
261
+ head << (style = XMLElement.new('style', 'type' => 'text/css'))
262
+ style << XMLBlob.new("\n" + cssFile)
263
+
264
+ html << (body = XMLElement.new('body'))
265
+ body << message.to_html
266
+
267
+ html.to_s
268
+ end
269
+
213
270
  end
214
271
 
215
272
  end
@@ -15,6 +15,7 @@ require 'mail'
15
15
  require 'open4'
16
16
  require 'yaml'
17
17
  require 'SheetHandlerBase'
18
+ require 'RichText'
18
19
 
19
20
  class TaskJuggler
20
21
 
@@ -42,7 +43,7 @@ class TaskJuggler
42
43
  # The subject of the confirmation email
43
44
  @emailSubject = nil
44
45
 
45
- # Regular expressions to identify a status sheet.
46
+ # Regular expressions to identify a sheet.
46
47
  @sheetHeader = nil
47
48
  # Regular expression to extract the sheet signature (date).
48
49
  @signatureFilter = nil
@@ -75,14 +76,34 @@ class TaskJuggler
75
76
 
76
77
  createDirectories
77
78
 
79
+ # Read the RFC 822 compliant mail from STDIN.
80
+ rawMail = $stdin.read
81
+
82
+ # To get line-accurate error reports for encoding errors, we scan the
83
+ # email for obvious ecoding errors and try to get a sender fallback
84
+ # address. This will not find encoding problems inside encoded mime
85
+ # parts.
86
+ fromLine = nil
78
87
  begin
79
- rawMail = $stdin.read
88
+ rawMail.each_line do |line|
89
+ unless fromLine
90
+ matches = line.encode('UTF-8', :invalid => :replace,
91
+ :replace => '?').match('^From: .*')
92
+ fromLine = matches[0] if matches
93
+ end
94
+ begin
95
+ # Try the encoding. If it fails, we'll get an exception.
96
+ line.encode!('UTF-8')
97
+ rescue
98
+ raise "Encoding error in line: #{line.encode('UTF-8', :invalid)}"
99
+ end
100
+ end
101
+
80
102
  mail = Mail.new(rawMail)
81
103
  rescue
82
104
  # Try to extract the mail sender the dirty way so we can at least send
83
105
  # a response to the submitter.
84
- fromLine = rawMail.match('^From: .*')[0]
85
- @submitter = fromLine[6..-1] if fromLine.is_a?(String)
106
+ @submitter = fromLine[6..-1] if fromLine && fromLine.is_a?(String)
86
107
  error("Incoming mail could not be processed: #{$!}")
87
108
  end
88
109
 
@@ -125,14 +146,6 @@ EOT
125
146
 
126
147
  # Isolate the actual syntax from _sheet_ and process it.
127
148
  def processSheet(sheet)
128
- # Make sure the sheet is really valid UTF-8
129
- begin
130
- sheet.encode!('UTF-8')
131
- rescue
132
- error("The sheet contains badly encoded characters. #{$!}")
133
- end
134
- # Store the detected sheet so we can include it with error reports if
135
- # needed.
136
149
  @sheet = fixLineBreaks(sheet)
137
150
  @sheet = cutOut(@sheet) unless @sheetWasAttached
138
151
  # A valid sheet must have the poper header line.
@@ -170,6 +183,8 @@ EOT
170
183
  # Send the report to the tj3client process via stdin.
171
184
  stdin.write(sheet)
172
185
  stdin.close
186
+ # Without errors, the incoming report is pretty printed and returned
187
+ # in RichText format.
173
188
  @report = stdout.read
174
189
  @warnings = stderr.read
175
190
  end
@@ -217,27 +232,29 @@ EOT
217
232
  end
218
233
 
219
234
  text = <<"EOT"
220
- Report from #{getResourceName} for the period ending #{@date}:
235
+ == Report from #{getResourceName} for the period ending #{@date} ==
221
236
 
222
237
  EOT
223
238
 
224
239
  # Add warnings if we had any.
225
240
  unless @warnings.empty?
226
241
  text += <<"EOT"
242
+ ----
227
243
  Your report does contain some issues that you may want to fix or address with
228
244
  your manager or project manager:
229
245
 
230
- #{@warnings}
246
+ <nowiki>#{@warnings}</nowiki>
231
247
 
248
+ ----
232
249
  EOT
233
250
  end
234
251
 
235
- # Append the pretty printed version of the submitted status sheet.
252
+ # Append the pretty printed version of the submitted sheet.
236
253
  text += @report
237
254
 
238
255
  # Send out the email.
239
- sendEmail(@submitter, sprintf(@emailSubject, getResourceName, @date), text,
240
- nil, nil, @messageId)
256
+ sendRichTextEmail(@submitter, sprintf(@emailSubject, getResourceName,
257
+ @date), text, nil, nil, @messageId)
241
258
  true
242
259
  end
243
260
 
@@ -312,7 +329,8 @@ EOT
312
329
  rescue
313
330
  end
314
331
 
315
- sendEmail(@submitter, "Your #{@sheetType} sheet submission failed!", message)
332
+ sendEmail(@submitter, "Your #{@sheetType} sheet submission failed!",
333
+ message)
316
334
 
317
335
  exit 1
318
336
  end