breakout_parser 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/breakout_parser/lex.yy.c +478 -443
- data/ext/breakout_parser/parser.l +3 -0
- data/ext/breakout_parser/parser.tab.c +203 -180
- data/ext/breakout_parser/parser.tab.h +14 -13
- data/ext/breakout_parser/parser.y +17 -1
- data/ext/breakout_parser/ruby_ext.c +14 -1
- data/spec/parser_spec.rb +59 -2
- metadata +2 -2
@@ -60,18 +60,19 @@
|
|
60
60
|
H3 = 276,
|
61
61
|
H4 = 277,
|
62
62
|
H5 = 278,
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
63
|
+
INLINE_CODE = 279,
|
64
|
+
SPACE = 280,
|
65
|
+
BR = 281,
|
66
|
+
OLI = 282,
|
67
|
+
ULI = 283,
|
68
|
+
PRE_CODE_START = 284,
|
69
|
+
PRE_CODE_END = 285,
|
70
|
+
PRE_START = 286,
|
71
|
+
PRE_END = 287,
|
72
|
+
CODE_START = 288,
|
73
|
+
CODE_END = 289,
|
74
|
+
BOLD_END = 290,
|
75
|
+
ITALIC_END = 291
|
75
76
|
};
|
76
77
|
#endif
|
77
78
|
|
@@ -91,7 +92,7 @@ typedef union YYSTYPE
|
|
91
92
|
|
92
93
|
|
93
94
|
/* Line 1676 of yacc.c */
|
94
|
-
#line
|
95
|
+
#line 96 "parser.tab.h"
|
95
96
|
} YYSTYPE;
|
96
97
|
# define YYSTYPE_IS_TRIVIAL 1
|
97
98
|
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
@@ -72,6 +72,7 @@ void yyerror(const char *msg)
|
|
72
72
|
%token <svalue> URL
|
73
73
|
%token <svalue> UL
|
74
74
|
%token <svalue> H1 H2 H3 H4 H5
|
75
|
+
%token <svalue> INLINE_CODE
|
75
76
|
%token SPACE BR /*BRBR*/ OLI ULI
|
76
77
|
%token PRE_CODE_START PRE_CODE_END PRE_START PRE_END CODE_START CODE_END
|
77
78
|
%token BOLD_END ITALIC_END
|
@@ -112,12 +113,13 @@ words: word
|
|
112
113
|
|
113
114
|
word : chars
|
114
115
|
| link
|
115
|
-
| T_WORD
|
116
|
+
| T_WORD {concat2($1)} // TODO: somehow pass T_WORD's length here
|
116
117
|
| URL {process_url($1)}
|
117
118
|
| BOLD_START {$1 ? concat(" <strong>",9) : concat("<strong>",8)}
|
118
119
|
| BOLD_END {concat("</strong>",9)}
|
119
120
|
| ITALIC_START {$1 ? concat(" <em>",5) : concat("<em>",4)}
|
120
121
|
| ITALIC_END {concat("</em>",5)}
|
122
|
+
| INLINE_CODE {process_inline_code($1)}
|
121
123
|
|
122
124
|
link: TICKET_LINK {process_ticket_link($1)}
|
123
125
|
| SVN_REVISION_LINK {process_svn_link($1)}
|
@@ -186,6 +188,20 @@ need_hex_convert(const char*p, const char*pend){
|
|
186
188
|
return 0;
|
187
189
|
}
|
188
190
|
|
191
|
+
process_inline_code(const char*p){
|
192
|
+
if( *p == ' ' || *p == 9 ){
|
193
|
+
concat_raw_char(' ');
|
194
|
+
while( *p == ' ' || *p == 9 ) p++;
|
195
|
+
}
|
196
|
+
if( *p == '@' ) p++;
|
197
|
+
concat("<code>",6);
|
198
|
+
for(; *p ; p++){
|
199
|
+
if( *p == '@' && *(p+1) == 0 ) break;
|
200
|
+
concat_escaped_char( *p );
|
201
|
+
}
|
202
|
+
concat("</code>",7);
|
203
|
+
}
|
204
|
+
|
189
205
|
process_header(const char*title){
|
190
206
|
const char*p,*pend;
|
191
207
|
|
@@ -19,8 +19,21 @@ extern size_t in_buf_len, bufsize, space_name_len;
|
|
19
19
|
|
20
20
|
VALUE method_parse(VALUE self, VALUE text, VALUE r_space_name) {
|
21
21
|
VALUE s;
|
22
|
-
char *p
|
22
|
+
char *p;
|
23
|
+
|
24
|
+
if(!text || text == Qnil || text == Qfalse){
|
25
|
+
// NULL input string
|
26
|
+
return rb_str_new("",0);
|
27
|
+
}
|
28
|
+
|
29
|
+
p = RSTRING(text)->ptr;
|
23
30
|
in_buf_len = RSTRING(text)->len;
|
31
|
+
|
32
|
+
if(!p || in_buf_len <= 0){
|
33
|
+
// empty input string
|
34
|
+
return rb_str_new("",0);
|
35
|
+
}
|
36
|
+
|
24
37
|
while( in_buf_len > 0 && (*p == ' ' || *p == '\n' || *p == '\r' || *p == '\t')){
|
25
38
|
p++;
|
26
39
|
in_buf_len--;
|
data/spec/parser_spec.rb
CHANGED
@@ -29,6 +29,27 @@ describe 'BreakoutParser' do
|
|
29
29
|
parse(s).size.should == s.strip.size
|
30
30
|
end
|
31
31
|
|
32
|
+
it "handles nil & false text well" do
|
33
|
+
parse(false).should == ""
|
34
|
+
parse(false,false).should == ""
|
35
|
+
parse("",false).should == ""
|
36
|
+
parse(nil).should == ""
|
37
|
+
parse(nil,nil).should == ""
|
38
|
+
parse("",nil).should == ""
|
39
|
+
end
|
40
|
+
|
41
|
+
it "handles nil space_name well" do
|
42
|
+
lambda{
|
43
|
+
parse("#123",nil)
|
44
|
+
}.should raise_error(TypeError)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "handles false space_name well" do
|
48
|
+
lambda{
|
49
|
+
parse("#123",false)
|
50
|
+
}.should raise_error(TypeError)
|
51
|
+
end
|
52
|
+
|
32
53
|
it "strips tailing spaces and newlines" do
|
33
54
|
parse("aaa ").should == "aaa"
|
34
55
|
parse("aaa\t\t\t\t\t\t").should == "aaa"
|
@@ -59,6 +80,42 @@ describe 'BreakoutParser' do
|
|
59
80
|
parse("aaa\r\n\r\n\r\nbbb").should == "aaa" + "<br />"*3 + "bbb"
|
60
81
|
end
|
61
82
|
|
83
|
+
###############################################################################
|
84
|
+
|
85
|
+
describe "@code@" do
|
86
|
+
it "only" do
|
87
|
+
parse("@smth@").should == '<code>smth</code>'
|
88
|
+
end
|
89
|
+
it "at beginning" do
|
90
|
+
parse("@smth@\nxxx").should == '<code>smth</code><br />xxx'
|
91
|
+
end
|
92
|
+
it "in the middle of text" do
|
93
|
+
parse("xxx @smth@ yyy").should == 'xxx <code>smth</code> yyy'
|
94
|
+
end
|
95
|
+
it "parses @multiline\\nsmth@" do
|
96
|
+
parse("@multiline\nsmth@").should == "@multiline<br />smth@"
|
97
|
+
end
|
98
|
+
it "not confuses" do
|
99
|
+
parse("look at @this code@ and mail me at xxx@yyy.com").should ==
|
100
|
+
'look at <code>this code</code> and mail me at xxx@yyy.com'
|
101
|
+
end
|
102
|
+
it "w/o closing tag" do
|
103
|
+
parse("@smth").should == '@smth'
|
104
|
+
end
|
105
|
+
it "nesting1 w/o closing tags" do
|
106
|
+
parse("@smth1 @smth2").should == '@smth1 @smth2'
|
107
|
+
end
|
108
|
+
it "nesting2 w/o closing tags" do
|
109
|
+
parse("@smth1 @smth2").should == '@smth1 @smth2'
|
110
|
+
end
|
111
|
+
it "two times" do
|
112
|
+
parse("@code1@ @code2@").should == "<code>code1</code> <code>code2</code>"
|
113
|
+
parse("@code1@ @code2@").should == "<code>code1</code> <code>code2</code>"
|
114
|
+
parse(" @code1@ @code2@ ").should == "<code>code1</code> <code>code2</code>"
|
115
|
+
parse(" @code1@ xxx @code2@ ").should == "<code>code1</code> xxx <code>code2</code>"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
62
119
|
###############################################################################
|
63
120
|
|
64
121
|
describe "*bold*" do
|
@@ -662,7 +719,7 @@ describe 'BreakoutParser' do
|
|
662
719
|
s.to_s.gsub(/[&"><]/) { |special| HTML_ESCAPE[special] }
|
663
720
|
end
|
664
721
|
|
665
|
-
def parse s
|
666
|
-
BreakoutParser.parse(s,
|
722
|
+
def parse s, space_name = "test_space"
|
723
|
+
BreakoutParser.parse(s, space_name).strip
|
667
724
|
end
|
668
725
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: breakout_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrey "Zed" Zaikin
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-25 00:00:00 +05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|