forked from hoothin/UserScripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pagetual.user.js
5592 lines (5452 loc) · 264 KB
/
pagetual.user.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
// ==UserScript==
// @name Pagetual
// @name:zh-CN 东方永页机
// @name:zh-TW 東方永頁機
// @name:ja 東方永頁機
// @name:ru Pagetual
// @name:de Pagetual
// @name:es Pagetual
// @name:fr Pagetual
// @name:it Pagetual
// @name:ko 東方永頁機
// @namespace hoothin
// @version 1.9.32.38
// @description Perpetual pages - Most powerful auto-pager script. Auto loading next paginated web pages and inserting into current page. Support thousands of web sites without any rule.
// @description:zh-CN 自动翻页 - 加载并拼接下一分页内容至当前页尾,无需规则自动适配任意网页
// @description:zh-TW 自動翻頁 - 加載並拼接下一分頁內容至當前頁尾,無需規則自動適配任意網頁
// @description:ja Webページを自動で読み込み継ぎ足し表示を行うブラウザ拡張です、次のページ付けされた Web ページの自動読み込みと現在のページへの挿入 ルールなしで何千もの Web サイトをサポートします。
// @description:ru Автоматическая загрузка следующих веб-страниц с разбивкой на страницы и вставка на текущую страницу. Поддержка тысяч веб-сайтов без каких-либо правил.
// @description:de Automatisches Laden der nächsten paginierten Webseiten und Einfügen in die aktuelle Seite. Unterstützen Sie Tausende von Websites ohne Regeln.
// @description:es Carga automática de las siguientes páginas web paginadas e inserción en la página actual. Admite miles de sitios web sin ninguna regla.
// @description:fr Chargement automatique des pages Web paginées suivantes et insertion dans la page en cours. Prend en charge des milliers de sites Web sans aucune règle.
// @description:it Caricamento automatico delle pagine Web impaginate successive e inserimento nella pagina corrente. Supporta migliaia di siti web senza alcuna regola.
// @description:ko 페이지가 매겨진 다음 웹 페이지를 자동으로 로드하고 현재 페이지에 삽입합니다. 규칙 없이 수천 개의 웹 사이트를 지원합니다.
// @author hoothin
// @match *://*/*
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAdVBMVEUAAAD3VU33VU32VEz8U073VU32VU33VU32VUz0Uk/3VE32VU32VUz2VU32VU32VU32VU33VU33U0z2VU34Wkv3VE32VUz/mpj/nJj2VUz2VU32VE33VEz2VU32VU32VUz3VE32VEz3VE3/mZf2Vkz2VU3/mpilFFolAAAAJXRSTlMA3Lp/GvTBT5YQLuawZ/DOyZwlPQeKc21N04+FX1bqpm9DNoB4T68ePwAAAitJREFUWMPt1tuasiAUBuCFCG5Rs3QybTPV1/1f4v/3PDkyIojn8x5qBrI+ltAfh32/yysmBKvyXb+njb6bDL9kzTd5SzjDAsYT8nFoGSxYe6BVqoNDp2jFDit25BRgVUAODB4YWcETWVTwVNGiGN5iWtBgg4YMCpsoI38dNunmmWyxUTvbPwwbsYR0fIzZLQ0pTG8eieRmBLMmpdH9uimQEf6TNRnXXKLZHixpJtywLzOgMHtFCqdM64DahHRnOE1dsrekm9wr2WtLcAlpdHwcp1pAJySXYnERclzp4+v19jXdmcTvQUJtz+ZaI4i05/V/UGYrCxbaAsOYoNfIKEQxpqQuzCgJJJ/3f42O8ywEZuMVWi/8hODxGj3GW2b0udkbGULLDOjimAG0S3fLGlBnXQM9irG1CiQdVQi0dqQsOSDlyEEz7Vy9OxxfR71VCXsSB23jMrKJYZXSjw57sqgLn5Z0wolsOCz0RyJkyeYjgz7pwwVq20eboZwtVUl2EnN5gJ50dQZFdryATvABRTr/tJXkUMdaAK5pwtCapwtFLskguwuyMh/Sd9WChQ4sIvIUYSk3PYqQvCQlOC04IfN7PkdjOyRKWhdKXMmiAFt9i3sJ5jxoRuR0vqAghxxwHuqfQE5OHGDKOrwEnqs1DgAZ2e4Eev1d45TN7JfhrQLKgfwMFYAsvp33dXII073aVQLI2gN5S58lfmGnKKFtah7nkgnBZB7zlP7Y/QNiTM6sYNzawwAAAABJRU5ErkJggg==
// @grant GM_xmlhttpRequest
// @grant GM_registerMenuCommand
// @grant GM_notification
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @grant GM_openInTab
// @grant GM_deleteValue
// @grant GM_info
// @grant GM_setClipboard
// @grant GM.xmlHttpRequest
// @grant GM.registerMenuCommand
// @grant GM.notification
// @grant GM.getValue
// @grant GM.setValue
// @grant GM.addStyle
// @grant GM.openInTab
// @grant GM.deleteValue
// @grant GM.info
// @grant GM.setClipboard
// @downloadURL https://greasyfork.org/scripts/438684-pagetual/code/Pagetual.user.js
// @updateURL https://greasyfork.org/scripts/438684-pagetual/code/Pagetual.user.js
// @supportURL https://github.com/hoothin/UserScripts/issues
// @connect wedata.net
// @connect githubusercontent.com
// @connect ghproxy.com
// @connect hoothin.github.io
// @run-at document-idle
// @exclude http://www.toodledo.com/tasks/*
// @exclude http*://maps.google.com*/*
// @exclude *://www.google.*/_/chrome/newtab*
// @exclude *://mega.*/*
// @exclude *://*.mega.*/*
// @exclude *://*.youku.com/v_*
// @exclude *://*pan.baidu.com
// @exclude *://*.iqiyi.com/v_*
// @exclude *://*.iqiyi.com/w_*
// @exclude *://*.iqiyi.com/a_*
// @exclude *://*.le.com/ptv/vplay/*
// @exclude *://v.qq.com/x/cover/*
// @exclude *://v.qq.com/x/page/*
// @exclude *://v.qq.com/tv/*
// @exclude *://*.tudou.com/listplay/*
// @exclude *://*.tudou.com/albumplay/*
// @exclude *://*.tudou.com/programs/view/*
// @exclude *://*.mgtv.com/b/*
// @exclude *://film.sohu.com/album/*
// @exclude *://tv.sohu.com/v/*
// @exclude *://*.bilibili.com/video/*
// @exclude *://*.bilibili.com/bangumi/play/*
// @exclude *://*.baofeng.com/play/*
// @exclude *://vip.pptv.com/show/*
// @exclude *://v.pptv.com/show/*
// @exclude *://www.le.com/ptv/vplay/*
// @exclude *://www.wasu.cn/Play/show/*
// @exclude *://m.v.qq.com/*
// @exclude *://m.iqiyi.com/*
// @exclude *://m.youku.com/alipay_video/*
// @exclude *://m.mgtv.com/b/*
// @exclude *://m.tv.sohu.com/v/*
// @exclude *://m.film.sohu.com/album/*
// @exclude *://m.le.com/ptv/vplay/*
// @exclude *://m.pptv.com/show/*
// @exclude *://m.acfun.cn/v/*
// @exclude *://m.bilibili.com/video/*
// @exclude *://m.bilibili.com/anime/*
// @exclude *://m.bilibili.com/bangumi/play/*
// @exclude *://m.wasu.cn/Play/show/*
// @exclude *://www.youtube.com
// @exclude *://www.youtube.com/*
// @exclude *://twitter.com/*
// @exclude *://www.youtube.com/watch*
// @exclude *://baike.baidu.com/*
// @exclude *://*.instagram.com/*
// @exclude *://order.jd.com/*
// @exclude *://pagetual.hoothin.com/*
// @exclude *://wenku.baidu.com/view/*
// @exclude *://pan.baidu.com/*
// @connect *
// ==/UserScript==
(function() {
'use strict';
if (window.name === 'pagetual-iframe' || (window.frameElement && window.frameElement.name === 'pagetual-iframe')) {
var domloaded = function (){
window.scroll(window.scrollX, 999999);
window.parent.postMessage('pagetual-iframe:DOMLoaded', '*');
};
if(window.opera){
document.addEventListener('DOMContentLoaded', domloaded, false);
} else {
domloaded();
}
if (getComputedStyle(document.documentElement).display == 'none') document.documentElement.style.display = 'block';
if (getComputedStyle(document.body).display == 'none') document.body.style.display = 'block';
return;
}
if(window.top != window.self){
try{
if (top.location.hostname != window.location.hostname || window.top != window.parent) {
return;
}
}catch(e){
return;
}
}
const noRuleTest = false;
const lang = navigator.appName=="Netscape"?navigator.language:navigator.userLanguage;
let config={};
switch (lang){
case "zh-CN":
case "zh-SG":
config = {
enableDebug:"调试模式,输出信息至控制台",
disable:"暂时禁用",
disableSite:"切换禁用状态",
disableSiteTips:"已在此站禁用",
enableSiteTips:"已在此站启用",
enable:"启用翻页",
toTop:"回到顶部",
toBottom:"前往页尾",
current:"当前页",
forceIframe:"强制拼接",
cancelForceIframe:"取消强制拼接",
configure:"打开配置页面",
firstUpdate:"点击此处初始化规则",
update:"更新规则",
click2update:"点击立即更新规则",
loadNow:"立即翻页",
loadConfirm:"要翻几页?(0为不间断)",
noNext:"没有找到下一页,请新建规则",
passSec:"更新于 #t# 秒前",
passMin:"更新于 #t# 分钟前",
passHour:"更新于 #t# 小时前",
passDay:"更新于 #t# 天前",
cantDel:"无法删除内置规则",
confirmDel:"是否确认要删除此规则?",
updateSucc:"更新成功",
beginUpdate:"正在更新,请耐心等待,不要关闭页面",
customUrls:"导入 Pagetual 或 AutoPagerize 规则 url,一行一条",
customRules:"输入【东方永页机】格式的自定义规则",
save:"保存设置",
loadingText:"少女祈祷中...",
opacity:"不透明值",
opacityPlaceholder:"0: 隐藏分隔条",
hideBar:"隐藏分页隔条",
hideBarButNoStop:"隐藏但不停止",
dbClick2Stop:"空白处双击暂停翻页",
sortTitle:"排序在下次更新规则后生效",
autoRun:"自动启用,否则为白名单模式",
autoLoadNum:"自动加载指定页数",
inputPageNum:"输入页码跳转",
enableHistory:"翻页后写入历史记录",
enableHistoryAfterInsert:"拼接后立即写入历史记录,否则浏览完毕后再行写入",
initRun:"打开页面后立即尝试翻页,否则滚动至页尾再翻页",
preload:"翻页前预读下一页,加速浏览",
click2ImportRule:"点击下方添加特殊规则库,并静待更新成功:",
forceAllBody:"是否拼接整个页面?",
openInNewTab:"使拼接页面的内容在新页面打开",
importSucc:"导入成功",
import:"导入",
editCurrent:"编辑此站规则",
editBlacklist:"编辑黑名单网址,一行一条,支持? *通配符",
upBtnImg:"回到页首图标",
downBtnImg:"前往页尾图标",
loadingTextTitle:"加载中文字",
dbClick2StopCtrl:"Ctrl 键",
dbClick2StopAlt:"Alt 键",
dbClick2StopShift:"Shift 键",
dbClick2StopMeta:"Meta 键",
dbClick2StopKey:"快捷键",
pageElementCss:"页面主体框架的样式",
customCss:"自定义 CSS",
firstAlert:"你还未导入规则库,请选择合适的规则库导入哦",
picker:"东方永页机主体元素抓取器",
closePicker:"关闭东方永页机抓取器",
pickerPlaceholder:"没想法建议留空",
pickerCheck:"检查你编辑的选择器并复制",
switchSelector:"点击切换元素",
gotoEdit:"使用当前的选择器前往编辑规则",
manualMode:"禁用拼接,手动用右方向键翻页,可使用 Alt + 左方向键返回",
clickMode:"禁用拼接,滚动至页尾时自动点击下一页",
pageBarMenu:"点击分隔条中间弹出菜单",
nextSwitch:"切换其他页码",
arrowToScroll:"左方向键滚动至上一页,右方向键滚动至下一页",
hideLoadingIcon:"隐藏加载动画",
duplicate:"检测到永页机重复安装,请删除其他脚本管理器中的永页机!",
forceStateIframe:"以 iframe 嵌入整页",
forceStateDynamic:"通过 iframe 加载动态内容后取出",
forceStateDisable:"在此站禁用"
};
break;
case "zh-TW":
case "zh-HK":
config = {
enableDebug:"調試模式,輸出信息至控制台",
disable:"暫時禁用",
disableSite:"切換禁用狀態",
disableSiteTips:"已在此站禁用",
enableSiteTips:"已在此站啟用",
enable:"啟用翻頁",
toTop:"回到頂部",
toBottom:"前往頁尾",
current:"當前頁",
forceIframe:"強制拼接",
cancelForceIframe:"取消强制拼接",
configure:"打開配置頁面",
firstUpdate:"點擊此處初始化規則",
update:"更新規則",
click2update:"點擊立即更新規則",
loadNow:"立即翻頁",
loadConfirm:"要翻几頁?(0為不間斷)",
noNext:"沒有找到下一頁,請新建規則",
passSec:"更新于 #t# 秒前",
passMin:"更新于 #t# 分鐘前",
passHour:"更新于 #t# 小時前",
passDay:"更新于 #t# 天前",
cantDel:"無法刪除内置規則",
confirmDel:"是否確認要刪除此規則?",
updateSucc:"更新成功",
beginUpdate:"正在更新,請稍候",
customUrls:"導入 Pagetual 或 AutoPagerize 規則 url,一行一條",
customRules:"輸入【東方永頁機】格式的自定義規則",
save:"存儲設置",
loadingText:"少女祈禱中...",
opacity:"不透明值",
opacityPlaceholder:"0: 隱藏分隔條",
hideBar:"隱藏分頁隔條",
hideBarButNoStop:"隱藏但不停止",
dbClick2Stop:"空白處雙擊暫停翻頁",
sortTitle:"排序在下次更新規則後生效",
autoRun:"自動啓用,否則為白名單模式",
autoLoadNum:"自動加載指定頁數",
inputPageNum:"輸入頁碼跳轉",
enableHistory:"翻頁后寫入歷史記錄",
enableHistoryAfterInsert:"拼接後立即寫入歷史記錄,否則瀏覽完畢後再行寫入",
initRun:"打開頁面后立即嘗試翻頁,否則滾動至頁尾再翻頁",
preload:"翻頁前預讀下一頁,加速瀏覽",
click2ImportRule:"點擊下方添加特殊規則庫,并靜待更新成功:",
forceAllBody:"是否拼接整個頁面?",
openInNewTab:"使拼接頁面的内容在新頁面打開",
importSucc:"導入成功",
import:"導入",
editCurrent:"編輯此站規則",
editBlacklist:"編輯黑名單網址,一行一條,支持? *通配符",
upBtnImg:"回到頁首圖標",
downBtnImg:"前往頁尾圖標",
loadingTextTitle:"加載中文字",
dbClick2StopCtrl:"Ctrl 鍵",
dbClick2StopAlt:"Alt 鍵",
dbClick2StopShift:"Shift 鍵",
dbClick2StopMeta:"Meta 鍵",
dbClick2StopKey:"快捷鍵",
pageElementCss:"頁面主體框架的樣式",
customCss:"自定義 CSS",
firstAlert:"你還未導入規則庫,請選擇合適的規則庫導入哦",
picker:"東方永頁機主體元素抓取器",
closePicker:"關閉東方永頁機抓取器",
pickerPlaceholder:"沒想法建議留空",
pickerCheck:"檢查你編輯的選擇器並複製",
switchSelector:"點擊切換元素",
gotoEdit:"使用當前的選擇器前往編輯規則",
manualMode:"禁用拼接,手動用右方向鍵翻頁",
clickMode:"禁用拼接,滾動至頁尾時自動點擊下一頁",
pageBarMenu:"點擊分隔條中間彈出菜單",
nextSwitch:"切換其他頁碼",
arrowToScroll:"左方向鍵滾動至上一頁,右方向鍵滾動至下一頁",
hideLoadingIcon:"隱藏加載動畫",
duplicate:"檢測到永頁機重複安裝,請刪除其他腳本管理器中的永頁機!",
forceStateIframe:"以 iframe 嵌入整頁",
forceStateDynamic:"通過 iframe 加載動態內容後取出",
forceStateDisable:"在此站禁用"
};
break;
case "ja":
config = {
enableDebug:"デバッグモード",
disable: "一時的に無効にする",
disableSite:"無効状態の切り替え",
disableSiteTips:"このサイトで既に無効になっています",
enableSiteTips:"このサイトで既に有効になっています",
enable: "ページめくりを有効にする",
toTop: "トップに戻る",
toBottom: "ページの下部に移動",
current: "現在のページ",
forceIframe: "強制ステッチ",
cancelForceIframe: "強制ステッチをキャンセル",
configure: "設定ページを開く",
firstUpdate:"ここをクリックしてルールを初期化します",
update: "更新ルール",
click2update:"今すぐルールを更新してください",
loadNow:"今すぐページをめくる",
loadConfirm:"数ページめくりたいですか?(0は途切れない)",
noNext:"次のページが見つかりません、新しいルールを作成してください",
passSec: "#t#秒前に更新",
passMin: "#t#分前に更新",
passHour: "#t#時間前に更新",
passDay: "#t#日前に更新",
cantDel: "組み込みルールを削除できません",
confirmDel: "このルールを削除してもよろしいですか?",
updateSucc: "更新に成功しました",
beginUpdate: "更新中、お待ちください",
customUrls: "インポートルールのURL、1行に1つ",
customRules: "【東方永頁機】の形式でカスタムルールを入力してください",
save: "設定を保存",
loadingText: "少女祈祷中...",
opacity:"不透明値",
opacityPlaceholder:"0: 隠す",
hideBar:"ページ区切り文字を非表示にします",
hideBarButNoStop:"非表示にするが停止しない",
dbClick2Stop:"空白部分をダブルクリックしてページめくりを一時停止します",
sortTitle:"並べ替えは、次のルールの更新後に有効になります",
autoRun:"自動的に有効",
autoLoadNum:"指定したページ数を自動的に読み込みます",
inputPageNum:"ジャンプするページ番号を入力",
enableHistory:"ページめくり後の履歴を書く",
enableHistoryAfterInsert: "スプライシングの直後に履歴レコードを書き込みます。それ以外の場合は、閲覧後に書き込みます",
initRun:"Webページを開いた直後にページをめくる",
preload:"事前に次のページを読む",
click2ImportRule:"以下をクリックして、ルールベースを追加します:",
forceAllBody:"フルページ埋め込み?",
openInNewTab:"スプライスされたページのコンテンツを新しいページで開きます",
importSucc:"インポート完了",
import:"インポート",
editCurrent:"現在のルールの編集",
editBlacklist:"ブラックリストのURLを編集し、1行ずつ、サポート? *ワイルドカード",
upBtnImg:"トップアイコンに戻る",
downBtnImg:"フッターアイコンに移動",
loadingTextTitle:"テキストをロード",
dbClick2StopCtrl:"Ctrlキー",
dbClick2StopAlt:"Altキー",
dbClick2StopShift:"Shiftキー",
dbClick2StopMeta:"Metaキー",
dbClick2StopKey:"Shortcutキー",
pageElementCss:"ページ本文フレームの STYLE",
customCss:"カスタム CSS",
firstAlert:"ルールベースをインポートしていないため、インポートする適切なルールベースを選択してください",
picker:"Pagetualページ要素ピッカー",
closePicker:"Pagetualピッカーを閉じる",
pickerPlaceholder:"わからない場合は空のままにしてください",
pickerCheck:"セレクターをチェックしてコピー",
switchSelector:"クリックして要素を切り替えます",
gotoEdit:"現在のセレクターでルールを編集する",
manualMode:"スプライシングを無効にします。手動で右の矢印キーを使用してページをめくります",
clickMode: "スティッチングを無効にします。ページの最後までスクロールすると、次のページが自動的にクリックされます",
pageBarMenu:"ページバーの中央をクリックしてメニューをポップアップ表示",
nextSwitch:"次のページに切り替え",
arrowToScroll:"左矢印キーで前へ、右矢印キーで次へ",
hideLoadingIcon:"読み込み中のアニメーションを隠す",
duplicate: "Pagetual の重複インストールが検出されました。他のスクリプト マネージャで永続的なページ マシンを削除してください!",
forceStateIframe: "iframe にページ全体を埋め込む",
forceStateDynamic: "iframe 経由で動的コンテンツを読み込む",
forceStateDisable: "このステーションでのページめくりを無効にする"
};
break;
case "ru":
case "ru-RU":
config = {
enableDebug:"Включить отладку",
disable:"Отключено",
disableSite:"Переключить состояние отключения",
disableSiteTips:"Отключено на этом сайте",
enableSiteTips:"Включено на этом сайте",
enable:"Включено",
toTop:"В начало",
toBottom:"В конец",
current:"Текущая страница",
forceIframe:"Принудительно присоединить следующую страницу",
cancelForceIframe:"Отменить принудительное присоединение",
configure:"Настроить",
firstUpdate:"Нажмите здесь, чтобы инициализировать правила",
update:"Обновить правила онлайн",
click2update:"Нажмите, чтобы обновить правила по URL сейчас",
loadNow:"Загрузить следующую страницу сейчас",
loadConfirm:"Сколько страниц вы хотите загрузить? (0 означает бесконечность)",
noNext:"Ссылка на следующую страницу не найдена, пожалуйста, создайте новое правило",
passSec:"Обновлено #t# секунд назад",
passMin:"Обновлено #t# минут назад",
passHour:"Обновлено #t# часов назад",
passDay:"Обновлено #t# дней назад",
cantDel:"Невозможно удалить встроенные правила",
confirmDel:"Вы уверены, что хотите удалить это правило?",
updateSucc:"Обновление прошло успешно",
beginUpdate:"Обновление начато, подождите минуту, пожалуйста",
customUrls:"Импортируйте URL-адрес правила Пэйджтуал или AutoPagerize по одному URL на строку",
customRules:"Введите пользовательские правила с форматом [Pagetual]",
save:"Сохранить",
loadingText:"Shojo загружается...",
opacity:"Непрозрачность",
opacityPlaceholder:"0: скрыть",
hideBar:"Скрыть промежуток переключения страниц",
hideBarButNoStop:"Скрыть, но не останавливать",
dbClick2Stop:"Двойной щелчок по пустому пространству для паузы",
sortTitle:"Сортировка вступает в силу после следующего обновления правила",
autoRun:"Автозапуск (режим черного списка)",
autoLoadNum:"Количество для предварительной загрузки страниц",
inputPageNum:"Введите номер страницы для перехода",
enableHistory:"Записать историю после переключения страниц",
enableHistoryAfterInsert: "Записать запись истории сразу после сплайсинга, в противном случае запишите после просмотра",
initRun:"Переключать страницы сразу после открытия",
preload:"Предварительная загрузка следующей страницы для ускорения",
click2ImportRule:"Нажмите, чтобы импортировать ссылку базовых правил, затем дождитесь завершения обновления:",
forceAllBody:"Присоединить полное тело страницы?",
openInNewTab:"Открыть дополнительные URL-адреса в новой вкладке",
importSucc:"Импорт завершен",
import:"Импорт",
editCurrent:"Редактировать правило для текущего",
editBlacklist:"Редактировать URL-адреса черного списка, по одной строке, поддержка ? * для подстановочного знака",
upBtnImg:"Иконка перехода к началу страницы",
downBtnImg:"Иконка перехода к концу страницы",
loadingTextTitle:"Текст загрузки",
dbClick2StopCtrl:"Клавиша Ctrl",
dbClick2StopAlt:"Клавиша Alt",
dbClick2StopShift:"Клавиша Shift",
dbClick2StopMeta:"Клавиша Meta",
dbClick2StopKey:"Клавиша быстрого доступа",
pageElementCss:"Пользовательский стиль для основных элементов страницы",
customCss:"Полный пользовательский CSS",
firstAlert:"Вы не импортировали базовое правило, пожалуйста, выберите соответствующее правило для импорта",
picker:"Выбор элемента страницы Пэйджтуал",
closePicker:"Закрыть выбор Пэйджтуал",
pickerPlaceholder:"Оставьте пустым, если вы не знаете",
pickerCheck:"Проверить селектор и скопируй",
switchSelector:"нажмите для переключения элемента",
gotoEdit:"Перейти к редактированию правила с текущим селектором",
manualMode:"Отключить автоматическую перелистывание страниц, перелистывать страницы вручную с помощью стрелок справа (или вызвать событие 'pagetual.next')",
clickMode: "Отключить \"сшивание\" страниц, т.е. автоматически переходить на следующую страницу при прокрутке к ее концу",
pageBarMenu:"Щелкните середину панели страниц, чтобы открыть меню.",
nextSwitch:"Переключить ссылку на следующую страницу",
arrowToScroll:"Нажмите клавишу со стрелкой влево для предыдущего и клавишу со стрелкой вправо для следующего",
hideLoadingIcon:"Скрыть анимацию загрузки",
duplicate: "Обнаружена двойная установка Pagetual, пожалуйста, удалите постоянную страничную машину в других менеджерах скриптов!",
forceStateIframe: "Вставить полную страницу как iframe",
forceStateDynamic:"Загружать динамический контент через iframe",
forceStateDisable: "Отключить перелистывание страниц на этой станции"
};
break;
default:
config = {
enableDebug:"Enable debug output",
disable:"Disable",
disableSite:"Toggle disabled state",
disableSiteTips:"Disabled on this site",
enableSiteTips:"Enabled on this site",
enable:"Enable",
toTop:"To Top",
toBottom:"To Bottom",
current:"Current Page",
forceIframe:"Force to join next page",
cancelForceIframe:"Cancel Force join",
configure:"Configure",
firstUpdate:"Click here to initialize the rules",
update:"Update online rules",
click2update:"Click to update rules from url now",
loadNow:"Load next page manually",
loadConfirm:"How much pages do you want to load? (0 means infinite)",
noNext:"No next link found, please create a new rule",
passSec:"Updated #t# seconds ago",
passMin:"Updated #t# minutes ago",
passHour:"Updated #t# hours ago",
passDay:"Updated #t# days ago",
cantDel:"Can't delete buildin rules",
confirmDel:"Are you sure you want to delete this rule?",
updateSucc:"Update succeeded",
beginUpdate:"Begin update, wait a minute please",
customUrls:"Import Pagetual or AutoPagerize rule url, One url per line",
customRules:"Input custom rules with [Pagetual] format",
save:"Save",
loadingText:"Shojo Now Loading...",
opacity:"Opacity",
opacityPlaceholder:"0: hide",
hideBar:"Hide the paging spacer",
hideBarButNoStop:"Hide but not stop",
dbClick2Stop:"Double-click on the blank space to pause",
sortTitle:"Sorting takes effect after the next rule update",
autoRun:"Auto run (black list mode)",
autoLoadNum:"Amount for preload pages",
inputPageNum:"Enter page number to jump",
enableHistory:"Write history after page turning",
enableHistoryAfterInsert: "Write history immediately after splicing, otherwise write after browsing",
initRun:"Turn pages immediately after opening",
preload:"Preload next page for speeding up",
click2ImportRule:"Click to import base rules link, then wait until the update is complete:",
forceAllBody:"Join full body of page?",
openInNewTab:"Open urls of additions in new tab",
importSucc:"Import completed",
import:"Import",
editCurrent:"Edit rule for current",
editBlacklist:"Edit the blacklist urls, line by line, Support ? * for wildcard",
upBtnImg:"Icon of back to top",
downBtnImg:"Icon of go to footer",
loadingTextTitle:"Loading text",
dbClick2StopCtrl:"Ctrl key",
dbClick2StopAlt:"Alt key",
dbClick2StopShift:"Shift key",
dbClick2StopMeta:"Meta key",
dbClick2StopKey:"Shortcut key",
pageElementCss:"Custom style for main page elements",
customCss:"Custom complete css",
firstAlert:"You have not imported the base rule, please select the appropriate rule to import",
picker:"Pagetual page element picker",
closePicker:"Close Pagetual picker",
pickerPlaceholder:"Leave empty if you have no idea",
pickerCheck:"Check selector and copy",
switchSelector:"Click to switch element",
gotoEdit:"Go to edit rule with current selector",
manualMode:"Disable splicing, manually turn pages with the right arrow keys (or dispatch event 'pagetual.next')",
clickMode: "Disable splicing, automatically click the next page when scrolling to the end of the page",
pageBarMenu:"Click the middle of the page bar to open the menu",
nextSwitch:"Switch next link",
arrowToScroll:"Press left arrow key to scroll prev and right arrow key to scroll next",
hideLoadingIcon:"Hide loading animation",
duplicate:"Duplicate Pagetual have been installed, check your script manager!",
forceStateIframe: "Embed full page as iframe",
forceStateDynamic: "Load dynamic content via iframe",
forceStateDisable: "Disable page turning on this site"
};
break;
}
var enableDebug=true;
function i18n(name, param) {
return config[name]?config[name].replace("#t#",param):name;
};
function debug(str, title) {
if(enableDebug){
console.log(
`%c【Pagetual v.${_GM_info.script.version}】 ${title ? title : 'debug'}:`,
'color: yellow;font-size: large;font-weight: bold;background-color: darkblue;',
str
);
}
};
var _GM_xmlhttpRequest,_GM_registerMenuCommand,_GM_notification,_GM_addStyle,_GM_openInTab,_GM_info,_GM_setClipboard;
if(typeof GM_xmlhttpRequest!='undefined'){
_GM_xmlhttpRequest=GM_xmlhttpRequest;
}else if(typeof GM!='undefined' && typeof GM.xmlHttpRequest!='undefined'){
_GM_xmlhttpRequest=GM.xmlHttpRequest;
}else{
_GM_xmlhttpRequest=(f)=>{fetch(f.url).then(response=>response.text()).then(data=>{let res={response:data};f.onload(res)}).catch(e => f.onerror(e))};
}
if(typeof GM_registerMenuCommand!='undefined'){
_GM_registerMenuCommand=GM_registerMenuCommand;
}else if(typeof GM!='undefined' && typeof GM.registerMenuCommand!='undefined'){
_GM_registerMenuCommand=GM.registerMenuCommand;
}else{
_GM_registerMenuCommand=(s,f)=>{};
}
if(typeof GM_info!='undefined'){
_GM_info=GM_info;
}else if(typeof GM!='undefined' && typeof GM.info!='undefined'){
_GM_info=GM.info;
}else{
_GM_info={script:1};
}
if(typeof GM_notification!='undefined'){
_GM_notification=GM_notification;
}else if(typeof GM!='undefined' && typeof GM.notification!='undefined'){
_GM_notification=GM.notification;
}else{
_GM_notification=(s)=>{showTips(s)};
}
if(typeof GM_openInTab!='undefined'){
_GM_openInTab=GM_openInTab;
}else if(typeof GM!='undefined' && typeof GM.openInTab!='undefined'){
_GM_openInTab=GM.openInTab;
}else{
_GM_openInTab=(s,t)=>{window.open(s)};
}
if(typeof GM_addStyle!='undefined'){
_GM_addStyle=GM_addStyle;
}else if(typeof GM!='undefined' && typeof GM.addStyle!='undefined'){
_GM_addStyle=GM.addStyle;
}else{
_GM_addStyle=cssStr=>{
let styleEle=document.createElement("style");
styleEle.innerHTML=cssStr;
document.head.appendChild(styleEle);
return styleEle;
};
}
if (typeof GM_setClipboard != 'undefined') {
_GM_setClipboard = GM_setClipboard;
} else if (typeof GM != 'undefined' && typeof GM.setClipboard != 'undefined') {
_GM_setClipboard = GM.setClipboard;
} else {
_GM_setClipboard = (s, i) => {};
}
var _unsafeWindow=(typeof unsafeWindow=='undefined')?window:unsafeWindow;//兼容 ios userscripts 的寫法
var storage={
supportGM: typeof GM_getValue=='function' && typeof GM_getValue('a','b')!='undefined',
supportGMPromise: typeof GM!='undefined' && typeof GM.getValue=='function' && typeof GM.getValue('a','b')!='undefined',
mxAppStorage:(function(){
try{
return window.external.mxGetRuntime().storage;
}catch(e){
}
})(),
operaUJSStorage:(function(){
try{
return window.opera.scriptStorage;
}catch(e){
}
})(),
setItem:function(key,value){
if(this.operaUJSStorage){
this.operaUJSStorage.setItem(key,value);
}else if(this.mxAppStorage){
this.mxAppStorage.setConfig(key,value);
}else if(this.supportGM){
GM_setValue(key,value);
if(value==="" && typeof GM_deleteValue!='undefined'){
GM_deleteValue(key);
}
}else if(this.supportGMPromise){
GM.setValue(key,value);
if(value==="" && typeof GM!='undefined' && typeof GM.deleteValue!='undefined'){
GM.deleteValue(key);
}
}else if(window.localStorage){
window.localStorage.setItem(key,value);
}
},
getItem:function(key,cb){
var value;
if(this.operaUJSStorage){
value=this.operaUJSStorage.getItem(key);
}else if(this.mxAppStorage){
value=this.mxAppStorage.getConfig(key);
}else if(this.supportGM){
value=GM_getValue(key);
}else if(this.supportGMPromise){
value=GM.getValue(key).then(v=>{cb(v)});
return;
}else if(window.localStorage){
value=window.localStorage.getItem(key);
};
cb(value);
}
};
var rulesData={},ruleUrls,updateDate;
const configPage=["https://github.com/hoothin/UserScripts/tree/master/Pagetual",
"https://hoothin.github.io/UserScripts/Pagetual/"];
const guidePage=/^https?:\/\/.*\/PagetualGuide\/.*rule\.html/;
const ruleImportUrlReg=/greasyfork\.org\/.*scripts\/438684[^\/]*(\/discussions|\/?$)|github\.com\/hoothin\/UserScripts\/(tree\/master\/Pagetual|issues\/)/i;
const allOfBody="body>*";
_GM_registerMenuCommand(i18n("configure"), ()=>{
_GM_openInTab(configPage[0],{active:true});
});
_GM_registerMenuCommand(i18n("editCurrent"), ()=>{
Picker.getInstance().start();
});
function getElementByXpath(xpath, contextNode, doc){
doc = doc || document;
contextNode = contextNode || doc;
try {
var result = doc.evaluate(xpath, contextNode, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
return result.singleNodeValue && result.singleNodeValue.nodeType === 1 && result.singleNodeValue;
} catch (err) {
debug(`Invalid xpath: ${xpath}`);
}
return null;
}
function getAllElementsByXpath(xpath, contextNode, doc){
doc = doc || document;
contextNode = contextNode || doc;
var result = [];
try {
var query = doc.evaluate(xpath, contextNode, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i = 0; i < query.snapshotLength; i++) {
var node = query.snapshotItem(i);
if (node.nodeType === 1) result.push(node);
}
} catch (err) {
debug(`Invalid xpath: ${xpath}`);
}
return result;
}
function isXPath(xpath) {
if (!xpath) return false;
return /^\(*(descendant::|\.\/|\/\/|id\()/.test(xpath);
}
function getAllElements(sel, doc) {
try {
if (!isXPath(sel)) {
return doc.querySelectorAll(sel);
}
} catch(e) {
debug(e, 'Error selector');
}
return getAllElementsByXpath(sel, doc, doc);
}
function getElement(sel, doc) {
try {
if (!isXPath(sel)) {
return doc.querySelector(sel);
}
} catch(e) {
debug(e, 'Error selector');
}
return getElementByXpath(sel, doc, doc);
}
function geneSelector(ele, addID){
let selector=ele.tagName.toLowerCase();
//Google id class都是隨機。百度更過分,style script順序都是隨機的
if(ele.tagName!="HTML" && ele.tagName!="BODY"){
if (addID && ele.id) selector += '#' + ele.id;
let className = "";
if (ele.className) {
let classList = ele.classList, i = 0;
for (let i = 0; i < classList.length; i++) {
let c = classList[i];
if (/^[\w-_]+$/.test(c) && !/\d{3,}/.test(c)) {
className += '.' + c;
}
}
selector += className;
}
let parent = ele.parentElement;
if (parent) {
selector = geneSelector(parent, addID) + ' > ' + selector;
if(!className && (!ele.id || !addID) && parent.children.length>1){
let i,j=0;
for(i=0;i<parent.children.length;i++){
if(parent.children[i].tagName==ele.tagName){
j++;
if(parent.children[i]==ele){
break;
}
}
}
selector += (parent.tagName=="HTML"?"":`:nth-of-type(${j})`);
}
}
}
return selector;
}
function createXPathFromElement(elm) {
let allNodes = document.getElementsByTagName('*'), segs;
for (segs = []; elm && elm.nodeType == 1; elm = elm.parentNode) {
if (elm.hasAttribute('id')) {
var uniqueIdCount = 0;
for (var n=0;n < allNodes.length;n++) {
if (allNodes[n].hasAttribute('id') && allNodes[n].id == elm.id) uniqueIdCount++;
if (uniqueIdCount > 1) break;
}
if ( uniqueIdCount == 1) {
segs.unshift('id("' + elm.getAttribute('id') + '")');
return segs.join('/');
} else {
segs.unshift(elm.localName.toLowerCase() + '[@id="' + elm.getAttribute('id') + '"]');
}
} else if (elm.hasAttribute('class')) {
segs.unshift(elm.localName.toLowerCase() + '[@class="' + elm.getAttribute('class') + '"]');
} else {
let i, sib;
for (i = 1, sib = elm.previousSibling; sib; sib = sib.previousSibling) {
if (sib.localName == elm.localName) i++;
}
segs.unshift(elm.localName.toLowerCase() + '[' + i + ']');
}
}
return segs.length ? '/' + segs.join('/') : null;
}
var escapeHTMLPolicy;
if (_unsafeWindow.trustedTypes && _unsafeWindow.trustedTypes.createPolicy) {
escapeHTMLPolicy = _unsafeWindow.trustedTypes.createPolicy('default', {
createHTML: (string, sink) => string
});
}
function createHTML(html){
return escapeHTMLPolicy?escapeHTMLPolicy.createHTML(html):html;
}
class RuleParser {
constructor() {
this.hpRules = [];
this.smartRules = [];
this.customRules = [];
this.rules = [];
this.pageDoc = document;
this.nextLinkHref = null;
this.nextTitle = "";
this.oldUrl = "";
this.curUrl = location.href;
this.curSiteRule = {};
this.initGetPage = true;
}
initSavedRules(callback) {
var self = this;
storage.getItem("smartRules", smartRules => {
if (smartRules) self.smartRules = smartRules;
storage.getItem("hpRules", hpRules => {
if (hpRules) self.hpRules = hpRules;
storage.getItem("customRules", customRules => {
if (customRules) self.customRules = customRules;
storage.getItem("rules", rules => {
if (rules) self.rules = rules;
callback();
});
});
});
});
}
saveCurSiteRule(){
/*if(!this.curSiteRule || !this.curSiteRule.url || this.curSiteRule.singleUrl || this.curSiteRule.url.length<13)return;
this.hpRules=this.hpRules.filter(item=>{return item&&item.url!=this.curSiteRule.url});
this.hpRules.unshift(this.curSiteRule);
if(this.hpRules.length>30){
this.hpRules.pop();
}
storage.setItem("hpRules", this.hpRules);*/
}
requestJSON(url, callback){
_GM_xmlhttpRequest({
url: url,
method: 'GET',
timeout: 20000,
onload: function(res) {
let json=null;
try{
json=JSON.parse(res.response||res.responseText);
}catch(e){
debug(e, 'Error json');
}
callback(json);
},
onerror: function(e) {
callback(null, e);
},
ontimeout: function(e) {
callback(null, e);
}
});
}
formatRule(item, from){
if(item.data && item.data.url){
let result = {
name:item.name,
from:from,
action:item.data.forceIframe=="true"?1:0,
url:item.data.url,
pageElement:item.data.pageElement,
nextLink:item.data.nextLink,
insert:item.data.insertBefore||undefined,
updatedAt:item.updated_at
};
let _css = (item.data.Stylus || '') + (item.data.CSS || '');
if (_css) result.css = _css;
if (item.data.bookmarklet) result.pageAction = item.data.bookmarklet;
return result;
}else{
item.from=from;
return item;
}
return null;
}
addRuleByUrl(url, from, callback) {
if(url.indexOf("?")==-1){
url=url+"?"+Date.now();
}else{
url=url+"&"+Date.now();
}
this.requestJSON(url, (json,err)=>{
if(!json){
debug(err, "Update "+url+" rules fail!");
}
this.addRules(json, from);
callback(json, err);
});
}
addRules(rules, from) {
if(rules && rules.length>0){
this.rules=this.rules.filter(item=>{return item.from!=from});
rules.forEach(item=>{
let rule=this.formatRule(item, from);
if(rule){
this.rules.unshift(rule);
}
});
}
}
ruleMatch(r) {
let findIndex = 0;
if (r.nextLink && r.nextLink != "0" && r.nextLink != 0) {
let nextLinkSel = r.nextLink, nextLink;
if (Array && Array.isArray && Array.isArray(nextLinkSel)) {
nextLink = !nextLinkSel.every((sel, i) => {
let ele = getElement(sel, document);
if (ele) findIndex = i;
return !ele;
});
} else nextLink = getElement(nextLinkSel, document);
if (!nextLink) return false;
}
if (r.pageElement) {
let pageElementSel = r.pageElement, pageElement;
if (Array && Array.isArray && Array.isArray(pageElementSel)) {
pageElementSel = pageElementSel[findIndex];
}
pageElement = getElement(pageElementSel, document);
if (!pageElement) return false;
}
if (r.insert) {
let insertSel = r.insert, insert;
if (Array && Array.isArray && Array.isArray(insertSel)) {
insertSel = insertSel[findIndex];
}
insert = getElement(insertSel, document);
if (!insert) return false;
}
//if (findIndex !== 0) nextIndex = findIndex;
return true;
}
scrollToShow(sel, doc) {
let exclude = getElement(sel, doc);
if (exclude) {
var actualTop = exclude.offsetTop;
var current = exclude.offsetParent;
while (current !== null) {
actualTop += current.offsetTop;
current = current.offsetParent;
}
doc.body.scrollTop = 0;
doc.documentElement.scrollTop = 0;
let maxHeight = Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight);
doc.body.scrollTop = actualTop - 10;
doc.documentElement.scrollTop = actualTop - 10;
setTimeout(() => {
while (actualTop < maxHeight) {
actualTop += 200;
doc.body.scrollTop = actualTop;
doc.documentElement.scrollTop = actualTop;
}
}, 0);
return false;
}
return true;
}
waitElement(doc, selArr) {
if (!selArr) selArr = this.curSiteRule.waitElement;
if (selArr[0].trim()) {
let include = getElement(selArr[0], doc);
if (!include) {
if (selArr.length == 2 && selArr[1].trim()) {
this.scrollToShow(selArr[1], doc);
}
return false;
}
}
if (doc === document) return true;
if (selArr.length == 2 && selArr[1].trim()) {