dyi 1.2.1 → 1.3.0

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/CHANGES CHANGED
@@ -1,5 +1,16 @@
1
1
  = DYI Changelog
2
2
 
3
+ == Version 1.3.0 / 2012-06-01
4
+ * Major Enhancement
5
+ * Can draw a predefined shape.
6
+ * Radial gradient support.
7
+ * Minor Enhancement
8
+ * Adds options to LineChart.
9
+ * Changes project URL.
10
+ * Adds method that draws logomark of DYI.
11
+ * Bug Fixes
12
+ * Revises spell-miss in DYI::Element#add_css_class.
13
+
3
14
  == Version 1.2.1 / 2012-05-01
4
15
  * Bug Fixes
5
16
  * A name of marker-option of LineChart is wrong.
data/README CHANGED
@@ -6,7 +6,7 @@ to output other format; for example, EPS.
6
6
 
7
7
  == License
8
8
 
9
- Copyright (c) 2009-2011 Sound-F Co., Ltd. All rights reserved.
9
+ Copyright (c) 2009-2012 Sound-F Co., Ltd. All rights reserved.
10
10
 
11
11
  DYI is free software: you can redistribute it and/or modify it
12
12
  under the terms of the GNU General Public License as published by
@@ -29,5 +29,4 @@ and forums.
29
29
 
30
30
  We are also preparing the Japanese mailing list. More infomation
31
31
  about the mailing list is indicated to
32
- <http://open-dyi.org/contents.html#community> in Japanese,
33
- including how to join it.
32
+ <http://open-dyi.org/community.html>, including how to join it.
@@ -1,28 +1,104 @@
1
- # -*- encoding: UTF-8 -*-
2
-
3
- require 'rubygems'
4
- require 'dyi'
5
-
6
- canvas = DYI::Canvas.new(400, 300)
7
-
8
- rect = DYI::Drawing::Brush.new(:color=>'#51ADE2').draw_rectangle(canvas, [10,10], 300, 200)
9
- rect.add_painting_animation(:from => {:fill => '#51ADE2'},
10
- :to => {:fill => 'red'},
11
- :duration => 3,
12
- :begin_event => DYI::Event.mouseover(rect),
13
- :end_event => DYI::Event.mouseout(rect),
14
- :fill => 'freeze')
15
- text = DYI::Drawing::Brush.new.draw_text(canvas,
16
- [100,250],
17
- 'click me!',
18
- :show_border => true,
19
- :border_color=>'#325BA8',
20
- :padding => 8,
21
- :border_rx => 10,
22
- :border_width => 3,
23
- :background_color=>'#A5C7F8')
24
- rect.add_painting_animation(:to => {:fill => 'green'},
25
- :begin_event => DYI::Event.click(text),
26
- :fill => 'freeze')
27
-
28
- canvas.save('output/animation.svg')
1
+ # -*- encoding: UTF-8 -*-
2
+
3
+ require 'rubygems'
4
+ require 'dyi'
5
+
6
+ canvas = DYI::Canvas.new(250, 140)
7
+ canvas.title = 'Animation Icons without Script'
8
+ canvas.description = 'This image is a sample of DYI which uses SVG animation.'
9
+
10
+ # Left-Hand Icon
11
+ icon1 = DYI::Shape::ShapeGroup.draw_on(canvas)
12
+ pen = DYI::Drawing::Pen.new(:stroke_width => 6, :stroke_linecap => 'round')
13
+ pen.color = '#DDD'
14
+ line = pen.draw_line(icon1, [10,0], [18,0])
15
+ line.add_painting_animation(:from => {:stroke => '#DDD'},
16
+ :relays => [{:stroke => '#DDD'}, {:stroke => '#333'}, {:stroke => '#DDD'}],
17
+ :to => {:stroke => '#DDD'},
18
+ :relay_times => [0.125, 0.125, 0.75],
19
+ :duration => 1,
20
+ :repeat_count => 0)
21
+ line = pen.draw_line(icon1, [10,0], [18,0])
22
+ line.rotate(45)
23
+ line.add_painting_animation(:from => {:stroke => '#DDD'},
24
+ :relays => [{:stroke => '#DDD'}, {:stroke => '#333'}, {:stroke => '#DDD'}],
25
+ :to => {:stroke => '#DDD'},
26
+ :relay_times => [0.25, 0.25, 0.825],
27
+ :duration => 1,
28
+ :repeat_count => 0)
29
+ line = pen.draw_line(icon1, [10,0], [18,0])
30
+ line.rotate(90)
31
+ line.add_painting_animation(:from => {:stroke => '#DDD'},
32
+ :relays => [{:stroke => '#DDD'}, {:stroke => '#333'}],
33
+ :to => {:stroke => '#DDD'},
34
+ :relay_times => [0.375, 0.375, 1],
35
+ :duration => 1,
36
+ :repeat_count => 0)
37
+ line = pen.draw_line(icon1, [10,0], [18,0])
38
+ line.rotate(135)
39
+ line.add_painting_animation(:from => {:stroke => '#BBB'},
40
+ :relays => [{:stroke => '#DDD'}, {:stroke => '#DDD'}, {:stroke => '#333'}],
41
+ :to => {:stroke => '#BBB'},
42
+ :relay_times => [0.125, 0.5, 0.5],
43
+ :duration => 1,
44
+ :repeat_count => 0)
45
+ pen.color = '#999'
46
+ line = pen.draw_line(icon1, [10,0], [18,0])
47
+ line.rotate(180)
48
+ line.add_painting_animation(:from => {:stroke => '#999'},
49
+ :relays => [{:stroke => '#DDD'}, {:stroke => '#DDD'}, {:stroke => '#333'}],
50
+ :to => {:stroke => '#999'},
51
+ :relay_times => [0.25, 0.625, 0.625],
52
+ :duration => 1,
53
+ :repeat_count => 0)
54
+ pen.color = '#777'
55
+ line = pen.draw_line(icon1, [10,0], [18,0])
56
+ line.rotate(225)
57
+ line.add_painting_animation(:from => {:stroke => '#777'},
58
+ :relays => [{:stroke => '#DDD'}, {:stroke => '#DDD'}, {:stroke => '#333'}],
59
+ :to => {:stroke => '#777'},
60
+ :relay_times => [0.375, 0.75, 0.75],
61
+ :duration => 1,
62
+ :repeat_count => 0)
63
+ pen.color = '#555'
64
+ line = pen.draw_line(icon1, [10,0], [18,0])
65
+ line.rotate(270)
66
+ line.add_painting_animation(:from => {:stroke => '#555'},
67
+ :relays => [{:stroke => '#DDD'}, {:stroke => '#DDD'}, {:stroke => '#333'}],
68
+ :to => {:stroke => '#555'},
69
+ :relay_times => [0.5, 0.875, 0.875],
70
+ :duration => 1,
71
+ :repeat_count => 0)
72
+ pen.color = '#333'
73
+ line = pen.draw_line(icon1, [10,0], [18,0])
74
+ line.rotate(315)
75
+ line.add_painting_animation(:from => {:stroke => '#333'},
76
+ :relays => [{:stroke => '#DDD'}, {:stroke => '#DDD'}],
77
+ :to => {:stroke => '#333'},
78
+ :relay_times => [0.625, 1],
79
+ :duration => 1,
80
+ :repeat_count => 0)
81
+ icon1.translate(70,70)
82
+
83
+ # Right-Hand Icon
84
+ icon2 = DYI::Shape::ShapeGroup.draw_on(canvas)
85
+ brush = DYI::Drawing::Brush.new(:color => '#08A')
86
+ brush.draw_closed_path(icon2, [-14.489, -3.882]){|path|
87
+ path.arc_to([12.99, -7.5], 15, 15)
88
+ path.line_to([17.321, -10], [14.5, 0], [4.33, -2.5], [8.66, -5])
89
+ path.arc_to([-9.397, -3.42], 10, 10, 0, false, false)
90
+ }
91
+ brush.draw_closed_path(icon2, [14.489, 3.882]){|path|
92
+ path.arc_to([-12.99, 7.5], 15, 15)
93
+ path.line_to([-17.321, 10], [-14.5, 0], [-4.33, 2.5], [-8.66, 5])
94
+ path.arc_to([9.397, 3.42], 10, 10, 0, false, false)
95
+ }
96
+ icon2.add_transform_animation(:rotate,
97
+ :from => 0,
98
+ :to => 360,
99
+ :duration => 1.5,
100
+ :repeat_count => 0,
101
+ :additive => 'sum')
102
+ icon2.translate(180,70)
103
+
104
+ canvas.save('output/animation.svg')
@@ -0,0 +1,152 @@
1
+ # -*- encoding: UTF-8 -*-
2
+
3
+ require 'rubygems'
4
+ require 'dyi'
5
+
6
+ include DYI::Script::EcmaScript::DomLevel2
7
+
8
+ settings = {
9
+ :hour => {:center => [250, 60], :rx => 220, :ry => 20},
10
+ :minute => {:center => [250, 91], :rx => 220, :ry => 32},
11
+ :second => {:center => [250, 122], :rx => 220, :ry => 44}}
12
+ settings.each do |key, value|
13
+ value[:label_position] = DYI::Coordinate.new(value[:center][0],
14
+ value[:center][1] + value[:ry] + 10)
15
+ end
16
+
17
+ canvas = DYI::Canvas.new(500, 200)
18
+ canvas.title = 'Circle Clock'
19
+ canvas.description = 'This image is a sample of DYI which uses a client script.'
20
+
21
+ pen = DYI::Drawing::Pen.new
22
+
23
+ gradient = DYI::Drawing::ColorEffect::LinearGradient.new([0,0],[0,1])
24
+ gradient.add_color(0, 'gainsboro')
25
+ gradient.add_color(1, 'grey')
26
+ line_pen = DYI::Drawing::Pen.new
27
+ line_pen.color = gradient
28
+
29
+ setting = settings[:second]
30
+ sec_group = DYI::Shape::ShapeGroup.draw_on(canvas)
31
+ line_pen.draw_ellipse(sec_group, setting[:center], setting[:rx], setting[:ry])
32
+ 60.times do |i|
33
+ pen.draw_text(sec_group, [0, 0], i.to_s,
34
+ :text_anchor => 'middle',
35
+ :css_class => i % 5 == 0 ? 'large' : 'small')
36
+ end
37
+ pen.draw_text(canvas, setting[:label_position], 'seconds',
38
+ :text_anchor => 'middle',
39
+ :css_class => 'label')
40
+
41
+ setting = settings[:minute]
42
+ min_group = DYI::Shape::ShapeGroup.draw_on(canvas)
43
+ line_pen.draw_ellipse(min_group, setting[:center], setting[:rx], setting[:ry])
44
+ 60.times do |i|
45
+ pen.draw_text(min_group, [0, 0], i.to_s,
46
+ :text_anchor => 'middle',
47
+ :css_class => i % 5 == 0 ? 'large' : 'small')
48
+ end
49
+ pen.draw_text(canvas, setting[:label_position], 'minutes',
50
+ :text_anchor => 'middle',
51
+ :css_class => 'label')
52
+
53
+ setting = settings[:hour]
54
+ hour_group = DYI::Shape::ShapeGroup.draw_on(canvas)
55
+ line_pen.draw_ellipse(hour_group, setting[:center], setting[:rx], setting[:ry])
56
+ 12.times do |i|
57
+ pen.draw_text(hour_group, [0, 0], (i + 1).to_s,
58
+ :text_anchor => 'middle',
59
+ :css_class => 'large')
60
+ end
61
+ pen.draw_text(canvas, setting[:label_position], 'hours',
62
+ :text_anchor => 'middle',
63
+ :css_class => 'label')
64
+ ap_label = pen.draw_text(canvas, setting[:label_position] + [18, -10], 'A.M.',
65
+ :css_class => 'label')
66
+
67
+ canvas.add_initialize_script(<<-SCRIPT)
68
+ var hourTexts = #{get_element(hour_group)}.getElementsByTagName('text');
69
+ var minTexts = #{get_element(min_group)}.getElementsByTagName('text');
70
+ var secTexts = #{get_element(sec_group)}.getElementsByTagName('text');
71
+ var apLabel = #{get_element(ap_label)};
72
+ var hour = -1, minute = -1, second = -1;
73
+
74
+ function rewrite(){
75
+ var currentTime = new Date();
76
+ var text, i, angle, baseSize;
77
+
78
+ if(hour != currentTime.getHours()){
79
+ hour = currentTime.getHours();
80
+ for(i = 0; i < 12; i++){
81
+ text = hourTexts.item(i);
82
+ angle = Math.PI / 6 * (hour % 12 - i - 1);
83
+ text.setAttribute('x', #{settings[:hour][:rx]} * Math.sin(angle) + #{settings[:hour][:center][0]});
84
+ text.setAttribute('y', #{settings[:hour][:ry]} * Math.cos(angle) + #{settings[:hour][:center][1]});
85
+ text.setAttribute('opacity', (Math.cos(angle) + 1) * 0.375 + 0.25);
86
+ if(hour % 12 == i + 1){
87
+ text.setAttribute('font-size', '20pt');
88
+ }
89
+ else{
90
+ text.setAttribute('font-size', (16 * 200 / (300 - 100 * Math.cos(angle))).toString() + 'pt');
91
+ }
92
+ }
93
+ apLabel.childNodes.item(0).data = hour < 12 ? 'A.M.' : 'P.M.';
94
+ }
95
+
96
+ if(minute != currentTime.getMinutes()){
97
+ minute = currentTime.getMinutes();
98
+ for(i = 0; i < 60; i++){
99
+ text = minTexts.item(i);
100
+ angle = Math.PI / 30 * (minute - i);
101
+ text.setAttribute('x', #{settings[:minute][:rx]} * Math.sin(angle) + #{settings[:minute][:center][0]});
102
+ text.setAttribute('y', #{settings[:minute][:ry]} * Math.cos(angle) + #{settings[:minute][:center][1]});
103
+ text.setAttribute('opacity', (Math.cos(angle) + 1) * 0.375 + 0.25);
104
+ if(minute == i){
105
+ text.setAttribute('font-size', '20pt');
106
+ }
107
+ else{
108
+ baseSize = text.className.baseVal == 'large' ? 12 : 6;
109
+ text.setAttribute('font-size', (baseSize * 200 / (300 - 100 * Math.cos(angle))).toString() + 'pt');
110
+ }
111
+ }
112
+ }
113
+
114
+ if(second != currentTime.getSeconds()){
115
+ second = currentTime.getSeconds();
116
+ for(i = 0; i < 60; i++){
117
+ text = secTexts.item(i);
118
+ angle = Math.PI / 30 * (second - i);
119
+ text.setAttribute('x', #{settings[:second][:rx]} * Math.sin(angle) + #{settings[:second][:center][0]});
120
+ text.setAttribute('y', #{settings[:second][:ry]} * Math.cos(angle) + #{settings[:second][:center][1]});
121
+ text.setAttribute('opacity', (Math.cos(angle) + 1) * 0.375 + 0.25);
122
+ if(second == i){
123
+ text.setAttribute('font-size', '20pt');
124
+ }
125
+ else{
126
+ baseSize = text.className.baseVal == 'large' ? 12 : 6;
127
+ text.setAttribute('font-size', (baseSize * 200 / (300 - 100 * Math.cos(angle))).toString() + 'pt');
128
+ }
129
+ }
130
+ }
131
+ }
132
+
133
+ rewrite();
134
+ setInterval(rewrite, 250);
135
+ SCRIPT
136
+
137
+ canvas.reference_stylesheet_file('http://fonts.googleapis.com/css?family=Great+Vibes')
138
+
139
+ canvas.add_stylesheet(<<-CSS)
140
+ text {
141
+ font-family: 'Great Vibes', cursive;
142
+ }
143
+ text.large {
144
+ font-weight: bold;
145
+ }
146
+ text.label {
147
+ font-size: 10pt;
148
+ text-decoration: underline;
149
+ }
150
+ CSS
151
+
152
+ canvas.save('output/clock.svg')
@@ -1,12 +1,13 @@
1
- 1998,550804,5919793,#008000
2
- 1999,589375,6153010,#008000
3
- 2000,658350,6330959,#008000
4
- 2001,667725,6478207,#008000
5
- 2002,910393,6707326,#008000
6
- 2003,1015445,6767064,#ffa500
7
- 2004,1082958,6891878,#ffa500
8
- 2005,1115568,7015353,#ffa500
9
- 2006,1035779,7129107,#ffa500
10
- 2007,908926,7210963,#ffa500
11
- 2008,883589,7345795,#ffa500
12
- 2009,956238,7542049,#ffa500
1
+ Year,Money Stock,Monetary Base,Color
2
+ 2000,976798,67395,#008000
3
+ 2001,975687,72144,#008000
4
+ 2002,994527,89643,#008000
5
+ 2003,1005732,103726,#008000
6
+ 2004,1023448,110030,#ffa500
7
+ 2005,1028507,111765,#ffa500
8
+ 2006,1025202,96727,#ffa500
9
+ 2007,1026995,90034,#ffa500
10
+ 2008,1034705,91336,#ffa500
11
+ 2009,1053287,96311,#ffa500
12
+ 2010,1075186,100946,#ffa500
13
+ 2011,1098966,114671,#ffa500
@@ -0,0 +1,71 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
+ xmlns:svg="http://www.w3.org/2000/svg">
4
+ <xsl:template match="/svg:svg">
5
+ <xsl:copy>
6
+ <xsl:copy-of select="@version"/>
7
+ <xsl:copy-of select="@viewBox"/>
8
+ <xsl:copy-of select="@preserveAspectRatio"/>
9
+ <xsl:attribute name="viewBox">0 0 861 488</xsl:attribute>
10
+ <xsl:attribute name="width">861</xsl:attribute>
11
+ <xsl:attribute name="height">488</xsl:attribute>
12
+ <svg:defs>
13
+ <svg:filter id="effect1" filterUnits="userSpaceOnUse" x="-5" y="-5"
14
+ width="305" height="185">
15
+ <svg:feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>
16
+ <svg:feOffset in="blur" dx="8" dy="12" result="offsetBlur"/>
17
+ <svg:feMerge>
18
+ <svg:feMergeNode in="offsetBlur"/>
19
+ <svg:feMergeNode in="SourceGraphic"/>
20
+ </svg:feMerge>
21
+ </svg:filter>
22
+ <svg:filter id="effect2" filterUnits="userSpaceOnUse" x="-5" y="-5"
23
+ width="305" height="185">
24
+ <svg:feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>
25
+ <svg:feOffset in="blur" dx="8" dy="12" result="offsetBlur"/>
26
+ <svg:feSpecularLighting in="blur" surfaceScale="5" specularConstant=".75"
27
+ specularExponent="20" lighting-color="#bbbbbb" result="specOut">
28
+ <svg:fePointLight x="-5000" y="-10000" z="20000"/>
29
+ </svg:feSpecularLighting>
30
+ <svg:feComposite in="specOut" in2="SourceAlpha" operator="in" result="specOut"/>
31
+ <svg:feComposite in="SourceGraphic" in2="specOut" operator="arithmetic"
32
+ k1="0" k2="1" k3="1" k4="0" result="litPaint"/>
33
+ </svg:filter>
34
+ </svg:defs>
35
+ <svg:g transform="translate(143.5,81.32) scale(2)">
36
+ <xsl:apply-templates mode="normal"/>
37
+ </svg:g>
38
+ <svg:g transform="translate(95.67,162.64)">
39
+ <xsl:apply-templates mode="line"/>
40
+ </svg:g>
41
+ <svg:g transform="translate(478.35,162.64)" filter="url(#effect1)">
42
+ <xsl:apply-templates mode="effect"/>
43
+ </svg:g>
44
+ </xsl:copy>
45
+ </xsl:template>
46
+
47
+ <xsl:template match="svg:path" mode="normal">
48
+ <xsl:copy>
49
+ <xsl:copy-of select="@*"/>
50
+ </xsl:copy>
51
+ </xsl:template>
52
+
53
+ <xsl:template match="svg:path" mode="line">
54
+ <xsl:copy>
55
+ <xsl:copy-of select="@d"/>
56
+ <xsl:attribute name="fill">#fff</xsl:attribute>
57
+ <xsl:attribute name="fill-opacity">0.9</xsl:attribute>
58
+ <xsl:attribute name="stroke">
59
+ <xsl:value-of select="@fill"/>
60
+ </xsl:attribute>
61
+ <xsl:attribute name="stroke-width">2</xsl:attribute>
62
+ </xsl:copy>
63
+ </xsl:template>
64
+
65
+ <xsl:template match="svg:path" mode="effect">
66
+ <xsl:copy>
67
+ <xsl:copy-of select="@*"/>
68
+ <xsl:attribute name="filter">url(#effect2)</xsl:attribute>
69
+ </xsl:copy>
70
+ </xsl:template>
71
+ </xsl:stylesheet>
@@ -0,0 +1,125 @@
1
+ # -*- encoding: UTF-8 -*-
2
+
3
+ require 'rubygems'
4
+ require 'dyi'
5
+
6
+ include DYI::Script::EcmaScript::DomLevel2
7
+
8
+ path_points = [
9
+ [197, 42.141], [419.42, 172.747], [197, 306.472],
10
+ [241.055, 264.061], [374, 172.748], [241.055, 84.553]
11
+ ]
12
+ ctrl_points = [
13
+ [262.211, 42.141], [419.42, 27.495], [419.42, 323.496], [260.69, 306.472],
14
+ [270.044, 264.061], [374, 272.829], [374, 75.829], [269.211, 84.553]
15
+ ]
16
+
17
+ canvas = DYI::Canvas.new(625, 350)
18
+ canvas.title = 'Letter D'
19
+ canvas.description = 'This image is a sample of DYI which is drawn Bezier curves.'
20
+
21
+ pen = DYI::Drawing::Pen.new(:width => 0, :color => nil)
22
+ rect = pen.draw_rectangle(canvas, [1,1], canvas.width - 2, canvas.height - 2)
23
+
24
+ letter = pen.draw_path(canvas, path_points[0]){|path|
25
+ path.curve_to(ctrl_points[0], ctrl_points[1], path_points[1])
26
+ path.curve_to(ctrl_points[2], ctrl_points[3], path_points[2])
27
+ path.close_path
28
+ path.move_to(path_points[3])
29
+ path.curve_to(ctrl_points[4], ctrl_points[5], path_points[4])
30
+ path.curve_to(ctrl_points[6], ctrl_points[7], path_points[5])
31
+ path.close_path
32
+ path.set_marker(:all, :circle, :size => 5)
33
+ }
34
+
35
+ lines = []
36
+ lines << pen.draw_line(canvas, path_points[0], ctrl_points[0])
37
+ lines << pen.draw_line(canvas, path_points[1], ctrl_points[1])
38
+ lines << pen.draw_line(canvas, path_points[1], ctrl_points[2])
39
+ lines << pen.draw_line(canvas, path_points[2], ctrl_points[3])
40
+ lines << pen.draw_line(canvas, path_points[3], ctrl_points[4])
41
+ lines << pen.draw_line(canvas, path_points[4], ctrl_points[5])
42
+ lines << pen.draw_line(canvas, path_points[4], ctrl_points[6])
43
+ lines << pen.draw_line(canvas, path_points[5], ctrl_points[7])
44
+
45
+ circles = ctrl_points.map do |ctrl_pt|
46
+ circle = pen.draw_circle(canvas, ctrl_pt, 7.5)
47
+ circle.set_event(nil)
48
+ circle
49
+ end
50
+
51
+ dragging = DYI::Script::EcmaScript::EventListener.new(<<SCRIPT)
52
+ if(target_id == null) return;
53
+ var x = evt.pageX;
54
+ var y = evt.pageY;
55
+ circles[target_id].cx.baseVal.value = x;
56
+ circles[target_id].cy.baseVal.value = y;
57
+ lines[target_id].x2.baseVal.value = x;
58
+ lines[target_id].y2.baseVal.value = y;
59
+ letter.pathSegList.getItem(command_ids[target_id])['x' + (target_id % 2 == 0 ? '1' : '2')] = x;
60
+ letter.pathSegList.getItem(command_ids[target_id])['y' + (target_id % 2 == 0 ? '1' : '2')] = y;
61
+ SCRIPT
62
+
63
+ end_drag = DYI::Script::EcmaScript::EventListener.new(<<SCRIPT)
64
+ if(target_id == null) return;
65
+ circles[target_id].className.baseVal = '';
66
+ lines[target_id].className.baseVal = '';
67
+ target_id = null;
68
+ SCRIPT
69
+
70
+ canvas.add_script(<<SCRIPT)
71
+ var target_id = null;
72
+ var command_ids = [1, 1, 2, 2, 5, 5, 6, 6];
73
+ var letter, lines, circles
74
+ SCRIPT
75
+
76
+ canvas.add_initialize_script(<<SCRIPT)
77
+ letter = #{get_element(letter)};
78
+ lines = [#{lines.map{|l| get_element(l)}.join(',')}];
79
+ circles = [#{circles.map{|c| get_element(c)}.join(',')}];
80
+ SCRIPT
81
+
82
+ circles.each_with_index do |circle, i|
83
+ start_drag = DYI::Script::EcmaScript::EventListener.new(<<-SCRIPT)
84
+ if(target_id != null) return;
85
+ target_id = #{i};
86
+ circles[target_id].className.baseVal = 'target';
87
+ lines[target_id].className.baseVal = 'target';
88
+ SCRIPT
89
+
90
+ circle.add_event_listener(:mousedown, start_drag)
91
+ circle.add_event_listener(:mousemove, dragging)
92
+ circle.add_event_listener(:mouseup, end_drag)
93
+ end
94
+ rect.add_event_listener(:mousemove, dragging)
95
+ rect.add_event_listener(:mouseup, end_drag)
96
+
97
+ canvas.add_stylesheet(<<CSS)
98
+ path {
99
+ fill: #C3DAFF;
100
+ stroke: #666666;
101
+ stroke-width: 3;
102
+ }
103
+ svg > circle {
104
+ fill: white;
105
+ stroke: #336699;
106
+ stroke-width: 1;
107
+ cursor: move;
108
+ }
109
+ marker circle{
110
+ fill: #666666
111
+ }
112
+ line {
113
+ stroke: #003DA2;
114
+ stroke-width: 2;
115
+ stroke-dasharray: 6,4;
116
+ }
117
+ circle.target{
118
+ fill: #33CCFF;
119
+ }
120
+ line.target{
121
+ stroke: #33CCFF;
122
+ }
123
+ CSS
124
+
125
+ canvas.save('output/letter.svg')