Skip to content

Commit 0d80e4c

Browse files
committed
+function filter_token(token)
1 parent f45aaa0 commit 0d80e4c

File tree

3 files changed

+55
-9
lines changed

3 files changed

+55
-9
lines changed

_test suite/test.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5491,7 +5491,18 @@ function test_wiki() {
54915491

54925492
wikitext = '\n{{to del}} [[L]]'; parsed = CeL.wiki.parser(wikitext).parse(); 0;
54935493
parsed.each('template', function (token) { if (CeL.wiki.is_template('To del', token)) { return parsed.each.remove_token; } });
5494-
assert([parsed.toString(), '[[L]]'], 'parsed.each.remove_token #3');
5494+
assert([parsed.toString(), '[[L]]'], 'parsed.each.remove_token #4');
5495+
5496+
5497+
wikitext = '\n{{tT}} [[L]]_<p>f</p> {{tt|1}}<p class="s">s</p>a{{TT|2}}'; parsed = CeL.wiki.parser(wikitext).parse(); 0;
5498+
parsed.list = [];
5499+
parsed.each('template:tT', function (token) { parsed.list.push(token); }, { no_session_warning: true });
5500+
assert([parsed.list.join(''), '{{tT}}{{TT|2}}'], 'parsed.each(template) #1');
5501+
5502+
parsed = CeL.wiki.parser(wikitext).parse(); 0;
5503+
parsed.list = [];
5504+
parsed.each('<p>', function (token) { parsed.list.push(token); });
5505+
assert([parsed.list.join(''), '<p>f</p><p class="s">s</p>'], 'parsed.each(tag) #1');
54955506

54965507

54975508
CeL.wiki.set_language('en');

application/net/wiki/parser.js

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ function module_code(library_namespace) {
415415
* TODO: 可中途跳出。
416416
*
417417
* @param {String}[type]
418-
* 欲搜尋之類型。 e.g., 'template'. see
418+
* filter 或欲搜尋之類型。 e.g., 'template'. see
419419
* ((wiki_API.parse.wiki_element_toString)).<br />
420420
* 未指定: 處理所有節點。
421421
* @param {Function}processor
@@ -479,14 +479,38 @@ function module_code(library_namespace) {
479479
}
480480

481481
var token_name;
482+
function filter_token(token) {
483+
if (type && type !== (Array.isArray(token) ? token.type
484+
// 'plain': 對所有 plain text 或尚未 parse 的 wikitext.,皆執行指定作業。
485+
: 'plain')) {
486+
return false;
487+
}
488+
489+
if (!token_name)
490+
return true;
491+
492+
switch (token.type) {
493+
case 'transclusion':
494+
return session ? session.is_template(token_name, token)
495+
: token.name === token_name;
496+
497+
case 'tag_single':
498+
case 'tag':
499+
return token.tag === token_name;
500+
}
501+
}
502+
482503
if (type || type === '') {
483504
if (typeof type !== 'string') {
484505
library_namespace.warn('for_each_subelement: Invalid type ['
485506
+ type + ']');
486507
return;
487508
}
488509

489-
token_name = type.match(/^(Template):(.+)$/i);
510+
type = type.trim();
511+
// 配合 function filter_token(token)
512+
token_name = type.match(/^(Template):([^{}|:]+)$/i)
513+
|| type.match(/^({{)([^{}|:]+)}}$/i);
490514
if (token_name) {
491515
if (session) {
492516
token_name = session.redirect_target_of(type);
@@ -502,6 +526,21 @@ function module_code(library_namespace) {
502526
+ '未設定 session 卻篩選模板:' + token_name + ',會漏掉採用別名的模板!');
503527
console.trace(type);
504528
}
529+
530+
} else if (token_name = type.match(/^<(\w+)[^<>]*>/i)) {
531+
token_name[2] = wiki_API.parse(type, options, []);
532+
if (!(token_name[2] && (token_name[2].type === 'tag' || token_name[2].type === 'tag_single'))) {
533+
// e.g., .each('<p>', ...)
534+
token_name[2] = wiki_API.parse(type + '</' + token_name[1]
535+
+ '>', options, []);
536+
}
537+
if (token_name[2]
538+
&& (token_name[2].type === 'tag' || token_name[2].type === 'tag_single')) {
539+
type = token_name[2].type;
540+
token_name = token_name[2].tag;
541+
} else {
542+
token_name = null;
543+
}
505544
}
506545

507546
// normalize type
@@ -592,12 +631,7 @@ function module_code(library_namespace) {
592631
console.trace([ type, token ]);
593632
}
594633

595-
if ((!type
596-
// 'plain': 對所有 plain text 或尚未 parse 的 wikitext.,皆執行特定作業。
597-
|| type === (Array.isArray(token) ? token.type : 'plain'))
598-
&& (!token_name || (session ? token.type === 'transclusion'
599-
&& session.is_template(token_name, token)
600-
: token.name === token_name))) {
634+
if (filter_token(token)) {
601635
// options.set_index
602636
if (options.add_index && token && typeof token === 'object') {
603637
// 假如需要自動設定 .parent, .index 則必須特別指定。

application/net/wiki/parser/section.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,6 +1219,7 @@ function module_code(library_namespace) {
12191219
replace_by : replace_section_by,
12201220
toString : _this.toString
12211221
});
1222+
wiki_API.add_session_to_options(options[KEY_SESSION], section);
12221223
section[wiki_API.KEY_page_data] = _this.page;
12231224
all_root_section_list.push(section);
12241225
}

0 commit comments

Comments
 (0)