모미지→카에데 변환 방법

18TRIP_통합공지
2026.05.11

✅기능 안내

 
1. 이 티스토리 주소 한정으로 pc환경에서 모미지 이미지가 카에데 이미지로 전환됩니다.
 
2.  '모미지' 텍스트가 '카에데' 로 바뀝니다.
 
3. 외의 기능은 없습니다. 카에데 only 텍스트가 뜬다던가, '그녀' 호칭이 '그'로 바뀐다던가...같은 건 무리.

되도록 성별중립적인 '그'를 쓰려 하고 있습니다.
하지만 간혹 가다가 카에데가 모미지 오빠. 라고 부르는 참사가 일어날 수 있습니다...

 

유의사항: 가끔 달려있는 주임의 행동지문은 모미지 보이스 연기 기준. 카에데는 톤이 다를 때가 많아요.


(260517) 작성된 일부 포스트에 (일부 이벤스/메인 스토리) 원클릭 버튼이 추가되었습니다.

이전 이벤트는... 수정하기가 번거로워서... 언젠가 주위에 카에데 플블이 더 생긴다면 또......

 
 

이렇게 생겨먹었답니다 (눌러보세요)

TEST 

모미지
오모테나시 성공!

 


해당 확장프로그램을 추가합니다.
https://chromewebstore.google.com/detail/violentmonkey/jinjaccalgkegednnccohejagnlnfdag?pli=1

 

Violentmonkey - Chrome 웹 스토어

유저스크립트를 실행합니다.

chromewebstore.google.com

 

(js 코드를 실행시켜주는 확장프로그램입니다. Tampermonkey 나 User JavaScript and CSS 같은 확장프로그램도 상관 X.
쓰고 계신 동일한 기능의 확장프로그램이 있다면 그걸 쓰세요.)

 
 

 
이후 스크립트 추가 버튼을 누르시고, 아래의 코드를 그대로 복붙하시면 됩니다.
(확장프로그램 버튼에서 +를 바로 누르면 들어가는 코드 작성 페이지와 동일)


// ==UserScript==
// @name         18TRIP 번역 블로그 여주임->남주임 변환
// @namespace    vm-tistory
// @version      1.0
// @description  티스토리 이미지 교체 + 텍스트 치환
// @match        https://spinel17.tistory.com/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    const imageReplacements = [

        // Momiji → Kaede
        {
            oldName: 'Momiji.png',
            newImage:
                'https://tistory1.daumcdn.net/tistory/1822022/skin/images/Kaede.png'
        },

        // Kaede → Momiji
        {
            oldName: 'Kaede.png',
            newImage:
                'https://tistory1.daumcdn.net/tistory/1822022/skin/images/Momiji.png'
        }
    ];

    function replaceImages(root = document) {

        root.querySelectorAll('img').forEach(img => {

            [
                'src',
                'data-src',
                'data-original'
            ].forEach(attr => {

                const value = img.getAttribute(attr);

                if (!value) return;

                for (const rule of imageReplacements) {

                    if (value.includes(rule.oldName)) {

                        img.setAttribute(
                            attr,
                            rule.newImage
                        );

                        break;
                    }
                }
            });

            if (img.srcset) {

                for (const rule of imageReplacements) {

                    if (img.srcset.includes(rule.oldName)) {

                        const regex = new RegExp(
                            `https?:\\/\\/[^\\s,]+${rule.oldName.replace('.', '\\.')}`,
                            'g'
                        );

                        img.srcset = img.srcset.replaceAll(
                            regex,
                            rule.newImage
                        );

                        break;
                    }
                }
            }
        });
    }



    function swapText(text) {

        text = text.replaceAll('모미지', '__TEMP_MOMIJI__');
        text = text.replaceAll('카에데', '모미지');
        text = text.replaceAll('__TEMP_MOMIJI__', '카에데');

        return text;
    }


    function replaceTextNodes(root) {

        const walker = document.createTreeWalker(
            root,
            NodeFilter.SHOW_TEXT,
            {
                acceptNode(node) {

                    if (
                        !node.parentElement ||
                        ['SCRIPT', 'STYLE', 'NOSCRIPT'].includes(
                            node.parentElement.tagName
                        )
                    ) {
                        return NodeFilter.FILTER_REJECT;
                    }

                    return NodeFilter.FILTER_ACCEPT;
                }
            }
        );

        let node;

        while ((node = walker.nextNode())) {

            const original = node.nodeValue;

            if (!original) continue;

            const replaced = swapText(original);

            if (original !== replaced) {
                node.nodeValue = replaced;
            }
        }
    }


    function runAll(root = document.body) {

        replaceImages(root);
        replaceTextNodes(root);
    }


    runAll();

    // 동적 로딩 대응
    const observer = new MutationObserver(mutations => {

        mutations.forEach(mutation => {

            mutation.addedNodes.forEach(node => {

                if (node.nodeType === 1) {
                    runAll(node);
                }
            });
        });
    });

    observer.observe(document.body, {
        childList: true,
        subtree: true
    });

})();

활성화하면 이렇게 바뀌게 됩니다. 아무 포스팅이나 들어가셔서 확인해 보세요.
당장 제대로 적용이 된 상태라면 이 포스트의 '모미지' '카에데' 텍스트가 뒤바뀌어 있을 겁니다.
 

 
이런 식으로 적용된다면 성공. 비활성하면 원래대로 돌아갑니다.

 
안 쓰게 되면 지우세요. 뭔 변방의 티스토리 주소를 저장한 채 영원히 살아가지 마시길...
 
 
버그 있다면 댓글 남겨주세요.


 

'18TRIP_통합공지' 카테고리의 다른 글

18TRIP/ 이벤트 스토리 번역  (4) 2026.04.14
18TRIP/ 구장 노벨  (0) 2026.04.14
18TRIP/ 카드스 링크 모음  (0) 2026.01.08
18TRIP/ 번역 공지  (6) 2025.12.14