@kangsicj/dcinsideenhancer 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  <br><br>
6
6
 
7
- <a href="https://cdn.jsdelivr.net/npm/@kangsicj/dcinsideenhancer@latest/dist/DCInsideEnhancer.user.js"><img src="https://img.shields.io/badge/Install-v1.0.2-3b4890?style=for-the-badge&logo=tampermonkey&logoColor=white" alt="Install"></a>
7
+ <a href="https://cdn.jsdelivr.net/npm/@kangsicj/dcinsideenhancer@latest/dist/DCInsideEnhancer.user.js"><img src="https://img.shields.io/npm/v/%40kangsicj%2Fdcinsideenhancer?label=Install&color=3b4890&style=for-the-badge&logo=tampermonkey&logoColor=white&cacheSeconds=1800" alt="Install"></a>
8
8
  <img src="https://img.shields.io/badge/iPhone%20%C2%B7%20Android%20%C2%B7%20PC-supported-5865c7?style=for-the-badge" alt="iPhone · Android · PC">
9
9
  <img src="https://img.shields.io/badge/ads%20%26%20tracking-none-2e7d5b?style=for-the-badge" alt="No ads or tracking">
10
10
  <a href="https://fairy.hada.io/@jinny#support"><img src="https://img.shields.io/badge/Fairy-Support-ff6fb5?style=for-the-badge&logo=githubsponsors&logoColor=white" alt="Support on Fairy"></a>
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  <br><br>
6
6
 
7
- <a href="https://cdn.jsdelivr.net/npm/@kangsicj/dcinsideenhancer@latest/dist/DCInsideEnhancer.user.js"><img src="https://img.shields.io/badge/%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-v1.0.2-3b4890?style=for-the-badge&logo=tampermonkey&logoColor=white" alt="설치하기"></a>
7
+ <a href="https://cdn.jsdelivr.net/npm/@kangsicj/dcinsideenhancer@latest/dist/DCInsideEnhancer.user.js"><img src="https://img.shields.io/npm/v/%40kangsicj%2Fdcinsideenhancer?label=%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0&color=3b4890&style=for-the-badge&logo=tampermonkey&logoColor=white&cacheSeconds=1800" alt="설치하기"></a>
8
8
  <img src="https://img.shields.io/badge/iPhone%20%C2%B7%20Android%20%C2%B7%20PC-%EC%A7%80%EC%9B%90-5865c7?style=for-the-badge" alt="iPhone · Android · PC 지원">
9
9
  <img src="https://img.shields.io/badge/%EA%B4%91%EA%B3%A0%C2%B7%EC%B6%94%EC%A0%81-%EC%97%86%EC%9D%8C-2e7d5b?style=for-the-badge" alt="광고·추적 없음">
10
10
  <a href="https://fairy.hada.io/@jinny#support"><img src="https://img.shields.io/badge/Fairy-%ED%9B%84%EC%9B%90%ED%95%98%EA%B8%B0-ff6fb5?style=for-the-badge&logo=githubsponsors&logoColor=white" alt="Fairy로 후원하기"></a>
@@ -2,7 +2,7 @@
2
2
  // @name DCInside Enhancer
3
3
  // @name:ko 디시 인핸서
4
4
  // @namespace https://github.com/kangsicj/DCInsideEnhancer
5
- // @version 1.2.0
5
+ // @version 1.2.1
6
6
  // @description DCInside filter & enhancer — mobile & PC. Block users/words/heads/notices/images & GIFs across posts, infinite list, zoom viewer, theme sync, encrypted multi-device sync.
7
7
  // @description:ko 디시인사이드 차단·편의 기능 (모바일·PC) - 유저·단어(제목/본문)·말머리·공지 차단, 같은/비슷한 이미지·움짤 모든 글 차단, 디시콘 제거, 차단 미디어 데이터 절약, 목록 자동 보충·무한 스크롤·뒤로 가기 위치 복원, 스크랩, 이미지 확대뷰 개선, 야간모드 자동 연동, 암호화 기기 간 동기화
8
8
  // @author kangsicj
@@ -2,7 +2,7 @@
2
2
  // @name DCInside Enhancer
3
3
  // @name:ko 디시 인핸서
4
4
  // @namespace https://github.com/kangsicj/DCInsideEnhancer
5
- // @version 1.2.0
5
+ // @version 1.2.1
6
6
  // @description DCInside filter & enhancer — mobile & PC. Block users/words/heads/notices/images & GIFs across posts, infinite list, zoom viewer, theme sync, encrypted multi-device sync.
7
7
  // @description:ko 디시인사이드 차단·편의 기능 (모바일·PC) - 유저·단어(제목/본문)·말머리·공지 차단, 같은/비슷한 이미지·움짤 모든 글 차단, 디시콘 제거, 차단 미디어 데이터 절약, 목록 자동 보충·무한 스크롤·뒤로 가기 위치 복원, 스크랩, 이미지 확대뷰 개선, 야간모드 자동 연동, 암호화 기기 간 동기화
8
8
  // @author kangsicj
@@ -75,7 +75,7 @@
75
75
  // 0. 설정·상수
76
76
  // =========================================================
77
77
 
78
- const SCRIPT_VERSION = '1.2.0';
78
+ const SCRIPT_VERSION = '1.2.1';
79
79
  const PROJECT_URL = 'https://github.com/kangsicj/DCInsideEnhancer';
80
80
  const DONATE_URL = 'https://fairy.hada.io/@jinny#support';
81
81
 
@@ -412,67 +412,76 @@
412
412
  html.dc-home-media-off .main-wrapping section.grid.media-group { display: none !important; }
413
413
  html.dc-footer-info-off footer.footer > .ft-btm { display: none !important; }
414
414
 
415
- html.dc-pc-fit { --dc-fit-gap: clamp(12px, 2vw, 32px); }
416
- html.dc-pc-fit body,
417
- html.dc-pc-fit .dcwrap { min-width: 0 !important; }
418
- html.dc-pc-fit .dcwrap .dchead,
419
- html.dc-pc-fit .dcwrap .gnb,
420
- html.dc-pc-fit .dcwrap .gnb_depth2_list,
421
- html.dc-pc-fit .dcwrap .info_policy,
422
- html.dc-pc-fit .dcwrap .copyright,
423
- html.dc-pc-fit .dcwrap .visit_bookmark {
424
- width: auto !important;
425
- max-width: none !important;
426
- margin-left: var(--dc-fit-gap) !important;
427
- margin-right: var(--dc-fit-gap) !important;
428
- }
429
-
430
- html.dc-pc-fit .dcwrap .gnb_bar { min-width: 0 !important; width: auto !important; margin: 0 !important; }
431
- html.dc-pc-fit .dcwrap .gnb_list,
432
- html.dc-pc-fit .dcwrap .dc_all { width: auto !important; }
433
- html.dc-pc-fit .dcwrap .wrap_inner { width: auto !important; }
434
- html.dc-pc-fit .dcwrap #container {
435
- width: auto !important;
436
- margin-left: var(--dc-fit-gap) !important;
437
- margin-right: var(--dc-fit-gap) !important;
438
- }
439
- html.dc-pc-fit .dcwrap #container:has(> .left_content),
440
- html.dc-pc-fit .dcwrap #container > .main_content:has(> .left_content) {
441
- display: flex;
442
- flex-wrap: wrap;
443
- align-items: flex-start;
444
- gap: 20px;
445
- width: auto !important;
446
- }
447
- html.dc-pc-fit .dcwrap #container:has(> .left_content)::before,
448
- html.dc-pc-fit .dcwrap #container:has(> .left_content)::after,
449
- html.dc-pc-fit .dcwrap .main_content:has(> .left_content)::before,
450
- html.dc-pc-fit .dcwrap .main_content:has(> .left_content)::after { display: none !important; }
451
- html.dc-pc-fit .dcwrap #container:has(> .left_content) > :not(.left_content):not(.right_content),
452
- html.dc-pc-fit .dcwrap .main_content:has(> .left_content) > :not(.left_content):not(.right_content) {
453
- flex: 0 0 100%;
454
- float: none !important;
455
- }
456
- html.dc-pc-fit .dcwrap :is(#container, .main_content) > .left_content {
457
- float: none !important;
458
- flex: 1 1 0;
459
- width: auto !important;
460
- min-width: 0;
461
- }
462
- html.dc-pc-fit .dcwrap :is(#container, .main_content) > .right_content {
463
- float: none !important;
464
- flex: 0 0 300px;
465
- margin-left: 0 !important;
466
- }
467
- html.dc-pc-fit .dcwrap .issuebox,
468
- html.dc-pc-fit .dcwrap .newvisit_history,
469
- html.dc-pc-fit .dcwrap .trendalign { width: auto !important; }
470
- html.dc-pc-fit .dcwrap .list_array_option { width: 100% !important; }
471
- html.dc-pc-fit .dcwrap .stickyunit { display: none !important; }
472
- html.dc-pc-fit .dcwrap .darkmodebox .pop_tipbox { left: auto !important; right: 0 !important; }
473
-
474
- @media (max-width: 1240px) {
475
- html.dc-pc-fit .dcwrap :is(#container, .main_content) > .right_content { display: none !important; }
415
+ @media (max-width: 1519.98px) {
416
+ html.dc-pc-fit { --dc-fit-gap: clamp(10px, 1.6vw, 24px); }
417
+ html.dc-pc-fit body,
418
+ html.dc-pc-fit .dcwrap { min-width: 0 !important; }
419
+ html.dc-pc-fit body { overflow-x: hidden; }
420
+ html.dc-pc-fit .dcwrap .dchead,
421
+ html.dc-pc-fit .dcwrap .gnb,
422
+ html.dc-pc-fit .dcwrap .gnb_depth2_list,
423
+ html.dc-pc-fit .dcwrap .info_policy,
424
+ html.dc-pc-fit .dcwrap .copyright,
425
+ html.dc-pc-fit .dcwrap .visit_bookmark {
426
+ width: auto !important;
427
+ max-width: none !important;
428
+ margin-left: var(--dc-fit-gap) !important;
429
+ margin-right: var(--dc-fit-gap) !important;
430
+ }
431
+
432
+ html.dc-pc-fit .dcwrap .gnb_bar { min-width: 0 !important; width: auto !important; margin: 0 !important; }
433
+ html.dc-pc-fit .dcwrap .gnb_list,
434
+ html.dc-pc-fit .dcwrap .dc_all,
435
+ html.dc-pc-fit .dcwrap .wrap_inner { width: auto !important; }
436
+ html.dc-pc-fit .dcwrap #container {
437
+ width: auto !important;
438
+ margin-left: var(--dc-fit-gap) !important;
439
+ margin-right: var(--dc-fit-gap) !important;
440
+ }
441
+
442
+ html.dc-pc-fit .dcwrap :is(#container, .main_content, #bottom_listwrap) > .right_content { display: none !important; }
443
+ html.dc-pc-fit .dcwrap :is(#container, .main_content, #bottom_listwrap) > .left_content {
444
+ float: none !important;
445
+ width: auto !important;
446
+ max-width: none !important;
447
+ min-width: 0;
448
+ }
449
+ html.dc-pc-fit .dcwrap .main_content { width: auto !important; }
450
+
451
+ html.dc-pc-fit .dcwrap :is(.view_content_wrap, .gallview_head, .writing_view_box, .view_comment, .comment_wrap,
452
+ .comment_box, .cmt_write_box, #bottom_listwrap, .listwrap, .gall_listwrap, .page_head, .issuebox,
453
+ .newvisit_history, .trendalign, .bottom_paging_wrap, .bottom_paging_box, .bottom_search, .btn_recommend_box) {
454
+ width: auto !important;
455
+ max-width: 100% !important;
456
+ box-sizing: border-box;
457
+ }
458
+ html.dc-pc-fit .dcwrap .write_div { max-width: 100% !important; }
459
+ html.dc-pc-fit .dcwrap .write_div img,
460
+ html.dc-pc-fit .dcwrap .write_div video,
461
+ html.dc-pc-fit .dcwrap .write_div iframe { max-width: 100% !important; }
462
+ html.dc-pc-fit .dcwrap .list_array_option { width: 100% !important; }
463
+ html.dc-pc-fit .dcwrap .stickyunit { display: none !important; }
464
+ html.dc-pc-fit .dcwrap .darkmodebox .pop_tipbox { left: auto !important; right: 0 !important; }
465
+
466
+ html.dc-pc-fit .dcwrap .cmt_info { display: flex !important; align-items: flex-start; }
467
+ html.dc-pc-fit .dcwrap .cmt_info::before,
468
+ html.dc-pc-fit .dcwrap .cmt_info::after { display: none !important; }
469
+ html.dc-pc-fit .dcwrap .cmt_info > .addbox { display: flex; flex: 1 1 auto; min-width: 0; width: auto !important; }
470
+ html.dc-pc-fit .dcwrap .cmt_info > .addbox > .cmt_nickbox { flex: 0 0 auto; float: none !important; }
471
+ html.dc-pc-fit .dcwrap .cmt_info > .addbox > .cmt_txtbox { flex: 1 1 auto; min-width: 0; float: none !important; width: auto !important; }
472
+ html.dc-pc-fit .dcwrap .cmt_info .cmt_txtbox .usertxt { float: none !important; width: auto !important; max-width: 100% !important; }
473
+ html.dc-pc-fit .dcwrap .cmt_info > .fr { flex: 0 0 auto; float: none !important; margin-left: 10px; }
474
+
475
+ html.dc-pc-fit .dcwrap .cmt_write_box > .fl { width: 142px; }
476
+ html.dc-pc-fit .dcwrap .cmt_write_box > .cmt_txt_cont {
477
+ float: right !important;
478
+ width: calc(100% - 158px) !important;
479
+ }
480
+ html.dc-pc-fit .dcwrap .cmt_write_box > .cmt_txt_cont .cmt_write,
481
+ html.dc-pc-fit .dcwrap .cmt_write_box > .cmt_txt_cont textarea,
482
+ html.dc-pc-fit .dcwrap .cmt_write_box > .cmt_txt_cont .cmt_cont_bottm { width: 100% !important; box-sizing: border-box; }
483
+
484
+ html.dc-pc-fit .dcwrap .cmt_write_box:not(:has(> .fl)) > .cmt_txt_cont { width: 100% !important; }
476
485
  }
477
486
 
478
487
  html.dc-footer-info-off .dcwrap footer.dcfoot,
@@ -1856,40 +1865,52 @@
1856
1865
 
1857
1866
  #dc-preview {
1858
1867
  position: fixed;
1868
+ top: 50%;
1869
+ left: 50%;
1859
1870
  z-index: 99997;
1860
1871
  display: flex;
1861
1872
  flex-direction: column;
1862
1873
  box-sizing: border-box;
1874
+ width: clamp(520px, 52vw, 980px);
1875
+ height: clamp(420px, 84vh, 1100px);
1876
+ max-width: calc(100vw - 32px);
1877
+ max-height: calc(100vh - 32px);
1863
1878
  border: 1px solid var(--dc-border);
1864
- border-radius: 14px;
1879
+ border-radius: 16px;
1880
+ overflow: hidden;
1865
1881
  background: var(--dc-surface);
1866
1882
  color: var(--dc-text);
1867
- box-shadow: var(--dc-shadow);
1883
+ box-shadow: 0 18px 60px rgba(0,0,0,.28), var(--dc-shadow);
1868
1884
  font-size: 14px;
1869
- line-height: 1.65;
1885
+ line-height: 1.6;
1870
1886
  opacity: 0;
1871
1887
  visibility: hidden;
1872
1888
  pointer-events: none;
1873
- transform: translateY(4px);
1874
- transition: opacity .15s ease, transform .15s ease, visibility 0s linear .15s;
1889
+ transform: translate(-50%, -50%) scale(.97);
1890
+ transition: opacity .16s ease, transform .16s ease, visibility 0s linear .16s;
1875
1891
  }
1876
1892
 
1877
1893
  #dc-preview.show {
1878
1894
  opacity: 1;
1879
1895
  visibility: visible;
1880
1896
  pointer-events: auto;
1881
- transform: none;
1882
- transition: opacity .15s ease, transform .15s ease, visibility 0s;
1897
+ transform: translate(-50%, -50%);
1898
+ transition: opacity .16s ease, transform .16s ease, visibility 0s;
1883
1899
  }
1884
1900
 
1885
1901
  #dc-preview .dc-pv-head {
1886
1902
  flex: 0 0 auto;
1887
- padding: 14px 16px 10px;
1903
+ padding: 14px 18px 10px;
1888
1904
  border-bottom: 1px solid var(--dc-border);
1905
+ background: var(--dc-surface);
1889
1906
  }
1890
1907
 
1891
1908
  #dc-preview .dc-pv-title {
1892
- font-size: 15px;
1909
+ display: -webkit-box;
1910
+ overflow: hidden;
1911
+ -webkit-line-clamp: 2;
1912
+ -webkit-box-orient: vertical;
1913
+ font-size: 16px;
1893
1914
  font-weight: 800;
1894
1915
  line-height: 1.4;
1895
1916
  word-break: break-all;
@@ -1906,21 +1927,25 @@
1906
1927
  flex-wrap: wrap;
1907
1928
  align-items: center;
1908
1929
  gap: 6px;
1909
- margin-top: 8px;
1930
+ margin-top: 9px;
1910
1931
  }
1911
1932
 
1933
+ #dc-preview .dc-pv-hint { margin-left: auto; color: var(--dc-text-dim); font-size: 11.5px; }
1934
+ #dc-preview .dc-pv-notes:empty { display: none; }
1935
+ #dc-preview .dc-pv-notes { margin-top: 6px; }
1936
+
1912
1937
  #dc-preview .dc-btn {
1913
1938
  display: inline-flex;
1914
1939
  align-items: center;
1915
1940
  justify-content: center;
1916
1941
  box-sizing: border-box;
1917
- height: 28px;
1918
- padding: 0 11px;
1942
+ height: 30px;
1943
+ padding: 0 12px;
1919
1944
  border: 1px solid var(--dc-border);
1920
1945
  border-radius: 999px;
1921
1946
  background: var(--dc-surface-2);
1922
1947
  color: var(--dc-text);
1923
- font-size: 12px;
1948
+ font-size: 12.5px;
1924
1949
  font-weight: 700;
1925
1950
  line-height: 1;
1926
1951
  text-decoration: none;
@@ -1928,43 +1953,37 @@
1928
1953
  }
1929
1954
 
1930
1955
  #dc-preview .dc-btn:hover { border-color: var(--dc-accent-ink); color: var(--dc-accent-ink); }
1956
+ #dc-preview .dc-btn.primary { border-color: var(--dc-accent); background: var(--dc-accent); color: var(--dc-on-accent); }
1957
+ #dc-preview .dc-btn.primary:hover { color: var(--dc-on-accent); filter: brightness(1.08); }
1931
1958
  #dc-preview .dc-btn.danger-ghost { color: var(--dc-danger-ink); }
1932
- #dc-preview .dc-btn.dc-pv-close { margin-left: auto; width: 28px; padding: 0; }
1959
+ #dc-preview .dc-btn.dc-pv-close { width: 30px; padding: 0; font-size: 14px; }
1933
1960
 
1934
1961
  #dc-preview .dc-pv-body {
1962
+ position: relative;
1963
+ display: flex;
1964
+ flex-direction: column;
1935
1965
  flex: 1 1 auto;
1936
- min-height: 60px;
1937
- padding: 12px 16px 18px;
1938
- overflow-y: auto;
1939
- overscroll-behavior: contain;
1940
- word-break: break-word;
1941
- }
1942
-
1943
- #dc-preview .dc-pv-body img,
1944
- #dc-preview .dc-pv-body video { max-width: 100% !important; height: auto !important; border-radius: 6px; }
1945
- #dc-preview .dc-pv-body p { margin: 0 0 4px; }
1946
- #dc-preview .dc-pv-body { overflow-x: hidden; overflow-wrap: anywhere; }
1947
- #dc-preview .dc-pv-body .write_div,
1948
- #dc-preview .dc-pv-body [style*="width"] { width: auto !important; max-width: 100% !important; }
1949
- #dc-preview .dc-pv-body * { white-space: normal !important; }
1950
- #dc-preview .dc-pv-body pre, #dc-preview .dc-pv-body pre * { white-space: pre-wrap !important; }
1951
- #dc-preview .dc-pv-body a { color: var(--dc-accent-ink); }
1952
- #dc-preview .dc-pv-body table { max-width: 100%; }
1953
-
1954
- html.dc-dark #dc-preview .dc-pv-body [style*="background"] { background: transparent !important; }
1955
- html.dc-dark #dc-preview .dc-pv-body [style*="color: rgb(0, 0, 0)"],
1956
- html.dc-dark #dc-preview .dc-pv-body [style*="color:#000"],
1957
- html.dc-dark #dc-preview .dc-pv-body [style*="color: #000"],
1958
- html.dc-dark #dc-preview .dc-pv-body [style*="color:black"],
1959
- html.dc-dark #dc-preview .dc-pv-body font[color="#000000"] { color: inherit !important; }
1966
+ min-height: 0;
1967
+ background: var(--dc-surface);
1968
+ }
1969
+
1970
+ #dc-preview .dc-pv-frame {
1971
+ flex: 1 1 auto;
1972
+ width: 100%;
1973
+ min-height: 0;
1974
+ border: 0;
1975
+ background: var(--dc-surface);
1976
+ }
1960
1977
 
1961
1978
  #dc-preview .dc-pv-loading,
1962
1979
  #dc-preview .dc-pv-note {
1963
- padding: 10px 0;
1980
+ padding: 12px 18px;
1964
1981
  color: var(--dc-text-dim);
1965
1982
  font-size: 13px;
1966
1983
  }
1967
1984
 
1985
+ #dc-preview .dc-pv-notes .dc-pv-note { padding: 0; font-size: 12px; }
1986
+
1968
1987
  #dc-preview .dc-pv-loading::before {
1969
1988
  content: '';
1970
1989
  display: inline-block;
@@ -1985,6 +2004,7 @@
1985
2004
  flex-wrap: wrap;
1986
2005
  align-items: center;
1987
2006
  gap: 8px;
2007
+ margin: 14px 18px;
1988
2008
  padding: 10px 12px;
1989
2009
  border-radius: 10px;
1990
2010
  background: var(--dc-danger-soft);
@@ -1993,18 +2013,6 @@
1993
2013
  font-weight: 700;
1994
2014
  }
1995
2015
 
1996
- #dc-preview .dc-pv-blocked {
1997
- margin: 6px 0;
1998
- padding: 14px;
1999
- border: 1px dashed var(--dc-border);
2000
- border-radius: 8px;
2001
- color: var(--dc-text-dim);
2002
- font-size: 12px;
2003
- text-align: center;
2004
- }
2005
-
2006
- #dc-preview .dc-pv-embed { display: inline-block; margin: 6px 0; font-weight: 700; }
2007
-
2008
2016
  .dc-pv-anchor { text-decoration: underline !important; text-decoration-color: var(--dc-accent-ink) !important; }
2009
2017
 
2010
2018
  .dc-key-cursor { outline: 2px solid var(--dc-accent-ink) !important; outline-offset: -2px; background: var(--dc-accent-soft) !important; }
@@ -14296,6 +14304,10 @@
14296
14304
  let keyCursor = null;
14297
14305
 
14298
14306
  const moveKeyCursor = step => {
14307
+ if (previewOpen()) {
14308
+ closePreview();
14309
+ }
14310
+
14299
14311
  const rows = visibleListRows();
14300
14312
 
14301
14313
  if (!rows.length) {
@@ -14696,18 +14708,23 @@
14696
14708
  // =========================================================
14697
14709
 
14698
14710
  const PREVIEW_DELAY = 450;
14711
+ const PREVIEW_CLOSE_DELAY = 380;
14699
14712
  const PREVIEW_CACHE_MS = 5 * 60 * 1000;
14700
14713
  const PREVIEW_CACHE_MAX = 30;
14701
14714
  const PREVIEW_TITLE_SELECTOR = 'table.gall_list td.gall_tit > a:not(.reply_numbox)';
14715
+ const PREVIEW_MOVIE_RE = /^https:\/\/gall\.dcinside\.com\/board\/movie\//i;
14702
14716
 
14703
14717
  const previewCache = new Map();
14704
14718
  let previewEl = null;
14705
14719
  let previewKey = '';
14720
+ let previewHref = '';
14706
14721
  let previewAnchor = null;
14707
14722
  let previewHoverTimer = null;
14708
14723
  let previewCloseTimer = null;
14724
+ let previewThemeObserver = null;
14709
14725
 
14710
14726
  const previewEnabled = () => IS_PC_SITE && settings.hoverPreview !== false;
14727
+ const previewOpen = () => !!previewEl && previewEl.classList.contains('show');
14711
14728
 
14712
14729
  const ensurePreviewEl = () => {
14713
14730
  if (previewEl && previewEl.isConnected) {
@@ -14723,6 +14740,7 @@
14723
14740
  '<div class="dc-pv-title"></div>' +
14724
14741
  '<div class="dc-pv-meta"></div>' +
14725
14742
  '<div class="dc-pv-actions"></div>' +
14743
+ '<div class="dc-pv-notes"></div>' +
14726
14744
  '</div>' +
14727
14745
  '<div class="dc-pv-body"></div>';
14728
14746
  previewEl.addEventListener('mouseenter', () => clearTimeout(previewCloseTimer));
@@ -14732,40 +14750,21 @@
14732
14750
  return previewEl;
14733
14751
  };
14734
14752
 
14735
- const placePreview = anchor => {
14736
- const el = ensurePreviewEl();
14737
- const rect = anchor.getBoundingClientRect();
14738
- const vw = window.innerWidth;
14739
- const vh = window.innerHeight;
14740
- const width = Math.min(640, Math.max(360, Math.round(vw * 0.42)));
14741
- const height = Math.min(Math.round(vh * 0.78), 860);
14742
-
14743
- el.style.width = `${width}px`;
14744
- el.style.maxHeight = `${height}px`;
14745
-
14746
- let left = rect.right + 16;
14747
-
14748
- if (left + width > vw - 12) {
14749
- left = Math.max(12, rect.left - width - 16);
14750
- }
14751
-
14752
- if (left + width > vw - 12) {
14753
- left = Math.max(12, vw - width - 12);
14754
- }
14755
-
14756
- const top = Math.min(Math.max(12, rect.top - 60), Math.max(12, vh - height - 12));
14757
-
14758
- el.style.left = `${Math.round(left)}px`;
14759
- el.style.top = `${Math.round(top)}px`;
14753
+ const stopPreviewTheme = () => {
14754
+ previewThemeObserver?.disconnect();
14755
+ previewThemeObserver = null;
14760
14756
  };
14761
14757
 
14762
14758
  const closePreview = () => {
14763
14759
  clearTimeout(previewHoverTimer);
14764
14760
  clearTimeout(previewCloseTimer);
14761
+ stopPreviewTheme();
14765
14762
 
14766
14763
  if (previewEl) {
14767
14764
  previewEl.classList.remove('show');
14765
+
14768
14766
  previewEl.querySelector('.dc-pv-body').textContent = '';
14767
+ previewEl.querySelector('.dc-pv-notes').textContent = '';
14769
14768
  }
14770
14769
 
14771
14770
  previewAnchor?.classList.remove('dc-pv-anchor');
@@ -14775,57 +14774,53 @@
14775
14774
 
14776
14775
  const schedulePreviewClose = () => {
14777
14776
  clearTimeout(previewCloseTimer);
14778
- previewCloseTimer = setTimeout(closePreview, 260);
14777
+ previewCloseTimer = setTimeout(closePreview, PREVIEW_CLOSE_DELAY);
14779
14778
  };
14780
14779
 
14781
- let previewHref = '';
14782
-
14783
- const withPostReferrer = (href, fn) => {
14784
- const back = location.href;
14785
- let swapped = false;
14780
+ const goToPreviewPost = () => {
14781
+ const href = previewHref;
14786
14782
 
14787
- try {
14788
- const target = new URL(href, location.href);
14783
+ closePreview();
14789
14784
 
14790
- if (target.origin === location.origin && target.href !== back) {
14791
- history.replaceState(history.state, '', target.pathname + target.search);
14792
- swapped = true;
14793
- }
14794
- } catch {
14795
- }
14796
-
14797
- try {
14798
- return fn();
14799
- } finally {
14800
- if (swapped) {
14801
- setTimeout(() => {
14802
- try {
14803
- history.replaceState(history.state, '', back);
14804
- } catch {
14805
- }
14806
- }, 60);
14807
- }
14785
+ if (href) {
14786
+ location.href = href;
14808
14787
  }
14809
14788
  };
14810
14789
 
14811
- const cleanPreviewBody = source => withPostReferrer(previewHref, () => cleanPreviewBodyRaw(source));
14812
-
14813
- const cleanPreviewBodyRaw = source => {
14814
- const body = document.importNode(source, true);
14790
+ const cleanPreviewBody = source => {
14791
+ const body = source.cloneNode(true);
14815
14792
  let hiddenMedia = 0;
14816
14793
 
14817
- body.querySelectorAll('script, style, link, iframe, object, embed, form, noscript, .dc-ui').forEach(node => {
14818
- if (node.tagName === 'IFRAME') {
14819
- const src = node.getAttribute('src') || '';
14820
- const link = document.createElement('a');
14794
+ body.removeAttribute('style');
14821
14795
 
14822
- link.href = src;
14823
- link.textContent = '🎬 삽입된 동영상 열기';
14824
- link.className = 'dc-pv-embed';
14825
- node.replaceWith(link);
14826
- } else {
14827
- node.remove();
14796
+ body.querySelectorAll('script, style, link, object, embed, form, noscript, .dc-ui, #zzbang_div').forEach(node => node.remove());
14797
+
14798
+ body.querySelectorAll('iframe').forEach(node => {
14799
+ let src = node.getAttribute('src') || '';
14800
+
14801
+ try {
14802
+ src = new URL(src, 'https://gall.dcinside.com/').href;
14803
+ } catch {
14804
+ src = '';
14805
+ }
14806
+
14807
+ if (PREVIEW_MOVIE_RE.test(src)) {
14808
+ node.setAttribute('src', src);
14809
+ node.removeAttribute('style');
14810
+ node.removeAttribute('width');
14811
+ node.removeAttribute('height');
14812
+ node.setAttribute('allowfullscreen', '');
14813
+ node.setAttribute('allow', 'autoplay; fullscreen; picture-in-picture');
14814
+ node.className = 'dc-pv-movie';
14815
+ return;
14828
14816
  }
14817
+
14818
+ const link = body.ownerDocument.createElement('a');
14819
+
14820
+ link.href = src;
14821
+ link.textContent = '🎬 삽입된 동영상 열기';
14822
+ link.className = 'dc-pv-embed';
14823
+ node.replaceWith(link);
14829
14824
  });
14830
14825
 
14831
14826
  body.querySelectorAll('*').forEach(node => {
@@ -14837,9 +14832,9 @@
14837
14832
  });
14838
14833
 
14839
14834
  body.querySelectorAll('img, video').forEach(media => {
14840
- const lazy = media.getAttribute('data-original') || media.getAttribute('data-src');
14835
+ const lazy = media.getAttribute('data-original') || media.getAttribute('data-src') || media.getAttribute('data-lazy-src');
14841
14836
 
14842
- if (lazy && !media.getAttribute('src')) {
14837
+ if (media.tagName === 'IMG' && lazy && /^https?:\/\//.test(lazy)) {
14843
14838
  media.setAttribute('src', lazy);
14844
14839
  }
14845
14840
 
@@ -14853,10 +14848,8 @@
14853
14848
  return;
14854
14849
  }
14855
14850
 
14856
- const blocked = findBlockedMediaKey(resolveMediaIds(media, candidates));
14857
-
14858
- if (blocked) {
14859
- const stub = document.createElement('div');
14851
+ if (findBlockedMediaKey(resolveMediaIds(media, candidates))) {
14852
+ const stub = body.ownerDocument.createElement('div');
14860
14853
 
14861
14854
  stub.className = 'dc-pv-blocked';
14862
14855
  stub.textContent = '🚫 차단한 이미지';
@@ -14870,18 +14863,134 @@
14870
14863
  media.removeAttribute('height');
14871
14864
 
14872
14865
  if (media.tagName === 'VIDEO') {
14873
- media.setAttribute('controls', '');
14874
- media.setAttribute('preload', 'metadata');
14875
- media.removeAttribute('autoplay');
14866
+ media.setAttribute('playsinline', '');
14867
+
14868
+ if (media.hasAttribute('loop') && media.hasAttribute('muted')) {
14869
+ media.setAttribute('autoplay', '');
14870
+ media.muted = true;
14871
+ } else {
14872
+ media.removeAttribute('autoplay');
14873
+ media.setAttribute('controls', '');
14874
+ media.setAttribute('preload', 'metadata');
14875
+ }
14876
14876
  }
14877
14877
  });
14878
14878
 
14879
- body.querySelectorAll('a[href]').forEach(link => {
14880
- link.target = '_blank';
14881
- link.rel = 'noopener noreferrer';
14879
+ return { body, hiddenMedia };
14880
+ };
14881
+
14882
+ const previewFrameCss = () => {
14883
+ const root = getComputedStyle(document.documentElement);
14884
+ const token = name => root.getPropertyValue(name).trim();
14885
+ const font = getComputedStyle(document.body).fontFamily || 'sans-serif';
14886
+ const dark = document.documentElement.classList.contains('dc-dark');
14887
+
14888
+ return `
14889
+ html { color-scheme: ${dark ? 'dark' : 'light'}; }
14890
+ html, body { margin: 0; padding: 0; background: ${token('--dc-surface')}; color: ${token('--dc-text')}; }
14891
+ body { padding: 14px 18px 28px; font: 14px/1.7 ${font}; word-break: break-word; overflow-wrap: anywhere; cursor: pointer; }
14892
+ ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-thumb { background: ${token('--dc-border')}; border-radius: 4px; }
14893
+ * { max-width: 100% !important; box-sizing: border-box; white-space: normal !important; }
14894
+ pre, pre * { white-space: pre-wrap !important; }
14895
+ [style*="width"] { width: auto !important; }
14896
+ p { margin: 0 0 4px; }
14897
+ img, video { display: block; height: auto !important; margin: 6px 0; border-radius: 6px; }
14898
+ a { color: ${token('--dc-accent-ink')}; cursor: pointer; }
14899
+ video, iframe, a, button { cursor: auto; }
14900
+ a { cursor: pointer; }
14901
+ .dc-pv-movie { display: block; width: 100% !important; aspect-ratio: 16 / 9; height: auto; border: 0; border-radius: 8px; background: #000; }
14902
+ .dc-pv-embed { display: inline-block; margin: 6px 0; font-weight: 700; }
14903
+ .dc-pv-blocked { margin: 6px 0; padding: 14px; border: 1px dashed ${token('--dc-border')}; border-radius: 8px; color: ${token('--dc-text-dim')}; font-size: 12px; text-align: center; }
14904
+ ${dark ? `[style*="background"] { background: transparent !important; }
14905
+ [style*="color: rgb(0, 0, 0)"], [style*="color:#000"], [style*="color: #000"], [style*="color:black"], font[color="#000000"] { color: inherit !important; }` : ''}
14906
+ `;
14907
+ };
14908
+
14909
+ const mountPreviewFrame = (container, data, href) => {
14910
+ const { body, hiddenMedia } = cleanPreviewBody(data.source);
14911
+ const frame = document.createElement('iframe');
14912
+
14913
+ frame.className = 'dc-pv-frame';
14914
+ frame.setAttribute('title', '글 본문');
14915
+ container.appendChild(frame);
14916
+
14917
+ const win = frame.contentWindow;
14918
+ const doc = frame.contentDocument;
14919
+
14920
+ if (!win || !doc) {
14921
+ return hiddenMedia;
14922
+ }
14923
+
14924
+ doc.open();
14925
+ doc.write('<!doctype html><html><head><meta charset="utf-8"><base target="_blank"><style id="dc-pv-css"></style></head><body></body></html>');
14926
+ doc.close();
14927
+
14928
+ try {
14929
+ const target = new URL(href, location.href);
14930
+
14931
+ win.history.replaceState(null, '', target.pathname + target.search);
14932
+ } catch {
14933
+ }
14934
+
14935
+ doc.getElementById('dc-pv-css').textContent = previewFrameCss();
14936
+ doc.body.appendChild(doc.importNode(body, true));
14937
+
14938
+ doc.querySelectorAll('video[data-src]').forEach(video => {
14939
+ const gif = video.getAttribute('data-src');
14940
+ let swapped = false;
14941
+ const toGif = () => {
14942
+ if (swapped || !video.isConnected) {
14943
+ return;
14944
+ }
14945
+
14946
+ swapped = true;
14947
+
14948
+ const img = doc.createElement('img');
14949
+
14950
+ img.src = gif;
14951
+ img.alt = '움짤';
14952
+ video.replaceWith(img);
14953
+ };
14954
+
14955
+ if (!video.canPlayType('video/mp4')) {
14956
+ toGif();
14957
+ return;
14958
+ }
14959
+
14960
+ video.addEventListener('error', toGif, true);
14961
+ video.querySelectorAll('source').forEach(source => source.addEventListener('error', toGif));
14882
14962
  });
14883
14963
 
14884
- return { body, hiddenMedia };
14964
+ doc.addEventListener('click', event => {
14965
+ const target = event.target;
14966
+
14967
+ if (target && target.closest && target.closest('a[href], video, iframe, button, input, textarea, select, summary')) {
14968
+ return;
14969
+ }
14970
+
14971
+ event.preventDefault();
14972
+ goToPreviewPost();
14973
+ });
14974
+
14975
+ doc.addEventListener('keydown', event => {
14976
+ if (event.key === 'Escape') {
14977
+ closePreview();
14978
+ }
14979
+ });
14980
+
14981
+ doc.documentElement.style.overscrollBehavior = 'contain';
14982
+
14983
+ stopPreviewTheme();
14984
+ previewThemeObserver = new MutationObserver(() => {
14985
+ const css = doc.getElementById('dc-pv-css');
14986
+
14987
+ if (css) {
14988
+ css.textContent = previewFrameCss();
14989
+ }
14990
+ });
14991
+ previewThemeObserver.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });
14992
+
14993
+ return hiddenMedia;
14885
14994
  };
14886
14995
 
14887
14996
  const readPreviewDoc = (html, key) => {
@@ -14917,17 +15026,17 @@
14917
15026
 
14918
15027
  const renderPreview = (data, href, key) => {
14919
15028
  const el = ensurePreviewEl();
14920
-
14921
- previewHref = href;
14922
15029
  const titleEl = el.querySelector('.dc-pv-title');
14923
15030
  const metaEl = el.querySelector('.dc-pv-meta');
14924
15031
  const actions = el.querySelector('.dc-pv-actions');
15032
+ const notes = el.querySelector('.dc-pv-notes');
14925
15033
  const bodyEl = el.querySelector('.dc-pv-body');
14926
15034
 
15035
+ previewHref = href;
14927
15036
  actions.textContent = '';
15037
+ notes.textContent = '';
14928
15038
  bodyEl.textContent = '';
14929
- bodyEl.scrollTop = 0;
14930
- el.scrollTop = 0;
15039
+ stopPreviewTheme();
14931
15040
 
14932
15041
  if (data.missing) {
14933
15042
  titleEl.textContent = '본문을 불러올 수 없습니다';
@@ -14936,29 +15045,36 @@
14936
15045
  titleEl.textContent = `${data.head ? `[${data.head}] ` : ''}${data.title || '(제목 없음)'}`;
14937
15046
  metaEl.textContent = [data.nick && `${data.nick}${data.ip ? `(${data.ip})` : ''}`, data.date, data.stats].filter(Boolean).join(' · ');
14938
15047
 
14939
- if (data.word) {
14940
- const note = h('div', 'dc-pv-warn', `🚫 본문에 차단 단어 "${data.word}" 가 있어 가렸습니다${settings.prefetchBodies !== false ? ' · 목록에서도 가려집니다' : ''}`);
14941
- const reveal = makeButton('그래도 보기', 'mini', () => {
14942
- note.remove();
14943
- bodyEl.appendChild(cleanPreviewBody(data.source).body);
14944
- });
14945
-
14946
- note.appendChild(reveal);
14947
- bodyEl.appendChild(note);
14948
- } else {
14949
- const { body, hiddenMedia } = cleanPreviewBody(data.source);
15048
+ const showBody = () => {
15049
+ const hidden = mountPreviewFrame(bodyEl, data, href);
14950
15050
 
14951
- if (hiddenMedia) {
14952
- bodyEl.appendChild(h('div', 'dc-pv-note', `차단한 이미지 ${hiddenMedia}개를 뺐습니다`));
15051
+ if (hidden) {
15052
+ notes.appendChild(h('div', 'dc-pv-note', `차단한 이미지 ${hidden}개를 뺐습니다`));
14953
15053
  }
15054
+ };
15055
+
15056
+ if (data.word) {
15057
+ const warn = h('div', 'dc-pv-warn', `🚫 본문에 차단 단어 "${data.word}" 가 있어 가렸습니다${settings.prefetchBodies !== false ? ' · 목록에서도 가려집니다' : ''}`);
14954
15058
 
14955
- bodyEl.appendChild(body);
15059
+ warn.appendChild(makeButton('그래도 보기', 'mini', () => {
15060
+ warn.remove();
15061
+ showBody();
15062
+ }));
15063
+ bodyEl.appendChild(warn);
15064
+ } else {
15065
+ showBody();
14956
15066
  }
14957
15067
  }
14958
15068
 
14959
- const open = h('a', 'dc-btn mini', '글 열기');
15069
+ const open = h('a', 'dc-btn mini primary', '글 열기');
14960
15070
 
14961
15071
  open.href = href;
15072
+ open.addEventListener('click', event => {
15073
+ if (!event.ctrlKey && !event.metaKey && !event.shiftKey && event.button === 0) {
15074
+ event.preventDefault();
15075
+ goToPreviewPost();
15076
+ }
15077
+ });
14962
15078
  actions.appendChild(open);
14963
15079
 
14964
15080
  if (!data.missing && key) {
@@ -14992,6 +15108,8 @@
14992
15108
  }
14993
15109
  }
14994
15110
 
15111
+ actions.appendChild(h('span', 'dc-pv-hint', '본문을 누르면 글로 이동'));
15112
+
14995
15113
  const close = makeButton('✕', 'mini dc-pv-close', closePreview);
14996
15114
 
14997
15115
  close.setAttribute('aria-label', '미리보기 닫기');
@@ -15005,7 +15123,7 @@
15005
15123
 
15006
15124
  const row = anchor.closest('tr');
15007
15125
 
15008
- if (row && (row.classList.contains('dc-user-blocked') && !row.classList.contains('dc-user-revealed') || row.classList.contains('dc-head-hidden'))) {
15126
+ if (row && ((row.classList.contains('dc-user-blocked') && !row.classList.contains('dc-user-revealed')) || row.classList.contains('dc-head-hidden'))) {
15009
15127
  return;
15010
15128
  }
15011
15129
 
@@ -15019,11 +15137,11 @@
15019
15137
  previewAnchor?.classList.remove('dc-pv-anchor');
15020
15138
  previewAnchor = anchor;
15021
15139
  previewKey = key;
15140
+ previewHref = href;
15022
15141
  anchor.classList.add('dc-pv-anchor');
15023
15142
 
15024
15143
  const el = ensurePreviewEl();
15025
15144
 
15026
- placePreview(anchor);
15027
15145
  el.classList.add('show');
15028
15146
 
15029
15147
  const cached = previewCache.get(key);
@@ -15033,19 +15151,23 @@
15033
15151
  return;
15034
15152
  }
15035
15153
 
15036
- const paused = netPausedUntil();
15037
-
15154
+ stopPreviewTheme();
15038
15155
  el.querySelector('.dc-pv-title').textContent = cleanText(anchor.textContent);
15039
15156
  el.querySelector('.dc-pv-meta').textContent = '';
15040
15157
  el.querySelector('.dc-pv-actions').textContent = '';
15041
- el.querySelector('.dc-pv-body').textContent = '';
15158
+ el.querySelector('.dc-pv-notes').textContent = '';
15159
+
15160
+ const body = el.querySelector('.dc-pv-body');
15161
+ const paused = netPausedUntil();
15162
+
15163
+ body.textContent = '';
15042
15164
 
15043
15165
  if (paused) {
15044
- el.querySelector('.dc-pv-body').appendChild(h('div', 'dc-pv-note', `⏸ 디시 요청 제한 중이라 ${Math.max(1, Math.ceil((paused - Date.now()) / 60000))}분 뒤에 미리볼 수 있습니다`));
15166
+ body.appendChild(h('div', 'dc-pv-note', `⏸ 디시 요청 제한 중이라 ${Math.max(1, Math.ceil((paused - Date.now()) / 60000))}분 뒤에 미리볼 수 있습니다`));
15045
15167
  return;
15046
15168
  }
15047
15169
 
15048
- el.querySelector('.dc-pv-body').appendChild(h('div', 'dc-pv-loading', '불러오는 중…'));
15170
+ body.appendChild(h('div', 'dc-pv-loading', '불러오는 중…'));
15049
15171
 
15050
15172
  try {
15051
15173
  const html = await siteFetchText(href, { credentials: 'same-origin', cache: 'no-cache' });
@@ -15069,8 +15191,6 @@
15069
15191
  return;
15070
15192
  }
15071
15193
 
15072
- const body = el.querySelector('.dc-pv-body');
15073
-
15074
15194
  body.textContent = '';
15075
15195
  body.appendChild(h('div', 'dc-pv-note', error instanceof NetPausedError
15076
15196
  ? '⏸ 디시 요청 제한 중이라 잠시 뒤에 미리볼 수 있습니다'
@@ -15084,7 +15204,7 @@
15084
15204
  }
15085
15205
 
15086
15206
  document.addEventListener('mouseover', event => {
15087
- if (!previewEnabled() || (event.pointerType && event.pointerType !== 'mouse')) {
15207
+ if (!previewEnabled()) {
15088
15208
  return;
15089
15209
  }
15090
15210
 
@@ -15094,14 +15214,16 @@
15094
15214
  return;
15095
15215
  }
15096
15216
 
15097
- clearTimeout(previewCloseTimer);
15098
-
15099
15217
  if (anchor === previewAnchor) {
15218
+ clearTimeout(previewCloseTimer);
15100
15219
  return;
15101
15220
  }
15102
15221
 
15103
15222
  clearTimeout(previewHoverTimer);
15104
- previewHoverTimer = setTimeout(() => showPreviewFor(anchor), PREVIEW_DELAY);
15223
+ previewHoverTimer = setTimeout(() => {
15224
+ clearTimeout(previewCloseTimer);
15225
+ showPreviewFor(anchor);
15226
+ }, PREVIEW_DELAY);
15105
15227
  });
15106
15228
 
15107
15229
  document.addEventListener('mouseout', event => {
@@ -15113,28 +15235,36 @@
15113
15235
 
15114
15236
  clearTimeout(previewHoverTimer);
15115
15237
 
15116
- if (previewEl && previewEl.classList.contains('show')) {
15238
+ if (previewOpen() && !(event.relatedTarget instanceof Node && previewEl.contains(event.relatedTarget))) {
15117
15239
  schedulePreviewClose();
15118
15240
  }
15119
15241
  });
15120
15242
 
15121
15243
  document.addEventListener('mousedown', event => {
15122
- if (previewEl && previewEl.classList.contains('show') && !(event.target instanceof Node && previewEl.contains(event.target))) {
15244
+ if (previewOpen() && !(event.target instanceof Node && previewEl.contains(event.target))) {
15123
15245
  closePreview();
15124
15246
  }
15125
15247
  }, true);
15126
15248
 
15127
15249
  window.addEventListener('scroll', () => {
15128
- if (previewEl && previewEl.classList.contains('show') && previewAnchor && !previewEl.matches(':hover')) {
15250
+ if (previewOpen() && !previewEl.matches(':hover')) {
15129
15251
  closePreview();
15130
15252
  }
15131
15253
  }, { passive: true });
15132
15254
 
15255
+ window.addEventListener('resize', () => {
15256
+ if (previewOpen()) {
15257
+ closePreview();
15258
+ }
15259
+ });
15260
+
15133
15261
  document.addEventListener('keydown', event => {
15134
- if (event.key === 'Escape' && previewEl && previewEl.classList.contains('show')) {
15262
+ if (event.key === 'Escape' && previewOpen()) {
15135
15263
  closePreview();
15136
15264
  }
15137
15265
  });
15266
+
15267
+ window.addEventListener('pagehide', closePreview);
15138
15268
  };
15139
15269
 
15140
15270
  const togglePreviewForCursor = () => {
@@ -15142,12 +15272,12 @@
15142
15272
  return false;
15143
15273
  }
15144
15274
 
15145
- if (previewEl && previewEl.classList.contains('show')) {
15275
+ if (previewOpen()) {
15146
15276
  closePreview();
15147
15277
  return true;
15148
15278
  }
15149
15279
 
15150
- const anchor = keyCursor && keyCursor.isConnected ? keyCursor.querySelector(PREVIEW_TITLE_SELECTOR.replace('table.gall_list ', '')) : null;
15280
+ const anchor = keyCursor && keyCursor.isConnected ? keyCursor.querySelector('td.gall_tit > a:not(.reply_numbox)') : null;
15151
15281
 
15152
15282
  if (!anchor) {
15153
15283
  return false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kangsicj/dcinsideenhancer",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "DCInside filter & enhancer userscript for mobile and PC (디시인사이드 차단·편의 유저스크립트)",
5
5
  "license": "MIT",
6
6
  "author": "kangsicj",