dtext_rb 1.0.9 → 1.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/dtext_rb.gemspec +3 -3
- data/ext/dtext/dtext.c +196 -178
- data/ext/dtext/dtext.rl +34 -16
- metadata +2 -2
data/ext/dtext/dtext.rl
CHANGED
@@ -34,6 +34,7 @@ typedef struct StateMachine {
|
|
34
34
|
int list_nest;
|
35
35
|
int d;
|
36
36
|
int b;
|
37
|
+
int quote;
|
37
38
|
} StateMachine;
|
38
39
|
|
39
40
|
static const size_t MAX_STACK_DEPTH = 512;
|
@@ -318,7 +319,10 @@ inline := |*
|
|
318
319
|
append(sm, true, "<a href=\"");
|
319
320
|
append_segment_html_escaped(sm, sm->b1, sm->b2 - sm->d);
|
320
321
|
append(sm, true, "\">");
|
321
|
-
|
322
|
+
link_content_sm = parse_helper(sm->a1, sm->a2 - sm->a1, false, true);
|
323
|
+
append(sm, true, link_content_sm->output->str);
|
324
|
+
free_machine(link_content_sm);
|
325
|
+
link_content_sm = NULL;
|
322
326
|
append(sm, true, "</a>");
|
323
327
|
|
324
328
|
if (sm->b) {
|
@@ -1072,7 +1076,7 @@ static inline void append_segment_html_escaped(StateMachine * sm, const char * a
|
|
1072
1076
|
|
1073
1077
|
static inline void append_block(StateMachine * sm, const char * s) {
|
1074
1078
|
if (sm->f_inline) {
|
1075
|
-
sm->output = g_string_append_c(sm->output, ' ');
|
1079
|
+
// sm->output = g_string_append_c(sm->output, ' ');
|
1076
1080
|
} else if (sm->f_strip) {
|
1077
1081
|
// do nothing
|
1078
1082
|
} else {
|
@@ -1244,18 +1248,18 @@ static bool print_machine(StateMachine * sm) {
|
|
1244
1248
|
return true;
|
1245
1249
|
}
|
1246
1250
|
|
1247
|
-
static void init_machine(StateMachine * sm,
|
1251
|
+
static void init_machine(StateMachine * sm, const char * src, size_t len) {
|
1248
1252
|
size_t output_length = 0;
|
1249
|
-
sm->p =
|
1253
|
+
sm->p = src;
|
1250
1254
|
sm->pb = sm->p;
|
1251
|
-
sm->pe = sm->p +
|
1255
|
+
sm->pe = sm->p + len;
|
1252
1256
|
sm->eof = sm->pe;
|
1253
1257
|
sm->ts = NULL;
|
1254
1258
|
sm->te = NULL;
|
1255
1259
|
sm->cs = 0;
|
1256
1260
|
sm->act = 0;
|
1257
1261
|
sm->top = 0;
|
1258
|
-
output_length =
|
1262
|
+
output_length = len;
|
1259
1263
|
if (output_length < (INT16_MAX / 2)) {
|
1260
1264
|
output_length *= 2;
|
1261
1265
|
}
|
@@ -1273,6 +1277,7 @@ static void init_machine(StateMachine * sm, VALUE input) {
|
|
1273
1277
|
sm->header_mode = false;
|
1274
1278
|
sm->d = 0;
|
1275
1279
|
sm->b = 0;
|
1280
|
+
sm->quote = 0;
|
1276
1281
|
}
|
1277
1282
|
|
1278
1283
|
static void free_machine(StateMachine * sm) {
|
@@ -1282,6 +1287,23 @@ static void free_machine(StateMachine * sm) {
|
|
1282
1287
|
g_free(sm);
|
1283
1288
|
}
|
1284
1289
|
|
1290
|
+
static StateMachine * parse_helper(const char * src, size_t len, bool f_strip, bool f_inline) {
|
1291
|
+
StateMachine * sm = NULL;
|
1292
|
+
StateMachine * link_content_sm = NULL;
|
1293
|
+
|
1294
|
+
sm = (StateMachine *)g_malloc0(sizeof(StateMachine));
|
1295
|
+
init_machine(sm, src, len);
|
1296
|
+
sm->f_strip = f_strip;
|
1297
|
+
sm->f_inline = f_inline;
|
1298
|
+
|
1299
|
+
%% write init;
|
1300
|
+
%% write exec;
|
1301
|
+
|
1302
|
+
dstack_close(sm);
|
1303
|
+
|
1304
|
+
return sm;
|
1305
|
+
}
|
1306
|
+
|
1285
1307
|
static VALUE parse(int argc, VALUE * argv, VALUE self) {
|
1286
1308
|
VALUE input;
|
1287
1309
|
VALUE input0;
|
@@ -1291,6 +1313,8 @@ static VALUE parse(int argc, VALUE * argv, VALUE self) {
|
|
1291
1313
|
VALUE ret;
|
1292
1314
|
rb_encoding * encoding = NULL;
|
1293
1315
|
StateMachine * sm = NULL;
|
1316
|
+
bool f_strip = false;
|
1317
|
+
bool f_inline = false;
|
1294
1318
|
|
1295
1319
|
g_debug("start\n");
|
1296
1320
|
|
@@ -1305,31 +1329,25 @@ static VALUE parse(int argc, VALUE * argv, VALUE self) {
|
|
1305
1329
|
}
|
1306
1330
|
|
1307
1331
|
input0 = rb_str_dup(input);
|
1308
|
-
|
1309
|
-
sm = (StateMachine *)g_malloc0(sizeof(StateMachine));
|
1310
1332
|
input0 = rb_str_cat(input0, "\0", 1);
|
1311
|
-
|
1312
|
-
|
1333
|
+
|
1313
1334
|
if (argc > 1) {
|
1314
1335
|
options = argv[1];
|
1315
1336
|
|
1316
1337
|
if (!NIL_P(options)) {
|
1317
1338
|
opt_strip = rb_hash_aref(options, ID2SYM(rb_intern("strip")));
|
1318
1339
|
if (RTEST(opt_strip)) {
|
1319
|
-
|
1340
|
+
f_strip = true;
|
1320
1341
|
}
|
1321
1342
|
|
1322
1343
|
opt_inline = rb_hash_aref(options, ID2SYM(rb_intern("inline")));
|
1323
1344
|
if (RTEST(opt_inline)) {
|
1324
|
-
|
1345
|
+
f_inline = true;
|
1325
1346
|
}
|
1326
1347
|
}
|
1327
1348
|
}
|
1328
1349
|
|
1329
|
-
|
1330
|
-
%% write exec;
|
1331
|
-
|
1332
|
-
dstack_close(sm);
|
1350
|
+
sm = parse_helper(RSTRING_PTR(input0), RSTRING_LEN(input0), f_strip, f_inline);
|
1333
1351
|
|
1334
1352
|
encoding = rb_enc_find("utf-8");
|
1335
1353
|
ret = rb_enc_str_new(sm->output->str, sm->output->len, encoding);
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dtext_rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- r888888888
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|