rsyntaxtree 0.9.3 → 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.tags +179 -0
- data/Gemfile +2 -0
- data/README.md +35 -29
- data/Rakefile +7 -0
- data/bin/rsyntaxtree +42 -31
- data/fonts/OpenMoji-Black.ttf +0 -0
- data/fonts/OpenMoji-Color.ttf +0 -0
- data/img/elements/circle.png +0 -0
- data/img/elements/circle_abc.png +0 -0
- data/img/elements/circle_bold.png +0 -0
- data/img/elements/circle_hatched.png +0 -0
- data/img/elements/circle_one.png +0 -0
- data/img/elements/connector.png +0 -0
- data/img/elements/connector_bold.png +0 -0
- data/img/elements/square.png +0 -0
- data/img/elements/square_abc.png +0 -0
- data/img/elements/square_bold.png +0 -0
- data/img/elements/square_hatched.png +0 -0
- data/img/elements/square_one.png +0 -0
- data/img/rsyntaxtree.png +0 -0
- data/img/sample.png +0 -0
- data/img/sample.svg +38 -0
- data/lib/rsyntaxtree/base_graph.rb +262 -0
- data/lib/rsyntaxtree/element.rb +156 -25
- data/lib/rsyntaxtree/elementlist.rb +16 -13
- data/lib/rsyntaxtree/markup_parser.rb +208 -0
- data/lib/rsyntaxtree/string_parser.rb +187 -204
- data/lib/rsyntaxtree/svg_graph.rb +471 -298
- data/lib/rsyntaxtree/utils.rb +49 -6
- data/lib/rsyntaxtree/version.rb +1 -1
- data/lib/rsyntaxtree.rb +144 -161
- data/rsyntaxtree.gemspec +2 -0
- data/test/markup_parser_test.rb +207 -0
- metadata +52 -11
- data/fonts/latinmodern-math.otf +0 -0
- data/fonts/lmroman10-bold.otf +0 -0
- data/fonts/lmroman10-bolditalic.otf +0 -0
- data/fonts/lmroman10-italic.otf +0 -0
- data/fonts/lmroman10-regular.otf +0 -0
- data/lib/rsyntaxtree/error_message.rb +0 -68
- data/lib/rsyntaxtree/graph.rb +0 -312
- data/lib/rsyntaxtree/tree_graph.rb +0 -327
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82885cdb8bb5fac82224d762cf2244ad8e5c5400d96ffd2f4857f16ad7293827
|
4
|
+
data.tar.gz: 5c00b9970c323030cc0ea9a5e9db35e83bc34ecbe82501e022d2ec1b957b0182
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92e0e77a86d01b0c366c9bfd769349652b6773c61937ddc24e9097fe282e76a90d9de91ee931ee73bb1af49535887385e23d10e2d466a47f22abaa6299d6fcdb
|
7
|
+
data.tar.gz: ba0163a1abe6d56c26a82dd5a9e13e85a03f23d5119aed67e32913d99a61e08f1b42889b4b18de3e92add60e64ad52cd2b67451c697d3d2c638b1ab15150146f
|
data/.gitignore
CHANGED
data/.tags
ADDED
@@ -0,0 +1,179 @@
|
|
1
|
+
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
|
2
|
+
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
|
3
|
+
!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/
|
4
|
+
!_TAG_OUTPUT_FILESEP slash /slash or backslash/
|
5
|
+
!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/
|
6
|
+
!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/
|
7
|
+
!_TAG_PROC_CWD /Users/yohasebe/Dropbox/code/rsyntaxtree/ //
|
8
|
+
!_TAG_PROGRAM_AUTHOR Universal Ctags Team //
|
9
|
+
!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/
|
10
|
+
!_TAG_PROGRAM_URL https://ctags.io/ /official site/
|
11
|
+
!_TAG_PROGRAM_VERSION 5.9.0 /58c0e68a/
|
12
|
+
Author README.md /^### Author$/;" S chapter:🌲 RSyntaxTree: yet another syntax tree generator in Ruby
|
13
|
+
BaseGraph lib/rsyntaxtree/base_graph.rb /^ class BaseGraph$/;" c class:RSyntaxTree
|
14
|
+
BaseGraph lib/rsyntaxtree/base_graph.rb /^ class BaseGraph$/;" c module:RSyntaxTree
|
15
|
+
Development README.md /^### Development$/;" S chapter:🌲 RSyntaxTree: yet another syntax tree generator in Ruby
|
16
|
+
ETYPE_LEAF lib/rsyntaxtree.rb /^ETYPE_LEAF = 2$/;" C
|
17
|
+
ETYPE_NODE lib/rsyntaxtree.rb /^ETYPE_NODE = 1$/;" C
|
18
|
+
Element lib/rsyntaxtree/element.rb /^ class Element$/;" c class:RSyntaxTree
|
19
|
+
Element lib/rsyntaxtree/element.rb /^ class Element$/;" c module:RSyntaxTree
|
20
|
+
ElementList lib/rsyntaxtree/elementlist.rb /^ class ElementList$/;" c class:RSyntaxTree
|
21
|
+
ElementList lib/rsyntaxtree/elementlist.rb /^ class ElementList$/;" c module:RSyntaxTree
|
22
|
+
Example README.md /^### Example$/;" S chapter:🌲 RSyntaxTree: yet another syntax tree generator in Ruby
|
23
|
+
FONT_DIR lib/rsyntaxtree.rb /^FONT_DIR = File.expand_path(File.dirname(__FILE__) + "\/..\/fonts")$/;" C
|
24
|
+
FONT_SCALING lib/rsyntaxtree.rb /^FONT_SCALING = 2$/;" C
|
25
|
+
FontMetrics lib/rsyntaxtree/utils.rb /^module FontMetrics$/;" m
|
26
|
+
Installation README.md /^### Installation$/;" S chapter:🌲 RSyntaxTree: yet another syntax tree generator in Ruby
|
27
|
+
License README.md /^### License$/;" S chapter:🌲 RSyntaxTree: yet another syntax tree generator in Ruby
|
28
|
+
Markup lib/rsyntaxtree/markup_parser.rb /^module Markup$/;" m
|
29
|
+
MarkupParser lib/rsyntaxtree/markup_parser.rb /^class MarkupParser < Parslet::Parser$/;" c
|
30
|
+
MarkupParserTest test/markup_parser_test.rb /^class MarkupParserTest < Minitest::Test$/;" c
|
31
|
+
RSGenerator lib/rsyntaxtree.rb /^ class RSGenerator$/;" c class:RSyntaxTree
|
32
|
+
RSGenerator lib/rsyntaxtree.rb /^ class RSGenerator$/;" c module:RSyntaxTree
|
33
|
+
RSTError lib/rsyntaxtree.rb /^class RSTError < StandardError$/;" c
|
34
|
+
RSyntaxTree lib/rsyntaxtree.rb /^module RSyntaxTree$/;" m
|
35
|
+
RSyntaxTree lib/rsyntaxtree/base_graph.rb /^module RSyntaxTree$/;" m
|
36
|
+
RSyntaxTree lib/rsyntaxtree/element.rb /^module RSyntaxTree$/;" m
|
37
|
+
RSyntaxTree lib/rsyntaxtree/elementlist.rb /^module RSyntaxTree$/;" m
|
38
|
+
RSyntaxTree lib/rsyntaxtree/string_parser.rb /^module RSyntaxTree$/;" m
|
39
|
+
RSyntaxTree lib/rsyntaxtree/svg_graph.rb /^module RSyntaxTree$/;" m
|
40
|
+
RSyntaxTree lib/rsyntaxtree/version.rb /^module RSyntaxTree$/;" m
|
41
|
+
SUBSCRIPT_CONST lib/rsyntaxtree.rb /^SUBSCRIPT_CONST = 0.7$/;" C
|
42
|
+
SVGGraph lib/rsyntaxtree/svg_graph.rb /^ class SVGGraph < BaseGraph$/;" c class:RSyntaxTree
|
43
|
+
SVGGraph lib/rsyntaxtree/svg_graph.rb /^ class SVGGraph < BaseGraph$/;" c module:RSyntaxTree
|
44
|
+
String lib/rsyntaxtree/utils.rb /^class String$/;" c
|
45
|
+
StringParser lib/rsyntaxtree/string_parser.rb /^ class StringParser$/;" c class:RSyntaxTree
|
46
|
+
StringParser lib/rsyntaxtree/string_parser.rb /^ class StringParser$/;" c module:RSyntaxTree
|
47
|
+
Tips README.md /^### Tips$/;" S chapter:🌲 RSyntaxTree: yet another syntax tree generator in Ruby
|
48
|
+
Usage README.md /^### Usage$/;" S chapter:🌲 RSyntaxTree: yet another syntax tree generator in Ruby
|
49
|
+
VERSION lib/rsyntaxtree/version.rb /^ VERSION = "1.0.2"$/;" C module:RSyntaxTree
|
50
|
+
WHITESPACE_BLOCK lib/rsyntaxtree.rb /^WHITESPACE_BLOCK = "■"$/;" C
|
51
|
+
Web Interface README.md /^### Web Interface$/;" S chapter:🌲 RSyntaxTree: yet another syntax tree generator in Ruby
|
52
|
+
add lib/rsyntaxtree/elementlist.rb /^ def add(element)$/;" f class:RSyntaxTree.ElementList
|
53
|
+
add_child lib/rsyntaxtree/element.rb /^ def add_child(child_id)$/;" f class:RSyntaxTree.Element
|
54
|
+
all_emoji? lib/rsyntaxtree/utils.rb /^ def all_emoji?$/;" f class:String
|
55
|
+
calculate_height lib/rsyntaxtree/base_graph.rb /^ def calculate_height(id = 1)$/;" f class:RSyntaxTree.BaseGraph
|
56
|
+
calculate_indent lib/rsyntaxtree/base_graph.rb /^ def calculate_indent$/;" f class:RSyntaxTree.BaseGraph
|
57
|
+
calculate_level lib/rsyntaxtree/base_graph.rb /^ def calculate_level$/;" f class:RSyntaxTree.BaseGraph
|
58
|
+
calculate_width lib/rsyntaxtree/base_graph.rb /^ def calculate_width(id = 1)$/;" f class:RSyntaxTree.BaseGraph
|
59
|
+
check_data lib/rsyntaxtree.rb /^ def self.check_data(text)$/;" F class:RSyntaxTree.RSGenerator
|
60
|
+
check_data lib/rsyntaxtree.rb /^ def self.check_data(text)$/;" S class:RSyntaxTree.RSGenerator
|
61
|
+
contains_cjk? lib/rsyntaxtree/utils.rb /^ def contains_cjk?$/;" f class:String
|
62
|
+
contains_emoji? lib/rsyntaxtree/utils.rb /^ def contains_emoji?$/;" f class:String
|
63
|
+
data lib/rsyntaxtree/string_parser.rb /^ attr_accessor :data, :elist, :pos, :id, :level$/;" A class:RSyntaxTree.StringParser
|
64
|
+
data= lib/rsyntaxtree/string_parser.rb /^ attr_accessor :data, :elist, :pos, :id, :level$/;" A class:RSyntaxTree.StringParser
|
65
|
+
draw_a_path lib/rsyntaxtree/svg_graph.rb /^ def draw_a_path(s_x, s_y, t_x, t_y, target_arrow = :none)$/;" f class:RSyntaxTree.SVGGraph
|
66
|
+
draw_connector lib/rsyntaxtree/base_graph.rb /^ def draw_connector(id = 1)$/;" f class:RSyntaxTree.BaseGraph
|
67
|
+
draw_element lib/rsyntaxtree/svg_graph.rb /^ def draw_element(element)$/;" f class:RSyntaxTree.SVGGraph
|
68
|
+
draw_elements lib/rsyntaxtree/base_graph.rb /^ def draw_elements$/;" f class:RSyntaxTree.BaseGraph
|
69
|
+
draw_paths lib/rsyntaxtree/svg_graph.rb /^ def draw_paths$/;" f class:RSyntaxTree.SVGGraph
|
70
|
+
draw_png lib/rsyntaxtree.rb /^ def draw_png(binary = false)$/;" f class:RSyntaxTree.RSGenerator
|
71
|
+
draw_svg lib/rsyntaxtree.rb /^ def draw_svg$/;" f class:RSyntaxTree.RSGenerator
|
72
|
+
draw_tree lib/rsyntaxtree.rb /^ def draw_tree$/;" f class:RSyntaxTree.RSGenerator
|
73
|
+
elements lib/rsyntaxtree/elementlist.rb /^ attr_accessor :elements, :iterator $/;" A class:RSyntaxTree.ElementList
|
74
|
+
elements= lib/rsyntaxtree/elementlist.rb /^ attr_accessor :elements, :iterator $/;" A class:RSyntaxTree.ElementList
|
75
|
+
elist lib/rsyntaxtree/string_parser.rb /^ attr_accessor :data, :elist, :pos, :id, :level$/;" A class:RSyntaxTree.StringParser
|
76
|
+
elist= lib/rsyntaxtree/string_parser.rb /^ attr_accessor :data, :elist, :pos, :id, :level$/;" A class:RSyntaxTree.StringParser
|
77
|
+
generate_line lib/rsyntaxtree/svg_graph.rb /^ def generate_line(x1, y1, x2, y2, col, dashed = false, arrow = false, stroke_width = 1)$/;" f class:RSyntaxTree.SVGGraph
|
78
|
+
get_child_count lib/rsyntaxtree/elementlist.rb /^ def get_child_count(id)$/;" f class:RSyntaxTree.ElementList
|
79
|
+
get_children lib/rsyntaxtree/elementlist.rb /^ def get_children(id)$/;" f class:RSyntaxTree.ElementList
|
80
|
+
get_element_width lib/rsyntaxtree/elementlist.rb /^ def get_element_width(id)$/;" f class:RSyntaxTree.ElementList
|
81
|
+
get_elementlist lib/rsyntaxtree/string_parser.rb /^ def get_elementlist$/;" f class:RSyntaxTree.StringParser
|
82
|
+
get_elements lib/rsyntaxtree/elementlist.rb /^ def get_elements$/;" f class:RSyntaxTree.ElementList
|
83
|
+
get_first lib/rsyntaxtree/elementlist.rb /^ def get_first$/;" f class:RSyntaxTree.ElementList
|
84
|
+
get_id lib/rsyntaxtree/elementlist.rb /^ def get_id(id)$/;" f class:RSyntaxTree.ElementList
|
85
|
+
get_indent lib/rsyntaxtree/elementlist.rb /^ def get_indent(id)$/;" f class:RSyntaxTree.ElementList
|
86
|
+
get_leftmost lib/rsyntaxtree/base_graph.rb /^ def get_leftmost(id = 1)$/;" f class:RSyntaxTree.BaseGraph
|
87
|
+
get_level_height lib/rsyntaxtree/elementlist.rb /^ def get_level_height$/;" f class:RSyntaxTree.ElementList
|
88
|
+
get_metrics lib/rsyntaxtree/utils.rb /^ def get_metrics(text, font, fontsize, font_style, font_weight)$/;" f class:FontMetrics
|
89
|
+
get_metrics lib/rsyntaxtree/utils.rb /^ def get_metrics(text, font, fontsize, font_style, font_weight)$/;" f module:FontMetrics
|
90
|
+
get_next lib/rsyntaxtree/elementlist.rb /^ def get_next$/;" f class:RSyntaxTree.ElementList
|
91
|
+
get_next_token lib/rsyntaxtree/string_parser.rb /^ def get_next_token$/;" f class:RSyntaxTree.StringParser
|
92
|
+
get_rightmost lib/rsyntaxtree/base_graph.rb /^ def get_rightmost(id = 1)$/;" f class:RSyntaxTree.BaseGraph
|
93
|
+
height lib/rsyntaxtree/svg_graph.rb /^ attr_accessor :width, :height$/;" A class:RSyntaxTree.SVGGraph
|
94
|
+
height= lib/rsyntaxtree/svg_graph.rb /^ attr_accessor :width, :height$/;" A class:RSyntaxTree.SVGGraph
|
95
|
+
id lib/rsyntaxtree/element.rb /^ attr_accessor :id,$/;" A class:RSyntaxTree.Element
|
96
|
+
id lib/rsyntaxtree/string_parser.rb /^ attr_accessor :data, :elist, :pos, :id, :level$/;" A class:RSyntaxTree.StringParser
|
97
|
+
id= lib/rsyntaxtree/element.rb /^ attr_accessor :id,$/;" A class:RSyntaxTree.Element
|
98
|
+
id= lib/rsyntaxtree/string_parser.rb /^ attr_accessor :data, :elist, :pos, :id, :level$/;" A class:RSyntaxTree.StringParser
|
99
|
+
initialize lib/rsyntaxtree.rb /^ def initialize(params = {})$/;" f class:RSyntaxTree.RSGenerator
|
100
|
+
initialize lib/rsyntaxtree.rb /^ def initialize(msg="Error: something unexpected occurred")$/;" f class:RSTError
|
101
|
+
initialize lib/rsyntaxtree/base_graph.rb /^ def initialize(element_list, params)$/;" f class:RSyntaxTree.BaseGraph
|
102
|
+
initialize lib/rsyntaxtree/element.rb /^ def initialize(id, parent, content, level, fontset, fontsize)$/;" f class:RSyntaxTree.Element
|
103
|
+
initialize lib/rsyntaxtree/elementlist.rb /^ def initialize$/;" f class:RSyntaxTree.ElementList
|
104
|
+
initialize lib/rsyntaxtree/string_parser.rb /^ def initialize(str, fontset, fontsize)$/;" f class:RSyntaxTree.StringParser
|
105
|
+
initialize lib/rsyntaxtree/svg_graph.rb /^ def initialize(element_list, params)$/;" f class:RSyntaxTree.SVGGraph
|
106
|
+
iterator lib/rsyntaxtree/elementlist.rb /^ attr_accessor :elements, :iterator $/;" A class:RSyntaxTree.ElementList
|
107
|
+
iterator= lib/rsyntaxtree/elementlist.rb /^ attr_accessor :elements, :iterator $/;" A class:RSyntaxTree.ElementList
|
108
|
+
level lib/rsyntaxtree/string_parser.rb /^ attr_accessor :data, :elist, :pos, :id, :level$/;" A class:RSyntaxTree.StringParser
|
109
|
+
level= lib/rsyntaxtree/string_parser.rb /^ attr_accessor :data, :elist, :pos, :id, :level$/;" A class:RSyntaxTree.StringParser
|
110
|
+
line_to_parent lib/rsyntaxtree/svg_graph.rb /^ def line_to_parent(parent, child)$/;" f class:RSyntaxTree.SVGGraph
|
111
|
+
line_to_parent lib/rsyntaxtree/svg_graph.rb /^ def line_to_parent(parent, child)$/;" f class:RSyntaxTree
|
112
|
+
line_to_parent2 lib/rsyntaxtree/svg_graph.rb /^ def line_to_parent2(parent, child)$/;" f class:RSyntaxTree.SVGGraph
|
113
|
+
make_balance lib/rsyntaxtree/base_graph.rb /^ def make_balance(id = 1)$/;" f class:RSyntaxTree.BaseGraph
|
114
|
+
make_tree lib/rsyntaxtree/string_parser.rb /^ def make_tree(parent)$/;" f class:RSyntaxTree.StringParser
|
115
|
+
monoline_to_parent lib/rsyntaxtree/svg_graph.rb /^ def monoline_to_parent(parent, child)$/;" f class:RSyntaxTree.SVGGraph
|
116
|
+
node_centering lib/rsyntaxtree/base_graph.rb /^ def node_centering$/;" f class:RSyntaxTree.BaseGraph
|
117
|
+
parse lib/rsyntaxtree/markup_parser.rb /^ def parse(txt)$/;" f class:Markup
|
118
|
+
parse lib/rsyntaxtree/markup_parser.rb /^ def parse(txt)$/;" f module:Markup
|
119
|
+
parse lib/rsyntaxtree/string_parser.rb /^ def parse$/;" f class:RSyntaxTree.StringParser
|
120
|
+
parse_list lib/rsyntaxtree/base_graph.rb /^ def parse_list$/;" f class:RSyntaxTree.BaseGraph
|
121
|
+
polyline_to_parent lib/rsyntaxtree/svg_graph.rb /^ def polyline_to_parent(parent, child)$/;" f class:RSyntaxTree.SVGGraph
|
122
|
+
polyline_to_parent lib/rsyntaxtree/svg_graph.rb /^ def polyline_to_parent(parent, child)$/;" f class:RSyntaxTree.SVGGraph.line_to_parent
|
123
|
+
pos lib/rsyntaxtree/string_parser.rb /^ attr_accessor :data, :elist, :pos, :id, :level$/;" A class:RSyntaxTree.StringParser
|
124
|
+
pos= lib/rsyntaxtree/string_parser.rb /^ attr_accessor :data, :elist, :pos, :id, :level$/;" A class:RSyntaxTree.StringParser
|
125
|
+
rsyntaxtree rsyntaxtree.gemspec /^ s.name = "rsyntaxtree"$/;" g
|
126
|
+
set_element_width lib/rsyntaxtree/elementlist.rb /^ def set_element_width(id, width)$/;" f class:RSyntaxTree.ElementList
|
127
|
+
set_hierarchy lib/rsyntaxtree/elementlist.rb /^ def set_hierarchy$/;" f class:RSyntaxTree.ElementList
|
128
|
+
set_indent lib/rsyntaxtree/elementlist.rb /^ def set_indent(id, indent)$/;" f class:RSyntaxTree.ElementList
|
129
|
+
set_tspan lib/rsyntaxtree/svg_graph.rb /^ def set_tspan(this_x, this_y, style, decoration, fontstyle, text)$/;" f class:RSyntaxTree.SVGGraph
|
130
|
+
setup lib/rsyntaxtree/element.rb /^ def setup$/;" f class:RSyntaxTree.Element
|
131
|
+
setup test/markup_parser_test.rb /^ def setup$/;" f class:MarkupParserTest
|
132
|
+
split_by_emoji lib/rsyntaxtree/utils.rb /^ def split_by_emoji$/;" f class:String
|
133
|
+
svg_data lib/rsyntaxtree/svg_graph.rb /^ def svg_data$/;" f class:RSyntaxTree.SVGGraph
|
134
|
+
test_evaluator test/markup_parser_test.rb /^ def test_evaluator$/;" f
|
135
|
+
test_evaluator test/markup_parser_test.rb /^ def test_evaluator$/;" f class:MarkupParserTest
|
136
|
+
test_rule_bold test/markup_parser_test.rb /^ def test_rule_bold$/;" f
|
137
|
+
test_rule_bold test/markup_parser_test.rb /^ def test_rule_bold$/;" f class:MarkupParserTest
|
138
|
+
test_rule_bolditalic test/markup_parser_test.rb /^ def test_rule_bolditalic$/;" f
|
139
|
+
test_rule_bolditalic test/markup_parser_test.rb /^ def test_rule_bolditalic$/;" f class:MarkupParserTest
|
140
|
+
test_rule_border test/markup_parser_test.rb /^ def test_rule_border$/;" f
|
141
|
+
test_rule_border test/markup_parser_test.rb /^ def test_rule_border$/;" f class:MarkupParserTest
|
142
|
+
test_rule_box test/markup_parser_test.rb /^ def test_rule_box$/;" f
|
143
|
+
test_rule_box test/markup_parser_test.rb /^ def test_rule_box$/;" f class:MarkupParserTest
|
144
|
+
test_rule_brackets test/markup_parser_test.rb /^ def test_rule_brackets$/;" f class:MarkupParserTest
|
145
|
+
test_rule_cr test/markup_parser_test.rb /^ def test_rule_cr$/;" f class:MarkupParserTest
|
146
|
+
test_rule_escaped test/markup_parser_test.rb /^ def test_rule_escaped$/;" f class:MarkupParserTest
|
147
|
+
test_rule_italic test/markup_parser_test.rb /^ def test_rule_italic$/;" f
|
148
|
+
test_rule_italic test/markup_parser_test.rb /^ def test_rule_italic$/;" f class:MarkupParserTest
|
149
|
+
test_rule_line test/markup_parser_test.rb /^ def test_rule_line$/;" f
|
150
|
+
test_rule_line test/markup_parser_test.rb /^ def test_rule_line$/;" f class:MarkupParserTest
|
151
|
+
test_rule_lines test/markup_parser_test.rb /^ def test_rule_lines$/;" f
|
152
|
+
test_rule_lines test/markup_parser_test.rb /^ def test_rule_lines$/;" f class:MarkupParserTest
|
153
|
+
test_rule_linethrough test/markup_parser_test.rb /^ def test_rule_linethrough$/;" f
|
154
|
+
test_rule_linethrough test/markup_parser_test.rb /^ def test_rule_linethrough$/;" f class:MarkupParserTest
|
155
|
+
test_rule_markup test/markup_parser_test.rb /^ def test_rule_markup$/;" f
|
156
|
+
test_rule_markup test/markup_parser_test.rb /^ def test_rule_markup$/;" f class:MarkupParserTest
|
157
|
+
test_rule_non_escaped test/markup_parser_test.rb /^ def test_rule_non_escaped$/;" f
|
158
|
+
test_rule_non_escaped test/markup_parser_test.rb /^ def test_rule_non_escaped$/;" f class:MarkupParserTest
|
159
|
+
test_rule_overline test/markup_parser_test.rb /^ def test_rule_overline$/;" f
|
160
|
+
test_rule_overline test/markup_parser_test.rb /^ def test_rule_overline$/;" f class:MarkupParserTest
|
161
|
+
test_rule_path test/markup_parser_test.rb /^ def test_rule_path$/;" f class:MarkupParserTest
|
162
|
+
test_rule_subscript test/markup_parser_test.rb /^ def test_rule_subscript$/;" f
|
163
|
+
test_rule_subscript test/markup_parser_test.rb /^ def test_rule_subscript$/;" f class:MarkupParserTest
|
164
|
+
test_rule_superscript test/markup_parser_test.rb /^ def test_rule_superscript$/;" f
|
165
|
+
test_rule_superscript test/markup_parser_test.rb /^ def test_rule_superscript$/;" f class:MarkupParserTest
|
166
|
+
test_rule_text test/markup_parser_test.rb /^ def test_rule_text$/;" f
|
167
|
+
test_rule_text test/markup_parser_test.rb /^ def test_rule_text$/;" f class:MarkupParserTest
|
168
|
+
test_rule_triangle test/markup_parser_test.rb /^ def test_rule_triangle$/;" f class:MarkupParserTest
|
169
|
+
test_rule_underline test/markup_parser_test.rb /^ def test_rule_underline$/;" f
|
170
|
+
test_rule_underline test/markup_parser_test.rb /^ def test_rule_underline$/;" f class:MarkupParserTest
|
171
|
+
triangle_to_parent lib/rsyntaxtree/svg_graph.rb /^ def triangle_to_parent(parent, child)$/;" f class:RSyntaxTree.SVGGraph
|
172
|
+
triangle_to_parent lib/rsyntaxtree/svg_graph.rb /^ def triangle_to_parent(parent, child)$/;" f class:RSyntaxTree.SVGGraph.line_to_parent
|
173
|
+
triangle_to_parent lib/rsyntaxtree/svg_graph.rb /^ def triangle_to_parent(parent, child)$/;" f class:RSyntaxTree
|
174
|
+
triangle_to_parent2 lib/rsyntaxtree/svg_graph.rb /^ def triangle_to_parent2(parent, child)$/;" f class:RSyntaxTree.SVGGraph
|
175
|
+
valid lib/rsyntaxtree/string_parser.rb /^ def self.valid?(data)$/;" F class:RSyntaxTree.StringParser
|
176
|
+
valid? lib/rsyntaxtree/string_parser.rb /^ def self.valid?(data)$/;" S class:RSyntaxTree.StringParser
|
177
|
+
width lib/rsyntaxtree/svg_graph.rb /^ attr_accessor :width, :height$/;" A class:RSyntaxTree.SVGGraph
|
178
|
+
width= lib/rsyntaxtree/svg_graph.rb /^ attr_accessor :width, :height$/;" A class:RSyntaxTree.SVGGraph
|
179
|
+
🌲 RSyntaxTree: yet another syntax tree generator in Ruby README.md /^# 🌲 RSyntaxTree: yet another syntax tree generator in Ruby$/;" c
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# 🌲 RSyntaxTree
|
1
|
+
# 🌲 RSyntaxTree
|
2
2
|
|
3
3
|
**RSyntaxTree** is a graphical syntax tree generator written in the Ruby programming language inspired by [phpSyntaxTree](http://ironcreek.net/phpsyntaxtree/).
|
4
4
|
|
@@ -17,51 +17,57 @@ For the web interface, see Usage section of <https://yohasebe.com/rsyntaxtree>.
|
|
17
17
|
For the command-line interface, type `$rsyntaxtree -h` after installation. Here's what you get:
|
18
18
|
|
19
19
|
```text
|
20
|
-
|
20
|
+
SyntaxTree, (linguistic) syntax tree generator written in Ruby.
|
21
21
|
|
22
22
|
Usage:
|
23
23
|
rsyntaxtree [options] "[VP [VP [V set] [NP bracket notation]] [ADV here]]"
|
24
24
|
where [options] are:
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
25
|
+
-o, --outdir=<s> Output directory (default: ./)
|
26
|
+
-f, --format=<s> Output format: png, gif, jpg, pdf, or svg (default: png)
|
27
|
+
-l, --leafstyle=<s> visual style of tree leaves: auto, triangle, bar, or nothing (default: auto)
|
28
|
+
-n, --fontstyle=<s> Font style (available when ttf font is specified): sans, serif, cjk (default: sans)
|
29
|
+
-t, --font=<s> Path to a ttf font used to generate tree (optional)
|
30
|
+
-s, --fontsize=<i> Size: 8-26 (default: 16)
|
31
|
+
-m, --margin=<i> Margin: 0-10 (default: 1)
|
32
|
+
-v, --vheight=<f> Connector Height: 0.5-5.0 (default: 2.0)
|
33
|
+
-c, --color=<s> Color text and bars: on or off (default: on)
|
34
|
+
-y, --symmetrize=<s> Generate radically symmetrical, balanced tree: on or off (default: off)
|
35
|
+
-r, --transparent=<s> Make background transparent: on or off (default: off)
|
36
|
+
-p, --polyline=<s> draw polyline connectors: on or off (default: off)
|
37
|
+
-e, --version Print version and exit
|
38
|
+
-h, --help Show this message```
|
38
39
|
```
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
Every branch or leaf of a tree must belong to a node. To create a node, place a label right next to the opening bracket. Arbitrary number of branches can follow with a preceding space.
|
43
|
-
|
44
|
-
There are several modes in which the connectors between terminal nodes and their leaves are drawn differently (auto, triangle, bar, and nothing). In auto mode, a triangle is used if the leaf contains one or more spaces inside (i.e. if it’s a phrase), but if it contains no spaces (i.e. if it is just a word), a straight bar will be drawn instead (unless the leaf contains a "^" symbol at the end which makes it a single-word phrase).
|
45
|
-
|
46
|
-
You can put a subscript to any node by putting the _ character between the main label and the subscript. For example, NP_TOP will be rendered as NP<sub>TOP</sub>. Or you can select the “Auto subscript” option so that nodes of the same label will be automatically numbered. (e.g. NP<sub>1</sub>, NP<sub>2</sub>)</p>
|
47
|
-
|
48
|
-
See https://yohasebe.com/rsyntaxtree for more detailed info about the syntax.
|
41
|
+
See [the documentation](https://yohasebe.com/rsyntaxtree/#documentation) for more detailed info about the syntax.
|
49
42
|
|
50
43
|
### Example
|
51
44
|
|
52
|
-
|
45
|
+
**Input text**
|
53
46
|
|
54
47
|
```text
|
55
|
-
[S
|
48
|
+
[S
|
49
|
+
[NP |R|<>SyntaxTree]
|
50
|
+
[VP
|
51
|
+
[V generates]
|
52
|
+
[NP
|
53
|
+
[Adj #\+multilingual\
|
54
|
+
\+beautiful]
|
55
|
+
[NP syntax\
|
56
|
+
trees]
|
57
|
+
]
|
58
|
+
]
|
59
|
+
]
|
56
60
|
```
|
57
61
|
|
58
|
-
|
62
|
+
**Output (PNG or SVG)**
|
63
|
+
|
64
|
+
<img src='https://github.com/yohasebe/rsyntaxtree/blob/master/img/sample.png?raw=true' width='600' />
|
59
65
|
|
60
|
-
|
66
|
+
See [RSyntaxTree Examples](https://yohasebe.notion.site/yohasebe/RSyntaxTree-Examples-006baf3ac6e84e7193b538a5bf02ad07) for more examples
|
61
67
|
|
62
68
|
### Development
|
63
69
|
|
64
|
-
For the latest updates and downloads please visit http://github.com/yohasebe/rsyntaxtree
|
70
|
+
For the latest updates and downloads please visit <http://github.com/yohasebe/rsyntaxtree>
|
65
71
|
|
66
72
|
### Author
|
67
73
|
|
data/Rakefile
CHANGED
data/bin/rsyntaxtree
CHANGED
@@ -5,6 +5,7 @@ $LOAD_PATH << File.join( File.dirname(__FILE__), '../lib')
|
|
5
5
|
|
6
6
|
require 'rsyntaxtree'
|
7
7
|
require 'optimist'
|
8
|
+
require 'utils'
|
8
9
|
|
9
10
|
opts = Optimist::options do
|
10
11
|
version "RSyntaxTree #{RSyntaxTree::VERSION} (c) 2021 Yoichiro Hasebe"
|
@@ -22,37 +23,37 @@ EOS
|
|
22
23
|
:default => "png"
|
23
24
|
opt :leafstyle, "visual style of tree leaves: auto, triangle, bar, or nothing",
|
24
25
|
:default => "auto"
|
25
|
-
opt :fontstyle, "Font style (available when ttf font is specified): sans, serif, cjk
|
26
|
+
opt :fontstyle, "Font style (available when ttf font is specified): sans, serif, cjk",
|
26
27
|
:default => "sans"
|
27
28
|
opt :font, "Path to a ttf font used to generate tree (optional)", :type => String
|
28
29
|
opt :fontsize, "Size: 8-26",
|
29
30
|
:default => 16
|
30
|
-
opt :margin, "Margin:
|
31
|
+
opt :margin, "Margin: 0-10",
|
31
32
|
:default => 1
|
32
33
|
opt :vheight, "Connector Height: 0.5-5.0",
|
33
|
-
:default =>
|
34
|
+
:default => 2.0
|
34
35
|
opt :color, "Color text and bars: on or off",
|
35
36
|
:default => "on"
|
36
|
-
opt :symmetrize, "Generate symmetrical, balanced tree: on or off",
|
37
|
-
:default => "on"
|
38
|
-
opt :autosub, "Put subscript numbers to nodes: on or off",
|
37
|
+
opt :symmetrize, "Generate radically symmetrical, balanced tree: on or off",
|
39
38
|
:default => "off"
|
40
39
|
opt :transparent, "Make background transparent: on or off",
|
41
40
|
:default => "off"
|
41
|
+
opt :polyline, "draw polyline connectors: on or off",
|
42
|
+
:default => "off"
|
42
43
|
end
|
43
44
|
|
44
45
|
Optimist::die :outdir, "must be an exsting directory path" unless FileTest::directory?(opts[:outdir])
|
45
46
|
Optimist::die :format, "must be png, jpg, gif, or svg" unless /\A(png|jpg|gif|pdf|svg)\z/ =~ opts[:format]
|
46
47
|
Optimist::die :leafstyle, "must be auto, triangle, bar, or nothing" unless /\A(auto|triangle|bar|nothing)\z/ =~ opts[:leafstyle]
|
47
|
-
Optimist::die :fontstyle, "must be sans, serif, cjk
|
48
|
+
Optimist::die :fontstyle, "must be sans, serif, cjk" unless /\A(sans|serif|cjk)\z/ =~ opts[:fontstyle]
|
48
49
|
Optimist::die :font, "must be path to an existing ttf font" if opts[:font] && !File::exists?(opts[:font])
|
49
50
|
Optimist::die :fontsize, "must be in the range of 8-26" unless opts[:fontsize] >= 8 && opts[:fontsize] <= 26
|
50
|
-
Optimist::die :color, "must be either on or off" unless /\A(on|off)\z/ =~ opts[:color]
|
51
|
-
Optimist::die :symmetrize, "must be either on or off" unless /\A(on|off)\z/ =~ opts[:symmetrize]
|
52
|
-
Optimist::die :
|
53
|
-
Optimist::die :margin, "must be in the range of 0-5" if opts[:margin] < 1 || opts[:margin] > 5
|
51
|
+
Optimist::die :color, "must be either on or off" unless /\A(on|off|true|false)\z/ =~ opts[:color]
|
52
|
+
Optimist::die :symmetrize, "must be either on or off" unless /\A(on|off|true|false)\z/ =~ opts[:symmetrize]
|
53
|
+
Optimist::die :margin, "must be in the range of 0-10" if opts[:margin] < 0 || opts[:margin] > 10
|
54
54
|
Optimist::die :vheight, "must be in the range of 0.5-5.0" if opts[:vheight] < 0.5 || opts[:vheight] > 5.0
|
55
|
-
Optimist::die :transparent, "must be either on or off" unless /\A(on|off)\z/ =~ opts[:transparent]
|
55
|
+
Optimist::die :transparent, "must be either on or off" unless /\A(on|off|true|false)\z/ =~ opts[:transparent]
|
56
|
+
Optimist::die :polyline, "must be either on or off" unless /\A(on|off|true|false)\z/ =~ opts[:polyline]
|
56
57
|
|
57
58
|
string_opts = {}
|
58
59
|
opts.each do |key, value|
|
@@ -61,26 +62,36 @@ end
|
|
61
62
|
|
62
63
|
data = ARGV[0]
|
63
64
|
|
64
|
-
|
65
|
-
|
65
|
+
begin
|
66
|
+
RSyntaxTree::RSGenerator.check_data(data)
|
67
|
+
rescue RSTError => e
|
68
|
+
puts e
|
66
69
|
exit
|
67
70
|
end
|
68
71
|
|
69
|
-
|
70
|
-
|
71
|
-
rsg = RSGenerator.new(string_opts)
|
72
|
-
ext = string_opts[:format]
|
73
|
-
|
74
|
-
case ext
|
75
|
-
when "
|
76
|
-
|
77
|
-
when "
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
72
|
+
begin
|
73
|
+
string_opts[:data] = data
|
74
|
+
rsg = RSyntaxTree::RSGenerator.new(string_opts)
|
75
|
+
ext = string_opts[:format]
|
76
|
+
filepath = File.expand_path(string_opts[:outdir]) + "/syntree." + ext
|
77
|
+
case ext
|
78
|
+
when "jpg", "gif", "pdf"
|
79
|
+
rsg.draw_tree.write(filepath)
|
80
|
+
when "png"
|
81
|
+
outfile = File.new(filepath, "wb")
|
82
|
+
# outfile.write rsg.draw_png
|
83
|
+
outfile.write rsg.draw_tree
|
84
|
+
outfile.close
|
85
|
+
when "svg"
|
86
|
+
outfile = File.new(filepath, "wb")
|
87
|
+
outfile.write rsg.draw_svg
|
88
|
+
outfile.close
|
89
|
+
end
|
90
|
+
rescue RSTError => e
|
91
|
+
puts e
|
92
|
+
exit
|
93
|
+
rescue => e
|
94
|
+
p e
|
95
|
+
puts "Error: something unexpected occurred"
|
96
|
+
exit
|
85
97
|
end
|
86
|
-
outfile.close
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/img/rsyntaxtree.png
ADDED
Binary file
|
data/img/sample.png
ADDED
Binary file
|
data/img/sample.svg
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
<?xml version="1.0" standalone="no"?>
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
3
|
+
<svg width="1211.119140625" height="941.0" viewBox="-40, -40, 1251.119140625, 981.0" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
4
|
+
<defs>
|
5
|
+
<marker id="arrow" markerUnits="strokeWidth" markerWidth="7.823437500000001" markerHeight="7.823437500000001" viewBox="0 0 7.823437500000001 7.823437500000001" refX="3.9117187500000004" refY="0">
|
6
|
+
<polyline fill="none" stroke="purple" stroke-width="1" points="0,7.823437500000001,3.9117187500000004,0,7.823437500000001,7.823437500000001" />
|
7
|
+
</marker>
|
8
|
+
</defs>
|
9
|
+
<rect x="-40" y="-40" width="1251.119140625" height="981.0" stroke="none" fill="white" />"
|
10
|
+
<text white-space='pre' alignment-baseline='text-top' style='fill: blue; font-size: 40px;' x='418.73779296875' y='70.0'><tspan x='418.73779296875' y='70.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">S</tspan></text>
|
11
|
+
<text white-space='pre' alignment-baseline='text-top' style='fill: blue; font-size: 40px;' x='136.2080078125' y='254.0'><tspan x='136.2080078125' y='254.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">NP</tspan></text>
|
12
|
+
<text white-space='pre' alignment-baseline='text-top' style='fill: green; font-size: 40px;' x='19.55859375' y='438.0'><tspan x='33.81640625' y='438.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">R</tspan><tspan x='90.857421875' y='438.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">SyntaxTree</tspan></text>
|
13
|
+
<text white-space='pre' alignment-baseline='text-top' style='fill: blue; font-size: 40px;' x='670.267578125' y='254.0'><tspan x='670.267578125' y='254.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">VP</tspan></text>
|
14
|
+
<text white-space='pre' alignment-baseline='text-top' style='fill: blue; font-size: 40px;' x='465.091796875' y='438.0'><tspan x='465.091796875' y='438.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">V</tspan></text>
|
15
|
+
<text white-space='pre' alignment-baseline='text-top' style='fill: green; font-size: 40px;' x='386.091796875' y='622.0'><tspan x='386.091796875' y='622.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">generates</tspan></text>
|
16
|
+
<text white-space='pre' alignment-baseline='text-top' style='fill: blue; font-size: 40px;' x='885.443359375' y='438.0'><tspan x='885.443359375' y='438.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">NP</tspan></text>
|
17
|
+
<text white-space='pre' alignment-baseline='text-top' style='fill: blue; font-size: 40px;' x='745.326171875' y='622.0'><tspan x='745.326171875' y='622.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">Adj</tspan></text>
|
18
|
+
<text white-space='pre' alignment-baseline='text-top' style='fill: green; font-size: 40px;' x='649.326171875' y='806.0'><tspan x='649.326171875' y='806.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">+multilingual</tspan><tspan x='649.326171875' y='861.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">+beautiful</tspan></text>
|
19
|
+
<text white-space='pre' alignment-baseline='text-top' style='fill: blue; font-size: 40px;' x='1020.560546875' y='622.0'><tspan x='1020.560546875' y='622.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">NP</tspan></text>
|
20
|
+
<text white-space='pre' alignment-baseline='text-top' style='fill: green; font-size: 40px;' x='984.560546875' y='806.0'><tspan x='984.560546875' y='806.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">syntax</tspan><tspan x='1001.560546875' y='861.0' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">trees</tspan></text>
|
21
|
+
<line style='stroke:black; stroke-width:2;' x1='163.7080078125' y1='184.0' x2='429.73779296875' y2='93.0' />
|
22
|
+
<line style='stroke:black; stroke-width:2;' x1='695.767578125' y1='184.0' x2='429.73779296875' y2='93.0' />
|
23
|
+
<polygon style='fill: none; stroke: black; stroke-width:2;' points='19.55859375 368.0 307.857421875 368.0 163.7080078125 277.0' />
|
24
|
+
<line style='stroke:black; stroke-width:2;' x1='478.591796875' y1='368.0' x2='695.767578125' y2='277.0' />
|
25
|
+
<line style='stroke:black; stroke-width:2;' x1='912.943359375' y1='368.0' x2='695.767578125' y2='277.0' />
|
26
|
+
<line style='stroke:black; stroke-width:2;' x1='478.591796875' y1='552.0' x2='478.591796875' y2='461.0' />
|
27
|
+
<line style='stroke:black; stroke-width:2;' x1='777.826171875' y1='552.0' x2='912.943359375' y2='461.0' />
|
28
|
+
<line style='stroke:black; stroke-width:2;' x1='1048.060546875' y1='552.0' x2='912.943359375' y2='461.0' />
|
29
|
+
<line style='stroke:black; stroke-width:2;' x1='777.826171875' y1='736.0' x2='777.826171875' y2='645.0' />
|
30
|
+
<line style='stroke:black; stroke-width:2;' x1='1048.060546875' y1='736.0' x2='1048.060546875' y2='645.0' />
|
31
|
+
<rect style='fill: none; stroke: green; stroke-width:2;' x='19.55859375' y='396.0' width='55.0' height='53.0' />
|
32
|
+
|
33
|
+
<line x1='639.546875' y1='743.0' x2='649.326171875' y2='743.0' style='fill: none; stroke: green; stroke-width:2' />
|
34
|
+
<line x1='639.546875' y1='743.0' x2='639.546875' y2='891.0' style='fill: none; stroke: green; stroke-width:2' />
|
35
|
+
<line x1='639.546875' y1='891.0' x2='649.326171875' y2='891.0' style='fill: none; stroke: green; stroke-width:2' />
|
36
|
+
<line x1='916.10546875' y1='743.0' x2='906.326171875' y2='743.0' style='fill: none; stroke: green; stroke-width:2' />
|
37
|
+
<line x1='916.10546875' y1='743.0' x2='916.10546875' y2='891.0' style='fill: none; stroke: green; stroke-width:2' />
|
38
|
+
<line x1='916.10546875' y1='891.0' x2='906.326171875' y2='891.0' style='fill: none; stroke: green; stroke-width:2' /></svg>
|