도움말:사용자 자바스크립트 편집하기


편집하면 당신의 IP 주소가 공개적으로 기록됩니다. 계정을 만들고 로그인하면 편집 시 사용자 이름만 보이며, 위키 이용에 여러 가지 편의가 주어집니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
9번째 줄: 9번째 줄:


== 미디어위키 내부 인터페이스 ==
== 미디어위키 내부 인터페이스 ==
{{참고|mw:Manual:Interface/JavasSript}}
{{참조|mw:Manual:Interface/JavasSript}}
{{참고|도움말:미디어위키 API}}
{{참조|도움말:미디어위키 API}}
미디어위키는 기본적인 DOM 자바스크립트와 [[JQuery]] 문법을 기본적으로 제공합니다. 그 외에도 미디어위키에서는 문서 자체의 정보를 긁어올 수 있는 mw 오브젝트를 포함해서 여러 오브젝트를 지원하고 있습니다.  
미디어위키는 기본적인 DOM 자바스크립트와 [[JQuery]] 문법을 기본적으로 제공합니다. 그 외에도 미디어위키에서는 문서 자체의 정보를 긁어올 수 있는 mw 오브젝트를 포함해서 여러 오브젝트를 지원하고 있습니다.  


예시 - mw.config.get('(속성)')을 통해 지금 읽고 있는 문서의 정보를 긁어오실 수 있습니다. 속성 관련 표
예시 - mw.config.get('(속성)')을 통해 지금 읽고 있는 문서의 정보를 긁어오실 수 있습니다. 아니면 그냥 아래 속성명을 직접 입력해도 확인할 수 있지만 추천문법은 아닙니다. 속성 관련 표


{|class="wikitable"
{|class="wikitable"
68번째 줄: 68번째 줄:
더 많은 정보는 [[:Wikipedia:Wikipedia:User scripts]]를 참조하시면 됩니다.
더 많은 정보는 [[:Wikipedia:Wikipedia:User scripts]]를 참조하시면 됩니다.


=== 위키백과 공식 소도구 ===
리브레 위키에서는 [[특수:환경설정]]의 옵션으로 설정되어 있지 않지만 리브레 위키에서 호환이 가능한 스크립트 모음입니다. 리버티 스킨 기준으로 해당 기능의 호환성이 확인된 만큼 그냥 아래 스크립트를 [[특수:내사용자문서/common.js]]에 붙여넣으시면 됩니다.
<pre>
//키보드 단축키 비활성화
mw.loader.load('//ko.wikipedia.org/w/index.php?title=Mediawiki:Gadget-removeAccessKeys.js&action=raw&type=text/javascript');
//대문 열면 커서 놓기
mw.loader.load('//ko.wikipedia.org/w/index.php?title=Mediawiki:Gadget-searchFocus.js&action=raw&type=text/javascript');
//토론 문서에서 서명 누락시 경고 메시지 띄우기
mw.loader.load('//ko.wikipedia.org/w/index.php?title=Mediawiki:Gadget-noSignAlert.js&action=raw&type=text/javascript');
//사용자 도구 모음에 UTC 시각 추가 - Vector, Timeless 스킨에서만 호환.
mw.loader.load( '//www.mediawiki.org/w/index.php?title=MediaWiki:Gadget-UTCLiveClock.js&action=raw&ctype=text/javascript' );
//사용자 도구 모음에 현지 시각 추가 - Vector, Timeless 스킨에서만 호환
mw.loader.load( '//www.mediawiki.org/w/index.php?title=MediaWiki:Gadget-LocalLiveClock.js&action=raw&ctype=text/javascript' );
// 특수:기여 문서에 IP주소 CIDR로 검색 기능 추가
mw.loader.load( '//en.wikipedia.org/w/index.php?title=MediaWiki:Gadget-contribsrange.js&action=raw&ctype=text/javascript' ); 
</pre>
=== 위키백과 이용자 소도구 ===
<pre>
<pre>
/* 토론 문서에서 편집 시에 서명하지 않을 경우 경고 메시지를 출력하는 스크립트입니다. 한위백 IRTC1015님이 작성 */
/* 토론 문서에서 편집 시에 서명하지 않을 경우 경고 메시지를 출력하는 스크립트입니다. 한위백 IRTC1015님이 작성 */
mw.loader.load('//ko.wikipedia.org/w/index.php?title=User:IRTC1015/qSig.js&action=raw&ctype=text/javascript');
mw.loader.load('//ko.wikipedia.org/w/index.php?title=User:IRTC1015/qSig.js&action=raw&ctype=text/javascript');
// 되돌리기 컨펌 박스
mw.loader.load('//en.wikipedia.org/w/index.php?title=User:MusikAnimal/confirmationRollback.js&action=raw&ctype=text/javascript');
// 로컬 파일 설명 안 보고 바로 공용으로 넘기기(영어 위키백과, 위키데이터에서 퍼옴)
mw.loader.load('//en.wikipedia.org/w/index.php?title=MediaWiki:Gadget-imagelinks.js&action=raw&ctype=text/javascript');
</pre>
</pre>


108번째 줄: 81번째 줄:
{{{icon|[[파일:Ambox warning pn.svg|25px]]}}} {{틀|숨김 시작}}이나 {{틀|숨기기}} 등의 기능을 사용할 경우 숨긴 내용을 풀 경우 맨 아래로 내리는 기능이 올바르게 작동하지 않을 수 있습니다.  
{{{icon|[[파일:Ambox warning pn.svg|25px]]}}} {{틀|숨김 시작}}이나 {{틀|숨기기}} 등의 기능을 사용할 경우 숨긴 내용을 풀 경우 맨 아래로 내리는 기능이 올바르게 작동하지 않을 수 있습니다.  


{{숨김 시작|title=맨 위로 가기/맨 아래로 가기 버튼 만들기|bg=#eee}}
{{숨김 시작|title=맨 위로 가기/맨 아래로 가기 버튼 만들기|titlestyle=background:#BFBFFF}}
<pre>
<pre>
/*  
/*  
186번째 줄: 159번째 줄:


=== Vector 스킨에서 우측 최근 바뀐 문서 보여주는 상자 만들기 ===
=== Vector 스킨에서 우측 최근 바뀐 문서 보여주는 상자 만들기 ===
[[특수:내사용자문서/vector.js]]에 아래 코드를 삽입할 경우 Vector(벡터) 스킨을 사용할 때 Liberty 스킨의 최근 바뀐 문서를 한눈에 보여주는 상자를 삽입하실 수 있습니다.[https://github.com/librewiki/liberty-skin/blob/master/js/live-recent.js 참조]. Liberty 스킨의 최근 바뀜 상자를 만들어주는 live-recent.js 코드를 이용해서 재구성했습니다.
[[특수:내사용자문서/vector.js]]에 아래 코드를 삽입할 경우 Vector(벡터) 스킨을 사용할 때 Liberty 스킨의 최근 바뀐 문서를 한눈에 보여주는 상자를 삽입하실 수 있습니다. 현재 디자인이나 코딩 최적화가 부족한 점 양해해주시기 바랍니다. [https://github.com/librewiki/liberty-skin/blob/master/js/live-recent.js 참조]. Liberty 스킨의 최근 바뀜 상자를 만들어주는 live-recent.js 코드를 이용해서 재구성했습니다.


[[특수:내사용자문서/vector.js]]에 직접 아래 소스를 복사하거나 아니면 아래 코드를 [[특수:내사용자문서/vector.js]]에 붙여넣으시면 됩니다. 그러면 벡터 스킨을 기본 스킨으로 지정할 경우 최근에 편집한 문서를 보여주는 상자를 띄울 수 있습니다.
{{{icon|[[파일:Ambox warning pn.svg|25px]]}}} 원인 미상의 오류로 인해 [[특수:내사용자문서/vector.js]]에 직접 아래 소스를 붙여놓으면 자바스크립트가 제대로 작동하지 않습니다. 하위 문서에 아래 소스를 붙여넣은 뒤 <code>mw.loader.load</code> 명령어를 붙여넣거나 아니면 아래 코드를 [[특수:내사용자문서/vector.js]]에 붙여넣으시면 됩니다. 그러면 벡터 스킨을 기본 스킨으로 지정할 경우 최근에 편집한 문서를 보여주는 상자를 띄울 수 있습니다.
<pre>mw.loader.load('https://librewiki.net/index.php?title=사용자:Utolee90/recentchange.js&action=raw&ctype=text/javascript');</pre>
<pre>mw.loader.load('https://librewiki.net/index.php?title=사용자:Utolee90/recentchange.js&action=raw&ctype=text/javascript');</pre>


{{숨김 시작|title=Vector 스킨에서 최근 바뀐 문서 한눈에 확인하는 상자 만들기|bg=#eee}}
{{숨김 시작|title=Vector 스킨에서 최근 바뀐 문서 한눈에 확인하는 상자 만들기|titlestyle=background:#BFBFFF}}
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
// 1280픽셀 이상에서만 상자가 나타나게 설정함.
$("span#pageuseskin").text("Vector");
var mediaViewContent = window.matchMedia('(min-width: 1280px)')
var $need_margin = Math.min(Math.max(0, 1510-parseInt(window.innerWidth)),190) //1510픽셀 이상일 때는 여백 0, 최대 190픽셀만 여백 지정


if(parseInt(window.innerWidth)>800){ //본문 내용이 800픽셀 이상일 때에만 최근바뀜 상자가 나타나게... 아래는 HTML 구성
//최근 바뀜 목록 보이기 - 출처 : https://github.com/librewiki/liberty-skin/blob/master/js/live-recent.js
//최근 바뀜 목록 보이기 - 출처 : https://github.com/librewiki/liberty-skin/blob/master/js/live-recent.js
 
$('#content').css("margin-right", String($need_margin)+'px'); // 800px 이상일 때만 여백 나타나게 지정
if (mediaViewContent.matches) {
$( function () {
$( function () {
 
$( 'body' ).append('<div class="libre_recent"><div id="libre_recent-tabs"><div id="recenttext" class="selected">최근 문서</div><div id="recenttalk">최근 토론</div></div><div id = "recent-list-div"><div class="live-recent-content"><ul class="live-recent-list docupage" id="live-recent-list"><li class="recent-item-background"><span class="recent-item">1</span></li><li class="recent-item-background"><span class="recent-item">2</span></li><li class="recent-item-background"><span class="recent-item">3</span></li><li class="recent-item-background"><span class="recent-item">4</span></li><li class="recent-item-background"><span class="recent-item">5</span></li><li class="recent-item-background"><span class="recent-item">6</span></li><li class="recent-item-background"><span class="recent-item">7</span></li><li class="recent-item-background"><span class="recent-item">8</span></li><li class="recent-item-background"><span class="recent-item">9</span></li><li class="recent-item-background"><span class="recent-item">10</span></li></ul></div><div class="recent-more"><span class="mw-editsection-bracket">[</span><a href="//librewiki.net/wiki/특수:최근바뀜" title="최근바뀜문서">more</a><span class="mw-editsection-bracket">]</div></span></div>' ); //HTML 삽입. <li>개수에 따라 아이템 갯수 조절 가능
    $('body').append('<div id="libre-recent-vector"></div>');  // 최근 바뀜 상자
    $('#libre-recent-vector').append('<div id="libre-recent-tabs"></div>'); // 최근 바뀜 상자 탭 버튼
    $('#libre-recent-vector').append('<div id="recent-list-div"></div>'); // 최근 바뀜 상자 내용
    $('#libre-recent-tabs').append('<div id="recent-text" class="selected">최근 문서</div>'); // 최근 문서 버튼
    $('#libre-recent-tabs').append('<div id="recent-talk">최근 토론</div>'); // 최근 토론 버튼
    $('#recent-list-div').append('<div class="live-recent-content"></div>'); // 최근 바뀜 내용
    $('#recent-list-div').append('<div class="recent-more" title="최근 바뀜 문서">최근 바뀜 더 보기</div>'); // 더 알아보기
    $('.live-recent-content').append('<ul id="live-recent-list" class="live-recent-list docupage"></div>'); // 리스트
 
    var listNum = 10; // 목록 갯수
    // 목록 갯수에 따라 오브젝트 추가
    for (var j = 0; j<listNum; j++) {
        $('#live-recent-list').append('<li class="recent-item-background"><span class="recent-item">'+j.toString()+'</span></li>');
        $('.recent-item-background')[j].style.background= j%2 ==0 ? '#eee' : '#c1d8e1';
    }
 
 
//기초 css 지정
//기초 css 지정
$('#libre-recent-vector').css({"position":"fixed","top":"15%","right":"10px"});
$('.libre_recent').css({"position":"fixed","top":"15%","right":"10px"});
$('#libre-recent-tabs').css({"display":"flex", "padding":"3px", "border":"1px solid grey", "background":"#ddf"});
$('#libre_recent-tabs').css({"display":"flex", "padding":"3px", "border":"1px solid grey", "width":"180px", "background":"#ddf"});
$('#recent-text').css({"padding":"3px", "flex":"1", "background":"#417ff3", "color":"white", "font-weight":"bold", "cursor":"pointer", "textAlign":"center"});
$('#recenttext').css({"padding":"3px", "flex":"1", "background":"#417ff3", "color":"white", "font-weight":"bold"});
$('#recent-talk').css({"padding":"3px", "flex":"1", "background":"white", "font-weight":"bold", "cursor":"pointer", "textAlign":"center"});
$('#recenttalk').css({"padding":"3px", "flex":"1", "background":"white", "font-weight":"bold"});
$('#recent-list-div').css({"width":"180px", "top":"auto", "right":"10px"});
$('#recent-list-div').css({"width":"180px", "position":"fixed", "top":"auto", "right":"10px"});
$('.live-recent-list.docupage').css({"display":"block", "list-style-type": "none", "padding": "0", "margin": "0"});
$('.live-recent-list.docupage').css({"display":"block", "list-style-type": "none", "padding": "0", "margin": "0"});
$('.live-recent-content').css({"border":"1px solid grey", 'background':'#eee', 'fontSize':'0.8em'});
$('.live-recent-content').css({"border":"1px solid grey", 'background':'#eee'});
$('.live-recent-list.docupage>li').css({"border-collapse":"collapse"});
$('.live-recent-list.docupage>li').css({"border-collapse":"collapse"});
$('.recent-more').css({"border":"1px solid grey", "background":"#c1d8e1", "color":"#417ff3", "textAlign":"center", "cursor":"pointer", "fontWeight":"bold"}); // 더 보기 버튼
$('.live-recent-list.docupage>li:nth-of-type(odd)').css({"background":"#ddd"});
$('.recent-more').click(function(){window.location.href='//librewiki.net/wiki/특수:최근바뀜';});
$('.live-recent-list.docupage>li:nth-of-type(even)').css({"background":"#eee"});
 
$('.recent-more').css({"border":"1px solid grey", "width":"180px", "background":"#eee"});


//가로폭이 좁으면 content 내용 좁히기.
//가로폭이 좁으면 content 내용 좁히기.
282번째 줄: 238번째 줄:
var recentChanges, html, time, line, text;
var recentChanges, html, time, line, text;
recentChanges = data.query.recentchanges;
recentChanges = data.query.recentchanges;
                                for (var j= 0; j<limit; j++) {
html = recentChanges.map( function ( item ) {
                                    $('.recent-item-background')[j].innerHTML = '';
time = new Date( item.timestamp );
                                    if (j < recentChanges.length) {
line = '<li><a class="recent-item" href="' + mw.util.getUrl( item.title ) + '" title="' + item.title + '">[' + timeFormat( time ) + '] ';
                                          var item = recentChanges[j];
text = '';
                                        var time = new Date( item.timestamp );
if ( item.type === 'new' ) {
                                   
text += '[新]'; //새문서 지정
                                        var newA = document.createElement('a'); // 하이퍼링크 텍스트
}
                                        newA.setAttribute('href', mw.util.getUrl(item.title));
text += item.title;
                                        newA.setAttribute('title', item.title);
if ( text.length > 13 ) {
                                        newA.classList.add('recent-item');
text = text.substr( 0, 13 );
                                        var titletext = item.title.length > 13 ? item.title.slice(0,13)+'..' : item.title;
text += '...';
                                        newA.innerText = '[' + timeFormat( time ) + '] ' + titletext;
}
                                        // 새문서일 때
//text = text.replace( '[New]', '<span class="new">' + mw.msg( 'liberty-feed-new' ) + ' </span>' ); //미작동하므로 코드 비활성화
                                        if (item.type == 'new') {
line += text;
                                            newA.style.color = '#d45';
line += '</a></li>';
                                            newA.setAttribute('title', item.title+ " (NEW)");
return line;
                                            // newA.innerHTML += ' <span class="new">' + mw.msg( 'liberty-feed-new' ) + ' </span>'; 미작동되기에 일단 지우기
} ).join( '\n' );
                                        }
$( '#live-recent-list' ).html( html );
                                        $('.recent-item-background')[j].appendChild(newA);
                                    }
                                }
})
})
.catch( function () {} );
.catch( function () {} );
309번째 줄: 262번째 줄:


//클릭 시 표시되는 내용 지정
//클릭 시 표시되는 내용 지정
var rtext=$('#recent-text');
var rtext=$('#recenttext');
var rtalk=$('#recent-talk');
var rtalk=$('#recenttalk');
rtext.click(function(){rtext.css({"background":"#417ff3", "color":"white"});  
rtext.click(function(){rtext.css({"background":"#417ff3", "color":"white"}); rtalk.css({"background":"white", "color":"black"}); isArticleTab = true; refreshLiveRecent(); }); //최근문서 배경색 파랗게, 최근문서  내용 보이고 최근토론 내용 숨김
              rtalk.css({"background":"white", "color":"black"});  
rtalk.click(function(){rtext.css({"background":"white", "color":"black"}); rtalk.css({"background":"#417ff3", "color":"white"}); isArticleTab = false; refreshLiveRecent(); } ); //최근토론 배경색 파랗게, 최근문서  내용 숨기고 최근토론 내용 보임
              isArticleTab = true;  
              refreshLiveRecent();  
            }); //최근문서 배경색 파랗게, 최근문서  내용 보이고 최근토론 내용 숨김
rtalk.click(function(){rtext.css({"background":"white", "color":"black"});  
                      rtalk.css({"background":"#417ff3", "color":"white"});  
                      isArticleTab = false;  
                      refreshLiveRecent(); } ); //최근토론 배경색 파랗게, 최근문서  내용 숨기고 최근토론 내용 보임
            
            
setInterval( refreshLiveRecent, 5 * 60 * 1000 );
setInterval( refreshLiveRecent, 5 * 60 * 1000 );
refreshLiveRecent();  
refreshLiveRecent();  
330번째 줄: 277번째 줄:


=== 편집 요약창 아래 편집요약 상용구 입력 버튼 추가 ===
=== 편집 요약창 아래 편집요약 상용구 입력 버튼 추가 ===
{{숨김 시작|title=편집창 아래 편집요약 상용구 입력 버튼 추가|bg=#eee}}
{{숨김 시작|title=편집창 아래 편집요약 상용구 입력 버튼 추가|titlestyle=background:#BFBFFF}}
<syntaxhighlight lang="javascript>
<syntaxhighlight lang="javascript>
/* 한국어 위키백과 미디어위키:Gadget-editsummary.js 호출. 사용자:Utolee90/Addbutton.js 참조 */
/* 한국어 위키백과 미디어위키:Gadget-editsummary.js 호출. 사용자:Utolee90/Addbutton.js 참조 */
389번째 줄: 336번째 줄:
를 [[특수:내사용자문서/common.js]]에 입력하시면 div 태그 안에 사용자 문서의 주인의 편집상태를 확인할 수 있습니다.  
를 [[특수:내사용자문서/common.js]]에 입력하시면 div 태그 안에 사용자 문서의 주인의 편집상태를 확인할 수 있습니다.  


{{숨김 시작|title=사용자 활동 상태 알려주기|bg=#eee}}
{{숨김 시작|title=사용자 활동 상태 알려주기|titlestyle=background:#BFBFFF}}
<syntaxhighlight lang="javascript" >
<syntaxhighlight lang="javascript" >
// 소스 원본 : 사용자:Utolee90/status.js
// 소스 원본 : 사용자:Utolee90/status.js
440번째 줄: 387번째 줄:
</syntaxhighlight>
</syntaxhighlight>
{{숨김 끝}}
{{숨김 끝}}
=== 민감한 내용 경고를 주는 스크립트===
=== 성적인 문서에 경고를 주는 스크립트===
어린이가 있는 집의 전자기기나 가족이 쓰는 컴퓨터 등에서 쓰면 좋습니다.
어린이가 있는 집의 전자기기이나 가족이 쓰는 컴퓨터 등에서 쓰면 좋습니다.


<syntaxhighlight lang="javascript" >
<syntaxhighlight lang="javascript" >
if (mw.config.get('wgCategories')[mw.config.get('wgCategories').indexOf("애드센스 제외 문서")] == "애드센스 제외 문서" && mw.config.get('wgNamespaceNumber') ==0 )
if (mw.config.get('wgCategories')[mw.config.get('wgCategories').indexOf("애드센스 제외 문서")] == "애드센스 제외 문서" && mw.config.get('wgNamespaceNumber') ==0 )
    {
      alert('이 문서에는 사회풍속상 민감한 내용이 있습니다. 읽을 때 주의하시기 바랍니다.');
    }
</syntaxhighlight>


=== 편잡창 위에 최종 편집자 정보 띄우는 스크립트 ===
{
아래 숨겨진 코드 혹은
<syntaxhighlight lang="javascript">
//최종 편집 상태 나타내기
mw.loader.load('//librewiki.net/index.php?title=사용자:Utolee90/lastedit.js&action=raw&ctype=text/javascript');
</syntaxhighlight>
코드를 [[특수:내사용자문서/common.js]]에 붙이면 편집창 오른쪽 위에 최종 편집자와 최종 편집시간, 변화 내용을 확인할 수 있습니다.
{{숨김 시작|title=문서 최종 편집자 정보 보여주기|bg=#eee}}
<syntaxhighlight lang="javascript">
// 사용자:Utolee90/lastedit.js에서 가져옴
// 사용 방법 : 자산의 사용자 자바스크립트 문서에 주석기호 '//'를 빼고 아래 문구를 입력하시면 사용가능합니다.
// mw.loader.load('//librewiki.net/index.php?title=사용자:Utolee90/lastedit.js&action=raw&ctype=text/javascript');
var a_title = mw.config.get('wgPageName');
var params_1 = {
action: 'query',
prop: 'revisions',
                utf8 : 1,
                titles : a_title,
                rvlimit : 1,
format: 'json'
},
api_1 = new mw.Api(); // api 얻기


 
alert('이 문서에는 성적인 내용이 있습니다. 읽을 때 주의하시기 바랍니다.');
 
api_1.get( params_1 ).done( function ( data ) {
        const addZero = (i) => { // 0함수 추가
  if (parseInt(i) < 10) {
    i = "0" + i;
  }
  return i+"";
};
if (mw.config.get('wgAction') === 'view' && mw.config.get('wgNamespaceNumber') > -1) {
        const rv_data = data.query.pages; // 리비전 확인
        const page_id = parseInt(Object.keys(rv_data)[0]); // PageID 형식으로 출력.
        let $status_info = $('<div id="document-status-infos"></div>');
        $('#mw-content-text').prepend($status_info);
        const rv_status = rv_data[page_id]['revisions'][0]; // 최근 리비전 상태 출력
        const rv_last_edit = new Date(rv_status.timestamp); // 마지막 변경 시점.
        const day_char_list = ['일','월','화','수','목','금','토'];
        const rv_year = (rv_last_edit.getFullYear())+'년 ';
        const rv_month = (rv_last_edit.getMonth()+1)+'월 ';
        const rv_date = (rv_last_edit.getDate())+'일 (';
        const rv_day = day_char_list[parseInt(rv_last_edit.getDay())];
        const rv_hour = ') '+addZero(rv_last_edit.getHours());
        const rv_minute =':'+addZero(rv_last_edit.getMinutes());
        const rv_last_time = rv_year+rv_month+rv_date+rv_day+rv_hour+rv_minute; // 날짜 문자열 표시
        rv_last_link_text = 'https://librewiki.net/index.php?title='+a_title+'&diff=prev&oldid='+rv_status.revid;
        $status_info.html('<small>'+rv_status.user+'에 의해 '+rv_last_time+'에 <a href="'+rv_last_link_text+'"> 마지막으로 편집됨</small>').css({'text-align':'right'});
 
}
}
);
</syntaxhighlight>
{{숨김 끝}}
 
=== 커스텀 문자입력셋 ===
편집창 아래에 문자 입력셋을 만들어줍니다. 사용할 때에는 아래 스크립트를 [[특수:내사용자문서/common.js]]에 저장하거나 자신의 사용자 문서에 적절한 하위 문서를 만든 뒤 [[특수:내사용자문서/common.js]]에 아래와 같은 코드를 입력하시면 됩니다.
<syntaxhighlight lang="javascript">
// 편집창 아래 커스텀 문자입력셋
mw.loader.load('//librewiki.net/index.php?title=(스크립트 저장한 파일명)&action=raw&ctype=text/javascript');
</syntaxhighlight>
 
{{{icon|[[파일:Ambox warning pn.svg|25px]]}}} syntaxhighlight 태그 간섭에 의해 문서가 깨지는 것을 방지하기 위해 스크립트 내부의 </syntaxhighlight> 태그의 / 앞부분에 \ 기호를 첨가해서 대체했습니다. 실제 사용하실 때에는 / 앞에 \ 기호를 지우시면 됩니다.
{{숨김 시작|title=사용자 커스텀 문자입력셋|bg=#eee}}
<syntaxhighlight lang="javascript">
/**
* 원본 [[mw:User:Alex Smotrov/edittools.js]], 수정본 리브레 위키 이용자 Cerulean, Utolee90
*
* Configuration (to be set from [[Special:MyPage/common.js]]):
*  window.charinsertCustom – Object. Merged into the default charinsert list. For example, setting
*      this to { Symbols: '‽' } will add the interrobang to the end of the Symbols section.
*  window.editToolsRecall – Boolean. Set true to create a recall switch.
*  window.charinsertDontMove – Boolean. Set true to leave the box in its default position, rather
*      than moving it above the edit summary.
*  window.updateEditTools() – Function. Call after updating window.charinsertCustom to regenerate the
*      EditTools window.
*/
/* global jQuery, mw, charinsertCustom */
 
/*window.updateEditTools = function () {
};*/
 
jQuery( document ).ready( function ( $ ) {
var $currentFocused, editTools;
function getSelectedSection() {
var selectedSection = mw.storage.get( editTools.storageKey )
|| mw.storage.session.get( editTools.storageKey );
return selectedSection;
}
function saveSelectedSection( newIndex ) {
mw.storage.set( editTools.storageKey, newIndex )
|| mw.storage.session.set( editTools.storageKey, newIndex );
}
editTools = {
                // 각 심볼은 '카테고리 이름' : '문자셋 이름', 형태로 작성합니다. 자바스크립트 오브젝트 형식으로 처리하므로 반드시 카테고리 이름, 문자셋 이름 앞뒤로 따옴표를 추가하고, 맨 뒤에는 반점(,)으로 구분하셔야 합니다.
                // 카테고리를 구별할 때에는 문자셋 이름 부분에 (카테고리명): 기호를 추가합니다.
                // 심볼을 구분할 때에는 띄어쓰기를 이용하며, 같은 심볼 안에서 공백을 입력할 때에는 온점 .을 이용합니다. 단 =기호 이후에는 .을 입력하면 온점이 입력되는 현상이 있어 공백을 삽입할 때 _기호를 사용합니다.
                // 버튼 형태로 심볼을 분리할 때에는 _기호를 사용하면 됩니다.
                // + 기호를 입력하면 심볼을 입력할 때 커서가 위치하는 지점을 지정할 수 있습니다.
                // 줄넘김을 표현할 때에는 \n을 삽입합니다. 반드시 뒤에 공백을 띄워줘야 제대로 작동합니다.
                // 정규표현식으로 처리하므로 중괄호 여는 기호 {나 대괄호 여는 기호 [를 입력하기 위해서는 앞에 \ 기호를 써서 \{, \[라고 사용해야 합니다. 닫을 때에는 알아서 처리하므로 \ 기호를 삽입할 필요는 없습니다.
                // 예시 : 다른 뜻 틀 삽입 => \{\{다른.뜻|+}}
// 기호 앞에 ␥ (U+2425 SYMBOL FOR DELETE FORM TWO)이 붙어있으면 메인 이름공간(0번)에서는 표시되지 않습니다.
                // 이 오브젝트 안에 '카테고리 이름' : '문자셋 이름' 형태로 작성하면 됩니다.
charinsert: {
'기본': '괄호: (+) [+] {+} 〔+〕 〈+〉 【+】 \n 위키텍스트: \{{크기||+}} [\[+]] {\{+}} <!--.+.--> /*.+.*/ [\[분류:+]] [\[파일:+]] <del>+</del> <br /> {\{-}} {\{각주}} <ref>+</ref> {\{lang||+}} {\{llang||+}} __TOC__ {\{PAGENAME}} {\{삭제|+}} {\{유튜브|+}} {\{퍼온문서|문서=+|판=_|일부=_}} {\{번역된.문서|en|+||}} {\{string|+}} &nbsp; {\{배지|+}}',
'틀' : '{\{\{+}}} {\{\{+|}}} <onlyinclude>+</onlyinclude> <includeonly>+</includeonly> <noinclude>+</noinclude>  {\{풀기:+}} \n 파서함수: {\{#expr:+}} {\{#if:+}} {\{#ifeq:+}} {\{#iferror:+}} {\{#ifexist:+}} {\{#switch:+}} {\{#time:+}} {\{#titlepart:+}} {\{#invoke:+|}}',
'HTML 태그': '<div>+</div> <div.id="".class="">+</div> <span>+</span> <span.id="".class="">+</span> <code>+</code> <pre>+</pre> <syntaxhighlight.lang="console">\n+\n<\/syntaxhighlight> <ref.name="+"_/>',
'기호': '~ | ¡¿†‡↔↑↓•¶#∞  〈+〉 《+》  ‘+’ “+” ‹+› «+»  ¤₳฿₵¢₡₢$₫₯€₠₣ƒ₴₭₤ℳ₥₦№₧₰£៛₨₪৳₮₩¥  ♠♣♥♦  ♭♯♮  ©®™ ◌',
'로마자': 'A a Á á À à  â Ä ä Ǎ ǎ Ă ă Ā ā à ã Å å Ą ą Æ æ Ǣ ǣ  B b  C c Ć ć Ċ ċ Ĉ ĉ Č č Ç ç  D d Ď ď Đ đ Ḍ ḍ Ð ð  E e É é È è Ė ė Ê ê Ë ë Ě ě Ĕ ĕ Ē ē Ẽ ẽ Ę ę Ẹ ẹ Ɛ ɛ Ǝ ǝ Ə ə  F f  G g Ġ ġ Ĝ ĝ Ğ ğ Ģ ģ  H h Ĥ ĥ Ħ ħ Ḥ ḥ  I i İ ı Í í Ì ì Î î Ï ï Ǐ ǐ Ĭ ĭ Ī ī Ĩ ĩ Į į Ị ị  J j Ĵ ĵ  K k Ķ ķ  L l Ĺ ĺ Ŀ ŀ Ľ ľ Ļ ļ Ł ł Ḷ ḷ Ḹ ḹ  M m Ṃ ṃ  N n Ń ń Ň ň Ñ ñ Ņ ņ Ṇ ṇ Ŋ ŋ  O o Ó ó Ò ò Ô ô Ö ö Ǒ ǒ Ŏ ŏ Ō ō Õ õ Ǫ ǫ Ọ ọ Ő ő Ø ø Œ œ  Ɔ ɔ  P p  Q q  R r Ŕ ŕ Ř ř Ŗ ŗ Ṛ ṛ Ṝ ṝ  S s Ś ś Ŝ ŝ Š š Ş ş Ș ș Ṣ ṣ ß  T t Ť ť Ţ ţ Ț ț Ṭ ṭ Þ þ  U u Ú ú Ù ù Û û Ü ü Ǔ ǔ Ŭ ŭ Ū ū Ũ ũ Ů ů Ų ų Ụ ụ Ű ű Ǘ ǘ Ǜ ǜ Ǚ ǚ Ǖ ǖ  V v  W w Ŵ ŵ  X x  Y y Ý ý Ŷ ŷ Ÿ ÿ Ỹ ỹ Ȳ ȳ  Z z Ź ź Ż ż Ž ž  ß Ð ð Þ þ Ŋ ŋ Ə ə',
'그리스 문자': 'ΆάΈέΉήΊίΌόΎύΏώ  ΑαΒβΓγΔδ  ΕεΖζΗηΘθ  ΙιΚκΛλΜμ  ΝνΞξΟοΠπ  ΡρΣσςΤτΥυ  ΦφΧχΨψΩω Ϝϝυ̯ι̯  ᾼᾳᾴᾺὰᾲᾶᾷἈἀᾈᾀἉἁᾉᾁἌἄᾌᾄἊἂᾊᾂἎἆᾎᾆἍἅᾍᾅἋἃᾋᾃἏἇᾏᾇ  ῈὲἘἐἙἑἜἔἚἒἝἕἛἓ  ῌῃῄῊὴῂῆῇἨἠᾘᾐἩἡᾙᾑἬἤᾜᾔἪἢᾚᾒἮἦᾞᾖἭἥᾝᾕἫἣᾛᾓἯἧᾟᾗ  ῚὶῖἸἰἹἱἼἴἺἲἾἶἽἵἻἳἿἷΪϊΐῒῗ  ῸὸὈὀὉὁὌὄὊὂὍὅὋὃ  ῤῬῥ  ῪὺῦὐὙὑὔὒὖὝὕὛὓὟὗΫϋΰῢῧ  ῼῳῴῺὼῲῶῷὨὠᾨᾠὩὡᾩᾡὬὤᾬᾤὪὢᾪᾢὮὦᾮᾦὭὥᾭᾥὫὣᾫᾣὯὧᾯᾧ ᾹᾱᾸᾰῙῑῘῐῩῡῨῠ {{lang|el|+}} {{lang|grc|+}}',
'키릴 문자': 'АаБбВвГг  ҐґЃѓДдЂђ  ЕеЁёЄєЖж  ЗзЅѕИиІі  ЇїЙйЈјКк  ЌќЛлЉљМм  НнЊњОоПп  РрСсТтЋћ  УуЎўФфХх  ЦцЧчЏџШш  ЩщЪъЫыЬь  ЭэЮюЯя ӘәӨөҒғҖҗ ҚқҜҝҢңҮү ҰұҲҳҸҹҺһ  ҔҕӢӣӮӯҘҙ  ҠҡҤҥҪҫӐӑ  ӒӓӔӕӖӗӰӱ  ӲӳӸӹӀ  ҞҟҦҧҨҩҬҭ  ҴҵҶҷҼҽҾҿ  ӁӂӃӄӇӈӋӌ  ӚӛӜӝӞӟӠӡ  ӤӥӦӧӪӫӴӵ  ́',
'IPA (영어)': 'ˈ ˌ  ŋ ɡ tʃ dʒ ʃ ʒ θ ð ʔ  ɑː ɒ æ aɪ aʊ ɛ eɪ ɪ iː ɔː ɔɪ oʊ ʊ uː ʌ ɜr  ə ər ᵻ ᵿ ɒ̃ æ̃  {\{angle.bracket|+}} {\{IPA|+}} {\{IPA.링크|+}}',
'IPA': '닿소리: ɱɳɲŋɴ : t̪ d̪ ʈɖɟɡɢʡʔ : ɸβθð  ʃʒʂʐɕʑ  çʝɣχʁ  ħʕʜʢɦɧ : ʋɹɻɥɰʍ : ʙⱱɾɽʀ  ɺ  ɫɬɮɭʎʟ : ɓɗᶑʄɠʛ  ʘǀǃǂǁ \n 홀소리: ɪʏɨʉɯʊ : øɘɵɤ  ə ɚ  ɛœɜɝɞʌɔ : æɶɐɑɒ  \n Spacing_diacritics: ˈˌːˑʼˀˤᵝᵊᶢˠʰʱʲˡⁿᵑʷᶣ˞‿˕˔  \n Combining_diacritics: ̚ ̪ ̺ ̻ ̼ ̬  ̊ ̥ ̞ ̝ ̘ ̙ ̽ ̟ ̠  ̈ ̤ ̹ ̜ ̍ ̩  ̆ ̯  ̃ ̰ ͡ ͜  \n 성조:  ̋  ́  ̄  ̀  ̏  ̌  ̂ ᷄ ᷅ ᷇ ᷆ ᷈ ᷉  ˥˦˧˨˩ꜛꜜ : ↗↘‖  \n extIPA: ͈ ͉ ͎ ̣ ̫ ͊ ᷽ ͇ : ˭ᵻᵿ  {\{angle.bracket|+}} {\{IPA|+}} {\{IPA.링크|+}}',
'수학·논리학': '− × ÷ ⋅ ° ∗ ∘ ± ∓ ≤ ≥ ≠ ≡ ≅ ≜ ≝ ≐ ≃ ≈ ⊕ ⊗ ⇐ ⇔ ⇒ ∞ ← ↔ → ≪ ≫ ∝ √ ∤ ≀ ◅ ▻ ⋉ ⋊ ⋈ ∴ ∵ ↦ ¬ ∧ ∨ ⊻ ∀ ∃ ∈ ∉ ∋ ⊆ ⊈ ⊊ ⊂ ⊄ ⊇ ⊉ ⊋ ⊃ ⊅ ∪ ∩ ∑ ∏ ∐ ′ ∫ ∬ ∭ ∮ ∇ ∂ ∆ ∅ ℂ ℍ ℕ ℙ ℚ ℝ ℤ ℵ ⌊ ⌋ ⌈ ⌉ ⊤ ⊥ ⊢ ⊣ ⊧ □ ∠ ⟨ ⟩ <math>+</math>  \{\{첨자|위=+|아래=}} '
},
        // 문자열 나누는 기호
        charinsertDivider: "\240",
        storageKey: 'edittoolscharsubset',
        createEditTools: function ( placeholder ) {
            var sel, id;
            var box = document.createElement( 'div' );
            var prevSubset = 0, curSubset = 0;
            box.id = 'editpage-specialchars';
            box.className = "nopopups";
            // 문자 선택시 나타나는 제목 이름
            box.title = '편집 창에 입력할 글자 혹은 태그를 클릭하세요';
            // append user-defined sets
            if ( window.charinsertCustom ) {
                for ( id in charinsertCustom ) {
                    if ( !editTools.charinsert[id] ) {
                        editTools.charinsert[id] = '';
                    }
                }
            }
            // 문자셋 드랍다운 메뉴를 만듭니다.
            sel = document.createElement( 'select' );
            for ( id in editTools.charinsert ) {
                sel.options[sel.options.length] = new Option( id, id );
            }
            sel.selectedIndex = 0;
            sel.style.marginRight = '.3em';
            // 입력상자 타이틀
            sel.title = 'Choose character subset';
            sel.onchange = sel.onkeyup = selectSubset;
            box.appendChild( sel );
            // create "recall" switch
            if ( window.editToolsRecall ) {
                var recall = document.createElement( 'span' );
                recall.appendChild( document.createTextNode( '↕' ) ); // ↔
                recall.onclick = function() {
                    sel.selectedIndex = prevSubset;
                    selectSubset();
                };
                recall.style.cssFloat = 'left';
                recall.style.marginRight = '5px';
                recall.style.cursor = 'pointer';
                box.appendChild( recall );
            }
if ( getSelectedSection() ) {
sel.selectedIndex = getSelectedSection();
}
            placeholder.parentNode.replaceChild( box, placeholder );
            selectSubset();
            return;
            function selectSubset() {
                // remember previous (for "recall" button)
                prevSubset = curSubset;
                curSubset = sel.selectedIndex;
                //save into web storage for persistence
                saveSelectedSection( curSubset );
               
                //hide other subsets
                var pp = box.getElementsByTagName( 'p' ) ;
                for ( var i = 0; i < pp.length; i++ ) {
                    pp[i].style.display = 'none';
                }
                //show/create current subset
                var id = sel.options[curSubset].value;
                var p = document.getElementById( id );
                if ( !p ) {
                    p = document.createElement( 'p' );
                    p.className = 'nowraplinks';
                    p.id = id;
                    if ( id == 'Arabic' || id == 'Hebrew' ) {
                        p.style.fontSize = '120%';
                        p.dir = 'rtl';
                    }
                    var tokens = editTools.charinsert[id];
                    if ( window.charinsertCustom && charinsertCustom[id] ) {
                        if ( tokens.length > 0 ) {
                            tokens += ' ';
                        }
                        tokens += charinsertCustom[id];
                    }
                    editTools.createTokens( p, tokens );
                    box.appendChild( p );
                }
                p.style.display = 'inline';
            }
        },
        createTokens: function ( paragraph, str ) {
            var tokens = str.split( ' ' ), token, i, n;
            for ( i = 0; i < tokens.length; i++ ) {
                token = tokens[i];
                n = token.indexOf( '+' );
                if ( token.charAt( 0 ) === '␥' ) {
                    if ( token.length > 1 && mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
                        continue;
                    } else {
                        token = token.substring( 1 );
                    }
                }
                if ( token === '' || token === '_' ) {
                    addText( editTools.charinsertDivider + ' ' );
                } else if ( token === '\n' ) {
                    paragraph.appendChild( document.createElement( 'br' ) );
                } else if ( token === '___' ) {
                    paragraph.appendChild( document.createElement( 'hr' ) );
                } else if ( token.charAt( token.length-1 ) === ':' ) { // : at the end means just text
                    addBold( token );
                } else if ( n === 0 ) { // +<tag>  ->  <tag>+</tag>
                    addLink( token.substring( 1 ), '</' + token.substring( 2 ), token.substring( 1 ) );
                } else if ( n > 0 ) { // <tag>+</tag>
                    addLink( token.substring( 0, n ), token.substring( n+1 ) );
                } else if ( token.length > 2 && token.charCodeAt( 0 ) > 127 ) { // a string of insertable characters
                    for ( var j = 0; j < token.length; j++ ) {
                        addLink( token.charAt( j ), '' );
                    }
                } else {
                    addLink( token, '' );
                }
            }
            return;
            function addLink( tagOpen, tagClose, name ) {
                var handler;
                var dle = tagOpen.indexOf( '\x10' );
                var a = document.createElement( 'a' );
               
                if ( dle > 0 ) {
                    var path = tagOpen.substring( dle + 1 ).split( '.' );
                    tagOpen = tagOpen.substring( 0, dle );
                    handler = window;
                    for ( var i = 0; i < path.length; i++ ) {
                        handler = handler[path[i]];
                    }
                $( a ).on( 'click', handler );
                } else {
                    tagOpen = tagOpen.replace( /\./g,' ' );
                    tagClose = tagClose ? tagClose.replace( /_/g,' ' ) : '';
                    $( a ).on( 'click', {
                    tagOpen: tagOpen,
                    sampleText: '',
                    tagClose: tagClose
                    }, insertTags );
                }
                name = name || tagOpen + tagClose;
                name = name.replace( /\\n/g,'' );
                a.appendChild( document.createTextNode( name ) );
                a.href = '';
                paragraph.appendChild( a );
                addText( ' ' );
            }
            function addBold( text ) {
                var b = document.createElement( 'b' );
                b.appendChild( document.createTextNode( text.replace( /_/g,' ' ) ) );
                paragraph.appendChild( b );
                addText( ' ' );
            }
            function addText( txt ) {
                paragraph.appendChild( document.createTextNode( txt ) );
            }
            function insertTags( e ) {
            e.preventDefault();
            if ( $currentFocused && $currentFocused.length && !$currentFocused.prop( 'readonly' ) ) {
$currentFocused.textSelection(
'encapsulateSelection', {
pre: e.data.tagOpen,
peri: e.data.sampleText,
post: e.data.tagClose
}
);
}
            }
        },
        setup: function () {
            var placeholder;
            if ( $( '#editpage-specialchars' ).length ) {
                placeholder = $( '#editpage-specialchars' )[0];
            } else {
                placeholder = $( '<div id="editpage-specialchars"> </div>' ).prependTo( '.mw-editTools' )[0];
            }
            if ( !placeholder ) {
                return;
            }
            if ( !window.charinsertDontMove ) {
                $( '.editOptions' ).before( placeholder );
            }
            // Find the element that is focused
            $currentFocused = $( '#wpTextbox1' );
            // Apply to dynamically created textboxes as well as normal ones
$( document ).on( 'focus', 'textarea, input:text', function () {
$currentFocused = $( this );
} );
// Used to determine where to insert tags
            editTools.createEditTools( placeholder );
            window.updateEditTools = function () {
                editTools.createEditTools( $( '#editpage-specialchars' )[0] );
            };
        }
    }; // end editTools
    editTools.setup();
} );
</syntaxhighlight>
이 소스에 디자인을 추가하려면 다음과 같은 소스를 [[특수:내사용자문서/common.css]]에 추가하시면 됩니다.
<syntaxhighlight lang="css">
/* 참조: 사용자:Cerulean/EditTools.css */
/* 사용자 소스 추가 영역 */
div#editpage-specialchars {
display: block;
padding: .5em 1em;
}
/* 선택상자, 버튼 공통 디자인 */
#editpage-specialchars a, #editpage-specialchars select {
border: 1px solid #ddd;
background-color: #f9f9f9;
padding: 4px 8px;
border-radius: 20px;
}
/* 버튼 디자인 */
#editpage-specialchars a {
display: inline-block;
margin-top: 4px;
}
/* 선택상자 디자인 */
#editpage-specialchars select {
width:100%;
margin-right: 0.3em;
    appearance: none;
}
}
</syntaxhighlight>
</syntaxhighlight>
{{숨김 끝}}
=== 리버티 스킨용 브레드크럼 ===
원래 Libre 스킨용으로 제작된 브레드크럼(최근 읽은 문서 목록)은(참조: [[미디어위키:Gadget-BreadCrumb.js]]) 리버티 스킨용으로 지원하지 않습니다. 따라서 리버티 스킨용으로 브레드크럼을 사용하기 위해서는 [[특수:내사용자문서/liberty.js]]에 아래와 같은 소스를 입력하시면 됩니다. 사이트 공지 상자 아래, 상단 광고 위에 목록이 삽입됩니다. 참고로 원 소스와는 다르게 최근 10개 문서만 저장하며, 중복으로 문서명이 나타나지 않습니다.
<syntaxhighlight lang="javascript">
// 리버티 스킨용 브레드크럼
mw.loader.load('//librewiki.net/index.php?title=사용자:Utolee90/BreadCrumb.js&action=raw&ctype=text/javascript');
</syntaxhighlight>
원 소스를 활용하고 싶으시면 아래 소스를 이용하시면 됩니다.
{{숨김 시작|title= 리버티 스킨용 브레드크럼|bg=#eee}}
<syntaxhighlight lang="javascript">
/*
* written By. LiteHell and modified by Utolee90
* Warning : This script uses localStorage of your browser so BREADCUMB WILL BE DELETED IF YOU CLEAR STORAGE DATA FROM YOUR BROWSER.
*/
if (mw.config.exists("wgIsArticle") && mw.config.exists("wgPageName") && mw.config.exists("wgArticlePath")) {
    var conf = mw.config.get(["wgIsArticle", "wgPageName", "wgArticlePath"]);
    if (conf.wgIsArticle) {
        var itemName = "pageBreadcumbs";
        function initStorageIfRequired() {
            if (localStorage.getItem(itemName) == null)
                localStorage.setItem(itemName, "[]");
        }
        function setStorage(value) {
            initStorageIfRequired();
            localStorage.setItem(itemName, JSON.stringify(value.slice(-20)));
        }
        function getStorage() {
            initStorageIfRequired();
            return JSON.parse(localStorage.getItem(itemName));
        }
        function makeBreadBar(arr, active) {
            var ol = document.createElement("ol");
            ol.className = "breadcrumb";
            ol.style.display = "inline-block"; // 내용에 따라 높이 자동조절할 수 있게 속성 부여
            ol.innerHTML = '<li id="cleanBreads"><a href="javascript:(function(){})();" style="color: red;"><span class="fa fa-trash"></span></a></li>';
            ol.querySelector('li#cleanBreads > a').addEventListener("click", function() {
                if (confirm("진짜로 빵가루를 전부다 청소할까요?")) {
                    localStorage.setItem(itemName, "[]");
                    alert('강제 새로고침하면 지워져 있을겁니다. :)');
                }
            });
            // 최근 10개만 역순으로 제작. 중복이 있으면 제외
            var limitCnt = 10;
            var newArr = [];
            var j = 0;
            while (newArr.length < Math.min(limitCnt, arr.length) && j<=arr.length-1) {
                if (newArr.indexOf(arr[arr.length-1-j]) ==-1) {
                    newArr.push(arr[arr.length-1-j]); 
                }
                j++;
            }
            for (var i = 0; i < newArr.length; i++) {
                var now = newArr[i];
                var li = document.createElement("li");
                if (now == active) {
                    li.className = "active";
                    li.textContent = now;
                } else {
                    var anchor = document.createElement("a");
                    anchor.href = conf.wgArticlePath.replace('$1', now);
                    anchor.title = now;
                    anchor.textContent = now;
                    li.appendChild(anchor);
                }
                ol.appendChild(li);
            }
            return ol;
        }
   
   
        var articles = getStorage();
        if(articles.length == 0 || (articles.length != 0 && articles[articles.length - 1] != conf.wgPageName)) articles.push(conf.wgPageName);
        setStorage(articles, conf.wgPageName);
        var breadbar = makeBreadBar(articles, conf.wgPageName);
        var headerAds = document.querySelector(".header-ads");
        headerAds.parentNode.insertBefore(breadbar, headerAds); // 광고 위에 삽입하기
    }
}
</syntaxhighlight>
{{숨김 끝}}
=== 리버티 스킨용 사용자 정의 내비게이션 바 ===
리버티 스킨에서 기존의 아이콘을 제거하거나 새로운 아이콘을 추가할 수 있습니다. 아래 스크립트는 드롭다운 메뉴나 내비게이션 바의 링크만 추가할 수 있으며, 드롭다운 메뉴 자체를 추가하는 기능은 추후 작성할 예정입니다.
{{{icon|[[파일:Ambox warning pn.svg|25px]]}}} 이 스크립트는 현재 고정된 URL만 정의할 수 있습니다. 랜덤 한자 문서처럼 URL이 랜덤으로 변동하는 것을 지원하려면 스크립트를 별도로 작성하셔야 합니다. [[사:하늘/custom-navbar.js]] 파일을 참조하시면 됩니다.
이 스크립트를 실행시키기 위해서는 JSON 파일이 필요합니다. 우선 [[특수:내사용자문서/custom-navbar-data.json]] 파일을 아래와 같은 형식으로 작성합니다. JSON 파일이기에 주석은 사용할 수 없다는 점에 유의해주세요.
{{숨김 시작|title= 리버티 스킨용 사용자 정의 내비게이션 바 JSON 데이터 파일 예시|bg=#eee}}
<syntaxhighlight lang="json">
{
  "explanation" : {
    "addList 양식" : "[(font-awesome 아이콘 클래스명), (표시될 링크 이름), (링크 주소), (링크 타이틀-title) ]",
    "dropList" : "기존에 있는 삭제할 링크 목록",
    "addList" : "추가할 메뉴 목록",
    "addDropdown": "추가할 드랍다운 메뉴 목록 (현재 미지원)"
  },
  "dropList": ["map", "menuWatch"],
  "addList": {
      "user" : [
        ["fa-star", " 공작실 ", "/wiki/사용자:Utolee90/공작실", "내 작업물"],
        ["fa-font", " 영한사전 ", "/wiki/시리즈:모두의 영한사전", ""]
      ],
    "board": [
        ["fa-globe", " 큰숲백과 ", "https://bigforest.miraheze.org/", "큰숲백과"]
    ],
    "tools": [],
    "help": [
        ["fa-code", "사용자 JS", "/wiki/도움말:사용자 자바스크립트", "사용자 자바스크립트 도움말"],
        ["fa-code", "사용자 CSS", "/wiki/도움말:사용자 CSS", "사용자 CSS 도움말"]
    ],
    "new": [
      ["fa-file", "큰숲백과 문서", "/wiki/큰숲백과", "큰숲백과 문서"]
    ]
  },
  "addDropdown": {
      "head": [],
      "navList": []
  }
}
</syntaxhighlight>
{{숨김 끝}}
다음에 아래 코드를 [[특수:내사용자문서/liberty.js]]에 집어넣으면 작동이 완료됩니다.
<syntaxhighlight lang="javascript">
/* 리버티 스킨 네비게이션 사용자 아이콘 */
mw.loader.load('//librewiki.net/index.php?title=사용자:Utolee90/custom-navbar.js&action=raw&ctype=text/javascript');
</syntaxhighlight>
아래는 이 스크립트의 원본입니다.
{{숨김 시작|title= 리버티 스킨용 사용자 정의 내비게이션 바 자바스크립트 부분|bg=#eee}}
<syntaxhighlight lang="javascript">
// 원본 : 사용자:하늘/custom-navbar.js, 수정 : 사용자:Utolee90
// custom-navbar-data 불러오기 -> navBarData 형식으로 값이 호출됨.
var dataPageName = "User:" + mw.config.get().wgUserName + "/custom-navbar-data.json"; // custom-navbar-data 파일이름
// json 파일 RAW 데이터를 얻기 위해서 필요
function getRaw(title) {
    var raw;
    $.ajax({
        async: false,
        url: location.origin + mw.util.getUrl(title || mw.title, { action: 'raw' }),
        success: function (data) { raw = data; }
    });
    return raw;
}
// 아이템 추가
var libreNavLogin = {};
// json 파일 파싱
libreNavLogin.navBarData = JSON.parse(getRaw(dataPageName));
// 제거할 메뉴 : 메뉴 타이틀명
libreNavLogin.titleMap2 = {
    "RC": "위키의 최근 바뀐 목록 [alt-shift-r]",  // 최근 바뀜 메뉴
    "random": "무작위로 선택된 문서 불러오기 [alt-shift-x]", // 임의 문서 메뉴
    "map": "https://maps.librewiki.net/", // 리브레 맵스 메뉴
    "board": "게시판", // 게시판 메뉴(드롭다운)
    "wikiBoard": "https://bbs.librewiki.net/", // 위키 게시판(하위 링크)
    "freeBoard": "https://bbs.librewiki.net/freeboard", //자유 게시판(하위 링크)
    "tools": "도구", // 도구(드롭다운)
    "special": "특수:특수문서", // 특수문서(하위링크)
    "upload": "특수:올리기", // 업로드(하위 링크)
    "help": "도움말", // 도움말(드롭다운)
    "summary": "리브레_위키:도움말", // 위키 도움말(하위 링크)
    "syntax": "도움말:위키_문법", // 위키 문법(하위 링크)
    "Tex": "도움말:TeX_문법", // TeX 문법(하위 링크)
    "menuMy": "내 사용자 문서 [alt-shift-.]", // 내 사용자 문서
    "menuEcho": "당신의 알림", // 알림 (사용자 메뉴)
    "menuContribution": "내 기여 목록 [alt-shift-y]", // 내 기여 목록
    "menuTalk": "내 토론 문서 [alt-shift-n]", // 내 토론 문서
    "menuWatch": "주시문서에 대한 바뀜 목록 [alt-shift-l]", // 주시문서 목록
    "menuSettings": "사용자 환경 설정", // 환경 설정
};
// 아이템 생성 방법
libreNavLogin.createItem = function(icon, title, url, desc, isMenu=false) {
  var a = document.createElement('a'); // 링크 추가
  var iconHTML = document.createElement('span'); // icon 추가
  iconHTML.className = "fa "+icon;
  iconHTML.style.color = isMenu? 'inherit' :'#373a3c'; // 색상 변경
  iconHTML.style.fontSize = isMenu? 'inherit' : '0.9em'; // 사이즈 변경
  iconHTML.style.padding = '0.2em 0'; // 아이콘 여백 조정
  a.className = isMenu? "nav-link" : "dropdown-item",
    a.href = url,
    a.innerHTML = isMenu? '<span class="hide-title">'+title+'</span>':title,
    a.title = desc;
  // icon이 빈 값이 아닐 때 아이콘 추가
  if (icon != '' && icon !=undefined) {
    a.prepend(iconHTML);
  }
  return a;
};
// 신규 아이콘 추가 함수
libreNavLogin.addMenuItem = function(icon, name, url, desc, part) {
  var node = this.createItem(icon, name, url, desc, part === 'new'); // 아이템 생성
  switch(part) {
    case 'user' : { // 사용자 메뉴
      document.getElementsByClassName('dropdown-divider')[0].before(node);
      break;
    }
    case 'board': { // 게시판
        document.querySelector('.navbar-fixed-top a.nav-link[title="게시판"]').nextElementSibling.appendChild(node)
        break;
    }
    case 'tools': { // 도구
      document.querySelector('.navbar-fixed-top a.nav-link[title="도구"]').nextElementSibling.appendChild(node)
      break;
    }
    case 'help': { // 도움말
      document.querySelector('.navbar-fixed-top a.nav-link[title="도움말"]').nextElementSibling.appendChild(node)
      break;
    }
    case 'new': { // 신규 메뉴
      var menuLi = document.createElement('li');
      menuLi.classList.add('nav-item');
      menuLi.appendChild(node);
      document.querySelector('.navbar-fixed-top ul.navbar-nav').appendChild(menuLi);
      break;
    }
    case 'dropdown': { // 신규 드롭다운. 지원 예정.
    }
  }
};
// 기존 아이콘 제거 함수
libreNavLogin.removeItem = function(name) {
  var Selector = '.navbar-fixed-top a[title="' + name + '"]'; // 타이틀 이름을 가진 링크. 사이드이펙트 방지를 위해 navbar-fixed-top 속성 추가.
  document.querySelector(Selector).remove();
};
// 아이템 설정.
libreNavLogin.setNavItems = function() {
// 메뉴 추가 - navBarData.addList 오브젝트 사용
  for (typical in this.navBarData.addList) {
        for (const item of this.navBarData.addList[typical]) {
            this.addMenuItem(item[0], item[1], item[2], item[3], typical);
        }
  }
  // 기존에 있는 메뉴 제거하는 과정
  for (const key in this.titleMap2) { // titleMap2에서 key값 추출
    if (this.navBarData.dropList.indexOf(key)>-1) {
        this.removeItem(this.titleMap2[key]);
    }
  }
  // 메뉴 앞의 알림버튼 지우기 여부
  if (this.navBarData.dropList.indexOf('echo')>-1) {
      document.querySelector('#pt-notifications-notice').remove();
  }
  // 로그아웃 버튼 지우기 여부
  if(this.navBarData.dropList.indexOf('logout')>-1) {
    document.querySelector('.hide-logout.logout-btn').remove();
  }
};
// 아이템 세팅 완료
libreNavLogin.setNavItems();
</syntaxhighlight>
{{숨김 끝}}
=== 다크 모드에서 글씨 색을 바꾸는 스크립트 추가 ===
자바스크립트를 이용해서 태그 안에 특정한 클래스가 있을 때 클래스를 인식해서 다크모드에서 글자 색을 변환할 수 있습니다. 즉각적으로 반응하는 방식이 아닌 페이지 로딩 후 약간의 딜레이를 준 뒤에 바꾸는 방식이라는 점에 유의해주세요.
아래 소스를 [[특수:내사용자문서/liberty.js]]에 입력하시면 사용하실 수 있습니다.
<syntaxhighlight lang="javascript">
// 다크 모드일 때 특정 클래스 안의 글자에 한해 다크모드에서 색상 전환시키는 코드. setTimeOut을 주는 이유는 바로 liberty-dark 속성이 서버에서 바뀌지 않기 때문이다.
setTimeout(function(){
if (mw.user.options.values['liberty-dark'] === 'dark' || window.matchMedia("(prefers-color-scheme:dark)").matches) {
    mw.loader.load('//librewiki.net/index.php?title=사용자:Utolee90/dark-mode-color.js&action=raw&ctype=text/javascript');
}}, 500);
</syntaxhighlight>
이 스크립트에 다음과 같은 방식으로 태그에 클래스명을 주면 다크 모드에서 색상이 변경됩니다. 색상명은 색상코드 6자리(FF0000 등) 또는 색상 이름(red 혹은 rgb(255,0,0) 등)으로 지정하면 됩니다.
{|class="wikitable"
! 클래스명 !! 효과 설명
|-
| class="dark-mode-color-(색상명)" || 글자 색상 변경
|-
| class="dark-mode-bgcolor-(색상명)" || 글자 배경 색상 변경
|-
| class="dark-mode-border-(색상명)" || 태그 테두리 색상 변경
|}
아래는 이 스크립트의 원본입니다.
{{숨김 시작|title= 리버티 스킨용 사용자 정의 내비게이션 바 자바스크립트 부분|bg=#eee}}
<syntaxhighlight lang="javascript">
/* 특정 클래스이름을 된 오브젝트 - 다크 모드일 때 색상 바꾸기*/
  var darkModeObjects = $("span[class*='dark-mode-']")
  for (var i=0; i<darkModeObjects.length; i++) {
      var classListObj = darkModeObjects[i].classList.value.split(" ");
      for (var j=0; j<classListObj.length; j++) {
          // 클래스명이 dark-mode-color-6자리색 또는 dark-mode-color-색상명(영어이름 또는 rgb(*,*,*) 등) -> 다크모드일 때 글씨 색 바꾸기
          if (classListObj[j].indexOf('dark-mode-color-') ===0) {
              var colorName = classListObj[j].slice(16);
              colorName = /([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})/.test(colorName)?"#"+colorName:colorName;
              darkModeObjects[i].style.color= colorName;
          }
          // 클래스명이 dark-mode-bgcolor-6자리색 또는 dark-mode-bgcolor-색상명 -> 다크모드일 때 배경 색 바꾸기
          if (classListObj[j].indexOf('dark-mode-bgcolor-') ===0 ) {
              var bgColorName = classListObj[j].slice(18);
              bgColorName = /([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})/.test(bgColorName)?"#"+bgColorName:bgColorName;
              darkModeObjects[i].style.background= bgColorName;
          }
          if (classListObj[j].indexOf('dark-mode-backgroundcolor-') ===0 ) {
              var bgColorName = classListObj[j].slice(27);
              bgColorName = /([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})/.test(bgColorName)?"#"+bgColorName:bgColorName;
              darkModeObjects[i].style.background= bgColorName;
          }
          // 클래스명이 dark-mode-border-6자리색 또는 dark-mode-border-색상명 -> 다크모드일 때 경계선 색 바꾸기
          if (classListObj[j].indexOf('dark-mode-border-') ===0 ) {
              var borderColorName = classListObj[j].slice(17);
              borderColorName = /([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})/.test(borderColorName)?"#"+borderColorName:borderColorName;
              darkModeObjects[i].style.borderColor= borderColorName;
          }
          if (classListObj[j].indexOf('dark-mode-bordercolor-') ===0 ) {
              var borderColorName = classListObj[j].slice(22);
              borderColorName = /([0-9A-Fa-f]{6}|[0-9A-Fa-f]{3})/.test(borderColorName)?"#"+borderColorName:borderColorName;
              darkModeObjects[i].style.borderColor= borderColorName;
          }
      }
  }
</syntaxhighlight>
{{숨김 끝}}
{{각주}}
{{각주}}
{{리브레 위키 도움말}}
{{리브레 위키 도움말}}
[[분류:도움말]]
[[분류:도움말]]
리브레 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포됩니다(자세한 내용에 대해서는 리브레 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
글이 직접 작성되었거나 호환되는 라이선스인지 확인해주세요. 리그베다 위키, 나무위키, 오리위키, 구스위키, 디시위키 및 CCL 미적용 사이트 등에서 글을 가져오실 때는 본인이 문서의 유일한 기여자여야 하고, 만약 본인이 문서의 유일한 기여자라는 증거가 없다면 그 문서는 불시에 삭제될 수 있습니다.
취소 편집 도움말 (새 창에서 열림)

| () [] [[]] {{}} {{{}}} · <!-- --> · [[분류:]] · [[파일:]] · [[미디어:]] · #넘겨주기 [[]] · {{ㅊ|}} · <onlyinclude></onlyinclude> · <includeonly></includeonly> · <noinclude></noinclude> · <br /> · <ref></ref> · {{각주}} · {|class="wikitable" · |- · rowspan=""| · colspan=""| · |}

이 문서에서 사용한 틀: