taskjuggler 0.0.2

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 (571) hide show
  1. data/COPYING +280 -0
  2. data/README +31 -0
  3. data/Rakefile +20 -0
  4. data/benchmarks/UTF-8-Strings.rb +58 -0
  5. data/benchmarks/allocate.tjp +30 -0
  6. data/benchmarks/booking.tjp +62 -0
  7. data/benchmarks/depends.tjp +112 -0
  8. data/benchmarks/htmltaskreport.tjp +45 -0
  9. data/benchmarks/runbench.rb +24 -0
  10. data/bin/tj3 +3 -0
  11. data/bin/tj3man +3 -0
  12. data/doc/classes/AppConfig.html +808 -0
  13. data/doc/classes/Arguments.html +226 -0
  14. data/doc/classes/String.html +395 -0
  15. data/doc/classes/TaskJuggler.html +1358 -0
  16. data/doc/classes/TaskJuggler/Account.html +257 -0
  17. data/doc/classes/TaskJuggler/AccountScenario.html +218 -0
  18. data/doc/classes/TaskJuggler/Allocation.html +419 -0
  19. data/doc/classes/TaskJuggler/AllocationAttribute.html +291 -0
  20. data/doc/classes/TaskJuggler/AttributeBase.html +608 -0
  21. data/doc/classes/TaskJuggler/AttributeDefinition.html +259 -0
  22. data/doc/classes/TaskJuggler/Booking.html +307 -0
  23. data/doc/classes/TaskJuggler/BookingListAttribute.html +263 -0
  24. data/doc/classes/TaskJuggler/BooleanAttribute.html +261 -0
  25. data/doc/classes/TaskJuggler/CSVFile.html +325 -0
  26. data/doc/classes/TaskJuggler/Charge.html +279 -0
  27. data/doc/classes/TaskJuggler/ChargeListAttribute.html +229 -0
  28. data/doc/classes/TaskJuggler/ChargeSet.html +440 -0
  29. data/doc/classes/TaskJuggler/ChargeSetListAttribute.html +276 -0
  30. data/doc/classes/TaskJuggler/ColumnTable.html +260 -0
  31. data/doc/classes/TaskJuggler/DateAttribute.html +194 -0
  32. data/doc/classes/TaskJuggler/DependencyListAttribute.html +267 -0
  33. data/doc/classes/TaskJuggler/DurationAttribute.html +229 -0
  34. data/doc/classes/TaskJuggler/FixnumAttribute.html +194 -0
  35. data/doc/classes/TaskJuggler/FlagListAttribute.html +263 -0
  36. data/doc/classes/TaskJuggler/FloatAttribute.html +229 -0
  37. data/doc/classes/TaskJuggler/GanttChart.html +667 -0
  38. data/doc/classes/TaskJuggler/GanttContainer.html +441 -0
  39. data/doc/classes/TaskJuggler/GanttHeader.html +280 -0
  40. data/doc/classes/TaskJuggler/GanttHeaderScaleItem.html +245 -0
  41. data/doc/classes/TaskJuggler/GanttLine.html +398 -0
  42. data/doc/classes/TaskJuggler/GanttLoadStack.html +327 -0
  43. data/doc/classes/TaskJuggler/GanttMilestone.html +415 -0
  44. data/doc/classes/TaskJuggler/GanttRouter.html +425 -0
  45. data/doc/classes/TaskJuggler/GanttTaskBar.html +429 -0
  46. data/doc/classes/TaskJuggler/HTMLDocument.html +240 -0
  47. data/doc/classes/TaskJuggler/HTMLGraphics.html +231 -0
  48. data/doc/classes/TaskJuggler/Interval.html +552 -0
  49. data/doc/classes/TaskJuggler/IntervalListAttribute.html +267 -0
  50. data/doc/classes/TaskJuggler/KeywordDocumentation.html +796 -0
  51. data/doc/classes/TaskJuggler/Limits.html +416 -0
  52. data/doc/classes/TaskJuggler/Limits/Limit.html +381 -0
  53. data/doc/classes/TaskJuggler/LimitsAttribute.html +261 -0
  54. data/doc/classes/TaskJuggler/Log.html +613 -0
  55. data/doc/classes/TaskJuggler/LogicalAttribute.html +226 -0
  56. data/doc/classes/TaskJuggler/LogicalExpression.html +251 -0
  57. data/doc/classes/TaskJuggler/LogicalFlag.html +229 -0
  58. data/doc/classes/TaskJuggler/LogicalFunction.html +324 -0
  59. data/doc/classes/TaskJuggler/LogicalOperation.html +299 -0
  60. data/doc/classes/TaskJuggler/Macro.html +194 -0
  61. data/doc/classes/TaskJuggler/MacroParser.html +360 -0
  62. data/doc/classes/TaskJuggler/MacroTable.html +366 -0
  63. data/doc/classes/TaskJuggler/Message.html +281 -0
  64. data/doc/classes/TaskJuggler/MessageHandler.html +215 -0
  65. data/doc/classes/TaskJuggler/Project.html +1606 -0
  66. data/doc/classes/TaskJuggler/ProjectFileParser.html +412 -0
  67. data/doc/classes/TaskJuggler/PropertyList.html +597 -0
  68. data/doc/classes/TaskJuggler/PropertySet.html +1200 -0
  69. data/doc/classes/TaskJuggler/PropertyTreeNode.html +1449 -0
  70. data/doc/classes/TaskJuggler/Query.html +600 -0
  71. data/doc/classes/TaskJuggler/RealFormat.html +252 -0
  72. data/doc/classes/TaskJuggler/ReferenceAttribute.html +194 -0
  73. data/doc/classes/TaskJuggler/Report.html +528 -0
  74. data/doc/classes/TaskJuggler/ReportElement.html +1070 -0
  75. data/doc/classes/TaskJuggler/ReportTable.html +497 -0
  76. data/doc/classes/TaskJuggler/ReportTableCell.html +518 -0
  77. data/doc/classes/TaskJuggler/ReportTableColumn.html +364 -0
  78. data/doc/classes/TaskJuggler/ReportTableElement.html +644 -0
  79. data/doc/classes/TaskJuggler/ReportTableLegend.html +343 -0
  80. data/doc/classes/TaskJuggler/ReportTableLine.html +431 -0
  81. data/doc/classes/TaskJuggler/Resource.html +211 -0
  82. data/doc/classes/TaskJuggler/ResourceListAttribute.html +267 -0
  83. data/doc/classes/TaskJuggler/ResourceListRE.html +249 -0
  84. data/doc/classes/TaskJuggler/ResourceScenario.html +1137 -0
  85. data/doc/classes/TaskJuggler/RichText.html +537 -0
  86. data/doc/classes/TaskJuggler/RichTextAttribute.html +229 -0
  87. data/doc/classes/TaskJuggler/RichTextDocument.html +418 -0
  88. data/doc/classes/TaskJuggler/RichTextElement.html +829 -0
  89. data/doc/classes/TaskJuggler/RichTextException.html +212 -0
  90. data/doc/classes/TaskJuggler/RichTextParser.html +317 -0
  91. data/doc/classes/TaskJuggler/RichTextProtocolExample.html +303 -0
  92. data/doc/classes/TaskJuggler/RichTextProtocolHandler.html +194 -0
  93. data/doc/classes/TaskJuggler/RichTextScanner.html +561 -0
  94. data/doc/classes/TaskJuggler/RichTextSnip.html +364 -0
  95. data/doc/classes/TaskJuggler/RichTextSyntaxRules.html +883 -0
  96. data/doc/classes/TaskJuggler/Scenario.html +163 -0
  97. data/doc/classes/TaskJuggler/ScenarioData.html +354 -0
  98. data/doc/classes/TaskJuggler/Scoreboard.html +638 -0
  99. data/doc/classes/TaskJuggler/Shift.html +255 -0
  100. data/doc/classes/TaskJuggler/ShiftAssignment.html +488 -0
  101. data/doc/classes/TaskJuggler/ShiftAssignments.html +715 -0
  102. data/doc/classes/TaskJuggler/ShiftAssignmentsAttribute.html +261 -0
  103. data/doc/classes/TaskJuggler/ShiftScenario.html +282 -0
  104. data/doc/classes/TaskJuggler/SourceFileInfo.html +247 -0
  105. data/doc/classes/TaskJuggler/StringAttribute.html +229 -0
  106. data/doc/classes/TaskJuggler/SymbolAttribute.html +194 -0
  107. data/doc/classes/TaskJuggler/SyntaxReference.html +516 -0
  108. data/doc/classes/TaskJuggler/TOCEntry.html +242 -0
  109. data/doc/classes/TaskJuggler/TableColumnDefinition.html +273 -0
  110. data/doc/classes/TaskJuggler/TableOfContents.html +256 -0
  111. data/doc/classes/TaskJuggler/Task.html +203 -0
  112. data/doc/classes/TaskJuggler/TaskDependency.html +251 -0
  113. data/doc/classes/TaskJuggler/TaskListAttribute.html +267 -0
  114. data/doc/classes/TaskJuggler/TaskListRE.html +250 -0
  115. data/doc/classes/TaskJuggler/TaskScenario.html +2206 -0
  116. data/doc/classes/TaskJuggler/TextParser.html +670 -0
  117. data/doc/classes/TaskJuggler/TextParser/Pattern.html +923 -0
  118. data/doc/classes/TaskJuggler/TextParser/Rule.html +779 -0
  119. data/doc/classes/TaskJuggler/TextParser/StackElement.html +267 -0
  120. data/doc/classes/TaskJuggler/TextParser/TextParserResultArray.html +212 -0
  121. data/doc/classes/TaskJuggler/TextParser/TokenDoc.html +221 -0
  122. data/doc/classes/TaskJuggler/TextScanner.html +708 -0
  123. data/doc/classes/TaskJuggler/TextScanner/BufferStreamHandle.html +355 -0
  124. data/doc/classes/TaskJuggler/TextScanner/FileStreamHandle.html +341 -0
  125. data/doc/classes/TaskJuggler/TextScanner/StreamHandle.html +260 -0
  126. data/doc/classes/TaskJuggler/TjException.html +185 -0
  127. data/doc/classes/TaskJuggler/TjTime.html +1845 -0
  128. data/doc/classes/TaskJuggler/TjpExample.html +310 -0
  129. data/doc/classes/TaskJuggler/TjpExportRE.html +329 -0
  130. data/doc/classes/TaskJuggler/TjpSyntaxRules.html +8928 -0
  131. data/doc/classes/TaskJuggler/UserManual.html +606 -0
  132. data/doc/classes/TaskJuggler/WorkingHours.html +582 -0
  133. data/doc/classes/TaskJuggler/WorkingHoursAttribute.html +284 -0
  134. data/doc/classes/TaskJuggler/XMLBlob.html +207 -0
  135. data/doc/classes/TaskJuggler/XMLComment.html +206 -0
  136. data/doc/classes/TaskJuggler/XMLDocument.html +293 -0
  137. data/doc/classes/TaskJuggler/XMLElement.html +341 -0
  138. data/doc/classes/TaskJuggler/XMLNamedText.html +174 -0
  139. data/doc/classes/TaskJuggler/XMLText.html +221 -0
  140. data/doc/files/COPYING.html +448 -0
  141. data/doc/files/README.html +134 -0
  142. data/doc/files/lib/AccountScenario_rb.html +116 -0
  143. data/doc/files/lib/Account_rb.html +118 -0
  144. data/doc/files/lib/Allocation_rb.html +118 -0
  145. data/doc/files/lib/AppConfig_rb.html +116 -0
  146. data/doc/files/lib/AttributeBase_rb.html +106 -0
  147. data/doc/files/lib/AttributeDefinition_rb.html +106 -0
  148. data/doc/files/lib/Attributes_rb.html +130 -0
  149. data/doc/files/lib/Booking_rb.html +106 -0
  150. data/doc/files/lib/ChargeSet_rb.html +116 -0
  151. data/doc/files/lib/Charge_rb.html +116 -0
  152. data/doc/files/lib/HTMLDocument_rb.html +116 -0
  153. data/doc/files/lib/Interval_rb.html +116 -0
  154. data/doc/files/lib/KeywordDocumentation_rb.html +122 -0
  155. data/doc/files/lib/Limits_rb.html +116 -0
  156. data/doc/files/lib/Log_rb.html +116 -0
  157. data/doc/files/lib/LogicalExpression_rb.html +122 -0
  158. data/doc/files/lib/LogicalFlag_rb.html +116 -0
  159. data/doc/files/lib/LogicalFunction_rb.html +116 -0
  160. data/doc/files/lib/LogicalOperation_rb.html +116 -0
  161. data/doc/files/lib/MacroParser_rb.html +118 -0
  162. data/doc/files/lib/MacroTable_rb.html +122 -0
  163. data/doc/files/lib/MessageHandler_rb.html +106 -0
  164. data/doc/files/lib/Message_rb.html +116 -0
  165. data/doc/files/lib/ProjectFileParser_rb.html +122 -0
  166. data/doc/files/lib/Project_rb.html +148 -0
  167. data/doc/files/lib/PropertyList_rb.html +106 -0
  168. data/doc/files/lib/PropertySet_rb.html +118 -0
  169. data/doc/files/lib/PropertyTreeNode_rb.html +106 -0
  170. data/doc/files/lib/Query_rb.html +116 -0
  171. data/doc/files/lib/RealFormat_rb.html +106 -0
  172. data/doc/files/lib/ResourceScenario_rb.html +116 -0
  173. data/doc/files/lib/Resource_rb.html +118 -0
  174. data/doc/files/lib/RichTextDocument_rb.html +120 -0
  175. data/doc/files/lib/RichTextElement_rb.html +120 -0
  176. data/doc/files/lib/RichTextParser_rb.html +120 -0
  177. data/doc/files/lib/RichTextProtocolExample_rb.html +120 -0
  178. data/doc/files/lib/RichTextProtocolHandler_rb.html +106 -0
  179. data/doc/files/lib/RichTextScanner_rb.html +116 -0
  180. data/doc/files/lib/RichTextSnip_rb.html +118 -0
  181. data/doc/files/lib/RichTextSyntaxRules_rb.html +106 -0
  182. data/doc/files/lib/RichText_rb.html +118 -0
  183. data/doc/files/lib/ScenarioData_rb.html +118 -0
  184. data/doc/files/lib/Scenario_rb.html +116 -0
  185. data/doc/files/lib/Scoreboard_rb.html +106 -0
  186. data/doc/files/lib/ShiftAssignments_rb.html +116 -0
  187. data/doc/files/lib/ShiftScenario_rb.html +116 -0
  188. data/doc/files/lib/Shift_rb.html +118 -0
  189. data/doc/files/lib/SourceFileInfo_rb.html +106 -0
  190. data/doc/files/lib/SyntaxReference_rb.html +122 -0
  191. data/doc/files/lib/TOCEntry_rb.html +118 -0
  192. data/doc/files/lib/TableColumnDefinition_rb.html +106 -0
  193. data/doc/files/lib/TableOfContents_rb.html +118 -0
  194. data/doc/files/lib/TaskDependency_rb.html +106 -0
  195. data/doc/files/lib/TaskJuggler_rb.html +120 -0
  196. data/doc/files/lib/TaskScenario_rb.html +116 -0
  197. data/doc/files/lib/Task_rb.html +118 -0
  198. data/doc/files/lib/TextParser/Pattern_rb.html +116 -0
  199. data/doc/files/lib/TextParser/Rule_rb.html +106 -0
  200. data/doc/files/lib/TextParser/StackElement_rb.html +106 -0
  201. data/doc/files/lib/TextParser/TokenDoc_rb.html +106 -0
  202. data/doc/files/lib/TextParser_rb.html +124 -0
  203. data/doc/files/lib/TextScanner_rb.html +128 -0
  204. data/doc/files/lib/Tj3Config_rb.html +118 -0
  205. data/doc/files/lib/TjException_rb.html +106 -0
  206. data/doc/files/lib/TjTime_rb.html +118 -0
  207. data/doc/files/lib/TjpExample_rb.html +116 -0
  208. data/doc/files/lib/TjpSyntaxRules_rb.html +106 -0
  209. data/doc/files/lib/UTF8String_rb.html +132 -0
  210. data/doc/files/lib/UserManual_rb.html +124 -0
  211. data/doc/files/lib/WorkingHours_rb.html +116 -0
  212. data/doc/files/lib/XMLDocument_rb.html +116 -0
  213. data/doc/files/lib/XMLElement_rb.html +116 -0
  214. data/doc/files/lib/reports/CSVFile_rb.html +116 -0
  215. data/doc/files/lib/reports/ColumnTable_rb.html +116 -0
  216. data/doc/files/lib/reports/GanttChart_rb.html +122 -0
  217. data/doc/files/lib/reports/GanttContainer_rb.html +116 -0
  218. data/doc/files/lib/reports/GanttHeaderScaleItem_rb.html +106 -0
  219. data/doc/files/lib/reports/GanttHeader_rb.html +116 -0
  220. data/doc/files/lib/reports/GanttLine_rb.html +126 -0
  221. data/doc/files/lib/reports/GanttLoadStack_rb.html +116 -0
  222. data/doc/files/lib/reports/GanttMilestone_rb.html +116 -0
  223. data/doc/files/lib/reports/GanttRouter_rb.html +106 -0
  224. data/doc/files/lib/reports/GanttTaskBar_rb.html +116 -0
  225. data/doc/files/lib/reports/HTMLGraphics_rb.html +106 -0
  226. data/doc/files/lib/reports/ReportElement_rb.html +118 -0
  227. data/doc/files/lib/reports/ReportTableCell_rb.html +106 -0
  228. data/doc/files/lib/reports/ReportTableColumn_rb.html +106 -0
  229. data/doc/files/lib/reports/ReportTableElement_rb.html +122 -0
  230. data/doc/files/lib/reports/ReportTableLegend_rb.html +106 -0
  231. data/doc/files/lib/reports/ReportTableLine_rb.html +116 -0
  232. data/doc/files/lib/reports/ReportTable_rb.html +118 -0
  233. data/doc/files/lib/reports/Report_rb.html +126 -0
  234. data/doc/files/lib/reports/ResourceListRE_rb.html +122 -0
  235. data/doc/files/lib/reports/TaskListRE_rb.html +122 -0
  236. data/doc/files/lib/reports/TjpExportRE_rb.html +116 -0
  237. data/doc/files/lib/taskjuggler3_rb.html +276 -0
  238. data/doc/files/lib/tj3man_rb.html +189 -0
  239. data/doc/fr_class_index.html +285 -0
  240. data/doc/fr_file_index.html +223 -0
  241. data/doc/fr_method_index.html +1953 -0
  242. data/doc/index.html +21 -0
  243. data/doc/rdoc-style.css +299 -0
  244. data/examples/tutorial.tjp +361 -0
  245. data/gem_spec.rb +30 -0
  246. data/lib/Account.rb +50 -0
  247. data/lib/AccountScenario.rb +39 -0
  248. data/lib/Allocation.rb +102 -0
  249. data/lib/AppConfig.rb +134 -0
  250. data/lib/AttributeBase.rb +131 -0
  251. data/lib/AttributeDefinition.rb +47 -0
  252. data/lib/Attributes.rb +478 -0
  253. data/lib/BatchProcessor.rb +209 -0
  254. data/lib/Booking.rb +59 -0
  255. data/lib/Charge.rb +71 -0
  256. data/lib/ChargeSet.rb +126 -0
  257. data/lib/HTMLDocument.rb +59 -0
  258. data/lib/Interval.rb +127 -0
  259. data/lib/KeywordDocumentation.rb +560 -0
  260. data/lib/Limits.rb +219 -0
  261. data/lib/Log.rb +160 -0
  262. data/lib/LogicalExpression.rb +71 -0
  263. data/lib/LogicalFlag.rb +34 -0
  264. data/lib/LogicalFunction.rb +102 -0
  265. data/lib/LogicalOperation.rb +118 -0
  266. data/lib/MacroParser.rb +77 -0
  267. data/lib/MacroTable.rb +84 -0
  268. data/lib/Message.rb +56 -0
  269. data/lib/MessageHandler.rb +34 -0
  270. data/lib/Project.rb +662 -0
  271. data/lib/ProjectFileParser.rb +333 -0
  272. data/lib/PropertyList.rb +181 -0
  273. data/lib/PropertySet.rb +304 -0
  274. data/lib/PropertyTreeNode.rb +461 -0
  275. data/lib/Query.rb +227 -0
  276. data/lib/RealFormat.rb +73 -0
  277. data/lib/Resource.rb +42 -0
  278. data/lib/ResourceScenario.rb +511 -0
  279. data/lib/RichText.rb +147 -0
  280. data/lib/RichTextDocument.rb +139 -0
  281. data/lib/RichTextElement.rb +391 -0
  282. data/lib/RichTextParser.rb +66 -0
  283. data/lib/RichTextProtocolExample.rb +65 -0
  284. data/lib/RichTextProtocolHandler.rb +35 -0
  285. data/lib/RichTextScanner.rb +390 -0
  286. data/lib/RichTextSnip.rb +104 -0
  287. data/lib/RichTextSyntaxRules.rb +265 -0
  288. data/lib/Scenario.rb +27 -0
  289. data/lib/ScenarioData.rb +65 -0
  290. data/lib/Scoreboard.rb +141 -0
  291. data/lib/Shift.rb +48 -0
  292. data/lib/ShiftAssignments.rb +291 -0
  293. data/lib/ShiftScenario.rb +46 -0
  294. data/lib/SourceFileInfo.rb +37 -0
  295. data/lib/SyntaxReference.rb +284 -0
  296. data/lib/TOCEntry.rb +76 -0
  297. data/lib/TableColumnDefinition.rb +54 -0
  298. data/lib/TableOfContents.rb +46 -0
  299. data/lib/Task.rb +37 -0
  300. data/lib/TaskDependency.rb +39 -0
  301. data/lib/TaskJuggler.rb +84 -0
  302. data/lib/TaskScenario.rb +1622 -0
  303. data/lib/TextParser.rb +416 -0
  304. data/lib/TextParser/Pattern.rb +263 -0
  305. data/lib/TextParser/Rule.rb +171 -0
  306. data/lib/TextParser/StackElement.rb +45 -0
  307. data/lib/TextParser/TokenDoc.rb +38 -0
  308. data/lib/TextScanner.rb +682 -0
  309. data/lib/Tj3Config.rb +27 -0
  310. data/lib/TjException.rb +27 -0
  311. data/lib/TjTime.rb +395 -0
  312. data/lib/TjpExample.rb +119 -0
  313. data/lib/TjpSyntaxRules.rb +4022 -0
  314. data/lib/UTF8String.rb +100 -0
  315. data/lib/UserManual.rb +282 -0
  316. data/lib/WorkingHours.rb +323 -0
  317. data/lib/XMLDocument.rb +54 -0
  318. data/lib/XMLElement.rb +175 -0
  319. data/lib/reports/CSVFile.rb +146 -0
  320. data/lib/reports/ColumnTable.rb +66 -0
  321. data/lib/reports/GanttChart.rb +308 -0
  322. data/lib/reports/GanttContainer.rb +107 -0
  323. data/lib/reports/GanttHeader.rb +141 -0
  324. data/lib/reports/GanttHeaderScaleItem.rb +42 -0
  325. data/lib/reports/GanttLine.rb +329 -0
  326. data/lib/reports/GanttLoadStack.rb +113 -0
  327. data/lib/reports/GanttMilestone.rb +80 -0
  328. data/lib/reports/GanttRouter.rb +375 -0
  329. data/lib/reports/GanttTaskBar.rb +95 -0
  330. data/lib/reports/HTMLGraphics.rb +65 -0
  331. data/lib/reports/Report.rb +344 -0
  332. data/lib/reports/ReportElement.rb +427 -0
  333. data/lib/reports/ReportTable.rb +144 -0
  334. data/lib/reports/ReportTableCell.rb +142 -0
  335. data/lib/reports/ReportTableColumn.rb +82 -0
  336. data/lib/reports/ReportTableElement.rb +852 -0
  337. data/lib/reports/ReportTableLegend.rb +167 -0
  338. data/lib/reports/ReportTableLine.rb +87 -0
  339. data/lib/reports/ResourceListRE.rb +72 -0
  340. data/lib/reports/TaskListRE.rb +73 -0
  341. data/lib/reports/TjpExportRE.rb +394 -0
  342. data/lib/taskjuggler3.rb +106 -0
  343. data/lib/tj3man.rb +88 -0
  344. data/manual/Day_To_Day_Juggling +168 -0
  345. data/manual/Getting_Started +61 -0
  346. data/manual/How_To_Contribute +185 -0
  347. data/manual/Installation +68 -0
  348. data/manual/Intro +102 -0
  349. data/manual/Reporting_Bugs +26 -0
  350. data/manual/Rich_Text_Attributes +90 -0
  351. data/manual/TaskJuggler_2x_Migration +40 -0
  352. data/manual/Tutorial +579 -0
  353. data/manual/fdl +450 -0
  354. data/prj_cfg.rb +43 -0
  355. data/setup.rb +1585 -0
  356. data/tasks/csts.rake +72 -0
  357. data/tasks/gem.rake +14 -0
  358. data/tasks/manual.rake +10 -0
  359. data/tasks/missing.rake +21 -0
  360. data/tasks/rcov.rake +14 -0
  361. data/tasks/rdoc.rake +17 -0
  362. data/tasks/rexml_fix.rb +16 -0
  363. data/tasks/rexml_fix_19.rb +49 -0
  364. data/tasks/show.rake +21 -0
  365. data/tasks/stats.rake +25 -0
  366. data/tasks/test.rake +11 -0
  367. data/test/MessageChecker.rb +53 -0
  368. data/test/TestSuite/CSV-Reports/celltext-Reference.csv +14 -0
  369. data/test/TestSuite/CSV-Reports/celltext.tjp +7 -0
  370. data/test/TestSuite/CSV-Reports/genrefs +6 -0
  371. data/test/TestSuite/CSV-Reports/project-1.tji +57 -0
  372. data/test/TestSuite/CSV-Reports/resourcereport-Reference.csv +4 -0
  373. data/test/TestSuite/CSV-Reports/resourcereport.tjp +10 -0
  374. data/test/TestSuite/CSV-Reports/resourcereport_with_tasks-Reference.csv +22 -0
  375. data/test/TestSuite/CSV-Reports/resourcereport_with_tasks.tjp +11 -0
  376. data/test/TestSuite/CSV-Reports/sortByTree-Reference.csv +14 -0
  377. data/test/TestSuite/CSV-Reports/sortByTree.tjp +8 -0
  378. data/test/TestSuite/CSV-Reports/sortBy_duration.down-Reference.csv +14 -0
  379. data/test/TestSuite/CSV-Reports/sortBy_duration.down.tjp +10 -0
  380. data/test/TestSuite/CSV-Reports/sortBy_effort.up-Reference.csv +14 -0
  381. data/test/TestSuite/CSV-Reports/sortBy_effort.up.tjp +10 -0
  382. data/test/TestSuite/CSV-Reports/sortBy_plan.start.down-Reference.csv +14 -0
  383. data/test/TestSuite/CSV-Reports/sortBy_plan.start.down.tjp +10 -0
  384. data/test/TestSuite/CSV-Reports/taskreport-Reference.csv +14 -0
  385. data/test/TestSuite/CSV-Reports/taskreport.tjp +10 -0
  386. data/test/TestSuite/CSV-Reports/taskreport_with_resources-Reference.csv +24 -0
  387. data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +11 -0
  388. data/test/TestSuite/Scheduler/Correct/Allocate.tjp +86 -0
  389. data/test/TestSuite/Scheduler/Correct/AutomaticMilestones.tjp +63 -0
  390. data/test/TestSuite/Scheduler/Correct/Booking.tjp +161 -0
  391. data/test/TestSuite/Scheduler/Correct/Depends.tjp +50 -0
  392. data/test/TestSuite/Scheduler/Correct/Duration.tjp +34 -0
  393. data/test/TestSuite/Scheduler/Correct/InheritStartEnd.tjp +129 -0
  394. data/test/TestSuite/Scheduler/Correct/Limits.tjp +81 -0
  395. data/test/TestSuite/Scheduler/Correct/MultipleMandatories.tjp +43 -0
  396. data/test/TestSuite/Scheduler/Correct/Optimize-1.tjp +28 -0
  397. data/test/TestSuite/Scheduler/Correct/Optimize-2.tjp +33 -0
  398. data/test/TestSuite/Scheduler/Correct/Optimize-3.tjp +33 -0
  399. data/test/TestSuite/Scheduler/Correct/Optimize-4.tjp +34 -0
  400. data/test/TestSuite/Scheduler/Correct/Optimize-5.tjp +62 -0
  401. data/test/TestSuite/Scheduler/Correct/Precedes.tjp +50 -0
  402. data/test/TestSuite/Scheduler/Correct/Shift.tjp +102 -0
  403. data/test/TestSuite/Scheduler/Errors/account_no_leaf.tjp +13 -0
  404. data/test/TestSuite/Scheduler/Errors/booking_conflict.tjp +10 -0
  405. data/test/TestSuite/Scheduler/Errors/booking_no_duty.tjp +9 -0
  406. data/test/TestSuite/Scheduler/Errors/booking_on_vacation.tjp +9 -0
  407. data/test/TestSuite/Scheduler/Errors/container_booking.tjp +14 -0
  408. data/test/TestSuite/Scheduler/Errors/container_duration.tjp +11 -0
  409. data/test/TestSuite/Scheduler/Errors/effort_no_allocations.tjp +7 -0
  410. data/test/TestSuite/Scheduler/Errors/loop_detected_1.tjp +19 -0
  411. data/test/TestSuite/Scheduler/Errors/loop_detected_10.tjp +36 -0
  412. data/test/TestSuite/Scheduler/Errors/loop_detected_11.tjp +27 -0
  413. data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +20 -0
  414. data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +27 -0
  415. data/test/TestSuite/Scheduler/Errors/loop_detected_14.tjp +26 -0
  416. data/test/TestSuite/Scheduler/Errors/loop_detected_2.tjp +24 -0
  417. data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +18 -0
  418. data/test/TestSuite/Scheduler/Errors/loop_detected_4.tjp +36 -0
  419. data/test/TestSuite/Scheduler/Errors/loop_detected_5.tjp +37 -0
  420. data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +35 -0
  421. data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +46 -0
  422. data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +51 -0
  423. data/test/TestSuite/Scheduler/Errors/loop_detected_9.tjp +20 -0
  424. data/test/TestSuite/Scheduler/Errors/maxend.tjp +8 -0
  425. data/test/TestSuite/Scheduler/Errors/maxstart.tjp +8 -0
  426. data/test/TestSuite/Scheduler/Errors/milestone_booking.tjp +10 -0
  427. data/test/TestSuite/Scheduler/Errors/milestone_duration.tjp +8 -0
  428. data/test/TestSuite/Scheduler/Errors/milestone_start_end.tjp +8 -0
  429. data/test/TestSuite/Scheduler/Errors/minend.tjp +8 -0
  430. data/test/TestSuite/Scheduler/Errors/minstart.tjp +8 -0
  431. data/test/TestSuite/Scheduler/Errors/multiple_durations.tjp +11 -0
  432. data/test/TestSuite/Scheduler/Errors/no_tasks.tjp +6 -0
  433. data/test/TestSuite/Scheduler/Errors/not_scheduled.tjp +8 -0
  434. data/test/TestSuite/Scheduler/Errors/task_depend_child.tjp +10 -0
  435. data/test/TestSuite/Scheduler/Errors/task_depend_multi.tjp +13 -0
  436. data/test/TestSuite/Scheduler/Errors/task_depend_parent.tjp +11 -0
  437. data/test/TestSuite/Scheduler/Errors/task_depend_self.tjp +10 -0
  438. data/test/TestSuite/Scheduler/Errors/task_depend_unknown.tjp +10 -0
  439. data/test/TestSuite/Scheduler/Errors/task_overspecified_1.tjp +9 -0
  440. data/test/TestSuite/Scheduler/Errors/task_overspecified_2.tjp +14 -0
  441. data/test/TestSuite/Scheduler/Errors/task_overspecified_3.tjp +14 -0
  442. data/test/TestSuite/Scheduler/Errors/task_underspecified_1.tjp +8 -0
  443. data/test/TestSuite/Scheduler/Errors/task_underspecified_2.tjp +8 -0
  444. data/test/TestSuite/Scheduler/Errors/task_underspecified_3.tjp +9 -0
  445. data/test/TestSuite/Syntax/Correct/Account.tjp +53 -0
  446. data/test/TestSuite/Syntax/Correct/Allocate-1.tjp +24 -0
  447. data/test/TestSuite/Syntax/Correct/Alternative.tjp +13 -0
  448. data/test/TestSuite/Syntax/Correct/AutoMacros.tjp +14 -0
  449. data/test/TestSuite/Syntax/Correct/Booking.tjp +26 -0
  450. data/test/TestSuite/Syntax/Correct/Caption.tjp +33 -0
  451. data/test/TestSuite/Syntax/Correct/Celltext.tjp +28 -0
  452. data/test/TestSuite/Syntax/Correct/Comments.tjp +29 -0
  453. data/test/TestSuite/Syntax/Correct/Complete.tjp +16 -0
  454. data/test/TestSuite/Syntax/Correct/CompletedWork.tji +20 -0
  455. data/test/TestSuite/Syntax/Correct/CriticalPath.tjp +31 -0
  456. data/test/TestSuite/Syntax/Correct/Currencyformat.tjp +12 -0
  457. data/test/TestSuite/Syntax/Correct/CustomAttributes.tjp +14 -0
  458. data/test/TestSuite/Syntax/Correct/Depends1.tjp +22 -0
  459. data/test/TestSuite/Syntax/Correct/Durations.tjp +29 -0
  460. data/test/TestSuite/Syntax/Correct/Efficiency.tjp +19 -0
  461. data/test/TestSuite/Syntax/Correct/Export.tjp +40 -0
  462. data/test/TestSuite/Syntax/Correct/Flags.tjp +32 -0
  463. data/test/TestSuite/Syntax/Correct/Freeze.tjp +28 -0
  464. data/test/TestSuite/Syntax/Correct/Gap.tjp +15 -0
  465. data/test/TestSuite/Syntax/Correct/HtmlTaskReport.tjp +33 -0
  466. data/test/TestSuite/Syntax/Correct/Limits-1.tjp +71 -0
  467. data/test/TestSuite/Syntax/Correct/LoadUnits.tjp +31 -0
  468. data/test/TestSuite/Syntax/Correct/Macro-1.tjp +19 -0
  469. data/test/TestSuite/Syntax/Correct/Mandatory.tjp +17 -0
  470. data/test/TestSuite/Syntax/Correct/Milestone.tjp +12 -0
  471. data/test/TestSuite/Syntax/Correct/MinMax.tjp +17 -0
  472. data/test/TestSuite/Syntax/Correct/Numberformat.tjp +12 -0
  473. data/test/TestSuite/Syntax/Correct/Period.tjp +16 -0
  474. data/test/TestSuite/Syntax/Correct/Persistent.tjp +11 -0
  475. data/test/TestSuite/Syntax/Correct/Precedes1.tjp +17 -0
  476. data/test/TestSuite/Syntax/Correct/Priority.tjp +30 -0
  477. data/test/TestSuite/Syntax/Correct/Project.tjp +21 -0
  478. data/test/TestSuite/Syntax/Correct/ProjectIDs.tjp +23 -0
  479. data/test/TestSuite/Syntax/Correct/RawHTML.tjp +29 -0
  480. data/test/TestSuite/Syntax/Correct/Reports.tjp +54 -0
  481. data/test/TestSuite/Syntax/Correct/Resource.tjp +20 -0
  482. data/test/TestSuite/Syntax/Correct/Responsible.tjp +16 -0
  483. data/test/TestSuite/Syntax/Correct/Scenario.tjp +15 -0
  484. data/test/TestSuite/Syntax/Correct/Scheduling.tjp +26 -0
  485. data/test/TestSuite/Syntax/Correct/Select.tjp +27 -0
  486. data/test/TestSuite/Syntax/Correct/Shift.tjp +55 -0
  487. data/test/TestSuite/Syntax/Correct/Simple.tjp +25 -0
  488. data/test/TestSuite/Syntax/Correct/String.tjp +12 -0
  489. data/test/TestSuite/Syntax/Correct/Supplement.tjp +24 -0
  490. data/test/TestSuite/Syntax/Correct/TaskRoot.tjp +34 -0
  491. data/test/TestSuite/Syntax/Correct/TimeFrame.tjp +19 -0
  492. data/test/TestSuite/Syntax/Correct/Timezone.tjp +8 -0
  493. data/test/TestSuite/Syntax/Correct/Vacation.tjp +33 -0
  494. data/test/TestSuite/Syntax/Correct/csvtest +16 -0
  495. data/test/TestSuite/Syntax/Correct/manual2example.rb +24 -0
  496. data/test/TestSuite/Syntax/Correct/tutorial.tjp +485 -0
  497. data/test/TestSuite/Syntax/Errors/bad_include.tjp +11 -0
  498. data/test/TestSuite/Syntax/Errors/booking_group.tjp +14 -0
  499. data/test/TestSuite/Syntax/Errors/booking_milestone.tjp +13 -0
  500. data/test/TestSuite/Syntax/Errors/booking_no_leaf.tjp +13 -0
  501. data/test/TestSuite/Syntax/Errors/chargeset.tjp +14 -0
  502. data/test/TestSuite/Syntax/Errors/chargeset_master.tjp +15 -0
  503. data/test/TestSuite/Syntax/Errors/container_attribute.tjp +13 -0
  504. data/test/TestSuite/Syntax/Errors/cost_acct_no_top.tjp +24 -0
  505. data/test/TestSuite/Syntax/Errors/cost_rev_same.tjp +24 -0
  506. data/test/TestSuite/Syntax/Errors/date_in_range.tjp +7 -0
  507. data/test/TestSuite/Syntax/Errors/effort_zero.tjp +8 -0
  508. data/test/TestSuite/Syntax/Errors/empty.tjp +1 -0
  509. data/test/TestSuite/Syntax/Errors/export_bad_extn.tjp +9 -0
  510. data/test/TestSuite/Syntax/Errors/extend_id_cap.tjp +7 -0
  511. data/test/TestSuite/Syntax/Errors/interval_end_in_range.tjp +7 -0
  512. data/test/TestSuite/Syntax/Errors/interval_start_in_range.tjp +7 -0
  513. data/test/TestSuite/Syntax/Errors/leaf_resource_id_expected.tjp +12 -0
  514. data/test/TestSuite/Syntax/Errors/misaligned_date.tjp +7 -0
  515. data/test/TestSuite/Syntax/Errors/no_csv_suffix.tjp +10 -0
  516. data/test/TestSuite/Syntax/Errors/no_html_suffix.tjp +10 -0
  517. data/test/TestSuite/Syntax/Errors/operand_attribute.tjp +11 -0
  518. data/test/TestSuite/Syntax/Errors/operand_unkn_flag.tjp +11 -0
  519. data/test/TestSuite/Syntax/Errors/operand_unkn_scen.tjp +11 -0
  520. data/test/TestSuite/Syntax/Errors/overtime_range.tjp +13 -0
  521. data/test/TestSuite/Syntax/Errors/purge_no_list.tjp +8 -0
  522. data/test/TestSuite/Syntax/Errors/purge_unknown_id.tjp +8 -0
  523. data/test/TestSuite/Syntax/Errors/report_end.tjp +10 -0
  524. data/test/TestSuite/Syntax/Errors/report_redifinition.tjp +10 -0
  525. data/test/TestSuite/Syntax/Errors/report_start.tjp +10 -0
  526. data/test/TestSuite/Syntax/Errors/resource_exists.tjp +7 -0
  527. data/test/TestSuite/Syntax/Errors/resource_id_expected.tjp +8 -0
  528. data/test/TestSuite/Syntax/Errors/rev_acct_no_top.tjp +24 -0
  529. data/test/TestSuite/Syntax/Errors/scenario_exists.tjp +7 -0
  530. data/test/TestSuite/Syntax/Errors/shift_assignment_overlap.tjp +15 -0
  531. data/test/TestSuite/Syntax/Errors/shift_exists.tjp +7 -0
  532. data/test/TestSuite/Syntax/Errors/shift_id_expected.tjp +7 -0
  533. data/test/TestSuite/Syntax/Errors/sloppy_range.tjp +13 -0
  534. data/test/TestSuite/Syntax/Errors/sort_direction.tjp +11 -0
  535. data/test/TestSuite/Syntax/Errors/sort_unknown_scen.tjp +11 -0
  536. data/test/TestSuite/Syntax/Errors/sorting_crit_exptd1.tjp +11 -0
  537. data/test/TestSuite/Syntax/Errors/sorting_crit_exptd2.tjp +11 -0
  538. data/test/TestSuite/Syntax/Errors/sorting_wbs.tjp +11 -0
  539. data/test/TestSuite/Syntax/Errors/start_before_end1.tjp +7 -0
  540. data/test/TestSuite/Syntax/Errors/start_before_end2.tjp +6 -0
  541. data/test/TestSuite/Syntax/Errors/task_complete.tjp +8 -0
  542. data/test/TestSuite/Syntax/Errors/task_exists.tjp +7 -0
  543. data/test/TestSuite/Syntax/Errors/task_priority.tjp +8 -0
  544. data/test/TestSuite/Syntax/Errors/task_without_chargeset.tjp +9 -0
  545. data/test/TestSuite/Syntax/Errors/time_interval.tjp +12 -0
  546. data/test/TestSuite/Syntax/Errors/too_many_bangs.tjp +10 -0
  547. data/test/TestSuite/Syntax/Errors/undecl_flag.tjp +6 -0
  548. data/test/TestSuite/Syntax/Errors/unknown_projectid.tjp +7 -0
  549. data/test/TestSuite/Syntax/Errors/unknown_scenario_id.tjp +6 -0
  550. data/test/TestSuite/Syntax/Errors/unknown_scenario_idx.tjp +11 -0
  551. data/test/TestSuite/Syntax/Errors/unknown_task.tjp +10 -0
  552. data/test/all.rb +31 -0
  553. data/test/test_BatchProcessor.rb +54 -0
  554. data/test/test_CSV-Reports.rb +101 -0
  555. data/test/test_Limits.rb +104 -0
  556. data/test/test_LogicalExpression.rb +110 -0
  557. data/test/test_MacroTable.rb +51 -0
  558. data/test/test_Project.rb +57 -0
  559. data/test/test_PropertySet.rb +71 -0
  560. data/test/test_Query.rb +83 -0
  561. data/test/test_RealFormat.rb +83 -0
  562. data/test/test_RichText.rb +869 -0
  563. data/test/test_Scheduler.rb +42 -0
  564. data/test/test_ShiftAssignments.rb +77 -0
  565. data/test/test_Syntax.rb +41 -0
  566. data/test/test_TextScanner.rb +95 -0
  567. data/test/test_TjTime.rb +114 -0
  568. data/test/test_TjpExample.rb +169 -0
  569. data/test/test_UTF8String.rb +84 -0
  570. data/test/test_WorkingHours.rb +56 -0
  571. metadata +649 -0
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env ruby -w
2
+ #
3
+ # = UTF8String.rb -- The TaskJuggler III Project Management Software
4
+ #
5
+ # Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
6
+ #
7
+ # This program is free software; you can redistribute it and/or modify
8
+ # it under the terms of version 2 of the GNU General Public License as
9
+ # published by the Free Software Foundation.
10
+ #
11
+
12
+ KCODE='u'
13
+
14
+ # This is an extension and modification of the standard String class. We do a
15
+ # lot of UTF-8 character processing in the parser. Ruby 1.8 does not have good
16
+ # enough UTF-8 support and Ruby 1.9 only handles UTF-8 characters as Strings.
17
+ # This is very inefficient compared to representing them as Fixnum objects.
18
+ # Some of these hacks can be removed once we have switched to 1.9 support
19
+ # only.
20
+ class String
21
+
22
+ if RUBY_VERSION < '1.9.0'
23
+
24
+ # Iterate over the String calling the block for each UTF-8 character in
25
+ # the String. This implementation looks more awkward but is noticeably
26
+ # faster than the often propagated regexp based implementations.
27
+ def each_utf8_char
28
+ c = ''
29
+ length = 0
30
+ each_byte do |b|
31
+ c << b
32
+ if length > 0
33
+ # subsequent unicode byte
34
+ if (length -= 1) == 0
35
+ # end of unicode character reached
36
+ yield c
37
+ c = ''
38
+ end
39
+ elsif (b & 0xC0) == 0xC0
40
+ # first unicode byte
41
+ length = -1
42
+ while (b & 0x80) != 0
43
+ length += 1
44
+ b = b << 1
45
+ end
46
+ else
47
+ # ASCII character
48
+ yield c
49
+ c = ''
50
+ end
51
+ end
52
+ end
53
+
54
+ alias old_double_left_angle <<
55
+
56
+ # Replacement for the existing << operator that also works for characters
57
+ # above Fixnum 255 (UTF-8 characters).
58
+ def << (obj)
59
+ if obj.is_a?(String) || (obj < 256)
60
+ # In this case we can use the built-in concat.
61
+ concat(obj)
62
+ else
63
+ # UTF-8 characters have a maximum length of 4 byte and no byte is 0.
64
+ mask = 0xFF000000
65
+ pos = 3
66
+ while pos >= 0
67
+ # Use the built-in concat operator for each byte.
68
+ concat((obj & mask) >> (8 * pos)) if (obj & mask) != 0
69
+ # Move mask and position to the next byte.
70
+ mask = mask >> 8
71
+ pos -= 1
72
+ end
73
+ end
74
+ end
75
+
76
+ # Return the number of UTF8 characters in the String. We don't override
77
+ # the built-in length() function here as we don't know who else uses it
78
+ # for what purpose.
79
+ def length_utf8
80
+ len = 0
81
+ each_utf8_char { |c| len += 1 }
82
+ len
83
+ end
84
+
85
+ alias old_reverse reverse
86
+
87
+ # UTF-8 aware version of reverse that replaces the built-in one.
88
+ def reverse
89
+ a = []
90
+ each_utf8_char { |c| a << c }
91
+ s = ''
92
+ a.reverse.join
93
+ end
94
+
95
+ else
96
+ alias each_utf8_char each_char
97
+ alias length_utf8 length
98
+ end
99
+
100
+ end
@@ -0,0 +1,282 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = UserManual.rb -- The TaskJuggler III Project Management Software
5
+ #
6
+ # Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
7
+ #
8
+ # This program is free software; you can redistribute it and/or modify
9
+ # it under the terms of version 2 of the GNU General Public License as
10
+ # published by the Free Software Foundation.
11
+ #
12
+
13
+ require 'Tj3Config'
14
+ require 'RichTextDocument'
15
+ require 'SyntaxReference'
16
+ require 'TjTime'
17
+ require 'RichTextProtocolExample'
18
+
19
+ class TaskJuggler
20
+
21
+ # This class specializes the RichTextDocument class for the TaskJuggler user
22
+ # manual. This manual is not only generated from a set of RichTextSnip files,
23
+ # but also contains the SyntaxReference for the TJP syntax.
24
+ class UserManual < RichTextDocument
25
+
26
+ # Create a UserManual object and gather the TJP syntax information.
27
+ def initialize
28
+ super
29
+ # Don't confuse this with RichTextDocument#references
30
+ @reference = SyntaxReference.new(self)
31
+ registerProtocolHandler(RichTextProtocolExample.new)
32
+ end
33
+
34
+ def generate(directory)
35
+ # Directory where to find the manual RichText sources. Must be relative
36
+ # to lib directory.
37
+ srcDir = AppConfig.dataDirs('manual')[0]
38
+ # Directory where to put the generated HTML files. Must be relative to lib
39
+ # directory.
40
+ destDir = directory + (directory[-1] == '/' ? '' : '/')
41
+ # A list of all source files. The order is important.
42
+ %w(
43
+ Intro
44
+ TaskJuggler_2x_Migration
45
+ How_To_Contribute
46
+ Reporting_Bugs
47
+ Installation
48
+ Getting_Started
49
+ Rich_Text_Attributes
50
+ Tutorial
51
+ Day_To_Day_Juggling
52
+ fdl
53
+ ).each do |file|
54
+ addSnip(srcDir + file)
55
+ end
56
+ # Generate the table of contense
57
+ tableOfContents
58
+ # Generate the HTML files.
59
+ generateHTML(destDir)
60
+ checkInternalReferences
61
+ end
62
+
63
+ # Generate the manual in HTML format. _directory_ specifies a directory
64
+ # where the HTML files should be put.
65
+ def generateHTML(directory)
66
+ generateHTMLindex(directory)
67
+ generateHTMLReference(directory)
68
+ # The SyntaxReference only generates the reference list when the HTML is
69
+ # generated. So we have to collect it after the HTML generation.
70
+ @references.merge!(@reference.internalReferences)
71
+
72
+ super
73
+ end
74
+
75
+ # Callback function used by the RichTextDocument and KeywordDocumentation
76
+ # classes to generate the HTML style sheet for the manual pages.
77
+ def generateStyleSheet
78
+ html = []
79
+ html << (style = XMLElement.new('style', 'type' => 'text/css'))
80
+ style << XMLBlob.new(<<'EOT'
81
+ pre {
82
+ font-size:16px;
83
+ font-family: Courier;
84
+ padding-left:8px;
85
+ padding-right:8px;
86
+ padding-top:0px;
87
+ padding-bottom:0px;
88
+ }
89
+ p {
90
+ margin-top:8px;
91
+ margin-bottom:8px;
92
+ }
93
+ code {
94
+ font-size:16px;
95
+ font-family: Courier;
96
+ }
97
+ .table {
98
+ background-color:#ABABAB;
99
+ width:100%;
100
+ }
101
+ .tag {
102
+ background-color:#E0E0F0;
103
+ font-size:16px;
104
+ font-weight:bold;
105
+ padding-left:8px;
106
+ padding-right:8px;
107
+ padding-top:5px;
108
+ padding-bottom:5px;
109
+ }
110
+ .descr {
111
+ background-color:#F0F0F0;
112
+ font-size:16px;
113
+ padding-left:8px;
114
+ padding-right:8px;
115
+ padding-top:5px;
116
+ padding-bottom:5px;
117
+ }
118
+ .codeframe{
119
+ border-width:2px;
120
+ border-color:#ABABAB;
121
+ border-style:solid;
122
+ background-color:#F0F0F0;
123
+ margin-top:8px;
124
+ margin-bottom:8px;
125
+ }
126
+ .code {
127
+ padding-left:15px;
128
+ padding-right:15px;
129
+ padding-top:0px;
130
+ padding-bottom:0px;
131
+ }
132
+ EOT
133
+ )
134
+
135
+ html
136
+ end
137
+
138
+ # Callback function used by the RichTextDocument class to generate the cover
139
+ # page for the manual.
140
+ def generateHTMLCover
141
+ html = []
142
+ html << (div = XMLElement.new('div', 'align' => 'center',
143
+ 'style' => 'margin-top:40px; margin-botton:40px'))
144
+ div << XMLNamedText.new("The #{AppConfig.packageName} User Manual",
145
+ 'h1')
146
+ div << XMLNamedText.new('Project Management beyond Gantt Chart drawing',
147
+ 'em')
148
+ div << XMLElement.new('br')
149
+ div << XMLNamedText.new(
150
+ "Copyright (c) #{AppConfig.copyright.join(', ')} " +
151
+ "by #{AppConfig.authors.join(', ')}", 'b')
152
+ div << XMLElement.new('br')
153
+ div << XMLText.new("Generated on #{TjTime.now.strftime('%Y-%m-%d')}")
154
+ div << XMLElement.new('br')
155
+ div << XMLNamedText.new("This manual covers #{AppConfig.packageName} " +
156
+ "version #{AppConfig.version}.", 'h3')
157
+ html << XMLElement.new('br')
158
+ html << XMLElement.new('hr')
159
+ html << XMLElement.new('br')
160
+
161
+ html
162
+ end
163
+
164
+ # Callback function used by the RichTextDocument class to generate the
165
+ # header for the manual pages.
166
+ def generateHTMLHeader
167
+ html = []
168
+ html << (headline = XMLElement.new('div', 'align' => 'center'))
169
+ headline << XMLNamedText.new(
170
+ "The #{AppConfig.packageName} User Manual", 'h3',
171
+ 'align' => 'center')
172
+ headline << XMLNamedText.new(
173
+ 'Project Management beyond Gantt Chart Drawing', 'em',
174
+ 'align' => 'center')
175
+
176
+ html
177
+ end
178
+
179
+ # Callback function used by the RichTextDocument class to generate the
180
+ # footer for the manual pages.
181
+ def generateHTMLFooter
182
+ html = []
183
+ html << (div = XMLElement.new('div', 'align' => 'center',
184
+ 'style' => 'font-size:10px;'))
185
+ div << XMLText.new("Copyright (c) #{AppConfig.copyright.join(', ')} by " +
186
+ "#{AppConfig.authors.join(', ')}.")
187
+ div << XMLNamedText.new('TaskJuggler', 'a', 'href' => AppConfig.contact)
188
+ div << XMLText.new(' is a trademark of Chris Schlaeger.')
189
+
190
+ html
191
+ end
192
+
193
+ # Callback function used by the RichTextDocument and KeywordDocumentation
194
+ # classes to generate the navigation bars for the manual pages.
195
+ # _predLabel_: Text for the reference to the previous page. May be nil.
196
+ # _predURL: URL to the previous page.
197
+ # _succLabel_: Text for the reference to the next page. May be nil.
198
+ # _succURL: URL to the next page.
199
+ def generateHTMLNavigationBar(predLabel, predURL, succLabel, succURL)
200
+ html = []
201
+ html << XMLElement.new('br')
202
+ html << XMLElement.new('hr')
203
+ if predLabel || succLabel
204
+ # We use a tabel to get the desired layout.
205
+ html << (tab = XMLElement.new('table',
206
+ 'style' => 'width:90%; margin-left:5%; margin-right:5%'))
207
+ tab << (tr = XMLElement.new('tr'))
208
+ tr << (td = XMLElement.new('td',
209
+ 'style' => 'text-align:left; width:35%;'))
210
+ if predLabel
211
+ # Link to previous page.
212
+ td << XMLText.new('<< ')
213
+ td << XMLNamedText.new(predLabel, 'a', 'href' => predURL)
214
+ td << XMLText.new(' <<')
215
+ end
216
+ # Link to table of contents
217
+ tr << (td = XMLElement.new('td',
218
+ 'style' => 'text-align:center; width:30%;'))
219
+ td << XMLNamedText.new('Table Of Contents', 'a', 'href' => 'toc.html')
220
+ tr << (td = XMLElement.new('td',
221
+ 'style' => 'text-align:right; width:35%;'))
222
+ if succLabel
223
+ # Link to next page.
224
+ td << XMLText.new('>> ')
225
+ td << XMLNamedText.new(succLabel, 'a', 'href' => succURL)
226
+ td << XMLText.new(' >>')
227
+ end
228
+ html << XMLElement.new('hr')
229
+ end
230
+ html << XMLElement.new('br')
231
+
232
+ html
233
+ end
234
+
235
+ # Generate the top-level file for the HTML user manual.
236
+ def generateHTMLindex(directory)
237
+ html = HTMLDocument.new(:frameset)
238
+ html << (head = XMLElement.new('head'))
239
+ head << (e = XMLNamedText.new("The #{AppConfig.packageName} User Manual",
240
+ 'title'))
241
+ head << XMLElement.new('meta', 'http-equiv' => 'Content-Type',
242
+ 'content' => 'text/html; charset=utf-8')
243
+
244
+ html << (frameset = XMLElement.new('frameset', 'cols' => '15%, 85%'))
245
+ frameset << (navFrames = XMLElement.new('frameset', 'rows' => '15%, 85%'))
246
+ navFrames << XMLElement.new('frame', 'src' => 'alphabet.html',
247
+ 'name' => 'alphabet')
248
+ navFrames << XMLElement.new('frame', 'src' => 'navbar.html',
249
+ 'name' => 'navigator')
250
+ frameset << XMLElement.new('frame', 'src' => 'toc.html',
251
+ 'name' => 'display')
252
+
253
+ html.write(directory + 'index.html')
254
+ end
255
+
256
+ private
257
+
258
+ # Create a table of contents that includes both the sections from the
259
+ # RichText pages as well as the SyntaxReference.
260
+ def tableOfContents
261
+ super
262
+ # Let's call the reference 'Appendix A'
263
+ @reference.tableOfContents(@toc, 'A')
264
+ @snipNames += @reference.all
265
+ end
266
+
267
+ # Generate the HTML pages for the syntax reference and a navigation page
268
+ # with links to all generated pages.
269
+ def generateHTMLReference(directory)
270
+ keywords = @reference.all
271
+ @reference.generateHTMLnavbar(directory, keywords)
272
+
273
+ keywords.each do |keyword|
274
+ @reference.generateHTMLreference(directory, keyword)
275
+ end
276
+ end
277
+
278
+ end
279
+
280
+ end
281
+
282
+
@@ -0,0 +1,323 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = WorkingHours.rb -- The TaskJuggler III Project Management Software
5
+ #
6
+ # Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
7
+ #
8
+ # This program is free software; you can redistribute it and/or modify
9
+ # it under the terms of version 2 of the GNU General Public License as
10
+ # published by the Free Software Foundation.
11
+ #
12
+
13
+ require 'Interval'
14
+
15
+ class TaskJuggler
16
+
17
+ # This cache class is used to speedup accesses to the frequently used
18
+ # WorkingHours::onShift? function. It saves the result the first time the
19
+ # function is called for a particular date and working hour set and returns
20
+ # it on subsequent calls again. Each partucular set of working hours needs
21
+ # its separate cache. The OnShiftCache object is shared amongst all
22
+ # WorkingHours objects so that WorkingHours objects with identical working
23
+ # hours can share the cache.
24
+ class OnShiftCache
25
+
26
+ # Create the OnShiftCache object. There should be only one for the
27
+ # application.
28
+ def initialize
29
+ @caches = []
30
+ @workingHoursTable = []
31
+ # The cache is an array with entries for each date. To minimize the
32
+ # necessary storage space, we need to guess the smallest used date
33
+ # (which gets index 0 then) and the smallest distance between dates.
34
+ @minDate = nil
35
+ # We assume a timing resolution of 1 hour (the TaskJuggler default)
36
+ # first.
37
+ @minDateDelta = 60 * 60
38
+ end
39
+
40
+ # Register the WorkingHours object with the caches. The function will
41
+ # return the actual cache used for this particular set of working hours.
42
+ # The WorkingHours object may not change its working hours after this
43
+ # call. The returned cache reference is used as a handle for subsequent
44
+ # OnShiftCache::set and OnShiftCache::get calls.
45
+ def register(wh)
46
+ # Search the list of already registered caches for an identical set of
47
+ # WorkingHours. In case one is found, return the reference to this
48
+ # cache.
49
+ @workingHoursTable.length.times do |i|
50
+ if @workingHoursTable[i] == wh
51
+ return @caches[i]
52
+ end
53
+ end
54
+ # If this is a new set of WorkingHours we create a new cache for it.
55
+ @workingHoursTable << WorkingHours.new(wh)
56
+ @caches << []
57
+ @caches.last
58
+ end
59
+
60
+ # Set the +value+ for a given +cache+ and +date+.
61
+ def set(cache, date, value)
62
+ cache[dateToIndex(date)] = value
63
+ end
64
+
65
+ # Get the value for a given +cache+ and +date+.
66
+ def get(cache, date)
67
+ cache[dateToIndex(date)]
68
+ end
69
+
70
+ private
71
+
72
+ # When the @minDate or @minDateDelta values need to be changed, we have to
73
+ # clear all the caches again.
74
+ def resetCaches
75
+ @caches.each { |c| c.clear }
76
+ end
77
+
78
+ # Convert a TjTime +date+ to an index in the cache Array. To optimize the
79
+ # size of the cache, we have to guess the smallest used date and the
80
+ # regular distance between the date values. If we have to correct these
81
+ # guessed values, we have to clear the caches.
82
+ def dateToIndex(date)
83
+ if @minDate.nil? || date < @minDate
84
+ @minDate = date
85
+ resetCaches
86
+ end
87
+ startDate = date - @minDate
88
+ div, mod = startDate.divmod(@minDateDelta)
89
+ if mod != 0
90
+ resetCaches
91
+ # We have to guess the timingresolution of the project here. Possible
92
+ # values are 5, 10, 15, 20, 30 or 60 minutes.
93
+ case @minDateDelta / 60
94
+ when 60
95
+ @minDateDelta = 30
96
+ when 30
97
+ @minDateDelta = 20
98
+ when 20
99
+ @minDateDelta = 15
100
+ when 15
101
+ @minDateDelta = 10
102
+ when 10
103
+ @minDateDelta = 5
104
+ else
105
+ raise "Illegal timing resolution!"
106
+ end
107
+ @minDateDelta *= 60
108
+ div = startDate / @minDateDelta
109
+ end
110
+
111
+ div
112
+ end
113
+
114
+ end
115
+
116
+ # Class to store the working hours for each day of the week. The working hours
117
+ # are stored as Arrays of Fixnum intervals for each day of the week. A day off
118
+ # is modelled as empty Array for that week day. The start end end times of
119
+ # each working period are stored as seconds after midnight.
120
+ class WorkingHours
121
+
122
+ attr_reader :days
123
+ attr_accessor :timezone
124
+
125
+ # All WorkingHours objects share the same cache to speedup the onShift?
126
+ # method.
127
+ @@onShiftCache = OnShiftCache.new
128
+
129
+ # Create a new WorkingHours object. The method accepts a reference to an
130
+ # existing WorkingHours object in +wh+. When it's present, the new object
131
+ # will be a deep copy of the given object.
132
+ def initialize(wh = nil)
133
+ # One entry for every day of the week. Sunday === 0.
134
+ @days = Array.new(7, [])
135
+ @cache = nil
136
+
137
+ if wh.nil?
138
+ # Create a new object with default working hours.
139
+ @timezone = nil
140
+ # Set the default working hours. Monday to Friday 9am - 12pm, 1pm - 6pm.
141
+ # Saturday and Sunday are days off.
142
+ 1.upto(5) do |day|
143
+ @days[day] = [ [ 9 * 60 * 60, 12 * 60 * 60 ],
144
+ [ 13 * 60 * 60, 18 * 60 * 60 ] ]
145
+ end
146
+ else
147
+ # Copy the values from the given object.
148
+ @timezone = wh.timezone
149
+ 7.times do |day|
150
+ hours = []
151
+ wh.days[day].each do |hrs|
152
+ hours << hrs.clone
153
+ end
154
+ setWorkingHours(day, hours)
155
+ end
156
+ end
157
+ end
158
+
159
+ # Return true of the given WorkingHours object +wh+ is identical to this
160
+ # object.
161
+ def ==(wh)
162
+ return false if @timezone != wh.timezone
163
+
164
+ 7.times do |d|
165
+ return false if @days[d].length != wh.days[d].length
166
+ # Check all working hour intervals
167
+ @days[d].length.times do |i|
168
+ return false if @days[d][i][0] != wh.days[d][i][0] ||
169
+ @days[d][i][1] != wh.days[d][i][1]
170
+ end
171
+ end
172
+ true
173
+ end
174
+
175
+ # Set the working hours for a given week day. +dayOfWeek+ must be 0 for
176
+ # Sunday, 1 for Monday and so on. +intervals+ must be an Array that
177
+ # contains an Array with 2 Fixnums for each working period. Each value
178
+ # specifies the time of day as minutes after midnight. The first value is
179
+ # the start time of the interval, the second the end time.
180
+ def setWorkingHours(dayOfWeek, intervals)
181
+ if @cache
182
+ raise 'You cannot change the working hours after onShift? has been ' +
183
+ 'called.'
184
+ end
185
+
186
+ # Legal values range from 0 Sunday to 6 Saturday.
187
+ if dayOfWeek < 0 || dayOfWeek > 6
188
+ raise "dayOfWeek out of range: #{dayOfWeek}"
189
+ end
190
+ intervals.each do |iv|
191
+ if iv[0] < 0 || iv[0] >= 24 * 60 * 60 ||
192
+ iv[1] < 0 || iv[1] >= 24 * 60 * 60
193
+ raise "Time interval has illegal values: #{iv[0]} - #{iv[1]}"
194
+ end
195
+ if iv[0] >= iv[1]
196
+ raise "Interval end time must be larger than start time"
197
+ end
198
+ end
199
+ @days[dayOfWeek] = intervals
200
+ end
201
+
202
+ # Return the working hour intervals for a given day of the week.
203
+ # +dayOfWeek+ must 0 for Sunday, 1 for Monday and so on. The result is an
204
+ # Array that contains Arrays of 2 Fixnums.
205
+ def getWorkingHours(dayOfWeek)
206
+ @days[dayOfWeek]
207
+ end
208
+
209
+ # Return true if _date_ is within the defined working hours.
210
+ def onShift?(date)
211
+ @cache = @@onShiftCache.register(self) unless @cache
212
+
213
+ # If we have the result cached already, return it.
214
+ unless (os = @@onShiftCache.get(@cache, date)).nil?
215
+ return os
216
+ end
217
+
218
+ # The date is in UTC. The weekday needs to be calculated according to the
219
+ # timezone of the project.
220
+ projectDate = toLocaltime(date)
221
+ dow = projectDate.wday
222
+
223
+ # The working hours need to be put into the proper time zone.
224
+ localDate = toLocaltime(date, @timezone)
225
+ secondsOfDay = localDate.secondsOfDay
226
+
227
+ @days[dow].each do |iv|
228
+ # Check the working hours of that day if they overlap with +date+.
229
+ if iv[0] <= secondsOfDay && secondsOfDay < iv[1]
230
+ # Store the result in the cache.
231
+ @@onShiftCache.set(@cache, date, true)
232
+ return true
233
+ end
234
+ end
235
+
236
+ # Store the result in the cache.
237
+ @@onShiftCache.set(@cache, date, false)
238
+ false
239
+ end
240
+
241
+ # This function does not belong here! It should be handled via the
242
+ # ShiftAssignment.
243
+ def timeOff?(interval)
244
+ t = interval.start.midnight
245
+ while t < interval.end
246
+ dow = t.wday
247
+ unless @days[dow].empty?
248
+ dayStart = t < interval.start ? interval.start.secondsOfDay :
249
+ t.secondsOfDay
250
+ dayEnd = t.sameTimeNextDay > interval.end ? interval.end.secondsOfDay :
251
+ 60 * 60 * 24;
252
+ @days[dow].each do |iv|
253
+ return false if (dayStart <= iv[0] && iv[0] < dayEnd) ||
254
+ (iv[0] <= dayStart && dayStart < iv[1])
255
+ end
256
+ end
257
+ t = t.sameTimeNextDay
258
+ end
259
+ true
260
+ end
261
+
262
+ # Probably should be put into ShiftAssignment as well.
263
+ def dayOff?(date)
264
+ projectDate = toLocaltime(date)
265
+ dow = projectDate.wday
266
+ @days[dow].empty?
267
+ end
268
+
269
+ # Returns the time interval settings for each day in a human readable form.
270
+ def to_s
271
+ dayNames = %w( Sun Mon Tue Wed Thu Fri Sat )
272
+ str = ''
273
+ 7.times do |day|
274
+ str += "#{dayNames[day]}: "
275
+ if @days[day].empty?
276
+ str += "off"
277
+ str += "\n" if day < 6
278
+ next
279
+ end
280
+ first = true
281
+ @days[day].each do |iv|
282
+ if first
283
+ first = false
284
+ else
285
+ str += ', '
286
+ end
287
+ str += "#{iv[0] / 3600}:" +
288
+ "#{iv[0] % 3600 == 0 ? '00' : iv[0] % 3600} - " +
289
+ "#{iv[1] / 3600}:#{iv[1] % 3600 == 0 ? '00' : iv[1] % 3600}"
290
+ end
291
+ str += "\n" if day < 6
292
+ end
293
+ str
294
+ end
295
+
296
+ private
297
+
298
+ # Convert a UTC date into the corresponding date in the local time zone.
299
+ # This is either the current system setting or the time zone specified by
300
+ # _tz_.
301
+ def toLocaltime(date, tz = nil)
302
+ oldTimezone = nil
303
+ # Set environment variable TZ to appropriate time zone
304
+ if @timezone
305
+ oldTimezone = ENV['tz']
306
+ ENV['tz'] = @timezone
307
+ end
308
+
309
+ localDate = date.clone
310
+ localDate.localtime
311
+
312
+ # Restore environment
313
+ if oldTimezone
314
+ ENV['tz'] = oldTimezone
315
+ end
316
+
317
+ localDate
318
+ end
319
+
320
+ end
321
+
322
+ end
323
+