Open ID와 Recaptcha가 당분간 지원되지 않습니다. 새 버전의 PHP에서 해당 확장기능이 제대로 작동하지 않습니다. 최대한 빨리 복구해보겠습니다.
도움말:설치
세그멘테이션 폴트
목차 |
확장 기능
reCAPTCHA로 스팸 방지하기
미디어위키용 reCAPTCHA 확장기능을 설치한다. 설치 과정은 어렵지 않고, 한국어 인터페이스가 없어 번역을 했다.
<?php /** * ReCaptcha.i18n.php 파일을 편집하면 된다. */ /** * Internationalisation file for the reCAPTCHA extension. * * @addtogroup Extensions */ function efReCaptchaMessages() { return array( /* English */ 'en' => array( 'recaptcha-edit' => 'To help protect against automated edit spam, please type the two words you see in the box below:', 'recaptcha-addurl' => 'Your edit includes new external links. To help protect against automated spam, please type the two words you see in the box below:', 'recaptcha-badpass' => 'To help protect against automated password cracking, please type the two words you see in the box below:', 'recaptcha-createaccount' => 'To help protect against automated account creation, please type the two words you see in the box below:', 'recaptcha-createaccount-fail' => "Incorrect or missing reCAPTCHA answer.", 'recaptcha-create' => 'To help protect against automated page creation, please type the two words you see in the box below:', ), /* TODO - more languages */ /* Korean 한국어 */ 'ko' => array( 'recaptcha-edit' => '스팸이 자동으로 문서를 편집 못하게 아래 상자에 보이는 두 단어를 입력해주세요.', 'recaptcha-addurl' => '편집한 내용에 외부 링크가 있습니다. 자동화된 스팸을 막도록 아래 상자에 보이는 두 단어를 입력해주세요.', 'recaptcha-badpass' => '자동화된 암호 해킹을 막도록 아래 상자에 보이는 두 단어를 입력해주세요.', 'recaptcha-createaccount' => '자동화된 계정 생성을 막도록 아래 상자에 보이는 두 단어를 입력해주세요.', 'recaptcha-createaccount-fail' => "reCAPTCHA 답변이 틀렸거나 빠졌습니다.", 'recaptcha-create' => '자동화된 페이지 생성을 막도록 아래 상자에 보이는 두 단어를 입력해주세요.', ), ); } ?>
소스코드 문법 하이라이트
프로그래밍을 다룰 때 소스코드 문법 하이라이트가 필요하다. 미디어위키엔 문법 하이라이트 확장기능이 많은데 MediaWiki 홈페이지에서 쓰는 SyntaxHighlight GeSHi를 선택했다. 설명서대로 설치하니까 시간도 얼마 안 걸렸다.
cd extensions svn co http://svn.wikimedia.org/svnroot/mediawiki/trunk/extensions/SyntaxHighlight_GeSHi # change to the directory of the SyntaxHighlight_GeSHi extension cd SyntaxHighlight_GeSHi # check out a current version of GeSHi into a directory called geshi svn co http://geshi.svn.sourceforge.net/svnroot/geshi/branches/RELEASE_1_0_X_STABLE/geshi-1.0.X/src/geshi
쉘에서 위의 명령어를 순서대로 치면 준비 완료!
require_once("$IP/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php");
LocalSettings.php 파일에 위의 코드만 한줄 추가하면 끝!
카테고리에 속한 글을 자동으로 나열하기
이 글 설치를 도움말:목차에 넣으려니 귀찮았다. 새 도움말을 쓸 때마다 목차에 일일이 써넣으려면 인생이 피곤해질 듯 하여 자동화 솔루션을 찾았다. 이 확장기능은 지정한 특수기능:분류에 속한 글을 일목요연하게 정리해 보여준다.
위키간 링크를 지원하는 사이트 편집하기
이 글의 참조자료를 정리하다가 인터위키 링크(위키간 링크)를 알게 됐다. Mediawiki의 위키나 기타 외부 위키에 있는 글을 내 위키의 글처럼 링크를 거는 기능이다. 이렇게 하려면 외부 위키의 주소에 약어를 부여해야 한다. 위키간 링크란 문서에 따르면 MySQL의 interwiki 테이블을 직접 수정해야 한다. 하지만 테이블에 데이터를 바이너리로 저장했다면 이 방법은 부적당하다.
이런 까닭에 새 확장기능을 설치했다. 이 기능을 설치하고 나면 특수기능:인터위키 페이지가 자동으로 생성되고 여기서 외부 위키를 등록할 수 있다.
가젯
확장기능:Widget
가젯을 지원하려면 우선 위젯 확장기능부터 설치한다. 이 확장기능을 설치하면 Youtube, Flickr 등의 위젯까지 설치할 수 있다.
확장기능:Google Gadget
구글 가젯 확장기능을 설치한다. 설치는 쉽고 문제는 구글 가젯을 실제로 가져오는 것이다. 구글 가젯은 소스 코드를 제공하는데 ?url= 뒷부분부터 &synd=open 전까지를 가져와 url 란에 입력한다.
{{#widget:Google Gadget |url=http://www.daylightmap.com/clouds/cloud_gadget.xml&up_remember_location=1&up_show_daylight=1&up_lat=10&up_lon=-20&up_zoom=1&up_type=S&up_msg_dismissed=0 |title=Clouds |width=600 |height=300 }}
확장기능:Google Spreadsheet
{{#widget:Google Spreadsheet |key=pZhZVJ1b08w4M4G_U_omyHA |width=800 |height=200 }}
{{#widget:Google Spreadsheet |key=pZhZVJ1b08w4M4G_U_omyHA |width=800 |height=200 }}
플리커
Flickr 사진을 직접 링크 걸어도 되지만 확장기능을 쓰면 더 편리하다. 무엇보다 주소를 바꾸지 않아도 간편하게 사진의 크기를 바꿀 수 있다.
<flickr>19251444|frame|center|m|김다현</flickr>
틀(Template) 관련
확장기능:ParserFunctions
RTENOTITLE에 설명이 잘 됐지만, 이 확장기능은 위키문법에 if, else 같은 분기문을 추가한다.
확장기능:RandomSelection
이 확장기능은 정해진 문장 중 하나를 무작위로 골라서 출력한다.
<choose> <option weight="2">This option will be shown twice as often as a normal option.</option> <option>By default, options have a weight of 1.</option> <option weight="1.5">This option also has a weight of 1. Fractional portions are ignored.</option> </choose>
구글 통계(Google Analytics)
확장기능:Google Analytics라는 확장기능도 있지만 소스코드에 직접 계정정보를 넣어야 한다. 게다가 자동으로 모든 페이지에 구글 통계가 적용되지 않고 페이지마다 특정 태그를 입력해야 한다. 그런 까닭에 확장기능:Google Analytics Integration를 선택했다.
스킨 파일에 직접 코드를 넣어도 되지만 그러면 업그레이드시 똑같은 작업을 다시 해야 할지 모른다. 그래서 굳이 확장기능을 찾아 쓰는 것이다.
OpenID
확장기능:OpenID를 설치하는 과정은 다른 것보단 까다롭다.
- 확장기능을 다운로드 받아 설치 문서에 나온 위치 $IP/extensions/OpenID에 압축을 푼다.
- 설치 문서대로 MySQL 테이블을 생성한다. 미디어위키용 테이블에 접두사(예. mw_)가 있다면 openid_table.sql 파일을 열어서 테이블 이름을 고친다.
mysql -h yourdbhost -u youradminuser -p yourwikidb < openid_table.sql
- PHP용 OpenID 라이브러리를 다운로드 받아서 $IP/extensions/OpenID/php-openid-2.1.2에 설치한다.
- $IP/.htaccess 파일에 다음과 같이 적는다.
php_value include_path "extensions/OpenID/php-openid-2.1.2/" - $IP/LocalSettings.php 파일에 다음과 같이 적는다.
require_once("$IP/extensions/OpenID/OpenID.setup.php");
- 특수기능:OpenIDLogin에 접속해 OpenID가 제대로 동작하는지 확인한다.
- 특수기능:모든메시지에서 OpenID 메뉴를 한글화하거나 ./extensions/OpenID/OpenID.i18n.php 파일에 다음 코드를 추가한다.
$messages['ko'] = array( 'openid-desc' => '[http://openid.net/ OpenID]로 위키에 로그인하고, 위키의 사용자 계정으로 다른 OpenID 호환 웹 사이트에 로그인하기', 'openidlogin' => 'OpenID로 로그인', 'openidfinish' => 'OpenID 로그인 마치기 ', 'openidserver' => 'OpenID 서버', 'openidxrds' => 'Yadis 파일', 'openidconvert' => 'OpenID 변환기', 'openiderror' => '검증 오류', 'openiderrortext' => 'OpenID URL를 검증하는 중간에 오류가 발생했습니다.', 'openidconfigerror' => 'OpenID 설정 오류 ', 'openidconfigerrortext' => '이 위키의 OpenID 저장소 설정이 유효하지 못합니다. [[특수기능:사용자/관리자]]와 상담해보세요.', 'openidpermission' => 'OpenID 권한 오류 ', 'openidpermissiontext' => '제공하신 OpenID로는 이 서버에 로그인이 허용되지 않습니다.', 'openidcancel' => '검증이 취소됐습니다', 'openidcanceltext' => 'OpenID URL의 검증이 취소됐습니다. ', 'openidfailure' => '검증이 실패했습니다', 'openidfailuretext' => 'OpenID URL의 검증이 실패했습니다. 오류 메시지: "$1" ', 'openidsuccess' => '검증이 성공했습니다', 'openidsuccesstext' => 'OpenID URL의 검증이 성공했습니다. ', 'openidusernameprefix' => 'OpenIDUser', 'openidserverlogininstructions' => '$3에 사용자 $2(사용자 페이지 $1)로 로그인하길 원하면 아래 암호를 입력하세요.', 'openidtrustinstructions' => '$1과 데이터를 공유하길 원한다면 선택하세요.', 'openidallowtrust' => '$1이 이 사용자 계정을 신뢰하도록 허용합니다. ', 'openidnopolicy' => '이 사이트는 사생활 보호 방침을 명시하지 않았습니다. ', 'openidpolicy' => '더 자세히 알고 싶으면 <a target="_new" href="$1">privacy policy</a>를 확인하세요. ', 'openidoptional' => '선택 사항', 'openidrequired' => '필수', 'openidnickname' => '별명', 'openidfullname' => '이름', 'openidemail' => '이메일 주소', 'openidlanguage' => '언어', 'openidnotavailable' => '당신이 원하는 별명 ($1)은 다른 사용자가 씁니다. ', 'openidnotprovided' => '당신의 OpenID 서버는 별명을 제공하지 않습니다 (서버에 기능이 없거나 사용자가 별명을 제공하지 않도록 설정한 겁니다).', 'openidchooseinstructions' => '별명이 있어야 합니다. 아래 보이는 것 중에 하나를 고르면 됩니다.', 'openidchoosefull' => '당신의 이름은 ($1)입니다. ', 'openidchooseurl' => '당신의 OpenID에서 끄집어낸 이름은 ($1)입니다. ', 'openidchooseauto' => '자동생성된 이름은 ($1)입니다. ', 'openidchoosemanual' => '당신이 선택한 이름은:', 'openidchooseexisting' => '위키에 존재하는 계정:', 'openidchoosepassword' => '암호:', 'openidconvertinstructions' => '사용자 계정을 OpenID URL로 바꾸는 폼입니다. ', 'openidconvertsuccess' => '성공리에 OpenID로 변환을 마쳤습니다.', 'openidconvertsuccesstext' => 'OpenID를 $1로 성공리에 변환했습니다. ', 'openidconvertyourstext' => '그건 이미 당신의 OpenID 계정입니다.', 'openidconvertothertext' => '그건 다른 사람의 OpenID입니다.', 'openidalreadyloggedin' => "'''벌써 로그인했습니다, $1!''' 나중에 OpenID로 로그인하길 원하면 [[특수기능:OpenIDConvert|계정을 OpenID로 변환]]하면 됩니다.", 'openidnousername' => '사용자 이름을 명시하지 않았습니다.', 'openidbadusername' => '잘못된 사용자 이름을 명시했습니다. ', 'openidautosubmit' => '이 페이지엔 자바스크립트가 활성화되면 자동으로 제출되는 폼이 있습니다. 자바스크립트가 비활성화됐다면 "계속" 단추를 눌러보세요. ', 'openidclientonlytext' => '이 위키의 계정을 다른 사이트용 OpenID로 사용할 수 없습니다.', 'openidloginlabel' => 'OpenID URL', 'openidlogininstructions' => '{{SITENAME}}는 [http://openid.net/ OpenID] 표준을 지원합니다. OpenID는 각기 다른 암호를 사용하지 않아도 여러 웹 사이트에 로그인하게 해줍니다. ([http://en.wikipedia.org/wiki/OpenID Wikipedia\'s OpenID article]에 자세한 설명이 있습니다.) 만약 {{SITENAME}}용 계정이 있다면 [[특수기능:UserLogin|log in]]에 평소처럼 사용자 이름과 암호를 적으면 됩니다. 나중에 OpenID를 이용하려면 정상적으로 로그인한 후 [[특수기능:OpenIDConvert|계정을 OpenID로 변환]]하면 됩니다. 여러 [http://openid.net/get/ OpenID 제공자]가 있고 다른 서비스에 OpenID 사용가능한 계정이 이미 있을지도 모릅니다.', 'openidupdateuserinfo' => '개인 정보를 갱신하기 ', 'openid-prefs' => 'OpenID', 'openid-prefstext' => '[http://openid.net/ OpenID] 설정 ', 'openid-pref-hide' => 'OpenID로 로그인했을 때 OpenID URL이 사용자 페이지에 나타나지 않게 합니다. ', 'openid-pref-update-userinfo-on-login' => '로그인할 때마다 OpenID에 저장된 정보를 가져와 내 정보를 갱신합니다.' );
위지위그 에디터
확장기능:FCKeditor에 따라 설치하면 된다.
기본 편집기로 쓰기
만약 FCKeditor를 기본 편집기로 사용할 거면 LocalSettings.php 파일에 다음 코드를 추가하면 된다.
require_once("$IP/extensions/FCKeditor/FCKeditor.php"); $wgDefaultUserOptions['riched_start_disabled'] = 1;
사실 FCKeditor integration guide란 공식 문서에는 LocalSettings.php 파일이 아닌 ./extensions/FCKeditor/FCKeditor.php 파일을 고치라고 되어 있다.
$wgDefaultUserOptions['riched_start_disabled'] = 1;
편집기 크기 조절하기
FCKeditor를 띄워보면 알지만 텍스트영역이 너무 커서 스크롤을 해야 하는 문제가 있다. 크기를 줄이는 법이 문서에 없어 소스 코드를 분석했는데 두 가지 방법이 있다. 우선 LocalSettings.php 파일에 크기를 고정시키는 방법이다.
$wgFCKEditorHeight = 50;
물론 이 방법은 디스플레이의 크기를 고려하지 않기 때문에 불합리하다. 동적으로 크기를 적절히 조절하려면 자바스크립트를 고치는 수밖에 없다. $IP/extensions/FCKeditor/FCKeditor.body.php 파일을 열면 다음과 같은 코드가 있다.
// Get the window (inner) size. var height = window.innerHeight || ( document.documentElement && document.documentElement.clientHeight ) || 550 ;
이 코드에서 변수 height의 값을 적절히 바꾸면 되는데, 경험상 70% 정도로 줄이는 게 좋다.
// Get the window (inner) size. var height = window.innerHeight || ( document.documentElement && document.documentElement.clientHeight ) || 550 ; height = height * 0.7;
한국어 적용하기
// $IP/extensions/FCKeditor/FCKeditor.i18n.ko.php <?php $messages = array( 'textrichditor' => '리치 에디터', 'tog-riched_disable' => '리치 에디터 사용하지 않기', 'tog-riched_disable_ns_main' => '주 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_talk' => '"{{ns:Talk}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_user' => '"{{ns:User}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_user_talk' => '"{{ns:User_talk}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_project' => '"{{ns:Project}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_project_talk' => '"{{ns:Project_talk}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_image' => '"{{ns:Image}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_image_talk' => '"{{ns:Image_talk}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_mediawiki' => '"{{ns:MediaWiki}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_mediawiki_talk' => '"{{ns:MediaWiki_talk}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_template' => '"{{ns:Template}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_template_talk' => '"{{ns:Template_talk}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_help' => '"{{ns:Help}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_help_talk' => '"{{ns:Help_talk}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_category' => '"{{ns:Category}}" 이름 공간에서 리치 에디어 사용하지 않기', 'tog-riched_disable_ns_category_talk' => '"{{ns:Category_talk}}" 이름 공간에서 리치 에디어 사용하지 않기', 'rich_editor_new_window' => '새 창에 리치 에디터 열기', 'tog-riched_start_disabled' => '리치 에디터를 끈 채로 시작하기', 'tog-riched_use_popup' => '팝업 창에 리치 에디터 열기', 'tog-riched_use_toggle' => '토글을 이용해 위키텍스트와 리치 에디터를 오가기 (텍스트영역을 리치 에디터로 대체하기)', 'tog-riched_toggle_remember_state' => '마지막 토글 상태를 기억하기', );
// $IP/extensions/FCKeditor/plugins/mediawiki/lang/ko.js /* * mediaWiki FCKeditor plugin * * 한국어 language file. */ FCKLang.wikiTabEdit = '편집'; FCKLang.wikiTabManual = '매뉴얼'; FCKLang.wikiBtnTemplate = '삽입/편집 틀'; FCKLang.wikiBtnReference = '삽입/편집 참조'; FCKLang.wikiBtnReferences = '삽입 <references /> 태그'; FCKLang.wikiBtnFormula = '삽입/편집 수식'; FCKLang.wikiBtnSpecial = '삽입/편집 특수기능 태그'; FCKLang.wikiBtnSourceCode = '삽입/편집 소스 코드'; FCKLang.wikiBtnSignature = '삽입 signature'; FCKLang.wikiCmdTemplate = '틀 속성'; FCKLang.wikiCmdReference = '참조 속성'; FCKLang.wikiCmdFormula = '수식'; FCKLang.wikiCmdCategories = '분류 목록'; FCKLang.wikiLoadingWikitext = '위키텍스트를 적재하는 중입니다. 기다려주세요...'; FCKLang.wikiLoadingCategories = '분류 목록을 적재하는 중입니다...'; FCKLang.wikiSearchCategory = '검색 분류'; FCKLang.wikiSelectedCategories = '선택한 분류 목록'; FCKLang.wikiBtnCategories = '삽입/편집 분류 목록'; FCKLang.wikiAddNewCategory = '새로 추가'; FCKLang.wikiCategoryTree = '분류 트리'; FCKLang.wikiMnuTemplate = '틀 속성'; FCKLang.wikiMnuMagicWord = '주문 수정하기'; FCKLang.wikiMnuReference = '참조 속성'; FCKLang.wikiMnuFormula = '수식 편집하기'; FCKLang.wikiCmdSpecial = '특수 태그 속성'; FCKLang.wikiCmdSourceCode = '소스 코드 속성'; FCKLang.wikiMnuSpecial = '특수 태그 속성'; FCKLang.wikiMnuSourceCode = '소스 코드 편집하기'; FCKLang.wikiSourceCode = '소스 코드'; FCKLang.wikiSourceLanguage = '소스 언어'; FCKLang.wikiImgFileName = '이미지 파일 이름'; FCKLang.wikiImgNotice1 = '이미지를 먼저 올려야 합니다'; FCKLang.wikiImgNotice2 = '화면 좌측의 "파일 올리기"를 이용하세요'; FCKLang.wikiImgCaption = '캡션'; FCKLang.wikiImgType = '특수 형'; FCKLang.wikiImgTypeThumb = '썸네일'; FCKLang.wikiImgTypeFrame = '프레임'; FCKLang.wikiImgTypeBorder = '두께'; FCKLang.wikiImgAlignCenter = '중앙'; FCKLang.wikiImgAutomatic = '자동 검색 결과'; FCKLang.wikiImgTooShort = '너무 짧습니다. 글자를 더 넣으세요'; FCKLang.wikiImgStartTyping = '위쪽 필드부터 적으세요'; FCKLang.wikiImgStopTyping = '타이핑을 멈추면 검색을 시작합니다'; FCKLang.wikiImgSearching = '검색 중...'; FCKLang.wikiImgSearchNothing = '발견한 이미지 없음'; FCKLang.wikiImgSearch1Found = '이미지 하나 발견'; FCKLang.wikiImgSearchSeveral = '%1 개의 이미지 발견'; FCKLang.wikiImgSearchALot = '%1 개의 이미지 발견'; FCKLang.wikiLnk = '링크'; FCKLang.wikiLnkAutomatic = '자동 검색 결과'; FCKLang.wikiLnkNoSearchAnchor = '앵커 링크... 검색된 내용 없음'; FCKLang.wikiLnkNoSearchMail = '이메일 링크... 검색된 내용 없음'; FCKLang.wikiLnkNoSearchExt = '외부 링크... 검색된 내용 없음'; FCKLang.wikiLnkTooShort = '너무 짧습니다. 글자를 더 넣으세요'; FCKLang.wikiLnkStartTyping = '위쪽 필드부터 적으세요'; FCKLang.wikiLnkStopTyping = '타이핑을 멈추면 검색을 시작합니다'; FCKLang.wikiLnkSearching = '검색 중...'; FCKLang.wikiLnkSearchNothing = '발견한 글 없음'; FCKLang.wikiLnkSearch1Found = '글 하나 발견'; FCKLang.wikiLnkSearchSeveral = '%1 개의 글 발견'; FCKLang.wikiLnkSearchALot = '%1 개의 글 발견'; FCKLang.wikiTeX = '수식 (TeX 마크업)'; FCKLang.wikiTeXEmpty = '수식을 입력해주세요'; FCKLang.wikiSpTag = '현재 특수 태그'; FCKLang.wikiSpParam = '특수 태그 매개변수'; FCKLang.wikiRef = 'Reference text (Wikitext)'; FCKLang.wikiRefName = 'Reference name (optional)'; FCKLang.wikiTmpl = '틀 원시 정의 ({{로 시작, }}로 끝남)'; FCKLang.wikiTmplEmpty = '틀은 {{로 시작해서 }}로 끝나야 합니다. 확인해보세요.'; FCKLang.wikiTmpsel = '(여기서 틀 매뉴얼을 고르세요)'; FCKLang.wikiUnsupportedLanguage = '지원하지 않는 언어: %1'; FCKLang.DplHelp = 'DPL은 Dynamic Page List를 뜻하며 선택 기준에 근거해 페이지 목록을 예쁘게 꾸며서 보여줍니다. 자세히 알고 싶으면 %link 를 참고하세요'; FCKLang.inputboxHelp = '입력 상자는 사용자가 새 페이지를 생성하는 폼을 생성하게 해줍니다. 어느 틀에나 새 페이지 편집 상자를 미리 적재할 수 있습니다. 자세히 알고 싶으면 %link 를 참고하세요';
이렇게 파일 두 개를 추가하고, $IP/extensions/FCKeditor/fckeditor_config.js 파일을 열어 다음 코드를 찾는다.
FCKConfig.Plugins.Add( 'mediawiki', 'en,he,pl') ;
이 코드를 다음과 같이 고친다.
FCKConfig.Plugins.Add( 'mediawiki', 'en,he,pl,ko') ;
위의 코드는 FCKeditor 프로젝트 홈페이지에 등록했다.
댓글
보통 위키는 토론 페이지에서 이런저런 이야기를 나누지만 댓글이 더 친숙한 사람을 위해 확장기능:ArticleComments을 설치했다. 이 확장기능은 댓글을 별도 테이블에 저장하지 않고 바로 그 페이지에 저장한다. 그런 까닭에 댓글 편집이 쉽다.
한글화
소스 코드를 고쳐 메시지를 한글로 고쳤다. 이 간단한 확장기능은 국제화 및 지역화를 전혀 고려하지 않았기 때문에 직접 소스 코드를 고치는 수밖에 없다. 일부 메시지는 한글화하지 않았는데 그 메시지가 나오는 상황을 겪어봐야 정확한 뜻을 파악할 수 있다.
# Messages used in this extension $wgMessageCache->addMessage('article-comments-title-field', '제목'); $wgMessageCache->addMessage('article-comments-name-string', '이름'); $wgMessageCache->addMessage('article-comments-name-field', '이름 (필수): '); $wgMessageCache->addMessage('article-comments-url-field', '웹사이트: '); $wgMessageCache->addMessage('article-comments-comment-string', '댓글'); $wgMessageCache->addMessage('article-comments-comment-field', '댓글: '); $wgMessageCache->addMessage('article-comments-submit-button', '제출'); $wgMessageCache->addMessage('article-comments-leave-comment-link', '댓글 남기기 ...'); $wgMessageCache->addMessage('article-comments-invalid-field', 'The $1 provided <nowiki>[$2]</nowiki> is invalid.'); $wgMessageCache->addMessage('article-comments-required-field', '$1 은 필수 필드입니다.'); $wgMessageCache->addMessage('article-comments-submission-failed', '댓글 제출이 실패했습니다'); $wgMessageCache->addMessage('article-comments-failure-reasons', '죄송합니다. 다음과 같은 이유로 댓글 제출이 실패했습니다:'); $wgMessageCache->addMessage('article-comments-no-comments', '죄송합니다. 글 "[[$1]]" 는 현재 댓글을 받지 않습니다.'); $wgMessageCache->addMessage('article-comments-talk-page-starter', "<noinclude>Comments on [[$1]]\n<comments />\n----- __NOEDITSECTION__</noinclude>\n"); $wgMessageCache->addMessage('article-comments-commenter-said', '$1 의 한마디 ...'); $wgMessageCache->addMessage('article-comments-summary', 'Comment provided by $1 - via ArticleComments extension'); $wgMessageCache->addMessage('article-comments-submission-succeeded', '댓글 제출 성공'); $wgMessageCache->addMessage('article-comments-submission-success', '[[$1]]에 대한 댓글이 제출됐습니다'); $wgMessageCache->addMessage('article-comments-submission-view-all', '이 글에 달린 모든 댓글은 [[$1|여기]]에서 볼 수 있습니다.'); $wgMessageCache->addMessage('article-comments-prefilled-comment-text', ''); $wgMessageCache->addMessage('article-comments-user-is-blocked', '당신의 사용자 계정은 현재 [[$1]]을 편집하지 못 하게 막혔습니다.'); $wgMessageCache->addMessage('article-comments-new-comment', "\n== \$1 ==\n\n<div class='commentBlock'>\n\$2\n\n--\$3 \$4\n</div>\n"); $wgMessageCache->addMessage('article-comments-no-spam', "필드 중 하나 이상이 스팸으로 분류됐습니다."); $wgMessageCache->addMessage('processcomment', '댓글 처리하기');
이름공간에 따른 접근 제한
여행이란 이름공간은 개인적인 용도로 쓸 생각이라 쓰기 권한을 제한해야 했다. 이 작업은 mediawikiwiki:Manual:Using custom namespaces 문서를 참고했다.
## 여행 이름공간 만들기 define("NS_TRAVEL", 100); define("NS_TRAVEL_TALK", 101); $wgExtraNamespaces[NS_TRAVEL] = "여행"; $wgNamespaceAliases["Travel"]=NS_TRAVEL; $wgExtraNamespaces[NS_TRAVEL_TALK] = "여행토론"; $wgNamespaceAliases["Travel_talk"] = NS_TRAVEL_TALK; ## 여행 이름공간 쓰기 보호하기 $wgNamespaceProtection[NS_TRAVEL] = Array("edit-travel"); $wgNamespacesWithSubpages[NS_TRAVEL] = true; $wgGroupPermissions['*']['edit-travel'] = false; $wgGroupPermissions['sysop']['edit-travel'] = true;
이름공간에 대한 읽기 제어
미디어위키는 정보의 공유를 목적으로 삼기 때문에 읽기 권한을 제한하지 않는다. 물론 확장기능이 있지만 Manual:Preventing_access에 따르면 보안상의 허점이 많다고 한다. 그래도 비밀 프로젝트 때문에 당분간 이런 기능이 필요했다. 여러 확장기능 중에 이름공간 별로 접근제어가 가능한 확장기능:Lockdown을 설치했다. 설치과정은 쉬웠고 읽기권한을 제어하기도 쉬웠다.
여행 이름공간과 달리 이번엔 토론 페이지도 접근 제한을 걸었다.
# 얼그레이 이름공간 만들기 define("NS_EARLGREY", 102); define("NS_EARLGREY_TALK", 103); $wgExtraNamespaces[NS_EARLGREY] = "얼그레이"; $wgNamespaceAliases["EarlGrey"] = NS_EARLGREY; $wgExtraNamespaces[NS_EARLGREY_TALK] = "얼그레이토론"; $wgNamespaceAliases["EarlGrey_talk"] = NS_EARLGREY_TALK; ## 얼그레이 이름공간 쓰기 보호하기 $wgNamespaceProtection[NS_EARLGREY] = Array("edit-earlgrey"); $wgNamespaceProtection[NS_EARLGREY_TALK] = Array("edit-earlgrey"); $wgNamespacesWithSubpages[NS_EARLGREY] = true; $wgNamespacesWithSubpages[NS_EARLGREY_TALK] = true; $wgGroupPermissions['*']['edit-earlgrey'] = false; $wgGroupPermissions['earlgrey']['edit-earlgrey'] = true; $wgGroupPermissions['sysop']['edit-earlgrey'] = true; ## Lockdown 확장기능을 이용해 얼그레이의 보기 제한하기 $wgNamespacePermissionLockdown[NS_EARLGREY]['read'] = array('earlgrey'); $wgNamespacePermissionLockdown[NS_EARLGREY_TALK]['read'] = array('earlgrey');
토론 게시판
AWC Forum을 메뉴얼에 따라 설치하는데 그리 어려운 점은 없었다. phpBB를 쓸 생각도 했지만 그리 복잡한 기능이 필요하지 않았다. 게다가 AWC 포럼은 BBCode를 지원하진 않지만 대신 미디어위키의 문법으로 글을 쓰면 되는 장점이 있다. 따로 글쓰는 법을 익히지 않아도 된다는 사실에 만족한다.
사용자에게 권한 주기
AWC 포럼을 설치하면 특수기능:권한조정에 새로운 권한이 생긴다. Forum: Cant Search 같은 권한인데 이상하게 미디어위키에서 문제가 생긴다. 권한의 이름이 일정 길이 이상이거나 ":" 같은 특수 문자가 있으면 권한 부여가 안 된다. 이건 AWC 포럼만 그런 게 아니라, 개인적으로 만든 권한도 마찬가지다. 아무래도 미디어위키가 유니코드를 처리할 때 문제가 있나 보다.
이 문제는 $IP/extensions/awc/forums/perm.php 파일을 열어 권한 이름을 바꿔서 해결했다. 예를 들어, Forum: Cant Search는 ForumCantSearch로 고쳤다. 포럼을 업데이트할 때마다 이 부분은 주의해야 한다.
제목 깨지는 버그
포럼에 글을 쓰면 제목이 깨지는 문제가 있다. 유니코드 처리가 잘못돼서 그런데 문제의 코드는 $IP/extensions/awc/forums/post.php 파일에 있다.
function CleanThreadTitle($t){ $t = strip_tags($t); $t = htmlentities($t, ENT_QUOTES); #$trans = get_html_translation_table(HTML_ENTITIES); #$t = strtr($t, $trans); $t = str_replace("[", "", $t); $t = str_replace("]", "", $t); $t = str_replace("{", "", $t); $t = str_replace("}", "", $t); $t = str_replace("'", "\'", $t); return $t; }
htmlentities 함수를 호출할 때 인코딩을 지정하면 문제는 해결된다.
function CleanThreadTitle($t){ $t = strip_tags($t); $t = htmlentities($t, ENT_QUOTES, 'UTF-8'); #$trans = get_html_translation_table(HTML_ENTITIES); #$t = strtr($t, $trans); $t = str_replace("[", "", $t); $t = str_replace("]", "", $t); $t = str_replace("{", "", $t); $t = str_replace("}", "", $t); $t = str_replace("'", "\'", $t); return $t; }
주석 달기
위키피디아에 쓰는 주석은 Cite 확장기능을 사용한다. 딱히 더 설명할 내용도 없다.
수식 표기
Manual:Enable_TeX/ko 대로 절차를 따르면 된다.


