taskjuggler 3.1.0 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +44 -0
- data/bin/tj3webd +4 -0
- data/data/css/tjreport.css +14 -5
- data/data/tjp.vim +22 -7
- data/examples/Fedora-20/reports.tji +2 -4
- data/examples/Scrum/Product Burndown.csv +26 -0
- data/examples/Scrum/Sprint 1 Burndown.csv +26 -0
- data/examples/Scrum/Sprint 2 Burndown.csv +26 -0
- data/examples/Scrum/Sprint 3 Burndown.csv +26 -0
- data/examples/Scrum/scrum.tjp +141 -0
- data/examples/Tutorial/tutorial.tjp +13 -7
- data/lib/taskjuggler/Attributes.rb +2 -3
- data/lib/taskjuggler/HTMLDocument.rb +25 -18
- data/lib/taskjuggler/Journal.rb +85 -65
- data/lib/taskjuggler/KeywordDocumentation.rb +25 -13
- data/lib/taskjuggler/LeaveList.rb +1 -1
- data/lib/taskjuggler/Limits.rb +3 -5
- data/lib/taskjuggler/MessageHandler.rb +173 -19
- data/lib/taskjuggler/Painter.rb +75 -0
- data/lib/taskjuggler/Painter/BasicShapes.rb +76 -0
- data/lib/taskjuggler/Painter/Color.rb +273 -0
- data/lib/taskjuggler/Painter/Element.rb +56 -0
- data/lib/taskjuggler/Painter/FontData.rb +221 -0
- data/lib/taskjuggler/Painter/FontMetrics.rb +125 -0
- data/lib/taskjuggler/Painter/FontMetricsData.rb +151 -0
- data/lib/taskjuggler/Painter/Group.rb +77 -0
- data/lib/taskjuggler/Painter/Points.rb +47 -0
- data/lib/taskjuggler/Painter/Primitives.rb +100 -0
- data/lib/taskjuggler/Painter/SVGSupport.rb +36 -0
- data/lib/taskjuggler/Painter/Text.rb +36 -0
- data/lib/taskjuggler/Project.rb +46 -29
- data/lib/taskjuggler/ProjectFileParser.rb +24 -22
- data/lib/taskjuggler/ProjectFileScanner.rb +2 -2
- data/lib/taskjuggler/PropertyTreeNode.rb +26 -34
- data/lib/taskjuggler/Query.rb +8 -5
- data/lib/taskjuggler/RealFormat.rb +3 -0
- data/lib/taskjuggler/Resource.rb +3 -5
- data/lib/taskjuggler/ResourceScenario.rb +19 -7
- data/lib/taskjuggler/RichText.rb +4 -6
- data/lib/taskjuggler/RichText/FunctionExample.rb +1 -1
- data/lib/taskjuggler/RichText/FunctionHandler.rb +5 -6
- data/lib/taskjuggler/RichText/Parser.rb +4 -6
- data/lib/taskjuggler/RichText/RTFNavigator.rb +1 -1
- data/lib/taskjuggler/RichText/RTFQuery.rb +2 -3
- data/lib/taskjuggler/RichText/RTFReport.rb +1 -1
- data/lib/taskjuggler/RichText/RTFReportLink.rb +1 -2
- data/lib/taskjuggler/RichText/RTFWithQuerySupport.rb +1 -1
- data/lib/taskjuggler/RichText/Scanner.rb +6 -6
- data/lib/taskjuggler/RichText/Snip.rb +1 -2
- data/lib/taskjuggler/RuntimeConfig.rb +9 -6
- data/lib/taskjuggler/ScenarioData.rb +4 -3
- data/lib/taskjuggler/Scoreboard.rb +6 -0
- data/lib/taskjuggler/SheetHandlerBase.rb +25 -8
- data/lib/taskjuggler/SimpleQueryExpander.rb +14 -5
- data/lib/taskjuggler/SyntaxReference.rb +1 -2
- data/lib/taskjuggler/TableColumnSorter.rb +84 -0
- data/lib/taskjuggler/Task.rb +3 -5
- data/lib/taskjuggler/TaskJuggler.rb +36 -29
- data/lib/taskjuggler/TaskScenario.rb +154 -66
- data/lib/taskjuggler/TextParser.rb +24 -17
- data/lib/taskjuggler/TextParser/Scanner.rb +16 -11
- data/lib/taskjuggler/TextParser/SourceFileInfo.rb +20 -15
- data/lib/taskjuggler/TimeSheets.rb +6 -12
- data/lib/taskjuggler/Tj3AppBase.rb +35 -16
- data/lib/taskjuggler/Tj3Config.rb +1 -1
- data/lib/taskjuggler/TjpSyntaxRules.rb +239 -49
- data/lib/taskjuggler/XMLElement.rb +9 -2
- data/lib/taskjuggler/apps/Tj3.rb +43 -37
- data/lib/taskjuggler/apps/Tj3Client.rb +62 -112
- data/lib/taskjuggler/apps/Tj3Daemon.rb +66 -29
- data/lib/taskjuggler/apps/Tj3Man.rb +5 -5
- data/lib/taskjuggler/apps/Tj3SsReceiver.rb +10 -13
- data/lib/taskjuggler/apps/Tj3SsSender.rb +13 -16
- data/lib/taskjuggler/apps/Tj3TsReceiver.rb +10 -13
- data/lib/taskjuggler/apps/Tj3TsSender.rb +12 -15
- data/lib/taskjuggler/apps/Tj3TsSummary.rb +12 -15
- data/lib/taskjuggler/apps/Tj3WebD.rb +99 -0
- data/lib/taskjuggler/daemon/Daemon.rb +50 -10
- data/lib/taskjuggler/daemon/DaemonConnector.rb +127 -0
- data/lib/taskjuggler/daemon/ProcessIntercom.rb +36 -21
- data/lib/taskjuggler/daemon/ProjectBroker.rb +122 -112
- data/lib/taskjuggler/daemon/ProjectServer.rb +78 -46
- data/lib/taskjuggler/daemon/ReportServer.rb +52 -28
- data/lib/taskjuggler/daemon/ReportServlet.rb +92 -21
- data/lib/taskjuggler/daemon/WebServer.rb +75 -22
- data/lib/taskjuggler/daemon/WelcomePage.rb +1 -0
- data/lib/taskjuggler/reports/AccountListRE.rb +3 -3
- data/lib/taskjuggler/reports/CSVFile.rb +9 -2
- data/lib/taskjuggler/reports/ChartPlotter.rb +453 -0
- data/lib/taskjuggler/reports/Navigator.rb +1 -0
- data/lib/taskjuggler/reports/NikuReport.rb +4 -4
- data/lib/taskjuggler/reports/Report.rb +6 -18
- data/lib/taskjuggler/reports/ReportBase.rb +9 -9
- data/lib/taskjuggler/reports/ReportContext.rb +2 -2
- data/lib/taskjuggler/reports/StatusSheetReport.rb +6 -6
- data/lib/taskjuggler/reports/TableReport.rb +24 -15
- data/lib/taskjuggler/reports/TimeSheetReport.rb +5 -5
- data/lib/taskjuggler/reports/TraceReport.rb +251 -0
- data/lib/tj3webd.rb +17 -0
- data/manual/Day_To_Day_Juggling +10 -3
- data/manual/Installation +38 -19
- data/manual/Software +25 -19
- data/manual/Tutorial +119 -110
- data/manual/html/Day_To_Day_Juggling.html +7 -5
- data/manual/html/Getting_Started.html +4 -4
- data/manual/html/How_To_Contribute.html +4 -4
- data/manual/html/Installation.html +19 -11
- data/manual/html/Intro.html +4 -4
- data/manual/html/Reporting_Bugs.html +4 -4
- data/manual/html/Rich_Text_Attributes.html +4 -4
- data/manual/html/Software.html +15 -11
- data/manual/html/TaskJuggler_2x_Migration.html +4 -4
- data/manual/html/TaskJuggler_Internals.html +4 -4
- data/manual/html/The_TaskJuggler_Syntax.html +4 -4
- data/manual/html/Tutorial.html +41 -32
- data/manual/html/account.html +4 -4
- data/manual/html/account.task.html +4 -4
- data/manual/html/accountprefix.html +4 -4
- data/manual/html/accountreport.html +27 -9
- data/manual/html/accountroot.html +5 -5
- data/manual/html/active.html +4 -4
- data/manual/html/adopt.task.html +4 -4
- data/manual/html/aggregate.html +4 -4
- data/manual/html/alert.html +4 -4
- data/manual/html/alertlevels.html +4 -4
- data/manual/html/allocate.html +5 -5
- data/manual/html/alphabet.html +4 -4
- data/manual/html/alternative.html +4 -4
- data/manual/html/author.html +4 -4
- data/manual/html/balance.html +5 -5
- data/manual/html/booking.resource.html +4 -4
- data/manual/html/booking.task.html +4 -4
- data/manual/html/caption.html +5 -5
- data/manual/html/cellcolor.column.html +43 -8
- data/manual/html/celltext.column.html +4 -4
- data/manual/html/center.html +5 -5
- data/manual/html/charge.html +4 -4
- data/manual/html/chargeset.html +4 -4
- data/manual/html/columnid.html +27 -15
- data/manual/html/columns.html +5 -5
- data/manual/html/complete.html +4 -4
- data/manual/html/copyright.html +4 -4
- data/manual/html/credits.html +4 -4
- data/manual/html/css/tjreport.css +14 -5
- data/manual/html/currency.html +4 -4
- data/manual/html/currencyformat.html +5 -5
- data/manual/html/dailymax.html +5 -5
- data/manual/html/dailymin.html +5 -5
- data/manual/html/dailyworkinghours.html +4 -4
- data/manual/html/date.extend.html +4 -4
- data/manual/html/date.html +5 -5
- data/manual/html/definitions.html +4 -4
- data/manual/html/depends.html +4 -4
- data/manual/html/details.html +4 -4
- data/manual/html/disabled.html +4 -4
- data/manual/html/duration.html +4 -4
- data/manual/html/efficiency.html +4 -4
- data/manual/html/effort.html +4 -4
- data/manual/html/email.html +4 -4
- data/manual/html/enabled.html +4 -4
- data/manual/html/end.column.html +4 -4
- data/manual/html/end.html +4 -4
- data/manual/html/end.limit.html +4 -4
- data/manual/html/end.report.html +5 -5
- data/manual/html/end.timesheet.html +4 -4
- data/manual/html/endcredit.html +4 -4
- data/manual/html/epilog.html +5 -5
- data/manual/html/export.html +4 -4
- data/manual/html/extend.html +4 -4
- data/manual/html/fail.html +43 -8
- data/manual/html/fdl.html +4 -4
- data/manual/html/flags.account.html +4 -4
- data/manual/html/flags.html +4 -4
- data/manual/html/flags.journalentry.html +4 -4
- data/manual/html/flags.report.html +5 -5
- data/manual/html/flags.resource.html +4 -4
- data/manual/html/flags.statussheet.html +4 -4
- data/manual/html/flags.task.html +4 -4
- data/manual/html/flags.timesheet.html +4 -4
- data/manual/html/fontcolor.column.html +43 -8
- data/manual/html/footer.html +5 -5
- data/manual/html/formats.html +5 -5
- data/manual/html/functions.html +4 -4
- data/manual/html/gapduration.html +4 -4
- data/manual/html/gaplength.html +4 -4
- data/manual/html/halign.center.html +4 -4
- data/manual/html/halign.column.html +43 -8
- data/manual/html/halign.left.html +4 -4
- data/manual/html/halign.right.html +4 -4
- data/manual/html/hasalert.html +4 -4
- data/manual/html/header.html +5 -5
- data/manual/html/headline.html +7 -7
- data/manual/html/height.html +72 -0
- data/manual/html/hideaccount.html +46 -11
- data/manual/html/hidejournalentry.html +5 -5
- data/manual/html/hidereport.html +43 -8
- data/manual/html/hideresource.html +44 -9
- data/manual/html/hidetask.html +44 -9
- data/manual/html/icalreport.html +4 -4
- data/manual/html/include.macro.html +4 -4
- data/manual/html/include.project.html +4 -4
- data/manual/html/include.properties.html +4 -4
- data/manual/html/index.html +2 -1
- data/manual/html/inherit.extend.html +4 -4
- data/manual/html/interval1.html +4 -4
- data/manual/html/interval2.html +4 -4
- data/manual/html/interval3.html +4 -4
- data/manual/html/interval4.html +4 -4
- data/manual/html/isactive.html +4 -4
- data/manual/html/ischildof.html +4 -4
- data/manual/html/isdependencyof.html +4 -4
- data/manual/html/isdutyof.html +4 -4
- data/manual/html/isfeatureof.html +4 -4
- data/manual/html/isleaf.html +4 -4
- data/manual/html/ismilestone.html +4 -4
- data/manual/html/isongoing.html +4 -4
- data/manual/html/isresource.html +4 -4
- data/manual/html/isresponsibilityof.html +4 -4
- data/manual/html/istask.html +4 -4
- data/manual/html/journalattributes.html +11 -7
- data/manual/html/journalentry.html +4 -4
- data/manual/html/journalmode.html +5 -5
- data/manual/html/leaveallowance.html +5 -5
- data/manual/html/leaves.html +5 -6
- data/manual/html/left.html +5 -5
- data/manual/html/length.html +4 -4
- data/manual/html/limits.allocate.html +4 -4
- data/manual/html/limits.html +4 -4
- data/manual/html/limits.resource.html +4 -4
- data/manual/html/limits.task.html +4 -4
- data/manual/html/listitem.column.html +4 -4
- data/manual/html/listtype.column.html +4 -4
- data/manual/html/loadunit.html +5 -5
- data/manual/html/logicalexpression.html +8 -44
- data/manual/html/logicalflagexpression.html +4 -4
- data/manual/html/macro.html +4 -4
- data/manual/html/managers.html +4 -4
- data/manual/html/mandatory.html +4 -4
- data/manual/html/maxend.html +4 -4
- data/manual/html/maximum.html +5 -5
- data/manual/html/maxstart.html +4 -4
- data/manual/html/milestone.html +4 -4
- data/manual/html/minend.html +4 -4
- data/manual/html/minimum.html +5 -5
- data/manual/html/minstart.html +4 -4
- data/manual/html/monthlymax.html +5 -5
- data/manual/html/monthlymin.html +5 -5
- data/manual/html/navbar.html +10 -4
- data/manual/html/navigator.html +4 -4
- data/manual/html/newtask.html +4 -4
- data/manual/html/nikureport.html +4 -4
- data/manual/html/note.task.html +4 -4
- data/manual/html/now.html +4 -4
- data/manual/html/numberformat.html +5 -5
- data/manual/html/onend.html +4 -4
- data/manual/html/onstart.html +4 -4
- data/manual/html/opennodes.html +5 -5
- data/manual/html/overtime.booking.html +4 -4
- data/manual/html/period.column.html +4 -4
- data/manual/html/period.limit.html +4 -4
- data/manual/html/period.report.html +5 -5
- data/manual/html/period.task.html +4 -4
- data/manual/html/persistent.html +4 -4
- data/manual/html/precedes.html +4 -4
- data/manual/html/priority.html +4 -4
- data/manual/html/priority.timesheet.html +4 -4
- data/manual/html/project.html +4 -4
- data/manual/html/projectid.html +4 -4
- data/manual/html/projectid.task.html +4 -4
- data/manual/html/projectids.html +4 -4
- data/manual/html/projection.html +5 -7
- data/manual/html/prolog.html +5 -5
- data/manual/html/properties.html +11 -5
- data/manual/html/purge.html +5 -5
- data/manual/html/rate.html +4 -4
- data/manual/html/rate.resource.html +4 -4
- data/manual/html/reference.extend.html +4 -4
- data/manual/html/remaining.html +4 -4
- data/manual/html/replace.html +4 -4
- data/manual/html/reportprefix.html +4 -4
- data/manual/html/resource.html +4 -10
- data/manual/html/resourceattributes.html +4 -4
- data/manual/html/resourceprefix.html +4 -4
- data/manual/html/resourcereport.html +28 -10
- data/manual/html/resourceroot.html +5 -5
- data/manual/html/resources.limit.html +4 -4
- data/manual/html/responsible.html +4 -4
- data/manual/html/richtext.extend.html +4 -4
- data/manual/html/right.html +5 -5
- data/manual/html/rollupaccount.html +44 -9
- data/manual/html/rollupresource.html +44 -9
- data/manual/html/rolluptask.html +44 -9
- data/manual/html/scale.column.html +4 -4
- data/manual/html/scenario.html +4 -22
- data/manual/html/scenario.ical.html +4 -4
- data/manual/html/scenarios.export.html +4 -4
- data/manual/html/scenarios.html +5 -5
- data/manual/html/scenariospecific.extend.html +4 -4
- data/manual/html/scheduled.html +4 -4
- data/manual/html/scheduling.html +4 -4
- data/manual/html/select.html +4 -4
- data/manual/html/selfcontained.html +5 -5
- data/manual/html/shift.allocate.html +4 -4
- data/manual/html/shift.html +4 -4
- data/manual/html/shift.resource.html +5 -5
- data/manual/html/shift.task.html +4 -4
- data/manual/html/shift.timesheet.html +4 -4
- data/manual/html/shifts.allocate.html +4 -4
- data/manual/html/shifts.resource.html +4 -4
- data/manual/html/shifts.task.html +4 -4
- data/manual/html/shorttimeformat.html +4 -4
- data/manual/html/sloppy.booking.html +4 -4
- data/manual/html/sloppy.projection.html +5 -5
- data/manual/html/sortaccounts.html +5 -5
- data/manual/html/sortjournalentries.html +5 -5
- data/manual/html/sortresources.html +5 -5
- data/manual/html/sorttasks.html +5 -5
- data/manual/html/start.column.html +4 -4
- data/manual/html/start.html +4 -4
- data/manual/html/start.limit.html +4 -4
- data/manual/html/start.report.html +5 -5
- data/manual/html/startcredit.html +4 -4
- data/manual/html/status.statussheet.html +4 -4
- data/manual/html/status.timesheet.html +4 -4
- data/manual/html/statussheet.html +4 -4
- data/manual/html/statussheetreport.html +4 -4
- data/manual/html/strict.projection.html +5 -5
- data/manual/html/summary.html +4 -4
- data/manual/html/supplement.html +4 -4
- data/manual/html/supplement.resource.html +4 -10
- data/manual/html/supplement.task.html +4 -28
- data/manual/html/tagfile.html +4 -4
- data/manual/html/task.html +4 -28
- data/manual/html/task.statussheet.html +4 -4
- data/manual/html/task.timesheet.html +4 -4
- data/manual/html/taskattributes.html +4 -4
- data/manual/html/taskprefix.html +4 -4
- data/manual/html/taskreport.html +28 -10
- data/manual/html/taskroot.html +5 -5
- data/manual/html/text.extend.html +4 -4
- data/manual/html/textreport.html +27 -9
- data/manual/html/timeformat.html +5 -5
- data/manual/html/timeoff.nikureport.html +4 -4
- data/manual/html/timesheet.html +4 -4
- data/manual/html/timesheetreport.html +23 -5
- data/manual/html/timezone.export.html +4 -4
- data/manual/html/timezone.html +4 -4
- data/manual/html/timezone.report.html +5 -5
- data/manual/html/timezone.shift.html +4 -4
- data/manual/html/timingresolution.html +4 -4
- data/manual/html/title.column.html +4 -4
- data/manual/html/title.html +5 -5
- data/manual/html/toc.html +207 -179
- data/manual/html/tooltip.column.html +45 -10
- data/manual/html/tracereport.html +405 -0
- data/manual/html/trackingscenario.html +6 -6
- data/manual/html/treelevel.html +4 -4
- data/manual/html/vacation.html +4 -4
- data/manual/html/vacation.resource.html +4 -4
- data/manual/html/vacation.shift.html +4 -4
- data/manual/html/warn.html +43 -8
- data/manual/html/weeklymax.html +5 -5
- data/manual/html/weeklymin.html +5 -5
- data/manual/html/weekstartsmonday.html +4 -4
- data/manual/html/weekstartssunday.html +6 -6
- data/manual/html/width.column.html +6 -6
- data/manual/html/width.html +72 -0
- data/manual/html/work.html +4 -4
- data/manual/html/workinghours.project.html +4 -4
- data/manual/html/workinghours.resource.html +4 -4
- data/manual/html/workinghours.shift.html +4 -4
- data/manual/html/yearlyworkingdays.html +4 -4
- data/spec/Color_spec.rb +60 -0
- data/spec/ProjectBroker_spec.rb +3 -2
- data/spec/StatusSheets_spec.rb +5 -4
- data/spec/TableColumnSorter_spec.rb +78 -0
- data/spec/TimeSheets_spec.rb +6 -2
- data/spec/Tj3Daemon_spec.rb +2 -2
- data/spec/TraceReport_spec.rb +117 -0
- data/taskjuggler.gemspec +1 -1
- data/test/MessageChecker.rb +3 -1
- data/test/ReferenceGenerator.rb +1 -1
- data/test/TestSuite/CSV-Reports/Leave.tjp +1 -1
- data/test/TestSuite/CSV-Reports/refs/resourcereport_with_tasks.csv +3 -0
- data/test/TestSuite/CSV-Reports/refs/taskcounter.csv +9 -0
- data/test/TestSuite/CSV-Reports/refs/taskreport_with_resources.csv +19 -16
- data/test/TestSuite/CSV-Reports/refs/weekly.csv +1 -0
- data/test/TestSuite/Export-Reports/refs/LogicalExpression.tjp +14 -2
- data/test/TestSuite/Export-Reports/refs/tutorial.tjp +98 -86
- data/test/TestSuite/Scheduler/Correct/Leaves.tjp +25 -0
- data/test/TestSuite/Syntax/Correct/Leave.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/LogicalExpression.tjp +9 -1
- data/test/TestSuite/Syntax/Correct/TraceReport.tjp +10 -0
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +10 -4
- data/test/test_CSV-Reports.rb +3 -3
- data/test/test_Export-Reports.rb +91 -86
- data/test/test_Journal.rb +15 -12
- data/test/test_Limits.rb +3 -3
- data/test/test_Project.rb +1 -2
- data/test/test_ProjectFileScanner.rb +1 -1
- data/test/test_PropertySet.rb +1 -1
- data/test/test_Query.rb +5 -6
- data/test/test_ReportGenerator.rb +15 -7
- data/test/test_RichText.rb +4 -3
- data/test/test_Scheduler.rb +19 -7
- data/test/test_ShiftAssignments.rb +2 -2
- data/test/test_SimpleQueryExpander.rb +29 -2
- data/test/test_Syntax.rb +14 -5
- metadata +49 -10
- data/lib/taskjuggler/LogFile.rb +0 -73
@@ -0,0 +1,56 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
# encoding: UTF-8
|
3
|
+
#
|
4
|
+
# = Line.rb -- The TaskJuggler III Project Management Software
|
5
|
+
#
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
8
|
+
#
|
9
|
+
# This program is free software; you can redistribute it and/or modify
|
10
|
+
# it under the terms of version 2 of the GNU General Public License as
|
11
|
+
# published by the Free Software Foundation.
|
12
|
+
#
|
13
|
+
|
14
|
+
require 'taskjuggler/Painter/SVGSupport'
|
15
|
+
require 'taskjuggler/Painter/Primitives'
|
16
|
+
|
17
|
+
class TaskJuggler
|
18
|
+
|
19
|
+
class Painter
|
20
|
+
|
21
|
+
# The base class for all drawable elements.
|
22
|
+
class Element
|
23
|
+
|
24
|
+
include SVGSupport
|
25
|
+
include Primitives
|
26
|
+
|
27
|
+
# Create a new Element. _type_ specifies the type of the element.
|
28
|
+
# _attrs_ is a list of the supported attributes. _values_ is a hash of
|
29
|
+
# the provided attributes.
|
30
|
+
def initialize(type, attrs, values)
|
31
|
+
@type = type
|
32
|
+
@attributes = attrs
|
33
|
+
@values = {}
|
34
|
+
@text = nil
|
35
|
+
|
36
|
+
values.each do |k, v|
|
37
|
+
unless @attributes.include?(k)
|
38
|
+
raise ArgumentError, "Unsupported attribute #{k}"
|
39
|
+
end
|
40
|
+
@values[k] = v
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Convert the Element into an XMLElement tree using SVG syntax.
|
45
|
+
def to_svg
|
46
|
+
el = XMLElement.new(@type, valuesToSVG)
|
47
|
+
el << XMLText.new(@text) if @text
|
48
|
+
el
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,221 @@
|
|
1
|
+
|
2
|
+
class TaskJuggler
|
3
|
+
class Painter
|
4
|
+
class FontMetrics
|
5
|
+
Font_LiberationSans_normal = Painter::FontMetricsData.new('LiberationSans', :normal, 24, 26.088,
|
6
|
+
@charWidth = {
|
7
|
+
' ' => 6.648, '!' => 6.648, '"' => 8.496, '#' => 13.344,
|
8
|
+
'$' => 13.344, '%' => 21.336, '&' => 15.984, '\'' => 4.560,
|
9
|
+
'(' => 7.992, ')' => 7.992, '*' => 9.336, '+' => 13.992,
|
10
|
+
',' => 6.648, '-' => 7.992, '.' => 6.648, '/' => 6.648,
|
11
|
+
'0' => 13.344, '1' => 13.344, '2' => 13.344, '3' => 13.344,
|
12
|
+
'4' => 13.344, '5' => 13.344, '6' => 13.344, '7' => 13.344,
|
13
|
+
'8' => 13.344, '9' => 13.344, ':' => 6.648, ';' => 6.648,
|
14
|
+
'<' => 13.992, '=' => 13.992, '>' => 13.992, '?' => 13.344,
|
15
|
+
'@' => 24.360, 'A' => 15.984, 'B' => 15.984, 'C' => 17.328,
|
16
|
+
'D' => 17.328, 'E' => 15.984, 'F' => 14.640, 'G' => 18.648,
|
17
|
+
'H' => 17.328, 'I' => 6.648, 'J' => 12.000, 'K' => 15.984,
|
18
|
+
'L' => 13.344, 'M' => 19.992, 'N' => 17.328, 'O' => 18.648,
|
19
|
+
'P' => 15.984, 'Q' => 18.648, 'R' => 17.328, 'S' => 15.984,
|
20
|
+
'T' => 14.640, 'U' => 17.328, 'V' => 15.984, 'W' => 22.632,
|
21
|
+
'X' => 15.984, 'Y' => 15.984, 'Z' => 14.640, '[' => 6.648,
|
22
|
+
'\\' => 6.648, ']' => 6.648, '^' => 11.256, '_' => 13.344,
|
23
|
+
'`' => 7.992, 'a' => 13.344, 'b' => 13.344, 'c' => 12.000,
|
24
|
+
'd' => 13.344, 'e' => 13.344, 'f' => 6.648, 'g' => 13.344,
|
25
|
+
'h' => 13.344, 'i' => 5.328, 'j' => 5.328, 'k' => 12.000,
|
26
|
+
'l' => 5.328, 'm' => 19.992, 'n' => 13.344, 'o' => 13.344,
|
27
|
+
'p' => 13.344, 'q' => 13.344, 'r' => 7.992, 's' => 12.000,
|
28
|
+
't' => 6.648, 'u' => 13.344, 'v' => 12.000, 'w' => 17.328,
|
29
|
+
'x' => 12.000, 'y' => 12.000, 'z' => 12.000, '{' => 7.992,
|
30
|
+
'|' => 6.216, '}' => 7.992, '~' => 13.992,
|
31
|
+
},
|
32
|
+
@kerningDelta = {
|
33
|
+
' A' => -1.324, ' T' => -0.434, ' Y' => -0.434, '11' => -1.781,
|
34
|
+
'A ' => -1.324, 'AT' => -1.781, 'AV' => -1.781, 'AW' => -0.891,
|
35
|
+
'AY' => -1.781, 'Av' => -0.434, 'Aw' => -0.434, 'Ay' => -0.434,
|
36
|
+
'F,' => -2.660, 'F.' => -2.660, 'FA' => -1.324, 'L ' => -0.891,
|
37
|
+
'LT' => -1.781, 'LV' => -1.781, 'LW' => -1.781, 'LY' => -1.781,
|
38
|
+
'Ly' => -0.891, 'P ' => -0.434, 'P,' => -3.094, 'P.' => -3.094,
|
39
|
+
'PA' => -1.781, 'RT' => -0.434, 'RV' => -0.434, 'RW' => -0.434,
|
40
|
+
'RY' => -0.434, 'T ' => -0.434, 'T,' => -2.660, 'T-' => -1.324,
|
41
|
+
'T.' => -2.660, 'T:' => -2.660, 'T;' => -2.660, 'TA' => -1.781,
|
42
|
+
'TO' => -0.434, 'Ta' => -2.660, 'Tc' => -2.660, 'Te' => -2.660,
|
43
|
+
'Ti' => -0.891, 'To' => -2.660, 'Tr' => -0.891, 'Ts' => -2.660,
|
44
|
+
'Tu' => -0.891, 'Tw' => -1.324, 'Ty' => -1.324, 'V,' => -2.203,
|
45
|
+
'V-' => -1.324, 'V.' => -2.203, 'V:' => -0.891, 'V;' => -0.891,
|
46
|
+
'VA' => -1.781, 'Va' => -1.781, 'Ve' => -1.324, 'Vi' => -0.434,
|
47
|
+
'Vo' => -1.324, 'Vr' => -0.891, 'Vu' => -0.891, 'Vy' => -0.891,
|
48
|
+
'W,' => -1.324, 'W-' => -0.434, 'W.' => -1.324, 'W:' => -0.434,
|
49
|
+
'W;' => -0.434, 'WA' => -0.891, 'Wa' => -0.891, 'We' => -0.434,
|
50
|
+
'Wo' => -0.434, 'Wr' => -0.434, 'Wu' => -0.434, 'Wy' => -0.211,
|
51
|
+
'Y ' => -0.434, 'Y,' => -3.094, 'Y-' => -2.203, 'Y.' => -3.094,
|
52
|
+
'Y:' => -1.324, 'Y;' => -1.559, 'YA' => -1.781, 'Ya' => -1.781,
|
53
|
+
'Ye' => -2.203, 'Yi' => -0.891, 'Yo' => -2.203, 'Yp' => -1.781,
|
54
|
+
'Yq' => -2.203, 'Yu' => -1.324, 'Yv' => -1.324, 'ff' => -0.434,
|
55
|
+
'r,' => -1.324, 'r.' => -1.324, 'v,' => -1.781, 'v.' => -1.781,
|
56
|
+
'w,' => -1.324, 'w.' => -1.324, 'y,' => -1.781, 'y.' => -1.781,
|
57
|
+
}
|
58
|
+
)
|
59
|
+
Font_LiberationSans_italic = Painter::FontMetricsData.new('LiberationSans', :italic, 24, 26.016,
|
60
|
+
@charWidth = {
|
61
|
+
' ' => 6.648, '!' => 6.648, '"' => 8.496, '#' => 13.344,
|
62
|
+
'$' => 13.344, '%' => 21.336, '&' => 15.984, '\'' => 4.560,
|
63
|
+
'(' => 7.992, ')' => 7.992, '*' => 9.336, '+' => 13.992,
|
64
|
+
',' => 6.648, '-' => 7.992, '.' => 6.648, '/' => 6.648,
|
65
|
+
'0' => 13.344, '1' => 13.344, '2' => 13.344, '3' => 13.344,
|
66
|
+
'4' => 13.344, '5' => 13.344, '6' => 13.344, '7' => 13.344,
|
67
|
+
'8' => 13.344, '9' => 13.344, ':' => 6.648, ';' => 6.648,
|
68
|
+
'<' => 13.992, '=' => 13.992, '>' => 13.992, '?' => 13.344,
|
69
|
+
'@' => 24.360, 'A' => 15.984, 'B' => 15.984, 'C' => 17.328,
|
70
|
+
'D' => 17.328, 'E' => 15.984, 'F' => 14.640, 'G' => 18.648,
|
71
|
+
'H' => 17.328, 'I' => 6.648, 'J' => 12.000, 'K' => 15.984,
|
72
|
+
'L' => 13.344, 'M' => 19.992, 'N' => 17.328, 'O' => 18.648,
|
73
|
+
'P' => 15.984, 'Q' => 18.648, 'R' => 17.328, 'S' => 15.984,
|
74
|
+
'T' => 14.640, 'U' => 17.328, 'V' => 15.984, 'W' => 22.632,
|
75
|
+
'X' => 15.984, 'Y' => 15.984, 'Z' => 14.640, '[' => 6.648,
|
76
|
+
'\\' => 6.648, ']' => 6.648, '^' => 11.256, '_' => 13.344,
|
77
|
+
'`' => 7.992, 'a' => 13.344, 'b' => 13.344, 'c' => 12.000,
|
78
|
+
'd' => 13.344, 'e' => 13.344, 'f' => 6.648, 'g' => 13.344,
|
79
|
+
'h' => 13.344, 'i' => 5.328, 'j' => 5.328, 'k' => 12.000,
|
80
|
+
'l' => 5.328, 'm' => 19.992, 'n' => 13.344, 'o' => 13.344,
|
81
|
+
'p' => 13.344, 'q' => 13.344, 'r' => 7.992, 's' => 12.000,
|
82
|
+
't' => 6.648, 'u' => 13.344, 'v' => 12.000, 'w' => 17.328,
|
83
|
+
'x' => 12.000, 'y' => 12.000, 'z' => 12.000, '{' => 7.992,
|
84
|
+
'|' => 6.216, '}' => 7.992, '~' => 13.992,
|
85
|
+
},
|
86
|
+
@kerningDelta = {
|
87
|
+
' A' => -0.891, ' Y' => -0.434, '11' => -1.781, 'A ' => -0.891,
|
88
|
+
'AT' => -1.781, 'AV' => -1.324, 'AW' => -0.434, 'AY' => -1.781,
|
89
|
+
'Av' => -0.434, 'Aw' => -0.434, 'Ay' => -0.211, 'F ' => -0.434,
|
90
|
+
'F,' => -3.094, 'F.' => -3.094, 'FA' => -1.781, 'L ' => -0.434,
|
91
|
+
'LT' => -1.781, 'LV' => -1.324, 'LW' => -0.891, 'LY' => -2.203,
|
92
|
+
'Ly' => -0.434, 'P ' => -0.891, 'P,' => -3.094, 'P.' => -3.094,
|
93
|
+
'PA' => -1.781, 'RT' => -0.434, 'RV' => -0.434, 'RW' => -0.434,
|
94
|
+
'RY' => -0.891, 'T,' => -2.203, 'T-' => -2.203, 'T.' => -2.203,
|
95
|
+
'T:' => -1.781, 'T;' => -1.781, 'TA' => -1.781, 'TO' => -0.434,
|
96
|
+
'Ta' => -2.203, 'Tc' => -2.203, 'Te' => -2.203, 'Ti' => -0.211,
|
97
|
+
'To' => -2.203, 'Tr' => -1.781, 'Ts' => -2.203, 'Tu' => -1.781,
|
98
|
+
'Tw' => -1.781, 'Ty' => -1.781, 'V,' => -1.781, 'V-' => -0.891,
|
99
|
+
'V.' => -1.781, 'V:' => -0.434, 'V;' => -0.434, 'VA' => -1.324,
|
100
|
+
'Va' => -0.891, 'Ve' => -0.891, 'Vi' => -0.434, 'Vo' => -0.891,
|
101
|
+
'Vr' => -0.434, 'Vu' => -0.434, 'Vy' => -0.434, 'W,' => -0.891,
|
102
|
+
'W-' => -0.434, 'W.' => -0.891, 'WA' => -0.434, 'Wa' => -0.434,
|
103
|
+
'We' => -0.434, 'Wi' => -0.211, 'Y ' => -0.434, 'Y,' => -2.203,
|
104
|
+
'Y-' => -1.781, 'Y.' => -2.203, 'Y:' => -0.891, 'Y;' => -0.891,
|
105
|
+
'YA' => -1.324, 'Ya' => -1.781, 'Ye' => -1.324, 'Yi' => -0.434,
|
106
|
+
'Yo' => -1.324, 'Yp' => -1.324, 'Yq' => -1.324, 'Yu' => -0.891,
|
107
|
+
'Yv' => -0.891, 'r,' => -1.324, 'r-' => -0.434, 'r.' => -0.891,
|
108
|
+
'v,' => -1.781, 'v.' => -1.781, 'w,' => -1.324, 'w.' => -1.324,
|
109
|
+
'y,' => -1.781, 'y.' => -1.781,
|
110
|
+
}
|
111
|
+
)
|
112
|
+
Font_LiberationSans_bold = Painter::FontMetricsData.new('LiberationSans', :bold, 24, 26.088,
|
113
|
+
@charWidth = {
|
114
|
+
' ' => 6.648, '!' => 7.992, '"' => 11.376, '#' => 13.344,
|
115
|
+
'$' => 13.344, '%' => 21.336, '&' => 17.328, '\'' => 5.688,
|
116
|
+
'(' => 7.992, ')' => 7.992, '*' => 9.336, '+' => 13.992,
|
117
|
+
',' => 6.648, '-' => 7.992, '.' => 6.648, '/' => 6.648,
|
118
|
+
'0' => 13.344, '1' => 13.344, '2' => 13.344, '3' => 13.344,
|
119
|
+
'4' => 13.344, '5' => 13.344, '6' => 13.344, '7' => 13.344,
|
120
|
+
'8' => 13.344, '9' => 13.344, ':' => 7.992, ';' => 7.992,
|
121
|
+
'<' => 13.992, '=' => 13.992, '>' => 13.992, '?' => 14.640,
|
122
|
+
'@' => 23.400, 'A' => 17.328, 'B' => 17.328, 'C' => 17.328,
|
123
|
+
'D' => 17.328, 'E' => 15.984, 'F' => 14.640, 'G' => 18.648,
|
124
|
+
'H' => 17.328, 'I' => 6.648, 'J' => 13.344, 'K' => 17.328,
|
125
|
+
'L' => 14.640, 'M' => 19.992, 'N' => 17.328, 'O' => 18.648,
|
126
|
+
'P' => 15.984, 'Q' => 18.648, 'R' => 17.328, 'S' => 15.984,
|
127
|
+
'T' => 14.640, 'U' => 17.328, 'V' => 15.984, 'W' => 22.632,
|
128
|
+
'X' => 15.984, 'Y' => 15.984, 'Z' => 14.640, '[' => 7.992,
|
129
|
+
'\\' => 6.648, ']' => 7.992, '^' => 13.992, '_' => 13.344,
|
130
|
+
'`' => 7.992, 'a' => 13.344, 'b' => 14.640, 'c' => 13.344,
|
131
|
+
'd' => 14.640, 'e' => 13.344, 'f' => 7.992, 'g' => 14.640,
|
132
|
+
'h' => 14.640, 'i' => 6.648, 'j' => 6.648, 'k' => 13.344,
|
133
|
+
'l' => 6.648, 'm' => 21.336, 'n' => 14.640, 'o' => 14.640,
|
134
|
+
'p' => 14.640, 'q' => 14.640, 'r' => 9.336, 's' => 13.344,
|
135
|
+
't' => 7.992, 'u' => 14.640, 'v' => 13.344, 'w' => 18.648,
|
136
|
+
'x' => 13.344, 'y' => 13.344, 'z' => 12.000, '{' => 9.336,
|
137
|
+
'|' => 6.696, '}' => 9.336, '~' => 13.992,
|
138
|
+
},
|
139
|
+
@kerningDelta = {
|
140
|
+
' A' => -0.891, ' Y' => -0.434, '11' => -1.324, 'A ' => -0.891,
|
141
|
+
'AT' => -1.781, 'AV' => -1.781, 'AW' => -1.324, 'AY' => -2.203,
|
142
|
+
'Av' => -0.891, 'Aw' => -0.434, 'Ay' => -0.891, 'F,' => -2.660,
|
143
|
+
'F.' => -2.660, 'FA' => -1.324, 'L ' => -0.434, 'LT' => -1.781,
|
144
|
+
'LV' => -1.781, 'LW' => -1.324, 'LY' => -2.203, 'Ly' => -0.891,
|
145
|
+
'P ' => -0.434, 'P,' => -3.094, 'P.' => -3.094, 'PA' => -1.781,
|
146
|
+
'RV' => -0.434, 'RW' => -0.434, 'RY' => -0.891, 'T,' => -2.660,
|
147
|
+
'T-' => -1.324, 'T.' => -2.660, 'T:' => -2.660, 'T;' => -2.660,
|
148
|
+
'TA' => -1.781, 'TO' => -0.434, 'Ta' => -1.781, 'Tc' => -1.781,
|
149
|
+
'Te' => -1.781, 'Ti' => -0.434, 'To' => -1.781, 'Tr' => -1.324,
|
150
|
+
'Ts' => -1.781, 'Tu' => -1.781, 'Tw' => -1.781, 'Ty' => -1.781,
|
151
|
+
'V,' => -2.203, 'V-' => -1.324, 'V.' => -2.203, 'V:' => -1.324,
|
152
|
+
'V;' => -1.324, 'VA' => -1.781, 'Va' => -1.324, 'Ve' => -1.324,
|
153
|
+
'Vi' => -0.434, 'Vo' => -1.781, 'Vr' => -1.324, 'Vu' => -0.891,
|
154
|
+
'Vy' => -0.891, 'W,' => -1.324, 'W-' => -0.480, 'W.' => -1.324,
|
155
|
+
'W:' => -0.434, 'W;' => -0.434, 'WA' => -1.324, 'Wa' => -0.891,
|
156
|
+
'We' => -0.434, 'Wi' => -0.211, 'Wo' => -0.434, 'Wr' => -0.434,
|
157
|
+
'Wu' => -0.434, 'Wy' => -0.434, 'Y ' => -0.434, 'Y,' => -2.660,
|
158
|
+
'Y-' => -1.324, 'Y.' => -2.660, 'Y:' => -1.781, 'Y;' => -1.781,
|
159
|
+
'YA' => -2.203, 'Ya' => -1.324, 'Ye' => -1.324, 'Yi' => -0.891,
|
160
|
+
'Yo' => -1.781, 'Yp' => -1.324, 'Yq' => -1.781, 'Yu' => -1.324,
|
161
|
+
'Yv' => -1.324, 'r,' => -1.324, 'r.' => -1.324, 'v,' => -1.781,
|
162
|
+
'v.' => -1.781, 'w,' => -0.891, 'w.' => -0.891, 'y,' => -1.781,
|
163
|
+
'y.' => -1.781,
|
164
|
+
}
|
165
|
+
)
|
166
|
+
Font_LiberationSans_bold_italic = Painter::FontMetricsData.new('LiberationSans', :bold_italic, 24, 26.088,
|
167
|
+
@charWidth = {
|
168
|
+
' ' => 6.648, '!' => 7.992, '"' => 11.376, '#' => 13.344,
|
169
|
+
'$' => 13.344, '%' => 21.336, '&' => 17.328, '\'' => 5.688,
|
170
|
+
'(' => 7.992, ')' => 7.992, '*' => 9.336, '+' => 13.992,
|
171
|
+
',' => 6.648, '-' => 7.992, '.' => 6.648, '/' => 6.648,
|
172
|
+
'0' => 13.344, '1' => 13.344, '2' => 13.344, '3' => 13.344,
|
173
|
+
'4' => 13.344, '5' => 13.344, '6' => 13.344, '7' => 13.344,
|
174
|
+
'8' => 13.344, '9' => 13.344, ':' => 7.992, ';' => 7.992,
|
175
|
+
'<' => 13.992, '=' => 13.992, '>' => 13.992, '?' => 14.640,
|
176
|
+
'@' => 23.400, 'A' => 17.328, 'B' => 17.328, 'C' => 17.328,
|
177
|
+
'D' => 17.328, 'E' => 15.984, 'F' => 14.640, 'G' => 18.648,
|
178
|
+
'H' => 17.328, 'I' => 6.648, 'J' => 13.344, 'K' => 17.328,
|
179
|
+
'L' => 14.640, 'M' => 19.992, 'N' => 17.328, 'O' => 18.648,
|
180
|
+
'P' => 15.984, 'Q' => 18.648, 'R' => 17.328, 'S' => 15.984,
|
181
|
+
'T' => 14.640, 'U' => 17.328, 'V' => 15.984, 'W' => 22.632,
|
182
|
+
'X' => 15.984, 'Y' => 15.984, 'Z' => 14.640, '[' => 7.992,
|
183
|
+
'\\' => 6.648, ']' => 7.992, '^' => 13.992, '_' => 13.344,
|
184
|
+
'`' => 7.992, 'a' => 13.344, 'b' => 14.640, 'c' => 13.344,
|
185
|
+
'd' => 14.640, 'e' => 13.344, 'f' => 7.992, 'g' => 14.640,
|
186
|
+
'h' => 14.640, 'i' => 6.648, 'j' => 6.648, 'k' => 13.344,
|
187
|
+
'l' => 6.648, 'm' => 21.336, 'n' => 14.640, 'o' => 14.640,
|
188
|
+
'p' => 14.640, 'q' => 14.640, 'r' => 9.336, 's' => 13.344,
|
189
|
+
't' => 7.992, 'u' => 14.640, 'v' => 13.344, 'w' => 18.648,
|
190
|
+
'x' => 13.344, 'y' => 13.344, 'z' => 12.000, '{' => 9.336,
|
191
|
+
'|' => 6.696, '}' => 9.336, '~' => 13.992,
|
192
|
+
},
|
193
|
+
@kerningDelta = {
|
194
|
+
' A' => -0.891, ' Y' => -0.434, '11' => -1.781, 'A ' => -0.891,
|
195
|
+
'AT' => -1.781, 'AV' => -1.781, 'AW' => -1.324, 'AY' => -1.781,
|
196
|
+
'F,' => -2.660, 'F.' => -2.660, 'FA' => -1.324, 'L ' => -0.434,
|
197
|
+
'LT' => -1.781, 'LV' => -1.324, 'LW' => -1.324, 'LY' => -1.781,
|
198
|
+
'P ' => -0.891, 'P,' => -3.094, 'P.' => -3.094, 'PA' => -1.781,
|
199
|
+
'RT' => -0.434, 'RW' => -0.434, 'RY' => -0.434, 'T,' => -1.781,
|
200
|
+
'T-' => -1.324, 'T.' => -1.781, 'T:' => -1.781, 'T;' => -1.781,
|
201
|
+
'TA' => -1.781, 'TO' => -0.434, 'Ta' => -0.891, 'Tc' => -0.891,
|
202
|
+
'Te' => -0.891, 'Ti' => -0.434, 'To' => -0.891, 'Tr' => -0.434,
|
203
|
+
'Ts' => -0.891, 'Tu' => -0.434, 'Tw' => -0.891, 'Ty' => -0.891,
|
204
|
+
'V,' => -2.203, 'V-' => -0.891, 'V.' => -2.203, 'V:' => -0.891,
|
205
|
+
'V;' => -0.891, 'VA' => -1.781, 'Va' => -0.891, 'Ve' => -0.891,
|
206
|
+
'Vi' => -0.891, 'Vo' => -0.891, 'Vr' => -0.434, 'Vu' => -0.434,
|
207
|
+
'Vy' => -0.434, 'W,' => -1.781, 'W-' => -0.891, 'W.' => -1.781,
|
208
|
+
'W:' => -0.891, 'W;' => -0.891, 'WA' => -1.324, 'Wa' => -0.434,
|
209
|
+
'We' => -0.434, 'Wi' => -0.211, 'Wo' => -0.434, 'Wr' => -0.434,
|
210
|
+
'Wu' => -0.434, 'Wy' => -0.434, 'Y ' => -0.434, 'Y,' => -2.203,
|
211
|
+
'Y-' => -1.781, 'Y.' => -2.203, 'Y:' => -1.324, 'Y;' => -1.324,
|
212
|
+
'YA' => -1.781, 'Ya' => -0.891, 'Ye' => -0.891, 'Yi' => -0.891,
|
213
|
+
'Yo' => -0.891, 'Yp' => -0.891, 'Yq' => -0.891, 'Yu' => -0.891,
|
214
|
+
'Yv' => -0.891, 'ff' => -0.434, 'r,' => -1.324, 'r.' => -1.324,
|
215
|
+
'v,' => -1.324, 'v.' => -1.324, 'w,' => -0.891, 'w.' => -0.891,
|
216
|
+
'y,' => -0.891, 'y.' => -0.891,
|
217
|
+
}
|
218
|
+
)
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
# encoding: UTF-8
|
3
|
+
#
|
4
|
+
# = Painter.rb -- The TaskJuggler III Project Management Software
|
5
|
+
#
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
8
|
+
#
|
9
|
+
# This program is free software; you can redistribute it and/or modify
|
10
|
+
# it under the terms of version 2 of the GNU General Public License as
|
11
|
+
# published by the Free Software Foundation.
|
12
|
+
#
|
13
|
+
|
14
|
+
# Set this flag to true to generate FontData.rb. This will require the prawn
|
15
|
+
# gem to be installed. For normal operation, this flag must be set to false.
|
16
|
+
GeneratorMode = false
|
17
|
+
|
18
|
+
if GeneratorMode
|
19
|
+
# Only required to generate the font metrics data.
|
20
|
+
require 'prawn'
|
21
|
+
end
|
22
|
+
|
23
|
+
require 'taskjuggler/Painter/FontMetricsData'
|
24
|
+
unless GeneratorMode
|
25
|
+
require 'taskjuggler/Painter/FontData'
|
26
|
+
end
|
27
|
+
|
28
|
+
class TaskJuggler
|
29
|
+
|
30
|
+
class Painter
|
31
|
+
|
32
|
+
# Class to compute or store the raw data for glyph size and kerning
|
33
|
+
# infomation. Developers can use it to generate FontData.rb. This file
|
34
|
+
# contains pre-computed font metrics data for some selected fonts. This
|
35
|
+
# data can then be used to determine the width and height of a bounding
|
36
|
+
# box of a given String.
|
37
|
+
#
|
38
|
+
# Developers can also use this file to generate FontData.rb using prawn as
|
39
|
+
# a back-end. We currently do not want to have prawn as a runtime
|
40
|
+
# dependency for TaskJuggler.
|
41
|
+
class FontMetrics
|
42
|
+
|
43
|
+
# Initialize the FontMetrics object.
|
44
|
+
def initialize()
|
45
|
+
@fonts = {}
|
46
|
+
# We currently only support the LiberationSans font which is metric
|
47
|
+
# compatible to Arial.
|
48
|
+
@fonts['Arial'] = @fonts['LiberationSans'] =
|
49
|
+
Font_LiberationSans_normal
|
50
|
+
@fonts['Arial-Italic'] = @fonts['LiberationSans-Italic'] =
|
51
|
+
Font_LiberationSans_italic
|
52
|
+
@fonts['Arial-Bold'] = @fonts['LiberationSans-Bold'] =
|
53
|
+
Font_LiberationSans_bold
|
54
|
+
@fonts['Arial-BoldItalic'] = @fonts['LiberationSans-BoldItalic'] =
|
55
|
+
Font_LiberationSans_bold_italic
|
56
|
+
end
|
57
|
+
|
58
|
+
# Return the height of the _font_ with _ptSize_ points in screen pixels.
|
59
|
+
def height(font, ptSize)
|
60
|
+
checkFontName(font)
|
61
|
+
# Calculate resulting height scaled to the font size and convert to
|
62
|
+
# screen pixels instead of points.
|
63
|
+
(@fonts[font].height * (ptSize.to_f / @fonts[font].ptSize) *
|
64
|
+
(4.0 / 3.0)).to_i
|
65
|
+
end
|
66
|
+
|
67
|
+
# Return the width of the string in screen pixels when using the font
|
68
|
+
# _font_ with _ptSize_ points.
|
69
|
+
def width(font, ptSize, str)
|
70
|
+
checkFontName(font)
|
71
|
+
w = 0
|
72
|
+
lastC = nil
|
73
|
+
str.each_char do |c|
|
74
|
+
cw = @fonts[font].glyphWidth(c)
|
75
|
+
w += cw || @font[font].averageWidth
|
76
|
+
if lastC
|
77
|
+
delta = @fonts[font].kerningDelta[lastC + c]
|
78
|
+
w += delta if delta
|
79
|
+
end
|
80
|
+
lastC = c
|
81
|
+
end
|
82
|
+
# Calculate resulting width scaled to the font size and convert to
|
83
|
+
# screen pixels instead of points.
|
84
|
+
(w * (ptSize.to_f / @fonts[font].ptSize) * (4.0 / 3.0)).to_i
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def checkFontName(font)
|
90
|
+
unless @fonts.include?(font)
|
91
|
+
raise ArgumentError, "Unknown font '#{font}'!"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
if GeneratorMode
|
99
|
+
File.open('FontData.rb', 'w') do |f|
|
100
|
+
f.puts <<'EOT'
|
101
|
+
|
102
|
+
class TaskJuggler
|
103
|
+
class Painter
|
104
|
+
class FontMetrics
|
105
|
+
EOT
|
106
|
+
font = 'LiberationSans'
|
107
|
+
f.puts Painter::FontMetricsData.new(font, :normal).to_ruby
|
108
|
+
f.puts Painter::FontMetricsData.new(font, :italic).to_ruby
|
109
|
+
f.puts Painter::FontMetricsData.new(font, :bold).to_ruby
|
110
|
+
f.puts Painter::FontMetricsData.new(font, :bold_italic).to_ruby
|
111
|
+
#font = 'Helvetica'
|
112
|
+
#f.puts Painter::FontMetricsData.new(font, :normal).to_ruby
|
113
|
+
#f.puts Painter::FontMetricsData.new(font, :italic).to_ruby
|
114
|
+
#f.puts Painter::FontMetricsData.new(font, :bold).to_ruby
|
115
|
+
#f.puts Painter::FontMetricsData.new(font, :bold_italic).to_ruby
|
116
|
+
|
117
|
+
f.puts <<'EOT'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
EOT
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
@@ -0,0 +1,151 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
# encoding: UTF-8
|
3
|
+
#
|
4
|
+
# = Painter.rb -- The TaskJuggler III Project Management Software
|
5
|
+
#
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
8
|
+
#
|
9
|
+
# This program is free software; you can redistribute it and/or modify
|
10
|
+
# it under the terms of version 2 of the GNU General Public License as
|
11
|
+
# published by the Free Software Foundation.
|
12
|
+
#
|
13
|
+
|
14
|
+
class TaskJuggler
|
15
|
+
|
16
|
+
class Painter
|
17
|
+
|
18
|
+
# The FontMetricsData objects generate and store the font metrics data for
|
19
|
+
# a particular font. The glyph set is currently restricted to US ASCII
|
20
|
+
# characters.
|
21
|
+
class FontMetricsData
|
22
|
+
|
23
|
+
MIN_GLYPH_INDEX = 32
|
24
|
+
MAX_GLYPH_INDEX = 126
|
25
|
+
|
26
|
+
attr_reader :ptSize, :charWidth, :height, :kerningDelta
|
27
|
+
|
28
|
+
# The constructor can be used in two different modes. If all font data
|
29
|
+
# is supplied, the object just stores the supplied font data. If only
|
30
|
+
# the font name is given, the class uses the prawn library to generate
|
31
|
+
# the font metrics for the requested font.
|
32
|
+
def initialize(fontName, type = :normal, ptSize = 24, height = nil,
|
33
|
+
wData = nil, kData = nil)
|
34
|
+
@fontName = fontName
|
35
|
+
@type = type
|
36
|
+
@height = height
|
37
|
+
@ptSize = ptSize
|
38
|
+
@averageWidth = 0.0
|
39
|
+
|
40
|
+
if wData && kData
|
41
|
+
@charWidth = wData
|
42
|
+
@kerningDelta = kData
|
43
|
+
else
|
44
|
+
generateMetrics
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Return the width of the glyph _c_. This must be a single character
|
49
|
+
# String. If the glyph is not known, nil is returned.
|
50
|
+
def glyphWidth(c)
|
51
|
+
return @charWidth[c]
|
52
|
+
end
|
53
|
+
|
54
|
+
# The average with of all glyphs.
|
55
|
+
def averageWidth
|
56
|
+
return (@averageWidth * (3.0 / 4.0)).to_i
|
57
|
+
end
|
58
|
+
|
59
|
+
# Generate the FontMetricsData initialization code for the particular
|
60
|
+
# font. The output will be Ruby syntax.
|
61
|
+
def to_ruby
|
62
|
+
indent = ' ' * 6
|
63
|
+
s = "#{indent}Font_#{@fontName.gsub(/-/, '_')}_#{@type} = " +
|
64
|
+
"Painter::FontMetricsData.new('#{@fontName}', :#{@type}, " +
|
65
|
+
"#{@ptSize}, #{"%.3f" % @height},\n"
|
66
|
+
s << "#{indent} @charWidth = {"
|
67
|
+
i = 0
|
68
|
+
@charWidth.each do |c, w|
|
69
|
+
s << (i % 4 == 0 ? "\n#{indent} " : ' ')
|
70
|
+
i += 1
|
71
|
+
s << "'#{escapedChars(c)}' => #{"%0.3f" % w},"
|
72
|
+
end
|
73
|
+
s << "\n#{indent} },\n"
|
74
|
+
|
75
|
+
s << "#{indent} @kerningDelta = {"
|
76
|
+
i = 0
|
77
|
+
@kerningDelta.each do |cp, w|
|
78
|
+
s << (i % 4 == 0 ? "\n#{indent} " : ' ')
|
79
|
+
i += 1
|
80
|
+
s << "'#{cp}' => #{"%.3f" % w},"
|
81
|
+
end
|
82
|
+
s << "\n#{indent} }\n#{indent})\n"
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def escapedChars(c)
|
88
|
+
c.gsub(/\\/, '\\\\\\\\').gsub(/'/, '\\\\\'')
|
89
|
+
end
|
90
|
+
|
91
|
+
def generateMetrics
|
92
|
+
@pdf = Prawn::Document.new
|
93
|
+
ttfDir = "/usr/share/fonts/truetype/"
|
94
|
+
@pdf.font_families.update(
|
95
|
+
"LiberationSans" => {
|
96
|
+
:bold => "#{ttfDir}LiberationSans-Bold.ttf",
|
97
|
+
:italic => "#{ttfDir}LiberationSans-Italic.ttf",
|
98
|
+
:bold_italic => "#{ttfDir}LiberationSans-BoldItalic.ttf",
|
99
|
+
:normal => "#{ttfDir}LiberationSans-Regular.ttf"
|
100
|
+
}
|
101
|
+
)
|
102
|
+
|
103
|
+
@pdf.font(@fontName, :size => @ptSize, :style => @type)
|
104
|
+
|
105
|
+
# Determine the height of the font.
|
106
|
+
@height = @pdf.height_of("jjggMMWW")
|
107
|
+
|
108
|
+
@charWidth = {}
|
109
|
+
@averageWidth = 0.0
|
110
|
+
MIN_GLYPH_INDEX.upto(MAX_GLYPH_INDEX) do |c|
|
111
|
+
char = "" << c
|
112
|
+
begin
|
113
|
+
@charWidth[char] = (w = @pdf.width_of(char))
|
114
|
+
rescue
|
115
|
+
# the glyph is not in this font.
|
116
|
+
end
|
117
|
+
@averageWidth += w
|
118
|
+
end
|
119
|
+
@averageWidth /= (MAX_GLYPH_INDEX - MIN_GLYPH_INDEX)
|
120
|
+
|
121
|
+
@kerningDelta = {}
|
122
|
+
MIN_GLYPH_INDEX.upto(MAX_GLYPH_INDEX) do |c1|
|
123
|
+
char1 = "" << c1
|
124
|
+
next unless (cw1 = glyphWidth(char1))
|
125
|
+
|
126
|
+
MIN_GLYPH_INDEX.upto(MAX_GLYPH_INDEX) do |c2|
|
127
|
+
char2 = "" << c2
|
128
|
+
next unless (cw2 = glyphWidth(char2))
|
129
|
+
|
130
|
+
chars = char1 + char2
|
131
|
+
# The kerneing delta is the difference between the computed width
|
132
|
+
# of the combined characters and the sum of the individual
|
133
|
+
# character widths.
|
134
|
+
delta = @pdf.width_of(chars, :kerning => true) - (cw1 + cw2)
|
135
|
+
|
136
|
+
# We ususally don't use Strings longer than 100 characters. So we
|
137
|
+
# can ignore kerning deltas below a certain threshhold.
|
138
|
+
if delta.abs > 0.001
|
139
|
+
@kerningDelta[chars] = delta
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|