-
Notifications
You must be signed in to change notification settings - Fork 8
/
special page configuration.js
2408 lines (2173 loc) · 77.9 KB
/
special page configuration.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/**
* @fileoverview 本檔案包含了特殊頁面的設定。
*/
'use strict';
// Load CeJS library and modules.
require('./wiki loader.js');
// Load modules.
CeL.run([ 'application.net.wiki.template_functions',
// for CeL.assert()
'application.debug.log' ]);
/* eslint no-use-before-define: ["error", { "functions": false }] */
/* global CeL */
/* global Wiki */
var
/** {Number}未發現之index。 const: 基本上與程式碼設計合一,僅表示名義,不可更改。(=== -1) */
NOT_FOUND = ''.indexOf('_');
var
/** {Object}設定頁面所獲得之手動設定 manual settings。 */
configuration;
/**
* 由設定頁面讀入手動設定 manual settings。
*
* @param {Object}latest_task_configuration
* 最新的任務設定。
*/
function adapt_configuration_to_page(_configuration) {
configuration = _configuration;
}
// ================================================================================================
// 一般用討論頁面列表設定。
// column_to_header[column] = header used
var localized_column_to_header = {
// TODO: using https://translatewiki.net/wiki/Translating:MediaWiki
// @see https://zh.wikipedia.org/wiki/Wikipedia:用戶介面翻譯/MessagesZh_hant.php
// e.g., {{int:filehist-user}} {{int:filehist-datetime}}
zh : {
// 序號 Topics主題 討論名稱
title : '💭 話題',
// https://commons.wikimedia.org/wiki/Category:Convenient_Discussions
// [[File:Convenient Discussions logo color
// textless.svg|20px|link=|alt=發言]]
discussions : '<span title="發言數/發言人次 (實際上為計算簽名數)">💬</span>',
// 🗣️
participants : '<span title="參與討論人數/發言人數">👥</span>',
// first_user_set: 發起人與發起時間(Created)
// last_user_set: 最後留言者與最後時間(Last editor) 最後編輯者+最後編輯於 最後回覆時間
// [[File:Crystal Clear app personal.png|20px|link=|alt=]] 🧑
last_user_set : '🙋 最新發言 !! data-sort-type="isoDate" | <span title="最後更新">🕒 <small>(UTC+8)</small></span>',
// ⌚”在蘋果設備上會顯示成意義不明的蘋果手錶
// 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 🕞 🕟 🕠 🕡 🕢 🕣 🕤 🕥 🕦
// 🕧
// last_admin_set: 特定使用者 special_users.admin 最後留言者與最後時間
last_admin_set : '<span title="最新管理員發言">[[File:Admin mop.svg|20px|link=|alt=]] [[WP:ADM|管理員]]</span> !! data-sort-type="isoDate" | <span title="管理員更新">🕒 <small>(UTC+8)</small></span>',
// last_BAG_set: 特定使用者 special_users.BAG 最後留言者與最後時間(Last BAG editor)
// last_BAG_set: 最後BAG編輯者+BAG最後編輯於
last_BAG_set : '<span title="最新BAG發言">[[File:BAG laurier.svg|20px|link=WP:BAG|alt=]] [[WP:BAG|BAG]]</span> !! data-sort-type="isoDate" | <span title="BAG最後更新">🕒 <small>(UTC+8)</small></span>',
// https://commons.wikimedia.org/wiki/Category:Robot_head_icons
last_botop_set : '<small>🤖 最新[[Template:User bot owner|機器人操作者]]</small> !! data-sort-type="isoDate" | <span title="機器人操作者更新">🕒 <small>(UTC+8)</small></span>'
},
'zh-classical' : {
NO : 'data-sort-type="number" | <small>序</small>',
title : '💭 議題',
// 論
discussions : 'data-sort-type="number" | <span title="議論數">💬</span>',
participants : 'data-sort-type="number" | <small title="參議者數">👥</small>',
last_user_set : '🙋 末議者 !! data-sort-type="isoDate" | <span title="新易">🕒 <small>(UTC+8)</small></span>',
last_admin_set : '[[File:Admin mop.svg|20px|link=|alt=]] [[WP:有秩|有秩]] !! data-sort-type="isoDate" | <span title="有秩新易">🕒 <small>(UTC+8)</small></span>'
},
ja : {
// 質問や提案、議論
title : '💭 話題',
// 発言
discussions : '<span title="発言数">💬</span>',
participants : '<span title="議論に参加する人数">👥</span>',
last_user_set : '🙋 最終更新者 !! data-sort-type="isoDate" | <span title="最終更新日時">🕒 <small>(UTC+9)</small></span>',
// 審議者・決裁者
last_BAG_set : '<span title="BUR 決裁者更新">[[File:BAG laurier.svg|20px|link=WP:BAG|alt=]] [[WP:BUR|決裁者]]</span> !! data-sort-type="isoDate" | <span title="決裁者最後更新">🕒 <small>(UTC+9)</small></span>',
last_botop_set : '<small>🤖 [[Template:User bot owner|Bot運用者]]更新</small> !! data-sort-type="isoDate" | <span title="Bot運用者更新日時">🕒 <small>(UTC+9)</small></span>'
},
en : {
title : '💭 Title',
// Replies = discussions - 1
discussions : '<span title="Count of comments">💬</span>',
participants : '<span title="Count of peoples in discussion">👥</span>',
// Latest comment
last_user_set : '🙋 Last editor !! data-sort-type="isoDate" | <span title="Date/Time">🕒 <small>(UTC)</small></span>',
last_BAG_set : '<span title="Last BAG editor">[[File:BAG laurier.svg|20px|link=WP:BAG|alt=]] [[WP:BAG|BAG]]</span> !! data-sort-type="isoDate" | <span title="Date/Time">🕒 <small>(UTC)</small></span>',
last_botop_set : '<small title="bot owner, bot operator">🤖 Last botop editor</small> !! data-sort-type="isoDate" | <span title="Date/Time">🕒 <small>(UTC)</small></span>'
}
};
localized_column_to_header = localized_column_to_header[use_language]
// e.g., unknown language or 'commons' in CeL.wiki.api_URL.wikimedia
|| localized_column_to_header.en;
// console.trace(localized_column_to_header);
var column_to_header = Object.assign({
NO : 'data-sort-type="number" style="font-weight: normal;" | '
// № No 序號 '#' [[w:en:ordinal indicator|º]]
// <small title="No">#</small>
+ '<small>#</small>'
}, localized_column_to_header);
// Release memory. 釋放被占用的記憶體。
localized_column_to_header = null;
function generate_headers(page_configuration) {
var columns = page_configuration.columns;
columns = columns.split(';');
var headers;
// do not overwrite
if (page_configuration.headers) {
headers = page_configuration.headers;
} else {
/* let */var header_converter = page_configuration.column_to_header;
headers = '! ' + columns.map(function(column) {
return header_converter && header_converter[column]
//
|| column_to_header[column];
}).join(' !! ');
page_configuration.headers = headers;
}
return headers;
}
var
// need to add {{/topic list}} to {{/header}}
general_topic_page = '/topic list', general_page_configuration = {
topic_page : general_topic_page,
// autocollapse: 使用此技術會使頁面跳轉,通常應避免使用。
// https://www.mediawiki.org/wiki/Manual:Collapsible_elements
// https://en.wikipedia.org/wiki/Help:Collapsing#%22autocollapse%22
list_legend_class : "wikitable mw-collapsible mw-collapsed",
list_legend_style : "float: left; margin-left: .5em;",
// general_page_columns
columns : 'NO;title;discussions;participants;last_user_set'
// 不應該列出管理員那兩欄,似乎暗示著管理員與其他用戶不是平等的。
// + ';last_admin_set'
};
// workaround. TODO: using String_to_Date.zone
var localized_page_configuration = {
zh : {
timezone : 8,
// row_style : general_row_style
},
'zh-classical' : {
timezone : 8
},
ja : {
timezone : 9
}
};
localized_page_configuration = Object.assign(
localized_page_configuration[use_language] || Object.create(null),
globalThis.localized_page_configuration);
Object.assign(general_page_configuration, localized_page_configuration);
// console.log(general_page_configuration);
// Release memory. 釋放被占用的記憶體。
localized_page_configuration = null;
// generate_headers(general_page_configuration);
// ================================================================================================
// tool functions
function is_bot_user(user_name, section, using_special_users) {
// TODO: using section for [[w:ja:Wikipedia:Bot/使用申請]]
return (user_name in (using_special_users || globalThis.special_users).bot)
|| CeL.wiki.PATTERN_BOT_NAME.test(user_name);
}
function if_too_long(title) {
title = CeL.wiki.parser(title, {
// set options[KEY_SESSION]
// session : this.wiki
});
title.each('convert', function(token, index, parent) {
var keys;
if (token.no_convert
|| (keys = Object.keys(token.conversion)).length === 0)
return;
return keys.reduce(function(accumulator, currentValue) {
// 選出長度最長的轉換文字。
return accumulator.length < currentValue.length ? currentValue
: accumulator;
}, '');
}, true);
return title.toString()
// remove HTML tags
.replace(/<\/?[a-z][^<>]*>?/g, '')
// remove styles
.replace(/'''?/g, '').display_width() >
// 當標題過長,大於 max_title_length 時,縮小標題字型。
(configuration && configuration.general
&& configuration.general.max_title_length || 40);
}
// [[w:en:Help:Sorting#Specifying_a_sort_key_for_a_cell]]
function data_sort_attributes(key) {
var type;
if (typeof key === 'number') {
type = 'number';
} else if (CeL.is_Date(key)) {
type = 'isoDate';
key = key.toISOString();
}
key = 'data-sort-value="' + key + '" ';
if (type) {
key = 'data-sort-type="' + type + '" ' + key;
}
return key;
}
function local_number(number, attributes, style) {
if (use_language === 'zh-classical') {
return (attributes ? attributes + ' ' : '')
+ data_sort_attributes(number) + ' | '
// None, N/A
+ (number === 0 ? '無' : CeL.to_Chinese_numeral(number));
}
style = (style || '') + 'text-align: right;';
if (!attributes) {
if (!style) {
return number;
}
attributes = 'style="' + style + '"';
} else if (!attributes.includes('style="')) {
attributes += ' ' + 'style="' + style + '"';
} else {
attributes = attributes.replace('style="', 'style="' + style);
}
return attributes + ' | ' + number;
}
// ================================================================================================
// default configurations for BRFA 機器人申請
var default_BRFA_configurations = {
topic_page : general_topic_page,
columns : 'NO;title;status;discussions;participants;last_user_set;last_BAG_set',
column_to_header : {
en : {
// [[Bot awake.svg]]
title : '[[File:Logo wikibot.svg|20px|link=|alt=bot]] Bot request',
status : 'Status'
},
ja : {
title : '[[File:Logo wikibot.svg|20px|link=|alt=bot]] Bot使用申請',
status : '進捗'
},
zh : {
// [[Bot awake.svg]]
title : '[[File:Logo wikibot.svg|20px|link=|alt=bot]] 機器人申請',
status : '進度'
}
}[use_language],
// 要含入並且監視的頁面。
// e.g., {{Wikipedia:Bot/使用申請/InternetArchiveBot}}
transclusion_target : function(token) {
if (/\/(?:header|ヘッダ)$/i.test(token.name)) {
// 跳過標頭。
return;
}
if (token.name.startsWith('/')) {
return this.title + token.name;
}
if (token.name.startsWith(this.title + '/')) {
return token.name;
}
// for zhwiki
if (/^(?:維基百科|维基百科|Wikipedia|Project):(?:機器人|机器人)\/(?:申請|申请)\//i
.test(token.name)) {
return token.name;
}
},
// 篩選章節標題。
section_filter : BRFA_section_filter,
twist_filter : {
// 帶有審核意味的討論,審查者欄位應該去掉申請人。
BAG : function(section, user_group_filter) {
var new_filter = Object.create(null);
for ( var user_name in user_group_filter) {
if (!section.applicants.includes(user_name)
&& section.bot_name !== user_name) {
new_filter[user_name] = true;
}
}
return new_filter;
// for {Array}user_group_filter
return user_group_filter.map(function(user_name) {
return !section.applicants.includes(user_name);
});
}
},
// column operators
// @see section_column_operators
operators : {
title : function(section) {
var attributes = '';
// @see section_link_toString() @ CeL.wiki
section.section_title.link[2]
// [2]: display_text
= section.section_title.link[2]
//
.replace(/^(.+[^\d])(\d{1,3})$/, function(all, front, NO) {
NO = NO | 0;
attributes = data_sort_attributes(front + ' ' + NO.pad(3))
+ '| ';
return front.trimEnd() + ' <sub>' + NO + '</sub>';
});
return attributes + section.section_title.link;
},
bot_name : function(section) {
return section.bot_name;
},
// 操作者/申請人
applicants : function(section) {
return section.applicants.join(', ');
},
status : check_BRFA_status
}
};
// ----------------------------------------------
// asset: (MAX_32bit_INTEGER + 1) | 0 < 0
var MAX_32bit_INTEGER = (1 << 30) * 2 - 1;
var default_FC_vote_configurations = {
topic_page : general_topic_page,
columns : 'NO;title;support;oppose;invalid;status;countdown;discussions;participants;last_user_set',
column_to_header : {
zh : {
NO : 'data-sort-type="number" style="font-size: .3em;" |',
// 條目/圖片標題
title : '🎯 評選標題',
// 贊成 🙂 ✔️
support : 'data-sort-type="number" | <span title="支持票數">👍</span>',
// ☹️ ❌
oppose : 'data-sort-type="number" | <span title="反對票數">👎</span>',
// ❔ ❓ 🆖
invalid : 'data-sort-type="number" | <span title="無效票數。包括截止後的投票">❔</span>',
status : 'data-sort-type="number" | <span title="已去掉逾期選票">狀態</span>',
// Deadline 截止日期 ⏰
countdown : 'data-sort-type="number" | <span title="截止日期。從上次編輯時間起算之截止期限。非從現在起的時間!">⏲️</span>'
}
}[use_language],
// 要篩選的章節標題層級。 cf. .show_subtopic
level_filter : 3,
// 發言數量固定減去此數。
// 減去提名時嵌入的簽名。
discussion_minus : 1,
timeout_id_hash : Object.create(null),
// 註冊 listener。 this: see .section_filter()
vote_closed_listener : function() {
// wiki.page(this.title, pre_fetch_sub_pages);
},
// will be used in .section_filter()
support_templates : 'YesFA|YesFL|YesGA|YesGa|Yesga|YesFP'.split('|').map(
function(title) {
return CeL.wiki.normalize_title(title);
}).to_hash(),
oppose_templates : 'NoFA|NoFL|NoGA|NoGa|Noga|NoFP|Nofp'.split('|').map(
function(title) {
return CeL.wiki.normalize_title(title);
}).to_hash(),
cross_out_templates_header : {},
cross_out_templates_footer : {
// {{Votevoidh}}統合了較多模板。結尾部分分割得較多部分,例如{{Votevoidf}},{{Timeoutf}}
Votevoidf : true,
投票無效f : true,
// 該用戶投票因與先前重複而無效,但意見可供參考。
Votedupf : true,
// 投票者沒有註明理由,所以本票無效,請投票者補充理由。
Noreasonf : true,
沒理由f : true,
沒有理由f : true,
無理由f : true,
// 該用戶不符合資格
Notqualifiedf : true,
Nqf : true,
Nosignf : true,
未簽名f : true,
Unsignf : true,
// 傀儡投票
Sockvotedupf : true,
// 投票者使用刪除線刪除本票,所以本票無效。
Votedeletef : true,
Timeoutf : true,
OvertimeF : true,
超過時限f : true,
Overtimef : true,
},
set_vote_closed : set_FC_vote_closed,
get_votes_on_date : get_FC_votes_on_date,
// 篩選章節標題。
section_filter : FC_section_filter,
// for FA, FL
pass_vote : function(diff, section) {
var page_configuration = this.page.page_configuration;
return diff >= 8
// 有效淨支持票數滿8票方能中選。
&& page_configuration.get_votes_on_date(section, null, true) >= 2 * page_configuration
.get_votes_on_date(section, null, false);
},
// column operators
// @see section_column_operators
operators : {
title : function(section) {
var title = section.section_title.title,
// 當標題過長時,縮小標題字型。
title_too_long = if_too_long(title);
// TODO: title = CeL.wiki.parser.section_link(title); ...
// @see section_link_toString() @ CeL.wiki
title = CeL.wiki.title_link_of(section.section_title.link[0]
.replace(/\/(?:提名区|提名區)$/, '')
+ '#' + title, title);
return title_too_long ? '<small>' + title + '</small>' : title;
},
support : function(section) {
var page_configuration = this.page.page_configuration;
var votes = page_configuration.get_votes_on_date(section, null,
true);
return votes > 0 ? local_number(votes) : '';
},
oppose : function(section) {
var page_configuration = this.page.page_configuration;
var votes = page_configuration.get_votes_on_date(section, null,
false);
return votes > 0 ? local_number(votes) : '';
},
invalid : function(section) {
var votes = section.vote_list.invalid.length;
if (votes > 0) {
// console.log(section.vote_list.invalid);
}
return votes > 0 ? local_number(votes, null, 'color: red;') : '';
},
countdown : FC_vote_countdown,
status : check_FC_status
}
};
Object
.assign(default_FC_vote_configurations,
globalThis.FC_vote_configurations);
Object.keys(default_FC_vote_configurations.cross_out_templates_footer)
//
.forEach(function(title) {
if (!/f$/i.test(title))
return;
title = title.replace(/f$/i, function($0) {
return $0 === 'f' ? 'h' : 'H';
});
default_FC_vote_configurations.cross_out_templates_header[title] = true;
});
// console.log(default_FC_vote_configurations);
// default configurations for DYK vote 投票
// TODO: check [[Category:拒絕當選首頁新條目推薦欄目的條目]]
var default_DYK_vote_configurations = {
page_header1 : '<span style="color: red;">下面這個列表正在測試中。請[[Wikipedia:互助客栈/其他#是否要保留新條目評選列表討論|提供您的意見]]讓我們知道,謝謝!</span>',
page_header2 : '<span style="color: red;">依據[[Wikipedia:互助客栈/其他#是否要保留新條目評選列表討論|討論]],希望回復原先列表的人數較多。將會在4月24日恢復原先列表。</span>',
// 默認摺疊,需要的點擊展開
header_class : 'wikitable sortable mw-collapsible mw-collapsed',
// 建議把票數隱藏,我非常擔心這會為人情水票大開方便之門。
columns : 'NO;title;status;countdown;discussions;participants;last_user_set',
// .no_vote_message: 不要顯示得票數。
no_vote_message : true,
// 要篩選的章節標題層級。
level_filter : 4,
discussion_minus : 0,
// 肯定
// 規則講明計算「支持票」和「反對票」,如果接受帶有「激情」的票,怕會做壞榜樣
// |Strong support|强烈支持 |Strong oppose|Strongly oppose|強烈反對
// 未來若要採用機器計票,遇到類似情況,直接讓計票機器人提醒。溫馨提示
// {{提醒}}:{{ping|user}}{{tl|強烈支持}}並不是有效票。按本區規則,計算有效票衹接受{{tl|支持}}和{{tl|反對}}。
// --~~~~
//
// {{滋瓷}}本來就是娛樂用途 |滋磁|Zici|Zupport|滋瓷|资磁|资瓷|资辞
// {{傾向支持}}的立場比較薄弱,當成1票支持計算似乎也不合理。
support_templates : 'Support|SUPPORT|Pro|SP|ZC|支持'.split('|').map(
function(title) {
return CeL.wiki.normalize_title(title);
}).to_hash(),
// {{Seriously}}
oppose_templates : 'Oppose|OPPOSE|Contra|不同意|O|反对|反對'.split('|').map(
function(title) {
return CeL.wiki.normalize_title(title);
}).to_hash(),
// 篩選章節標題。
section_filter_in_template : function(token, section) {
if (token.name === 'DYKEntry') {
section.DYKEntry = token;
// overwrite section.section_title.title for `new_topics`
section.section_title.title = token.parameters.article;
if (+token.parameters.timestamp) {
section.vote_time_limit = 1000
// .timestamp: in seconds
* token.parameters.timestamp
// 基本投票期為4天。
+ CeL.date.to_millisecond('4D');
}
} else if (token.name === 'DYKCsplit') {
// 記錄這一段可直接跳過。
section.may_skip_section = true;
}
},
// 否則,投票期將自動延長3天,並待至延長投票期屆滿時方為結束投票;
extend_intervals : [ '3D' ],
section_filter_postfix : function(section) {
if (!section.DYKEntry)
return !section.may_skip_section;
},
// 已經可以早期判別選舉的結果。
pass_vote_prefix : function(section) {
if (section.DYKEntry) {
if (/^\+/.test(section.DYKEntry.parameters.result)) {
return "<span style=\"color: green;\">'''當選'''</span>";
}
if (/^\-/.test(section.DYKEntry.parameters.result)) {
return "<span style=\"color: red;\">'''未當選'''</span>";
}
}
},
pass_vote : function(diff, section) {
// 有效淨支持票數滿4票方能中選。
return diff >= 4;
},
// column operators
operators : {
title : function(section) {
if (!section.DYKEntry)
return 'N/A';
var title = section.DYKEntry.parameters.article,
// 當標題過長時,縮小標題字型。
title_too_long = if_too_long(title);
// @see section_link_toString() @ CeL.wiki
title = CeL.wiki.title_link_of(section.section_title.link[0] + '#'
+ title, title);
return title_too_long ? '<small>' + title + '</small>' : title;
}
}
};
default_DYK_vote_configurations.operators = Object.assign(Object.create(null),
default_FC_vote_configurations.operators,
default_DYK_vote_configurations.operators);
default_DYK_vote_configurations = Object.assign(Object.create(null),
default_FC_vote_configurations, default_DYK_vote_configurations);
// ----------------------------------------------
// https://ja.wikipedia.org/wiki/Help:管理者マニュアル_ページの削除
var jawiki_week_AFD_options = {
topic_page : general_topic_page,
timezone : 9,
// 定時更新 Refresh page automatically
update_at : {
// 以 .timezone 為基準的時分秒 '0:0:0'
time : '0:0'
},
header_class : 'wikitable sortable mw-collapsible mw-collapsed',
// 4: [[Wikipedia:削除依頼/東芝グループ企業間の履歴不継承転記]]
level_filter : [ 3, 4 ],
columns : 'NO;title;status;support;oppose;discussions;participants;last_user_set',
column_to_header : {
title : '依頼ページ',
status : '進捗',
//
support : '<small>存続</small>',
oppose : '<small>削除</small>'
},
// column operators
operators : {
title : function(section) {
this.page.page_configuration.operators.status.call(this, section);
var had_decided = section.had_decided;
var title = section.section_title.title
// {{Particle}}, {{P}}
.replace('(ノート / 履歴 / ログ / リンク元)', '')
// {{Ptalk}}
.replace('(履歴 / ログ / リンク元)', '')
// {{Particle4}}
.replace('(ノート / 履歴)', ''),
// 當標題過長時,縮小標題字型。
title_too_long = if_too_long(title);
var style = had_decided ? 'color: gray;' : /^[((][^()()]*緊/
.test(title) ? 'color: red;' : '';
if (style) {
title = '<span style="' + style + '">' + title + '</span>';
} else {
title = title.replace(/^([((][^()()]+[))])/,
'<span style="color: #c70;">$1</span>')
}
// @see section_link_toString() @ CeL.wiki
title = CeL.wiki.title_link_of(section.section_title.link[0] + '#'
+ (section.section_title.link[1] || ''), title);
return title_too_long ? '<small>' + title + '</small>' : title;
},
status : function(section) {
if ('AFD_status' in section) {
// has cache
return section.AFD_status;
}
var status, matched = section.toString().match(
/議論の結果、'''([^'+]+)''' に決定しました/);
if (matched) {
var status_text = matched[1];
// was_closed
section.had_decided = /* status_text */true;
var too_long;
// [[Help:管理者マニュアル ページの削除#削除依頼の保存]]
// Must in {{AFD}} parameters
if (status_text in {
存続 : true,
削除 : true,
即時存続 : true,
即時削除 : true,
特定版削除 : true,
版指定削除 : true,
緊急削除 : true,
緊急特定版削除 : true,
緊急版指定削除 : true,
即時版指定削除 : true,
全削除 : true
}) {
too_long = status_text.length > 3;
status = '{{AFD|' + status_text + '}}';
} else {
too_long = status_text.length > 4;
status = status_text;
}
if (too_long) {
status = '<small title="' + status_text + '">' + status
+ '</small>';
}
var max_width = '5em';
// https://bennettfeely.com/clippy/
status = 'style="max-width: ' + max_width
+ '; white-space: nowrap; clip-path: polygon(0 0, '
+ max_width + ' 0, ' + max_width
+ ' 100%, 0 100%);" | ' + status;
} else {
var to_exit = this.each.exit;
this.each.call(section, 'template', function(token) {
var decide = token.name;
if (decide === 'AFD') {
decide = token[1] && token[1].toString();
// https://ja.wikipedia.org/wiki/Template:AFD
if (!decide || decide.endsWith('r'))
return;
}
if (!decide)
return;
if (decide in {
// 取り下げ : true,
// Help:管理者マニュアル ページの削除
// 以下の引数は管理者専用です
対処 : true,
確認 : true,
却下 : true,
失効 : true,
議論終了 : true,
// {{終了}}
終了 : true,
// {{依頼無効}}
依頼無効 : true
}) {
status = token.toString();
section.had_decided = /* status */true;
return to_exit;
}
});
}
if (status) {
// cache status
section.AFD_status = status;
}
return status;
},
support : function(section, section_index) {
var vote_count = 0;
this.each.call(section, 'template', function(token) {
var vote = token.name === 'AFD' && token[1]
&& token[1].toString();
// https://ja.wikipedia.org/wiki/Template:AFD
if (!vote || vote.endsWith('r'))
return;
if (vote.includes('存続'))
vote_count++;
});
return vote_count || '';
},
oppose : function(section, section_index) {
var vote_count = 0;
this.each.call(section, 'template', function(token) {
var vote = token.name === 'AFD' && token[1]
&& token[1].toString();
// https://ja.wikipedia.org/wiki/Template:AFD
if (!vote || vote.endsWith('r'))
return;
if (vote.includes('削除') || vote.includes('一部')
|| vote.includes('特定版') || vote.includes('版指定')
|| vote.includes('緊急')) {
vote_count++;
}
});
return vote_count || '';
}
},
// TODO: using expand_transclusion()
preprocess_section_link_token : function(token) {
if (token.type === 'transclusion') {
// console.log(token);
var template_name = token.name;
if (template_name === 'Page') {
var page_name = token[1].toString().trim();
if (/(?:talk|ノート):/i.test(page_name)) {
template_name = 'Ptalk';
} else if (false && /^(?:Wikipedia|ファイル|File|MediaWiki|Template|Help|Category|Portal)/i
.test(page_name)) {
template_name = 'P';
} else {
template_name = 'Particle';
}
}
switch (template_name) {
case 'Particle':
// console.log(token);
return token[1] + '(ノート / 履歴 / ログ / リンク元)';
case 'P':
// console.log(token);
return token[1] + ':' + token[2] + '(ノート / 履歴 / ログ / リンク元)';
case 'Ptalk':
return token[1] + '(履歴 / ログ / リンク元)';
case 'Particle4':
return token[1] + '(ノート / 履歴)';
// 利用者情報表示用テンプレート
case 'User':
return '利用者:' + token[1] + '(会話 / 投稿記録)';
case 'User2':
return '利用者:' + token[1] + '(会話 / 投稿記録 / 記録)';
case 'User3':
return token[1] + '(会話 / 投稿記録 / 記録)';
case 'Curid':
return token[2] || ('ページ番号' + token[1]);
case 'Oldid':
return token[2] || ('版番' + token[1]);
}
}
return token;
},
transclusion_target : function(token) {
var prefix = 'Wikipedia:削除依頼/ログ/';
if (!token.name.startsWith(prefix))
return;
// console.log(token.name);
var matched = token.name.slice(prefix.length)
// {{Wikipedia:削除依頼/ログ/{{今日}}}}
.replace(/{{今日}}/g, '{{#time:Y年Fj日|-0 days +9 hours}}').match(
/{{ *#time: *Y年Fj日 *\| *([+\-]?\d+) +days/);
if (!matched)
return;
var date = new Date;
date.setDate(date.getDate() + +matched[1]);
var wiki = this.wiki;
var page_data = this;
// console.log(page_data);
// console.log(page_data.page_configuration);
// console.log(prefix + date.format('%Y年%m月%d日'));
return new Promise(function(resolve, reject) {
var sub_page_title = prefix + date.format({
format : '%Y年%m月%d日',
zone : page_data.page_configuration.timezone
});
globalThis.listen_to_sub_page(sub_page_title, page_data);
wiki.page(sub_page_title, function(page_data) {
var parsed = CeL.wiki.parser(page_data, {
// set options[KEY_SESSION]
session : wiki
});
var page_list = [];
parsed.each('transclusion', function(token, index, parent) {
// e.g., for Error: 取得了未設定的頁面:
// [[Wikipedia:削除依頼/横浜市立十日市場中学校]]
// @ [[Wikipedia:削除依頼/ログ/2019年10月29日]]
var page_title = CeL.wiki.normalize_title(token.name);
if (page_title.startsWith('Wikipedia:削除依頼/'))
page_list.push(CeL.wiki.normalize_title(page_title));
});
if (CeL.is_debug(1)) {
CeL.info(CeL.wiki.title_link_of(page_data.title)
+ ' transcludes:');
console.log(page_list);
}
page_list.multi = true;
resolve(page_list);
});
});
}
};
// ----------------------------------------------
// 檢查議體進度/狀態。
function check_Status_template(section, section_index) {
var status_token;
section.each('Template:Status', function(token) {
status_token = token;
token.push('prefix=');
return section.each.exit;
});
return status_token && status_token.toString();
}
// ================================================================================================
// page configurations for all supported talk pages
var page_configurations = {
'commonswiki:Commons:Bots/Work requests' : {
topic_page : general_topic_page,
timezone : 0,
columns : 'NO;title;status;discussions;participants;last_user_set;last_botop_set',
column_to_header : {
title : 'Bot request',
status : 'Status',
last_botop_set : '<small title="bot owner, bot operator">🤖 Last [[:Category:Commons bot owners|botop]] editor</small> !! data-sort-type="isoDate" | <span title="Date/Time">🕒 <small>(UTC)</small></span>'
},
operators : {
// 議體進度/狀態。
status : check_BOTREQ_status
}
},
'enwiki:Wikipedia:Bot requests' : {
topic_page : general_topic_page,
columns : 'NO;title;status;discussions;participants;last_user_set;last_botop_set',
column_to_header : {
title : 'Bot request',
status : 'Status'
},
operators : {
// 議體進度/狀態。
status : check_BOTREQ_status
}
},
// TODO: Wikipedia:バグの報告 Wikipedia:管理者伝言板 Wikipedia:お知らせ
'jawiki:Wikipedia:Bot/使用申請' : Object.assign({
timezone : 9
// 僅會顯示包含"bot"的標題
// @see is_bot_user(user_name, section)
}, default_BRFA_configurations),
'jawiki:Wikipedia:Bot作業依頼' : {
topic_page : general_topic_page,
timezone : 9,
columns : 'NO;title;status;discussions;participants;last_user_set;last_botop_set',
column_to_header : {
title : '依頼',
status : '進捗'
},
// column operators
operators : {
status : check_BOTREQ_status
}
},
// TODO: Template:井戸端から誘導
// 被認為無用
'jawiki:Wikipedia:井戸端' : Object.assign({
// [[Wikipedia‐ノート:井戸端#節ごとの発言数・参加者数・最終更新日時などの表(topic list)について]]
// 初期設定は折り畳んだ状態で (collapsed)
// [[Wikipedia:議論が盛んなノート]]の更新Botをフッタに対応させ、
// [[Wikipedia:井戸端/topic list]]を取り込んでみました。こちらでは表示の折り畳みは不要かと思われます
header_class : 'wikitable sortable mw-collapsible',
additional_header : 'style="float: left;"',
timezone : 9,
transclusion_target : function(token) {
if (token.name === '井戸端サブページ' && token.parameters.title) {
return 'Wikipedia:井戸端/subj/' + token.parameters.title;
}
if (token.name === '井戸端から誘導' && token.parameters.page) {
return [ token.parameters.page, token.parameters.title ];
}
},
postfix : function(section_table) {
// 早見表
if (false)
// using .page_header
section_table.push("↑'''この議題一覧表に関する議論は現在[[Wikipedia‐ノート:井戸端"
+ "#節ごとの発言数・参加者数・最終更新日時などの表(topic list)について"
+ "|ノートページ]]で行われています。皆様のご意見をお願いいたします。'''");
},
purge_page : 'Wikipedia:議論が盛んなノート'
}, general_page_configuration),
'jawiki:Wikipedia:削除依頼/ログ/今週' : jawiki_week_AFD_options,
'jawiki:Wikipedia:削除依頼/ログ/先週' : jawiki_week_AFD_options,
'jawiki:Wikipedia:削除依頼/ログ/先々週' : jawiki_week_AFD_options,
'zhwiki:Wikipedia:机器人/作业请求' : {
topic_page : general_topic_page,
timezone : 8,
columns : 'NO;title;status;discussions;participants;last_user_set;last_botop_set',
column_to_header : {
title : '需求',
// 處理情況
status : '進度',
},
operators : {
// 議體進度/狀態。
status : check_BOTREQ_status
}
},
'zhwiki:Wikipedia:机器人/申请' : Object.assign({
timezone : 8,
// 要篩選的章節標題層級。
level_filter : [ 2, 3 ],
// 發言數量固定減去此數。
// 減去機器人等權限申請時嵌入的簽名。
discussion_minus : 1
}, default_BRFA_configurations),
'zhwiki:Wikipedia:机器用户/申请' : Object.assign({
timezone : 8,
column_to_header : {
title : '機器用戶申請'
},
// 要篩選的章節標題層級。
level_filter : 3
}, Object.assign(Object.create(null), default_BRFA_configurations, {
transclusion_target : null,
section_filter : RFF_section_filter
})),
// TODO: 維基百科:同行評審
'zhwiki:Wikipedia:典范条目评选/提名区' : Object.assign({
timezone : 8,
// 不顯示發言更新圖例 list_legend。
need_time_legend : false
}, default_FC_vote_configurations),
'zhwiki:Wikipedia:特色列表评选/提名区' : Object.assign({
timezone : 8,
need_time_legend : false,
// 初次延長期(基礎評選期+14日)及最後延長期(初次延長期+28日)
// extend_intervals : [ '14D', '28D' ]
// 2020/12/2 特色列表評選(包括重審)和特色圖片評選(包括除名)現已統一為14+14天
// 評選延長期(基礎評選期+14日)
extend_intervals : [ '14D' ]
}, default_FC_vote_configurations),
'zhwiki:Wikipedia:優良條目評選/提名區' : Object.assign({
timezone : 8,
need_time_legend : false
}, default_FC_vote_configurations, {