breakout_parser 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -42,40 +42,44 @@
42
42
  T_CHAR = 258,
43
43
  BOLD_START = 259,
44
44
  ITALIC_START = 260,
45
- T_WORD = 261,
46
- TICKET_LINK = 262,
47
- LINK = 263,
48
- SVN_REVISION_LINK = 264,
49
- GIT_REVISION_LINK = 265,
50
- WIKI_LINK = 266,
51
- ANCHOR_LINK = 267,
52
- URL_WITH_PROTO_LINK = 268,
53
- URL_WITHOUT_PROTO_LINK = 269,
54
- FILE_LINK = 270,
55
- IMAGE_LINK = 271,
56
- URL = 272,
57
- EMAIL = 273,
58
- UL = 274,
59
- H1 = 275,
60
- H2 = 276,
61
- H3 = 277,
62
- H4 = 278,
63
- H5 = 279,
64
- INLINE_CODE = 280,
65
- SPACE = 281,
66
- BR = 282,
67
- OLI = 283,
68
- ULI = 284,
69
- PRE_CODE_START = 285,
70
- PRE_CODE_END = 286,
71
- PRE_START = 287,
72
- PRE_END = 288,
73
- CODE_START = 289,
74
- CODE_END = 290,
75
- NOTEXTILE_START = 291,
76
- NOTEXTILE_END = 292,
77
- BOLD_END = 293,
78
- ITALIC_END = 294
45
+ BOLD_ITALIC_START = 261,
46
+ ITALIC_BOLD_START = 262,
47
+ T_WORD = 263,
48
+ TICKET_LINK = 264,
49
+ LINK = 265,
50
+ SVN_REVISION_LINK = 266,
51
+ GIT_REVISION_LINK = 267,
52
+ WIKI_LINK = 268,
53
+ ANCHOR_LINK = 269,
54
+ URL_WITH_PROTO_LINK = 270,
55
+ URL_WITHOUT_PROTO_LINK = 271,
56
+ FILE_LINK = 272,
57
+ IMAGE_LINK = 273,
58
+ URL = 274,
59
+ EMAIL = 275,
60
+ UL = 276,
61
+ H1 = 277,
62
+ H2 = 278,
63
+ H3 = 279,
64
+ H4 = 280,
65
+ H5 = 281,
66
+ INLINE_CODE = 282,
67
+ SPACE = 283,
68
+ BR = 284,
69
+ OLI = 285,
70
+ ULI = 286,
71
+ PRE_CODE_START = 287,
72
+ PRE_CODE_END = 288,
73
+ PRE_START = 289,
74
+ PRE_END = 290,
75
+ CODE_START = 291,
76
+ CODE_END = 292,
77
+ NOTEXTILE_START = 293,
78
+ NOTEXTILE_END = 294,
79
+ BOLD_END = 295,
80
+ ITALIC_END = 296,
81
+ REVERT_BOLD = 297,
82
+ REVERT_ITALIC = 298
79
83
  };
80
84
  #endif
81
85
 
@@ -95,7 +99,7 @@ typedef union YYSTYPE
95
99
 
96
100
 
97
101
  /* Line 1676 of yacc.c */
98
- #line 99 "parser.tab.h"
102
+ #line 103 "parser.tab.h"
99
103
  } YYSTYPE;
100
104
  # define YYSTYPE_IS_TRIVIAL 1
101
105
  # define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -66,6 +66,7 @@ void yyerror(const char *msg)
66
66
 
67
67
 
68
68
  %token <ivalue> T_CHAR BOLD_START ITALIC_START
69
+ %token <ivalue> BOLD_ITALIC_START ITALIC_BOLD_START
69
70
  %token <svalue> T_WORD TICKET_LINK LINK SVN_REVISION_LINK GIT_REVISION_LINK WIKI_LINK ANCHOR_LINK
70
71
  %token <svalue> URL_WITH_PROTO_LINK URL_WITHOUT_PROTO_LINK
71
72
  %token <svalue> FILE_LINK IMAGE_LINK
@@ -77,6 +78,7 @@ void yyerror(const char *msg)
77
78
  %token PRE_CODE_START PRE_CODE_END PRE_START PRE_END CODE_START CODE_END
78
79
  %token NOTEXTILE_START NOTEXTILE_END
79
80
  %token BOLD_END ITALIC_END
81
+ %token REVERT_BOLD REVERT_ITALIC
80
82
 
81
83
  //%type <dvalue> expression
82
84
  //%type <dvalue> term
@@ -121,7 +123,11 @@ word : chars
121
123
  | BOLD_END {concat("</strong>",9)}
122
124
  | ITALIC_START {$1 ? concat(" <em>",5) : concat("<em>",4)}
123
125
  | ITALIC_END {concat("</em>",5)}
126
+ | BOLD_ITALIC_START {$1 ? concat(" <strong><em>",13) : concat("<strong><em>",12)}
127
+ | ITALIC_BOLD_START {$1 ? concat(" <em><strong>",13) : concat("<em><strong>",12)}
124
128
  | INLINE_CODE {process_inline_code($1)}
129
+ | REVERT_BOLD {revert_bold()}
130
+ | REVERT_ITALIC {revert_italic()}
125
131
 
126
132
  link: TICKET_LINK {process_ticket_link($1)}
127
133
  | SVN_REVISION_LINK {process_svn_link($1)}
@@ -421,3 +427,22 @@ process_email(const char*url){
421
427
  process_link_tail(url,NULL,NULL);
422
428
  }
423
429
 
430
+ revert_bold(){
431
+ char *p;
432
+ for( p=bufptr-1; p >= (buf+7) ; p--){
433
+ if( 0 == strncmp(p-7, "<strong>", 8) ){
434
+ memcpy(p-7," *",8);
435
+ break;
436
+ }
437
+ }
438
+ }
439
+
440
+ revert_italic(){
441
+ char *p;
442
+ for( p=bufptr-1; p >= (buf+3) ; p--){
443
+ if( 0 == strncmp(p-3, "<em>", 4) ){
444
+ memcpy(p-3," _",4);
445
+ break;
446
+ }
447
+ }
448
+ }
data/spec/parser_spec.rb CHANGED
@@ -114,6 +114,12 @@ describe 'BreakoutParser' do
114
114
  parse(" @code1@ @code2@ ").should == "<code>code1</code> <code>code2</code>"
115
115
  parse(" @code1@ xxx @code2@ ").should == "<code>code1</code> xxx <code>code2</code>"
116
116
  end
117
+ %w', .'.each do |c|
118
+ it "stops on #{c.inspect}" do
119
+ parse("@some code@#{c}").should == "<code>some code</code>#{c}"
120
+ parse("@some code@#{c} @another code@").should == "<code>some code</code>#{c} <code>another code</code>"
121
+ end
122
+ end
117
123
  end
118
124
 
119
125
  ###############################################################################
@@ -138,13 +144,13 @@ describe 'BreakoutParser' do
138
144
  parse("aaa * bbb").should == 'aaa * bbb'
139
145
  end
140
146
  it "w/o closing tag" do
141
- parse("*bold").should == '<strong>bold</strong>'
147
+ parse("*bold").should == '*bold'
142
148
  end
143
149
  it "nesting1 w/o closing tags" do
144
- parse("*bold1 *bold2").should == '<strong>bold1 <strong>bold2</strong></strong>'
150
+ parse("*bold1 *bold2").gsub(/ +/,' ').should == '*bold1 *bold2'
145
151
  end
146
152
  it "nesting2 w/o closing tags" do
147
- parse("*bold1 *bold2").should == '<strong>bold1 <strong>bold2</strong></strong>'
153
+ parse("*bold1 *bold2").gsub(/ +/,' ').should == '*bold1 *bold2'
148
154
  end
149
155
 
150
156
  it "not parses '*.*'" do
@@ -183,30 +189,57 @@ describe 'BreakoutParser' do
183
189
  parse("aaa _ bbb").should == 'aaa _ bbb'
184
190
  end
185
191
  it "w/o closing tag" do
186
- parse("_italic").should == '<em>italic</em>'
192
+ parse("_italic").should == '_italic'
187
193
  end
188
194
  it "nesting1 w/o closing tags" do
189
- parse("_italic1 _italic2").should == '<em>italic1 <em>italic2</em></em>'
195
+ parse("_italic1 _italic2").gsub(/ +/,' ').should == '_italic1 _italic2'
190
196
  end
191
197
  it "nesting2 w/o closing tags" do
192
- parse("_italic1 _italic2").should == '<em>italic1 <em>italic2</em></em>'
198
+ parse("_italic1 _italic2").gsub(/ +/,' ').should == '_italic1 _italic2'
193
199
  end
194
200
  end
195
201
 
196
202
  ###############################################################################
197
203
 
198
204
  describe "combinations" do
205
+ it "both bold and italic" do
206
+ s = "_*aaa bbb ccc*_"
207
+ parse(s).should == "<em><strong>aaa bbb ccc</strong></em>"
208
+ end
209
+ it "both italic and bold" do
210
+ s = "*_aaa bbb ccc_*"
211
+ parse(s).should == "<strong><em>aaa bbb ccc</em></strong>"
212
+ end
213
+
214
+ it "start b+i, end first italic then bold" do
215
+ s = "*_aaa bbb_ ccc*"
216
+ parse(s).should == "<strong><em>aaa bbb</em> ccc</strong>"
217
+ end
218
+ it "start i+b, end first bold then italic" do
219
+ s = "_*aaa bbb* ccc_"
220
+ parse(s).should == "<em><strong>aaa bbb</strong> ccc</em>"
221
+ end
222
+
223
+ it "start first italic then bold, end both" do
224
+ s = "_aaa *bbb ccc*_"
225
+ parse(s).should == "<em>aaa <strong>bbb ccc</strong></em>"
226
+ end
227
+ it "start first bold then italic, end both" do
228
+ s = "*aaa _bbb ccc_*"
229
+ parse(s).should == "<strong>aaa <em>bbb ccc</em></strong>"
230
+ end
231
+
199
232
  it "bold in italic" do
200
233
  s = "_aaa *bbb* ccc_"
201
234
  parse(s).should == "<em>aaa <strong>bbb</strong> ccc</em>"
202
235
  end
203
236
  it "bold in italic - no closing1" do
204
237
  s = "_aaa *bbb* ccc"
205
- parse(s).should == "<em>aaa <strong>bbb</strong> ccc</em>"
238
+ parse(s).should == "_aaa <strong>bbb</strong> ccc"
206
239
  end
207
240
  it "bold in italic - no closing2" do
208
241
  s = "_aaa *bbb ccc"
209
- parse(s).should == "<em>aaa <strong>bbb ccc</strong></em>"
242
+ parse(s).gsub(/ {2,}/,' ').should == "_aaa *bbb ccc"
210
243
  end
211
244
 
212
245
  it "italic in bold" do
@@ -215,11 +248,11 @@ describe 'BreakoutParser' do
215
248
  end
216
249
  it "italic in bold - no closing1" do
217
250
  s = "*aaa _bbb_ ccc"
218
- parse(s).should == "<strong>aaa <em>bbb</em> ccc</strong>"
251
+ parse(s).should == "*aaa <em>bbb</em> ccc"
219
252
  end
220
253
  it "italic in bold - no closing2" do
221
254
  s = "*aaa _bbb ccc"
222
- parse(s).should == "<strong>aaa <em>bbb ccc</em></strong>"
255
+ parse(s).gsub(/ {2,}/,' ').should == "*aaa _bbb ccc"
223
256
  end
224
257
 
225
258
  {'ul' => '*', 'ol' => '#'}.each do |l,c|
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.10
4
+ version: 0.0.11
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-03-24 00:00:00 +05:00
12
+ date: 2010-03-28 00:00:00 +05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency