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