taskjuggler 3.2.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (320) hide show
  1. data/CHANGELOG +30 -0
  2. data/README.rdoc +1 -0
  3. data/data/tjp.vim +13 -9
  4. data/lib/taskjuggler/Allocation.rb +2 -2
  5. data/lib/taskjuggler/AttributeBase.rb +10 -0
  6. data/lib/taskjuggler/Attributes.rb +2 -8
  7. data/lib/taskjuggler/Journal.rb +20 -19
  8. data/lib/taskjuggler/PTNProxy.rb +14 -1
  9. data/lib/taskjuggler/ProjectFileParser.rb +3 -0
  10. data/lib/taskjuggler/ProjectFileScanner.rb +54 -44
  11. data/lib/taskjuggler/PropertyList.rb +32 -0
  12. data/lib/taskjuggler/PropertyTreeNode.rb +4 -0
  13. data/lib/taskjuggler/ResourceScenario.rb +53 -20
  14. data/lib/taskjuggler/RichText/Document.rb +7 -5
  15. data/lib/taskjuggler/RichText/Scanner.rb +38 -38
  16. data/lib/taskjuggler/RichText/TOCEntry.rb +1 -1
  17. data/lib/taskjuggler/TaskScenario.rb +78 -62
  18. data/lib/taskjuggler/TextParser.rb +4 -3
  19. data/lib/taskjuggler/TextParser/MacroTable.rb +3 -1
  20. data/lib/taskjuggler/TextParser/Scanner.rb +73 -58
  21. data/lib/taskjuggler/Tj3Config.rb +1 -1
  22. data/lib/taskjuggler/TjpSyntaxRules.rb +215 -67
  23. data/lib/taskjuggler/apps/Tj3Client.rb +1 -1
  24. data/lib/taskjuggler/daemon/ReportServer.rb +8 -1
  25. data/lib/taskjuggler/reports/ExportRE.rb +46 -0
  26. data/lib/taskjuggler/reports/MspXmlRE.rb +409 -0
  27. data/lib/taskjuggler/reports/Report.rb +29 -4
  28. data/lib/taskjuggler/reports/ReportBase.rb +0 -8
  29. data/lib/taskjuggler/reports/TableReport.rb +13 -3
  30. data/lib/taskjuggler/reports/TaskListRE.rb +1 -0
  31. data/lib/taskjuggler/reports/TjpExportRE.rb +1 -1
  32. data/manual/Rich_Text_Attributes +2 -2
  33. data/manual/Tutorial +15 -11
  34. data/manual/html/Day_To_Day_Juggling.html +1 -1
  35. data/manual/html/Getting_Started.html +1 -1
  36. data/manual/html/How_To_Contribute.html +1 -1
  37. data/manual/html/Installation.html +1 -1
  38. data/manual/html/Intro.html +1 -1
  39. data/manual/html/Reporting_Bugs.html +1 -1
  40. data/manual/html/Rich_Text_Attributes.html +1 -1
  41. data/manual/html/Software.html +1 -1
  42. data/manual/html/TaskJuggler_2x_Migration.html +1 -1
  43. data/manual/html/TaskJuggler_Internals.html +1 -1
  44. data/manual/html/The_TaskJuggler_Syntax.html +1 -1
  45. data/manual/html/Tutorial.html +5 -2
  46. data/manual/html/account.html +1 -1
  47. data/manual/html/account.task.html +1 -1
  48. data/manual/html/accountprefix.html +1 -1
  49. data/manual/html/accountreport.html +9 -3
  50. data/manual/html/accountroot.html +1 -1
  51. data/manual/html/active.html +1 -1
  52. data/manual/html/adopt.task.html +3 -3
  53. data/manual/html/aggregate.html +1 -1
  54. data/manual/html/alert.html +1 -1
  55. data/manual/html/alertlevels.html +1 -1
  56. data/manual/html/allocate.html +5 -2
  57. data/manual/html/alphabet.html +1 -1
  58. data/manual/html/alternative.html +1 -1
  59. data/manual/html/author.html +1 -1
  60. data/manual/html/balance.html +1 -1
  61. data/manual/html/booking.resource.html +1 -1
  62. data/manual/html/booking.task.html +1 -1
  63. data/manual/html/caption.html +1 -1
  64. data/manual/html/cellcolor.column.html +1 -1
  65. data/manual/html/celltext.column.html +43 -4
  66. data/manual/html/center.html +1 -1
  67. data/manual/html/charge.html +1 -1
  68. data/manual/html/chargeset.html +2 -2
  69. data/manual/html/columnid.html +6 -6
  70. data/manual/html/columns.html +1 -1
  71. data/manual/html/complete.html +1 -1
  72. data/manual/html/copyright.html +1 -1
  73. data/manual/html/credits.html +1 -1
  74. data/manual/html/currency.html +1 -1
  75. data/manual/html/currencyformat.html +1 -1
  76. data/manual/html/dailymax.html +1 -1
  77. data/manual/html/dailymin.html +1 -1
  78. data/manual/html/dailyworkinghours.html +1 -1
  79. data/manual/html/date.extend.html +1 -1
  80. data/manual/html/date.html +2 -2
  81. data/manual/html/definitions.html +1 -1
  82. data/manual/html/depends.html +1 -1
  83. data/manual/html/details.html +1 -1
  84. data/manual/html/disabled.html +1 -1
  85. data/manual/html/duration.html +1 -1
  86. data/manual/html/efficiency.html +1 -1
  87. data/manual/html/effort.html +1 -1
  88. data/manual/html/email.html +1 -1
  89. data/manual/html/enabled.html +1 -1
  90. data/manual/html/end.column.html +1 -1
  91. data/manual/html/end.html +1 -1
  92. data/manual/html/end.limit.html +1 -1
  93. data/manual/html/end.report.html +9 -3
  94. data/manual/html/end.timesheet.html +1 -1
  95. data/manual/html/endcredit.html +1 -1
  96. data/manual/html/epilog.html +1 -1
  97. data/manual/html/export.html +73 -5
  98. data/manual/html/extend.html +1 -1
  99. data/manual/html/fail.html +1 -1
  100. data/manual/html/fdl.html +1 -1
  101. data/manual/html/flags.account.html +1 -1
  102. data/manual/html/flags.html +1 -1
  103. data/manual/html/flags.journalentry.html +1 -1
  104. data/manual/html/flags.report.html +1 -1
  105. data/manual/html/flags.resource.html +1 -1
  106. data/manual/html/flags.statussheet.html +1 -1
  107. data/manual/html/flags.task.html +1 -1
  108. data/manual/html/flags.timesheet.html +1 -1
  109. data/manual/html/fontcolor.column.html +1 -1
  110. data/manual/html/footer.html +1 -1
  111. data/manual/html/formats.export.html +72 -0
  112. data/manual/html/formats.html +3 -3
  113. data/manual/html/functions.html +3 -3
  114. data/manual/html/gapduration.html +2 -2
  115. data/manual/html/gaplength.html +1 -1
  116. data/manual/html/halign.center.html +1 -1
  117. data/manual/html/halign.column.html +1 -1
  118. data/manual/html/halign.left.html +1 -1
  119. data/manual/html/halign.right.html +1 -1
  120. data/manual/html/hasalert.html +1 -1
  121. data/manual/html/header.html +1 -1
  122. data/manual/html/headline.html +1 -1
  123. data/manual/html/height.html +1 -1
  124. data/manual/html/hideaccount.html +1 -1
  125. data/manual/html/hidejournalentry.html +1 -1
  126. data/manual/html/hidereport.html +1 -1
  127. data/manual/html/hideresource.html +1 -1
  128. data/manual/html/hidetask.html +1 -1
  129. data/manual/html/icalreport.html +1 -1
  130. data/manual/html/include.macro.html +1 -1
  131. data/manual/html/include.project.html +1 -1
  132. data/manual/html/include.properties.html +1 -1
  133. data/manual/html/index.html +1 -1
  134. data/manual/html/inherit.extend.html +1 -1
  135. data/manual/html/interval1.html +2 -2
  136. data/manual/html/interval2.html +2 -2
  137. data/manual/html/interval3.html +2 -2
  138. data/manual/html/interval4.html +2 -2
  139. data/manual/html/isactive.html +1 -1
  140. data/manual/html/ischildof.html +1 -1
  141. data/manual/html/isdependencyof.html +1 -1
  142. data/manual/html/isdutyof.html +1 -1
  143. data/manual/html/isfeatureof.html +1 -1
  144. data/manual/html/isleaf.html +1 -1
  145. data/manual/html/ismilestone.html +1 -1
  146. data/manual/html/isongoing.html +1 -1
  147. data/manual/html/isresource.html +1 -1
  148. data/manual/html/isresponsibilityof.html +1 -1
  149. data/manual/html/istask.html +1 -1
  150. data/manual/html/journalattributes.html +1 -1
  151. data/manual/html/journalentry.html +1 -1
  152. data/manual/html/journalmode.html +11 -3
  153. data/manual/html/leaveallowance.html +1 -1
  154. data/manual/html/leaves.html +1 -1
  155. data/manual/html/left.html +1 -1
  156. data/manual/html/length.html +1 -1
  157. data/manual/html/limits.allocate.html +1 -1
  158. data/manual/html/limits.html +1 -1
  159. data/manual/html/limits.resource.html +1 -1
  160. data/manual/html/limits.task.html +1 -1
  161. data/manual/html/listitem.column.html +1 -1
  162. data/manual/html/listtype.column.html +1 -1
  163. data/manual/html/loadunit.html +2 -2
  164. data/manual/html/logicalexpression.html +1 -1
  165. data/manual/html/logicalflagexpression.html +1 -1
  166. data/manual/html/macro.html +1 -1
  167. data/manual/html/managers.html +1 -1
  168. data/manual/html/mandatory.html +1 -1
  169. data/manual/html/maxend.html +1 -1
  170. data/manual/html/maximum.html +1 -1
  171. data/manual/html/maxstart.html +1 -1
  172. data/manual/html/milestone.html +1 -1
  173. data/manual/html/minend.html +1 -1
  174. data/manual/html/minimum.html +1 -1
  175. data/manual/html/minstart.html +1 -1
  176. data/manual/html/monthlymax.html +1 -1
  177. data/manual/html/monthlymin.html +1 -1
  178. data/manual/html/navbar.html +5 -1
  179. data/manual/html/navigator.html +1 -1
  180. data/manual/html/newtask.html +1 -1
  181. data/manual/html/nikureport.html +1 -1
  182. data/manual/html/note.task.html +1 -1
  183. data/manual/html/now.html +1 -1
  184. data/manual/html/numberformat.html +1 -1
  185. data/manual/html/onend.html +1 -1
  186. data/manual/html/onstart.html +1 -1
  187. data/manual/html/opennodes.html +1 -1
  188. data/manual/html/overtime.booking.html +1 -1
  189. data/manual/html/period.column.html +1 -1
  190. data/manual/html/period.limit.html +1 -1
  191. data/manual/html/period.report.html +1 -1
  192. data/manual/html/period.task.html +1 -1
  193. data/manual/html/persistent.html +1 -1
  194. data/manual/html/precedes.html +1 -1
  195. data/manual/html/priority.html +1 -1
  196. data/manual/html/priority.timesheet.html +1 -1
  197. data/manual/html/project.html +1 -1
  198. data/manual/html/projectid.html +1 -1
  199. data/manual/html/projectid.task.html +1 -1
  200. data/manual/html/projectids.html +1 -1
  201. data/manual/html/projection.html +1 -1
  202. data/manual/html/prolog.html +1 -1
  203. data/manual/html/properties.html +1 -1
  204. data/manual/html/purge.html +8 -5
  205. data/manual/html/rate.html +1 -1
  206. data/manual/html/rate.resource.html +1 -1
  207. data/manual/html/reference.extend.html +1 -1
  208. data/manual/html/remaining.html +1 -1
  209. data/manual/html/replace.html +1 -1
  210. data/manual/html/reportprefix.html +1 -1
  211. data/manual/html/resource.html +1 -1
  212. data/manual/html/resourceattributes.html +1 -1
  213. data/manual/html/resourceprefix.html +1 -1
  214. data/manual/html/resourcereport.html +9 -3
  215. data/manual/html/resourceroot.html +1 -1
  216. data/manual/html/resources.limit.html +1 -1
  217. data/manual/html/responsible.html +1 -1
  218. data/manual/html/richtext.extend.html +1 -1
  219. data/manual/html/right.html +1 -1
  220. data/manual/html/rollupaccount.html +1 -1
  221. data/manual/html/rollupresource.html +1 -1
  222. data/manual/html/rolluptask.html +1 -1
  223. data/manual/html/scale.column.html +1 -1
  224. data/manual/html/scenario.html +1 -1
  225. data/manual/html/scenario.ical.html +1 -1
  226. data/manual/html/scenarios.export.html +1 -1
  227. data/manual/html/scenarios.html +1 -1
  228. data/manual/html/scenariospecific.extend.html +1 -1
  229. data/manual/html/scheduled.html +2 -2
  230. data/manual/html/scheduling.html +1 -1
  231. data/manual/html/select.html +1 -1
  232. data/manual/html/selfcontained.html +1 -1
  233. data/manual/html/shift.allocate.html +1 -1
  234. data/manual/html/shift.html +1 -1
  235. data/manual/html/shift.resource.html +1 -1
  236. data/manual/html/shift.task.html +1 -1
  237. data/manual/html/shift.timesheet.html +1 -1
  238. data/manual/html/shifts.allocate.html +1 -1
  239. data/manual/html/shifts.resource.html +1 -1
  240. data/manual/html/shifts.task.html +1 -1
  241. data/manual/html/shorttimeformat.html +1 -1
  242. data/manual/html/sloppy.booking.html +1 -1
  243. data/manual/html/sloppy.projection.html +1 -1
  244. data/manual/html/sortaccounts.html +1 -1
  245. data/manual/html/sortjournalentries.html +1 -1
  246. data/manual/html/sortresources.html +1 -1
  247. data/manual/html/sorttasks.html +1 -1
  248. data/manual/html/start.column.html +1 -1
  249. data/manual/html/start.html +1 -1
  250. data/manual/html/start.limit.html +1 -1
  251. data/manual/html/start.report.html +1 -1
  252. data/manual/html/startcredit.html +1 -1
  253. data/manual/html/status.statussheet.html +1 -1
  254. data/manual/html/status.timesheet.html +1 -1
  255. data/manual/html/statussheet.html +1 -1
  256. data/manual/html/statussheetreport.html +1 -1
  257. data/manual/html/strict.projection.html +1 -1
  258. data/manual/html/summary.html +1 -1
  259. data/manual/html/supplement.html +1 -1
  260. data/manual/html/supplement.resource.html +1 -1
  261. data/manual/html/supplement.task.html +1 -1
  262. data/manual/html/tagfile.html +1 -1
  263. data/manual/html/task.html +1 -1
  264. data/manual/html/task.statussheet.html +1 -1
  265. data/manual/html/task.timesheet.html +1 -1
  266. data/manual/html/taskattributes.html +1 -1
  267. data/manual/html/taskprefix.html +1 -1
  268. data/manual/html/taskreport.html +9 -3
  269. data/manual/html/taskroot.export.html +104 -0
  270. data/manual/html/taskroot.html +3 -3
  271. data/manual/html/text.extend.html +3 -3
  272. data/manual/html/textreport.html +9 -3
  273. data/manual/html/timeformat.html +1 -1
  274. data/manual/html/timeoff.nikureport.html +1 -1
  275. data/manual/html/timesheet.html +1 -1
  276. data/manual/html/timesheetreport.html +1 -1
  277. data/manual/html/timezone.export.html +1 -1
  278. data/manual/html/timezone.html +1 -1
  279. data/manual/html/timezone.report.html +1 -1
  280. data/manual/html/timezone.shift.html +1 -1
  281. data/manual/html/timingresolution.html +1 -1
  282. data/manual/html/title.column.html +1 -1
  283. data/manual/html/title.html +1 -1
  284. data/manual/html/toc.html +203 -189
  285. data/manual/html/tooltip.column.html +1 -1
  286. data/manual/html/tracereport.html +9 -3
  287. data/manual/html/trackingscenario.html +1 -1
  288. data/manual/html/treelevel.html +1 -1
  289. data/manual/html/vacation.html +1 -1
  290. data/manual/html/vacation.resource.html +1 -1
  291. data/manual/html/vacation.shift.html +1 -1
  292. data/manual/html/warn.html +1 -1
  293. data/manual/html/weeklymax.html +1 -1
  294. data/manual/html/weeklymin.html +1 -1
  295. data/manual/html/weekstartsmonday.html +1 -1
  296. data/manual/html/weekstartssunday.html +1 -1
  297. data/manual/html/width.column.html +1 -1
  298. data/manual/html/width.html +1 -1
  299. data/manual/html/work.html +1 -1
  300. data/manual/html/workinghours.project.html +1 -1
  301. data/manual/html/workinghours.resource.html +1 -1
  302. data/manual/html/workinghours.shift.html +1 -1
  303. data/manual/html/yearlyworkingdays.html +1 -1
  304. data/test/TestSuite/CSV-Reports/project-1.tji +0 -6
  305. data/test/TestSuite/CSV-Reports/refs/alert.csv +0 -7
  306. data/test/TestSuite/CSV-Reports/refs/celltext.csv +0 -7
  307. data/test/TestSuite/CSV-Reports/refs/resourcereport_with_tasks.csv +0 -3
  308. data/test/TestSuite/CSV-Reports/refs/sortByTree.csv +0 -7
  309. data/test/TestSuite/CSV-Reports/refs/sortBy_duration.down.csv +0 -7
  310. data/test/TestSuite/CSV-Reports/refs/sortBy_effort.up.csv +0 -7
  311. data/test/TestSuite/CSV-Reports/refs/sortBy_plan.start.down.csv +0 -7
  312. data/test/TestSuite/CSV-Reports/refs/taskreport.csv +0 -7
  313. data/test/TestSuite/CSV-Reports/refs/taskreport_with_resources.csv +0 -18
  314. data/test/TestSuite/CSV-Reports/refs/weekly.csv +0 -1
  315. data/test/TestSuite/HTML-Reports/Alerts-2.tjp +46 -0
  316. data/test/TestSuite/Scheduler/Correct/purge.tjp +30 -0
  317. data/test/TestSuite/Syntax/Correct/Export.tjp +8 -2
  318. data/test/TestSuite/Syntax/Correct/tutorial.tjp +0 -1
  319. metadata +16 -10
  320. data/test/TestSuite/CSV-Reports/refs/taskcounter.csv +0 -9
data/CHANGELOG CHANGED
@@ -1,3 +1,33 @@
1
+ = Release 3.3.0 (2012-07-22)
2
+
3
+ == New Features
4
+
5
+ * Support 'purge' in export report definitions.
6
+ * Allow 'export' to be used as nested report.
7
+ * Export scheduled project as Microsoft Project XML format.
8
+ * Some speed improvements of the TJP parser.
9
+ * Support nested macro definitions.
10
+ * Improved scheduling performance.
11
+ * 'effortleft' and 'effortdone' columns now work for resources as well.
12
+ * Adding 'status_dep' and 'alerts_dep' journalmode options.
13
+
14
+ == Bug Fixes
15
+
16
+ * Don't crash when 'complete' is reported for container w/o real sub-tasks.
17
+ * Fix 'celltext' documentation.
18
+ * Properly compute cost from tasks when reported in a resource context.
19
+ * Ensure that there are no duplicated (by adoption) tasks in a report.
20
+ * Clarify start/end slot clipping for tasks with 'allocate'.
21
+ * Don't miss certain tasks in 'inputs' and 'targets' list.
22
+ * Don't crash when gantt report interval is outside of tasks.
23
+ * Allow macro definitions at end of file.
24
+ * Don't silently force interval durations to align with timing resolution.
25
+ * Make @none work for logical expressions.
26
+ * Support 'purge' for a specific scenario.
27
+ * Properly escape " in plain text strings in export reports.
28
+ * Make nested 'supplement' work with absolute IDs.
29
+
30
+
1
31
  = Release 3.2.0 (2012-04-30)
2
32
 
3
33
  == New Features
@@ -74,6 +74,7 @@ browser is all you need for your work.
74
74
  * Powerful project description language with macro support
75
75
  * Scales well on multi-core or multi-CPU systems
76
76
  * Support for project management teams and revision control systems
77
+ * Data export to Microsoft Project and Computer Associates Clarity
77
78
 
78
79
  == Web Publishing and Groupware Functions
79
80
 
@@ -1,7 +1,7 @@
1
1
  " Vim syntax file
2
2
  " Language: TaskJuggler
3
3
  " Maintainer: TaskJuggler Developers <taskjuggler-devel@googlegroups.com>
4
- " Last Change: 2012-04-30 14:20:23 +0200
4
+ " Last Change: 2012-07-22 20:00:43 +0200
5
5
  " This file was automatically generated by VimSyntax.rb
6
6
 
7
7
  if exists("b:current_syntax")
@@ -256,12 +256,16 @@ syn keyword tjp_details details contained
256
256
  hi def link tjp_details Type
257
257
  syn keyword tjp_definitions definitions contained
258
258
  hi def link tjp_definitions Type
259
+ syn keyword tjp_formats_export formats contained
260
+ hi def link tjp_formats_export Type
259
261
  syn keyword tjp_resourceattributes resourceattributes contained
260
262
  hi def link tjp_resourceattributes Type
261
263
  syn keyword tjp_scenarios_export scenarios contained
262
264
  hi def link tjp_scenarios_export Type
263
265
  syn keyword tjp_taskattributes taskattributes contained
264
266
  hi def link tjp_taskattributes Type
267
+ syn keyword tjp_taskroot_export taskroot contained
268
+ hi def link tjp_taskroot_export Type
265
269
  syn keyword tjp_timezone_export timezone contained
266
270
  hi def link tjp_timezone_export Type
267
271
  syn keyword tjp_date_extend date contained
@@ -370,6 +374,8 @@ syn keyword tjp_weeklymax weeklymax contained
370
374
  hi def link tjp_weeklymax Type
371
375
  syn keyword tjp_weeklymin weeklymin contained
372
376
  hi def link tjp_weeklymin Type
377
+ syn keyword tjp_loadunit loadunit contained
378
+ hi def link tjp_loadunit Type
373
379
  syn keyword tjp_logicalexpression @
374
380
  hi def link tjp_logicalexpression Type
375
381
  syn keyword tjp_navigator navigator contained
@@ -440,8 +446,6 @@ syn keyword tjp_journalmode journalmode contained
440
446
  hi def link tjp_journalmode Type
441
447
  syn keyword tjp_left left contained
442
448
  hi def link tjp_left Type
443
- syn keyword tjp_loadunit loadunit contained
444
- hi def link tjp_loadunit Type
445
449
  syn keyword tjp_opennodes opennodes contained
446
450
  hi def link tjp_opennodes Type
447
451
  syn keyword tjp_prolog prolog contained
@@ -621,9 +625,9 @@ syn match tjptime /\s\d\{1,2}:\d\d\(:\d\d\)\?/
621
625
 
622
626
  syn cluster tjpcommon contains=tjpcomment,tjpdate,tjptime,tjpstring,tjpnumber
623
627
  syn region tjpblk_account start=/^\s*account\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_account,tjp_account,tjpblk_account,tjp_aggregate,tjp_credits,tjp_flags_account
624
- syn region tjpblk_accountreport start=/^\s*accountreport\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_accountreport,tjp_accountroot,tjp_balance,tjp_caption,tjp_center,tjp_columns,tjpblk_columns,tjp_currencyformat,tjp_end_report,tjp_epilog,tjp_flags_report,tjp_footer,tjp_formats,tjp_header,tjp_headline,tjp_hidejournalentry,tjp_hideaccount,tjp_hideresource,tjp_hidetask,tjp_height,tjp_journalattributes,tjp_journalmode,tjp_left,tjp_loadunit,tjp_numberformat,tjp_opennodes,tjp_period_report,tjp_prolog,tjp_purge,tjp_accountreport,tjpblk_accountreport,tjp_resourcereport,tjpblk_resourcereport,tjp_taskreport,tjpblk_taskreport,tjp_textreport,tjpblk_textreport,tjp_tracereport,tjpblk_tracereport,tjp_right,tjp_rollupaccount,tjp_rollupresource,tjp_rolluptask,tjp_scenarios,tjp_selfcontained,tjp_sortaccounts,tjp_sortjournalentries,tjp_sortresources,tjp_sorttasks,tjp_start_report,tjp_resourceroot,tjp_taskroot,tjp_timeformat,tjp_timezone_report,tjp_title,tjp_width
628
+ syn region tjpblk_accountreport start=/^\s*accountreport\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_accountreport,tjp_accountroot,tjp_balance,tjp_caption,tjp_center,tjp_columns,tjpblk_columns,tjp_currencyformat,tjp_end_report,tjp_epilog,tjp_flags_report,tjp_footer,tjp_formats,tjp_header,tjp_headline,tjp_hidejournalentry,tjp_hideaccount,tjp_hideresource,tjp_hidetask,tjp_height,tjp_journalattributes,tjp_journalmode,tjp_left,tjp_loadunit,tjp_numberformat,tjp_opennodes,tjp_period_report,tjp_prolog,tjp_purge,tjp_accountreport,tjpblk_accountreport,tjp_export,tjpblk_export,tjp_resourcereport,tjpblk_resourcereport,tjp_taskreport,tjpblk_taskreport,tjp_textreport,tjpblk_textreport,tjp_tracereport,tjpblk_tracereport,tjp_right,tjp_rollupaccount,tjp_rollupresource,tjp_rolluptask,tjp_scenarios,tjp_selfcontained,tjp_sortaccounts,tjp_sortjournalentries,tjp_sortresources,tjp_sorttasks,tjp_start_report,tjp_resourceroot,tjp_taskroot,tjp_timeformat,tjp_timezone_report,tjp_title,tjp_width
625
629
  syn region tjpblk_allocate start=/^\s*allocate\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_allocate,tjp_alternative,tjp_select,tjp_persistent,tjp_mandatory,tjp_shifts_allocate contained
626
- syn region tjpblk_export start=/^\s*export\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_export,tjp_definitions,tjp_hideresource,tjp_hidetask,tjp_end_report,tjp_period_report,tjp_start_report,tjp_resourceattributes,tjp_rollupresource,tjp_rolluptask,tjp_scenarios_export,tjp_taskattributes,tjp_timezone_export
630
+ syn region tjpblk_export start=/^\s*export\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_export,tjp_definitions,tjp_formats_export,tjp_hideresource,tjp_hidetask,tjp_loadunit,tjp_purge,tjp_end_report,tjp_period_report,tjp_accountreport,tjpblk_accountreport,tjp_export,tjpblk_export,tjp_resourcereport,tjpblk_resourcereport,tjp_taskreport,tjpblk_taskreport,tjp_textreport,tjpblk_textreport,tjp_tracereport,tjpblk_tracereport,tjp_start_report,tjp_resourceattributes,tjp_rollupresource,tjp_rolluptask,tjp_scenarios_export,tjp_taskattributes,tjp_taskroot_export,tjp_timezone_export
627
631
  syn region tjpblk_date_extend start=/^\s*date\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_date_extend,tjp_inherit_extend,tjp_scenariospecific_extend contained
628
632
  syn region tjpblk_reference_extend start=/^\s*reference\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_reference_extend,tjp_inherit_extend,tjp_scenariospecific_extend contained
629
633
  syn region tjpblk_richtext_extend start=/^\s*richtext\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_richtext_extend,tjp_inherit_extend,tjp_scenariospecific_extend contained
@@ -647,7 +651,7 @@ syn region tjpblk_include_properties start=/^\s*include\s.*{\s*$/ end=/^\s*}\s*$
647
651
  syn region tjpblk_columns start=/^\s*columns\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_columns,tjp_celltext_column,tjp_cellcolor_column,tjp_end_column,tjp_fontcolor_column,tjp_halign_column,tjp_listitem_column,tjp_listtype_column,tjp_period_column,tjp_scale_column,tjp_start_column,tjp_title_column,tjp_tooltip_column,tjp_width_column contained
648
652
  syn region tjpblk_resource start=/^\s*resource\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_resource,tjp_email,tjp_journalentry,tjpblk_journalentry,tjp_purge,tjp_resource,tjpblk_resource,tjp_chargeset,tjp_efficiency,tjp_flags_resource,tjp_booking_resource,tjpblk_booking_resource,tjp_fail,tjp_leaveallowance,tjp_leaves,tjp_limits_resource,tjpblk_limits_resource,tjp_managers,tjp_rate_resource,tjp_shifts_resource,tjp_vacation_resource,tjp_warn,tjp_workinghours_resource,tjp_supplement_resource,tjpblk_supplement_resource
649
653
  syn region tjpblk_supplement_resource start=/^\s*supplement resource\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_supplement_resource,tjp_email,tjp_journalentry,tjpblk_journalentry,tjp_purge,tjp_resource,tjpblk_resource,tjp_chargeset,tjp_efficiency,tjp_flags_resource,tjp_booking_resource,tjpblk_booking_resource,tjp_fail,tjp_leaveallowance,tjp_leaves,tjp_limits_resource,tjpblk_limits_resource,tjp_managers,tjp_rate_resource,tjp_shifts_resource,tjp_vacation_resource,tjp_warn,tjp_workinghours_resource,tjp_supplement_resource,tjpblk_supplement_resource,tjp_supplement contained
650
- syn region tjpblk_resourcereport start=/^\s*resourcereport\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_resourcereport,tjp_accountroot,tjp_balance,tjp_caption,tjp_center,tjp_columns,tjpblk_columns,tjp_currencyformat,tjp_end_report,tjp_epilog,tjp_flags_report,tjp_footer,tjp_formats,tjp_header,tjp_headline,tjp_hidejournalentry,tjp_hideaccount,tjp_hideresource,tjp_hidetask,tjp_height,tjp_journalattributes,tjp_journalmode,tjp_left,tjp_loadunit,tjp_numberformat,tjp_opennodes,tjp_period_report,tjp_prolog,tjp_purge,tjp_accountreport,tjpblk_accountreport,tjp_resourcereport,tjpblk_resourcereport,tjp_taskreport,tjpblk_taskreport,tjp_textreport,tjpblk_textreport,tjp_tracereport,tjpblk_tracereport,tjp_right,tjp_rollupaccount,tjp_rollupresource,tjp_rolluptask,tjp_scenarios,tjp_selfcontained,tjp_sortaccounts,tjp_sortjournalentries,tjp_sortresources,tjp_sorttasks,tjp_start_report,tjp_resourceroot,tjp_taskroot,tjp_timeformat,tjp_timezone_report,tjp_title,tjp_width
654
+ syn region tjpblk_resourcereport start=/^\s*resourcereport\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_resourcereport,tjp_accountroot,tjp_balance,tjp_caption,tjp_center,tjp_columns,tjpblk_columns,tjp_currencyformat,tjp_end_report,tjp_epilog,tjp_flags_report,tjp_footer,tjp_formats,tjp_header,tjp_headline,tjp_hidejournalentry,tjp_hideaccount,tjp_hideresource,tjp_hidetask,tjp_height,tjp_journalattributes,tjp_journalmode,tjp_left,tjp_loadunit,tjp_numberformat,tjp_opennodes,tjp_period_report,tjp_prolog,tjp_purge,tjp_accountreport,tjpblk_accountreport,tjp_export,tjpblk_export,tjp_resourcereport,tjpblk_resourcereport,tjp_taskreport,tjpblk_taskreport,tjp_textreport,tjpblk_textreport,tjp_tracereport,tjpblk_tracereport,tjp_right,tjp_rollupaccount,tjp_rollupresource,tjp_rolluptask,tjp_scenarios,tjp_selfcontained,tjp_sortaccounts,tjp_sortjournalentries,tjp_sortresources,tjp_sorttasks,tjp_start_report,tjp_resourceroot,tjp_taskroot,tjp_timeformat,tjp_timezone_report,tjp_title,tjp_width
651
655
  syn region tjpblk_booking_resource start=/^\s*booking\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_booking_resource,tjp_overtime_booking,tjp_sloppy_booking contained
652
656
  syn region tjpblk_limits_resource start=/^\s*limits\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_limits_resource,tjp_dailymax,tjpblk_dailymax,tjp_dailymin,tjpblk_dailymin,tjp_maximum,tjpblk_maximum,tjp_minimum,tjpblk_minimum,tjp_monthlymax,tjpblk_monthlymax,tjp_monthlymin,tjpblk_monthlymin,tjp_weeklymax,tjpblk_weeklymax,tjp_weeklymin,tjpblk_weeklymin contained
653
657
  syn region tjpblk_scenario start=/^\s*scenario\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_scenario,tjp_active,tjp_scenario,tjpblk_scenario contained
@@ -659,17 +663,17 @@ syn region tjpblk_task_statussheet start=/^\s*task\s.*{\s*$/ end=/^\s*}\s*$/ tra
659
663
  syn region tjpblk_tagfile start=/^\s*tagfile\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_tagfile,tjp_hideresource,tjp_hidetask,tjp_rollupresource,tjp_rolluptask
660
664
  syn region tjpblk_task start=/^\s*task\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_task,tjp_adopt_task,tjp_journalentry,tjpblk_journalentry,tjp_note_task,tjp_purge,tjp_supplement_task,tjpblk_supplement_task,tjp_task,tjpblk_task,tjp_allocate,tjpblk_allocate,tjp_booking_task,tjpblk_booking_task,tjp_charge,tjp_chargeset,tjp_complete,tjp_depends,tjpblk_depends,tjp_duration,tjp_effort,tjp_end,tjp_flags_task,tjp_fail,tjp_length,tjp_limits_task,tjpblk_limits_task,tjp_maxend,tjp_maxstart,tjp_milestone,tjp_minend,tjp_minstart,tjp_period_task,tjp_precedes,tjpblk_precedes,tjp_priority,tjp_projectid_task,tjp_responsible,tjp_scheduled,tjp_scheduling,tjp_shifts_task,tjp_start,tjp_warn
661
665
  syn region tjpblk_supplement_task start=/^\s*supplement task\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_supplement_task,tjp_adopt_task,tjp_journalentry,tjpblk_journalentry,tjp_note_task,tjp_purge,tjp_supplement_task,tjpblk_supplement_task,tjp_task,tjpblk_task,tjp_allocate,tjpblk_allocate,tjp_booking_task,tjpblk_booking_task,tjp_charge,tjp_chargeset,tjp_complete,tjp_depends,tjpblk_depends,tjp_duration,tjp_effort,tjp_end,tjp_flags_task,tjp_fail,tjp_length,tjp_limits_task,tjpblk_limits_task,tjp_maxend,tjp_maxstart,tjp_milestone,tjp_minend,tjp_minstart,tjp_period_task,tjp_precedes,tjpblk_precedes,tjp_priority,tjp_projectid_task,tjp_responsible,tjp_scheduled,tjp_scheduling,tjp_shifts_task,tjp_start,tjp_warn,tjp_supplement contained
662
- syn region tjpblk_taskreport start=/^\s*taskreport\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_taskreport,tjp_accountroot,tjp_balance,tjp_caption,tjp_center,tjp_columns,tjpblk_columns,tjp_currencyformat,tjp_end_report,tjp_epilog,tjp_flags_report,tjp_footer,tjp_formats,tjp_header,tjp_headline,tjp_hidejournalentry,tjp_hideaccount,tjp_hideresource,tjp_hidetask,tjp_height,tjp_journalattributes,tjp_journalmode,tjp_left,tjp_loadunit,tjp_numberformat,tjp_opennodes,tjp_period_report,tjp_prolog,tjp_purge,tjp_accountreport,tjpblk_accountreport,tjp_resourcereport,tjpblk_resourcereport,tjp_taskreport,tjpblk_taskreport,tjp_textreport,tjpblk_textreport,tjp_tracereport,tjpblk_tracereport,tjp_right,tjp_rollupaccount,tjp_rollupresource,tjp_rolluptask,tjp_scenarios,tjp_selfcontained,tjp_sortaccounts,tjp_sortjournalentries,tjp_sortresources,tjp_sorttasks,tjp_start_report,tjp_resourceroot,tjp_taskroot,tjp_timeformat,tjp_timezone_report,tjp_title,tjp_width
666
+ syn region tjpblk_taskreport start=/^\s*taskreport\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_taskreport,tjp_accountroot,tjp_balance,tjp_caption,tjp_center,tjp_columns,tjpblk_columns,tjp_currencyformat,tjp_end_report,tjp_epilog,tjp_flags_report,tjp_footer,tjp_formats,tjp_header,tjp_headline,tjp_hidejournalentry,tjp_hideaccount,tjp_hideresource,tjp_hidetask,tjp_height,tjp_journalattributes,tjp_journalmode,tjp_left,tjp_loadunit,tjp_numberformat,tjp_opennodes,tjp_period_report,tjp_prolog,tjp_purge,tjp_accountreport,tjpblk_accountreport,tjp_export,tjpblk_export,tjp_resourcereport,tjpblk_resourcereport,tjp_taskreport,tjpblk_taskreport,tjp_textreport,tjpblk_textreport,tjp_tracereport,tjpblk_tracereport,tjp_right,tjp_rollupaccount,tjp_rollupresource,tjp_rolluptask,tjp_scenarios,tjp_selfcontained,tjp_sortaccounts,tjp_sortjournalentries,tjp_sortresources,tjp_sorttasks,tjp_start_report,tjp_resourceroot,tjp_taskroot,tjp_timeformat,tjp_timezone_report,tjp_title,tjp_width
663
667
  syn region tjpblk_booking_task start=/^\s*booking\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_booking_task,tjp_overtime_booking,tjp_sloppy_booking contained
664
668
  syn region tjpblk_depends start=/^\s*depends\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_depends,tjp_gapduration,tjp_gaplength,tjp_onend,tjp_onstart contained
665
669
  syn region tjpblk_limits_task start=/^\s*limits\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_limits_task,tjp_dailymax,tjpblk_dailymax,tjp_dailymin,tjpblk_dailymin,tjp_maximum,tjpblk_maximum,tjp_minimum,tjpblk_minimum,tjp_monthlymax,tjpblk_monthlymax,tjp_monthlymin,tjpblk_monthlymin,tjp_weeklymax,tjpblk_weeklymax,tjp_weeklymin,tjpblk_weeklymin contained
666
670
  syn region tjpblk_precedes start=/^\s*precedes\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_precedes,tjp_gapduration,tjp_gaplength,tjp_onend,tjp_onstart contained
667
- syn region tjpblk_textreport start=/^\s*textreport\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_textreport,tjp_accountroot,tjp_balance,tjp_caption,tjp_center,tjp_columns,tjpblk_columns,tjp_currencyformat,tjp_end_report,tjp_epilog,tjp_flags_report,tjp_footer,tjp_formats,tjp_header,tjp_headline,tjp_hidejournalentry,tjp_hideaccount,tjp_hideresource,tjp_hidetask,tjp_height,tjp_journalattributes,tjp_journalmode,tjp_left,tjp_loadunit,tjp_numberformat,tjp_opennodes,tjp_period_report,tjp_prolog,tjp_purge,tjp_accountreport,tjpblk_accountreport,tjp_resourcereport,tjpblk_resourcereport,tjp_taskreport,tjpblk_taskreport,tjp_textreport,tjpblk_textreport,tjp_tracereport,tjpblk_tracereport,tjp_right,tjp_rollupaccount,tjp_rollupresource,tjp_rolluptask,tjp_scenarios,tjp_selfcontained,tjp_sortaccounts,tjp_sortjournalentries,tjp_sortresources,tjp_sorttasks,tjp_start_report,tjp_resourceroot,tjp_taskroot,tjp_timeformat,tjp_timezone_report,tjp_title,tjp_width
671
+ syn region tjpblk_textreport start=/^\s*textreport\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_textreport,tjp_accountroot,tjp_balance,tjp_caption,tjp_center,tjp_columns,tjpblk_columns,tjp_currencyformat,tjp_end_report,tjp_epilog,tjp_flags_report,tjp_footer,tjp_formats,tjp_header,tjp_headline,tjp_hidejournalentry,tjp_hideaccount,tjp_hideresource,tjp_hidetask,tjp_height,tjp_journalattributes,tjp_journalmode,tjp_left,tjp_loadunit,tjp_numberformat,tjp_opennodes,tjp_period_report,tjp_prolog,tjp_purge,tjp_accountreport,tjpblk_accountreport,tjp_export,tjpblk_export,tjp_resourcereport,tjpblk_resourcereport,tjp_taskreport,tjpblk_taskreport,tjp_textreport,tjpblk_textreport,tjp_tracereport,tjpblk_tracereport,tjp_right,tjp_rollupaccount,tjp_rollupresource,tjp_rolluptask,tjp_scenarios,tjp_selfcontained,tjp_sortaccounts,tjp_sortjournalentries,tjp_sortresources,tjp_sorttasks,tjp_start_report,tjp_resourceroot,tjp_taskroot,tjp_timeformat,tjp_timezone_report,tjp_title,tjp_width
668
672
  syn region tjpblk_timesheet start=/^\s*timesheet\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_timesheet,tjp_newtask,tjpblk_newtask,tjp_shift_timesheet,tjp_status_timesheet,tjpblk_status_timesheet,tjp_task_timesheet,tjpblk_task_timesheet
669
673
  syn region tjpblk_newtask start=/^\s*newtask\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_newtask,tjp_end_timesheet,tjp_priority_timesheet,tjp_remaining,tjp_status_timesheet,tjpblk_status_timesheet,tjp_work contained
670
674
  syn region tjpblk_task_timesheet start=/^\s*task\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_task_timesheet,tjp_end_timesheet,tjp_priority_timesheet,tjp_remaining,tjp_status_timesheet,tjpblk_status_timesheet,tjp_work contained
671
675
  syn region tjpblk_timesheetreport start=/^\s*timesheetreport\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_timesheetreport,tjp_hideresource,tjp_hidetask,tjp_end_report,tjp_period_report,tjp_start_report,tjp_sortresources,tjp_sorttasks
672
- syn region tjpblk_tracereport start=/^\s*tracereport\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_tracereport,tjp_accountroot,tjp_balance,tjp_caption,tjp_center,tjp_columns,tjpblk_columns,tjp_currencyformat,tjp_end_report,tjp_epilog,tjp_flags_report,tjp_footer,tjp_formats,tjp_header,tjp_headline,tjp_hidejournalentry,tjp_hideaccount,tjp_hideresource,tjp_hidetask,tjp_height,tjp_journalattributes,tjp_journalmode,tjp_left,tjp_loadunit,tjp_numberformat,tjp_opennodes,tjp_period_report,tjp_prolog,tjp_purge,tjp_accountreport,tjpblk_accountreport,tjp_resourcereport,tjpblk_resourcereport,tjp_taskreport,tjpblk_taskreport,tjp_textreport,tjpblk_textreport,tjp_tracereport,tjpblk_tracereport,tjp_right,tjp_rollupaccount,tjp_rollupresource,tjp_rolluptask,tjp_scenarios,tjp_selfcontained,tjp_sortaccounts,tjp_sortjournalentries,tjp_sortresources,tjp_sorttasks,tjp_start_report,tjp_resourceroot,tjp_taskroot,tjp_timeformat,tjp_timezone_report,tjp_title,tjp_width
676
+ syn region tjpblk_tracereport start=/^\s*tracereport\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_tracereport,tjp_accountroot,tjp_balance,tjp_caption,tjp_center,tjp_columns,tjpblk_columns,tjp_currencyformat,tjp_end_report,tjp_epilog,tjp_flags_report,tjp_footer,tjp_formats,tjp_header,tjp_headline,tjp_hidejournalentry,tjp_hideaccount,tjp_hideresource,tjp_hidetask,tjp_height,tjp_journalattributes,tjp_journalmode,tjp_left,tjp_loadunit,tjp_numberformat,tjp_opennodes,tjp_period_report,tjp_prolog,tjp_purge,tjp_accountreport,tjpblk_accountreport,tjp_export,tjpblk_export,tjp_resourcereport,tjpblk_resourcereport,tjp_taskreport,tjpblk_taskreport,tjp_textreport,tjpblk_textreport,tjp_tracereport,tjpblk_tracereport,tjp_right,tjp_rollupaccount,tjp_rollupresource,tjp_rolluptask,tjp_scenarios,tjp_selfcontained,tjp_sortaccounts,tjp_sortjournalentries,tjp_sortresources,tjp_sorttasks,tjp_start_report,tjp_resourceroot,tjp_taskroot,tjp_timeformat,tjp_timezone_report,tjp_title,tjp_width
673
677
  syn region tjpblk_status_timesheet start=/^\s*status\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_status_timesheet,tjp_details,tjp_flags_timesheet,tjp_summary contained
674
678
  syn region tjpblk_macro start=/macro\s\+\h\w*\s*\[/ end=/\]$/ transparent fold contains=ALL
675
679
  syn region tjpstring start=/"/ skip=/\\"/ end=/"/
@@ -90,9 +90,9 @@ class TaskJuggler
90
90
  when 1 # lowest alloc probability
91
91
  x['criticalness', scenarioIdx] <=> y['criticalness', scenarioIdx]
92
92
  when 2 # lowest allocated load
93
- x['effort', scenarioIdx] <=> y['effort', scenarioIdx]
93
+ x.bookedEffort(scenarioIdx) <=> y.bookedEffort(scenarioIdx)
94
94
  when 3 # hightes allocated load
95
- y['effort', scenarioIdx] <=> x['effort', scenarioIdx]
95
+ y.bookedEffort(scenarioIdx) <=> x.bookedEffort(scenarioIdx)
96
96
  else
97
97
  raise "Unknown selection mode #{@selectionMode}"
98
98
  end
@@ -154,6 +154,16 @@ class TaskJuggler
154
154
  @type.id + " " + get.to_s
155
155
  end
156
156
 
157
+ private
158
+
159
+ def quotedString(str)
160
+ if str.include?("\n")
161
+ "-8<-\n#{str}\n->8-"
162
+ else
163
+ "\"#{str.gsub("\"", '\"')}\""
164
+ end
165
+ end
166
+
157
167
  end
158
168
 
159
169
  # The ListAttributeBase is a specialized form of AttributeBase for a list of
@@ -543,13 +543,7 @@ class TaskJuggler
543
543
  end
544
544
 
545
545
  def to_tjp
546
- inputText = get.richText.inputText
547
- if inputText[-1] == ?\n
548
- "#{@type.id} -8<-\n#{inputText}\n->8-"
549
- else
550
- escaped = inputText.gsub("\"", '\"')
551
- "#{@type.id} \"#{escaped}\""
552
- end
546
+ "#{@type.id} #{quotedString(get.richText.inputText)}"
553
547
  end
554
548
 
555
549
  end
@@ -623,7 +617,7 @@ class TaskJuggler
623
617
  end
624
618
 
625
619
  def to_tjp
626
- "#{@type.id} \"#{get}\""
620
+ "#{@type.id} #{quotedString(get)}"
627
621
  end
628
622
 
629
623
  end
@@ -433,7 +433,7 @@ class TaskJuggler
433
433
  entries.uniq!
434
434
  end
435
435
  end
436
- when :status_down
436
+ when :status_down, :status_dep
437
437
  # In this mode only the last entries before the query end date for
438
438
  # each task (incl. sub tasks) are included.
439
439
  if query.property
@@ -451,7 +451,7 @@ class TaskJuggler
451
451
  entries.uniq!
452
452
  end
453
453
  end
454
- when :alerts_down
454
+ when :alerts_down, :alerts_dep
455
455
  # In this mode only the last entries before the query end date for
456
456
  # each task (incl. sub tasks) and only the ones with the highest alert
457
457
  # level are included.
@@ -687,27 +687,28 @@ class TaskJuggler
687
687
  latestDate = e.date if latestDate.nil? || e.date > latestDate
688
688
  # Find the highest alert level.
689
689
  maxAlertLevel = e.alertLevel if e.alertLevel > maxAlertLevel
690
- cEntries << e
690
+ cEntries << e unless cEntries.include?(e)
691
691
  end
692
692
  end
693
693
 
694
694
  # Only Task properties have dependencies.
695
- #if property.is_a?(Task)
696
- # # Now gather all current entries of the dependency properties and find
697
- # # the date that is closest to and right before the given _date_.
698
- # property['startpreds', query.scenarioIdx].each do |p, onEnd|
699
- # # We only follow end->start dependencies.
700
- # next unless onEnd
701
-
702
- # currentEntriesR(date, p, minLevel, minDate, query).each do |e|
703
- # # Find the date of the most recent entry.
704
- # latestDate = e.date if latestDate.nil? || e.date > latestDate
705
- # # Find the highest alert level.
706
- # maxAlertLevel = e.alertLevel if e.alertLevel > maxAlertLevel
707
- # cEntries << e
708
- # end
709
- # end
710
- #end
695
+ if (query.journalMode == :status_dep ||
696
+ query.journalMode == :alerts_dep) && property.is_a?(Task)
697
+ # Now gather all current entries of the dependency properties and find
698
+ # the date that is closest to and right before the given _date_.
699
+ property['startpreds', query.scenarioIdx].each do |p, onEnd|
700
+ # We only follow end->start dependencies.
701
+ next unless onEnd
702
+
703
+ currentEntriesR(date, p, minLevel, minDate, query).each do |e|
704
+ # Find the date of the most recent entry.
705
+ latestDate = e.date if latestDate.nil? || e.date > latestDate
706
+ # Find the highest alert level.
707
+ maxAlertLevel = e.alertLevel if e.alertLevel > maxAlertLevel
708
+ cEntries << e unless cEntries.include?(e)
709
+ end
710
+ end
711
+ end
711
712
 
712
713
  if !pEntries.empty? && (maxPAlertLevel > maxAlertLevel ||
713
714
  latestDate.nil? ||
@@ -25,13 +25,26 @@ class TaskJuggler
25
25
 
26
26
  def initialize(ptn, parent)
27
27
  @ptn = ptn
28
- raise "Adopted classes must have a parent" unless parent
28
+ raise "Adopted properties must have a parent" unless parent
29
29
  @parent = parent
30
30
  @indext = nil
31
31
  @tree = nil
32
32
  @level = -1
33
33
  end
34
34
 
35
+ # Return the logical ID of this node respesting adoptions. For PropertySet
36
+ # objects with a flat namespace, this is just the ID. Otherwise, the
37
+ # logical ID is composed of all IDs from the root node to this node,
38
+ # separating the IDs by a dot. In contrast to PropertyTreeNode::fullId()
39
+ # the logicalId takes the aption path into account.
40
+ def logicalId
41
+ if @ptn.propertySet.flatNamespace
42
+ @ptn.id
43
+ else
44
+ @parent.logicalId + '.' + @ptn.id[(@ptn.id.rindex('.') + 1).. -1]
45
+ end
46
+ end
47
+
35
48
  def set(attribute, val)
36
49
  if attribute == 'index'
37
50
  @index = val
@@ -60,6 +60,9 @@ class TaskJuggler
60
60
  @property = nil
61
61
  @scenarioIdx = 0
62
62
  initFileStack
63
+ # Stack for property IDs. Needed to handle nested 'supplement'
64
+ # statements.
65
+ @idStack = []
63
66
  end
64
67
 
65
68
  # Call this function to cleanup the parser structures after the file
@@ -22,26 +22,26 @@ class TaskJuggler
22
22
  def initialize(masterFile)
23
23
  tokenPatterns = [
24
24
  # Any white spaces
25
- [ nil, /\s+/, :tjp, method('newPos') ],
25
+ [ nil, '\s+', /\s+/, :tjp, method('newPos') ],
26
26
 
27
27
  # Single line comments starting with #
28
- [ nil, /#.*\n?/, :tjp, method('newPos') ],
28
+ [ nil, '#.*\n?', /#.*\n?/, :tjp, method('newPos') ],
29
29
 
30
30
  # C++ style single line comments starting with //
31
- [ nil, /\/\/.*\n?/, :tjp, method('newPos') ],
31
+ [ nil, '//.*\n?', /\/\/.*\n?/, :tjp, method('newPos') ],
32
32
 
33
33
  # C style single line comment /* .. */.
34
- [ nil, /\/\*.*\*\//, :tjp, method('newPos') ],
34
+ [ nil, '/\*.*\*/', /\/\*.*\*\//, :tjp, method('newPos') ],
35
35
 
36
36
  # C style multi line comment: We need three patterns here. The first
37
37
  # one is for the start of the string. It switches the scanner mode to
38
38
  # the :cppComment mode.
39
- [ nil, /\/\*([^*]*[^\/]|.*)\n/, :tjp, method('startComment') ],
39
+ [ nil, '/\*([^*]*[^/]|.*)\n', /\/\*([^*]*[^\/]|.*)\n/, :tjp, method('startComment') ],
40
40
  # This is the string end pattern. It switches back to tjp mode.
41
- [ nil, /.*\*\//, :cppComment, method('endComment') ],
41
+ [ nil, '.*\*/', /.*\*\//, :cppComment, method('endComment') ],
42
42
  # This pattern matches string lines that contain neither the start,
43
43
  # nor the end of the string.
44
- [ nil, /^.*\n/, :cppComment ],
44
+ [ nil, '^.*\n', /^.*\n/, :cppComment ],
45
45
 
46
46
  # Macro Call: This case is more complicated because we want to replace
47
47
  # macro calls inside of numbers, strings and identifiers. For this to
@@ -54,100 +54,102 @@ class TaskJuggler
54
54
  # with neither start nor end. Macro calls inside of strings need a
55
55
  # special start pattern that is active in the string modes. Both
56
56
  # patterns switch the scanner to macroCall mode.
57
- [ nil, /([-a-zA-Z_0-9>:.+]*|"(\\"|[^"])*?|'(\\'|[^'])*?)?\$\{\s*([a-zA-Z_]\w*)(\s*"(\\"|[^"])*")*/,
57
+ [ nil, '([-a-zA-Z_0-9>:.+]*|"(\\\\"|[^"])*?|\'(\\\\\'|[^\'])*?)?\$\{\s*([a-zA-Z_]\w*)(\s*"(\\\\"|[^"])*")*', /([-a-zA-Z_0-9>:.+]*|"(\\"|[^"])*?|'(\\'|[^'])*?)?\$\{\s*([a-zA-Z_]\w*)(\s*"(\\"|[^"])*")*/,
58
58
  :tjp, method('startMacroCall') ],
59
59
  # This pattern is similar to the previous one, but is active inside of
60
60
  # multi-line strings. The corresponding rule for sizzors strings
61
61
  # can be found below.
62
- [ nil, /(\\"|[^"])*?\$\{\s*([a-zA-Z_]\w*)(\s*"(\\"|[^"])*")*/,
62
+ [ nil, '(\\\\"|[^"])*?\$\{\s*([a-zA-Z_]\w*)(\s*"(\\\\"|[^"])*")*',
63
+ /(\\"|[^"])*?\$\{\s*([a-zA-Z_]\w*)(\s*"(\\"|[^"])*")*/,
63
64
  :dqString, method('startMacroCall') ],
64
- [ nil, /(\\'|[^'])*?\$\{\s*([a-zA-Z_]\w*)(\s*"(\\"|[^"])*")*/,
65
+ [ nil, '(\\\\\'|[^\'])*?\$\{\s*([a-zA-Z_]\w*)(\s*"(\\\\"|[^"])*")*',
66
+ /(\\'|[^'])*?\$\{\s*([a-zA-Z_]\w*)(\s*"(\\"|[^"])*")*/,
65
67
  :sqString, method('startMacroCall') ],
66
68
  # This pattern matches the end of a macro call. It injects the prefix
67
69
  # and the expanded macro into the scanner again. The mode is restored
68
70
  # to the previous mode.
69
- [ nil, /(\s*"(\\"|[^"])*")*\s*\}/, :macroCall, method('endMacroCall') ],
71
+ [ nil, '(\s*"(\\\\"|[^"])*")*\s*\}', /(\s*"(\\"|[^"])*")*\s*\}/, :macroCall, method('endMacroCall') ],
70
72
  # This pattern collects macro call arguments in lines that contain
71
73
  # neither the start nor the end of the macro.
72
- [ nil, /.*\n/, :macroCall, method('midMacroCall') ],
74
+ [ nil, '.*\n', /.*\n/, :macroCall, method('midMacroCall') ],
73
75
 
74
76
  # Environment variable reference. This is similar to the macro call,
75
77
  # but the it can only extend within the starting line.
76
- [ nil, /([-a-zA-Z_0-9>:.+]*|"(\\"|[^"])*?|'(\\'|[^'])*?)?\$\([A-Z_][A-Z_0-9]*\)/,
78
+ [ nil, '([-a-zA-Z_0-9>:.+]*|"(\\\\"|[^"])*?|\'(\\\\\'|[^\'])*?)?\$\([A-Z_][A-Z_0-9]*\)', /([-a-zA-Z_0-9>:.+]*|"(\\"|[^"])*?|'(\\'|[^'])*?)?\$\([A-Z_][A-Z_0-9]*\)/,
77
79
  :tjp, method('environmentVariable') ],
78
80
  # An ID with a colon suffix: foo:
79
- [ :ID_WITH_COLON, /[a-zA-Z_]\w*:/, :tjp, method('chop') ],
81
+ [ :ID_WITH_COLON, '[a-zA-Z_]\w*:', /[a-zA-Z_]\w*:/, :tjp, method('chop') ],
80
82
 
81
83
  # An absolute ID: a.b.c
82
- [ :ABSOLUTE_ID, /[a-zA-Z_]\w*(\.[a-zA-Z_]\w*)+/ ],
84
+ [ :ABSOLUTE_ID, '[a-zA-Z_]\w*(\.[a-zA-Z_]\w*)+', /[a-zA-Z_]\w*(\.[a-zA-Z_]\w*)+/ ],
83
85
 
84
86
  # A normal ID: bar
85
- [ :ID, /[a-zA-Z_]\w*/ ],
87
+ [ :ID, '[a-zA-Z_]\w*', /[a-zA-Z_]\w*/ ],
86
88
 
87
89
  # A date
88
- [ :DATE, /\d{4}-\d{1,2}-\d{1,2}(-\d{1,2}:\d{1,2}(:\d{1,2})?(-[-+]?\d{4})?)?/, :tjp, method('to_date') ],
90
+ [ :DATE, '\d{4}-\d{1,2}-\d{1,2}(-\d{1,2}:\d{1,2}(:\d{1,2})?(-[-+]?\d{4})?)?', /\d{4}-\d{1,2}-\d{1,2}(-\d{1,2}:\d{1,2}(:\d{1,2})?(-[-+]?\d{4})?)?/, :tjp, method('to_date') ],
89
91
 
90
92
  # A time of day
91
- [ :TIME, /\d{1,2}:\d{2}/, :tjp, method('to_time') ],
93
+ [ :TIME, '\d{1,2}:\d{2}', /\d{1,2}:\d{2}/, :tjp, method('to_time') ],
92
94
 
93
95
  # A floating point number (e. g. 3.143)
94
- [ :FLOAT, /\d*\.\d+/, :tjp, method('to_f') ],
96
+ [ :FLOAT, '\d*\.\d+', /\d*\.\d+/, :tjp, method('to_f') ],
95
97
 
96
98
  # An integer number
97
- [ :INTEGER, /\d+/, :tjp, method('to_i') ],
99
+ [ :INTEGER, '\d+', /\d+/, :tjp, method('to_i') ],
98
100
 
99
101
  # Multi line string enclosed with double quotes. The string may
100
102
  # contain double quotes prefixed by a backslash. The first rule
101
103
  # switches the scanner to dqString mode.
102
- [ 'nil', /"(\\"|[^"])*/, :tjp, method('startStringDQ') ],
104
+ [ 'nil', '"(\\\\"|[^"])*', /"(\\"|[^"])*/, :tjp, method('startStringDQ') ],
103
105
  # Any line not containing the start or end.
104
- [ 'nil', /^(\\"|[^"])*\n/, :dqString, method('midStringDQ') ],
106
+ [ 'nil', '^(\\\\"|[^"])*\n', /^(\\"|[^"])*\n/, :dqString, method('midStringDQ') ],
105
107
  # The end of the string.
106
- [ :STRING, /(\\"|[^"])*"/, :dqString, method('endStringDQ') ],
108
+ [ :STRING, '(\\\\"|[^"])*"', /(\\"|[^"])*"/, :dqString, method('endStringDQ') ],
107
109
 
108
110
  # Multi line string enclosed with single quotes.
109
- [ 'nil', /'(\\'|[^'])*/, :tjp, method('startStringSQ') ],
111
+ [ 'nil', '\'(\\\\\'|[^\'])*', /'(\\'|[^'])*/, :tjp, method('startStringSQ') ],
110
112
  # Any line not containing the start or end.
111
- [ 'nil', /^(\\'|[^'])*\n/, :sqString, method('midStringSQ') ],
113
+ [ 'nil', '^(\\\\\'|[^\'])*\n', /^(\\'|[^'])*\n/, :sqString, method('midStringSQ') ],
112
114
  # The end of the string.
113
- [ :STRING, /(\\'|[^'])*'/, :sqString, method('endStringSQ') ],
115
+ [ :STRING, '(\\\\\'|[^\'])*\'', /(\\'|[^'])*'/, :sqString, method('endStringSQ') ],
114
116
 
115
117
  # Scizzors marked string -8<- ... ->8-: The opening mark must be the
116
118
  # last thing in the line. The indentation of the first line after the
117
119
  # opening mark determines the indentation for all following lines. So,
118
120
  # we first switch the scanner to szrString1 mode.
119
- [ 'nil', /-8<-.*\n/, :tjp, method('startStringSZR') ],
121
+ [ 'nil', '-8<-.*\n', /-8<-.*\n/, :tjp, method('startStringSZR') ],
120
122
  # Since the first line can be the last line (empty string case), we
121
123
  # need to detect the end in szrString1 and szrString mode. The
122
124
  # patterns switch the scanner back to tjp mode.
123
- [ :STRING, /\s*->8-/, :szrString1, method('endStringSZR') ],
124
- [ :STRING, /\s*->8-/, :szrString, method('endStringSZR') ],
125
+ [ :STRING, '\s*->8-', /\s*->8-/, :szrString1, method('endStringSZR') ],
126
+ [ :STRING, '\s*->8-', /\s*->8-/, :szrString, method('endStringSZR') ],
125
127
  # This rule handles macros inside of sizzors strings.
126
- [ nil, /.*?\$\{\s*([a-zA-Z_]\w*)(\s*"(\\"|[^"])*")*/,
128
+ [ nil, '.*?\$\{\s*([a-zA-Z_]\w*)(\s*"(\\\\"|[^"])*")*', /.*?\$\{\s*([a-zA-Z_]\w*)(\s*"(\\"|[^"])*")*/,
127
129
  [ :szrString, :szrString1 ], method('startMacroCall') ],
128
130
  # Any line not containing the start or end.
129
- [ 'nil', /.*\n/, :szrString1, method('firstStringSZR') ],
130
- [ 'nil', /.*\n/, :szrString, method('midStringSZR') ],
131
+ [ 'nil', '.*\n', /.*\n/, :szrString1, method('firstStringSZR') ],
132
+ [ 'nil', '.*\n', /.*\n/, :szrString, method('midStringSZR') ],
131
133
 
132
134
  # Single line macro definition
133
- [ :MACRO, /\[.*\]\n/, :tjp, method('chop2nl') ],
135
+ [ :MACRO, '\[.*\](\n|$)', /\[.*\]\n/, :tjp, method('chop2nl') ],
134
136
 
135
137
  # Multi line macro definition: The pattern switches the scanner into
136
138
  # macroDef mode.
137
- [ nil, /\[.*\n/, :tjp, method('startMacroDef') ],
139
+ [ nil, '\[.*\n', /\[.*\n/, :tjp, method('startMacroDef') ],
138
140
  # The end of the macro is marked by a ']' that is immediately followed
139
141
  # by a line break. It switches the scanner back to tjp mode.
140
- [ :MACRO, /.*\]\n/, :macroDef, method('endMacroDef') ],
142
+ [ :MACRO, '.*\](\n|$)', /.*\]\n/, :macroDef, method('endMacroDef') ],
141
143
  # Any line not containing the start or end.
142
- [ nil, /.*\n/, :macroDef, method('midMacroDef') ],
144
+ [ nil, '.*\n', /.*\n/, :macroDef, method('midMacroDef') ],
143
145
 
144
146
  # Some multi-char literals.
145
- [ :LITERAL, /<=?/ ],
146
- [ :LITERAL, />=?/ ],
147
- [ :LITERAL, /!=?/ ],
147
+ [ :LITERAL, '<=?', /<=?/ ],
148
+ [ :LITERAL, '>=?', />=?/ ],
149
+ [ :LITERAL, '!=?', /!=?/ ],
148
150
 
149
151
  # Everything else is returned as a single-char literal.
150
- [ :LITERAL, /./ ]
152
+ [ :LITERAL, '.', /./ ]
151
153
  ]
152
154
 
153
155
  super(masterFile, Log, tokenPatterns, :tjp)
@@ -203,8 +205,12 @@ class TaskJuggler
203
205
  end
204
206
 
205
207
  def chop2nl(type, match)
206
- # remove first and last 2 characters.
207
- [ type, match[1..-3] ]
208
+ # remove first and last \n (if it exists) and the last character.
209
+ if match[-1] == ?\n
210
+ [ type, match[1..-3] ]
211
+ else
212
+ [ type, match[1..-2] ]
213
+ end
208
214
  end
209
215
 
210
216
  def startComment(type, match)
@@ -332,8 +338,12 @@ class TaskJuggler
332
338
 
333
339
  def endMacroDef(type, match)
334
340
  self.mode = :tjp
335
- # Remove "]\n"
336
- @macroDef += match[0..-3]
341
+ # Remove "](\n|$)"
342
+ if match[-1] == ?\n
343
+ @macroDef += match[0..-3]
344
+ else
345
+ @macroDef += match[0..-2]
346
+ end
337
347
  [ :MACRO, @macroDef ]
338
348
  end
339
349