DokuWiki ======== ## 개요 [[wiki:sw:php|PHP]]로 만들어진 [[wiki:sw:wikiengine|위키엔진]] 소프트웨어. 도쿠위키는 현존하는 (소형) 위키엔진 중 가장 범용적이고 간편한 솔루션이다. PHP를 사용하기 때문에 배포가 쉬우며, 그렇지만 모던 PHP에 종속되지 않기 때문에 일반적인 호스팅 환경에서도 잘 작동하고, 파일 기반이기 때문에 저사양에서도 잘 작동한다. 코어 엔진은 극히 최소한의 기능만 담고 있으며 추가적인 기능은 extension으로 구현하도록 되어 있다. 즉 도쿠위키는 다른 위키엔진보다도 더 유연하고 개인화되어있다. 사실상 ‘개인 위키’란 컨셉에 가장 잘 들어맞는 소프트웨어는, 지금까지도 도쿠위키다. 그러나, 아래 마크업 단락에서 다루듯 도쿠위키가 가진 단점 또한 선명하다. ## 마크업 도쿠위키는 여타의 다른 [[wiki:markup|마크업 언어]]와는 전혀 다른, 상당히 괴상한 문법을 하고 있다. 가장 거슬리는 것은 h1에서 아내로 내려가면서 등호의 개수가 줄어드는 것이다. 단순히 ‘가장 상위의 단락 기호는 가장 눈에 잘 띄여야 한다’라는 생각으로밖에 읽히지 않는, 쓰레기같은 문법이다. 의미론적이고 기능적인 차원에서 헤딩은 하위로 갈 수록(즉 깊어질 수록) 더 많은 수의 기호로 정의되어야 하는 것이 맞다. [[wiki:markdown]]이나 [[wiki:asciidoc]] 등 수많은 다른 마크업들이 괜히 반대로 규정하는 것이 아니다. 도쿠위키의 단 하나의 단점을 꼽자면, 이러한 불합리한 마크업 문법을 꼽을 수 있을 정도다. ## 특징 도쿠위키가 (특히 다른 위키엔진과) 차별되는 점에 대한 정리. ### 하이퍼링크 도쿠위키는 wikilink를 상대적으로 취급한다. 예컨대 `[[pagename]]`은 같은 폴더/namespace에 있는 pagename이란 페이지로 이동시킨다. 혹은 다른 namespace로 연결하기 위해, 최상위부터 `[[namespace:pagename]]`이란 문법을 사용해도 된다. ### Pagename 도쿠위키는 문서의 제목(title)과 페이지의 이름(pagename/filename)을 구분한다. 페이지이름은 실제 url에 표시되는 이름이다. 이는 도쿠위키의 장점이 될 수도 있지만, 단점이 될 수도 있다. 후자의 경우 특히 링크를 걸 때 두드러지는데, [[wiki/mediawiki|미디어위키]]처럼 표제어로 직접 링크를 거는 것이 어려우며, 페이지이름으로 걸어야 한다. 따라서 표제어와 페이지이름간의 연관성을 고려해야 한다. 페이지이름은 (아마도 url을 상정하여) 다음 규칙을 갖는다. - 대소문자는 구분하지 않는다. - 특수문자는, 마침표와 하이픈, 밑줄기호만을 허용한다. 나머지는 밑줄로 변환된다. - 콜론은 네임스페이스를 구분하기 위해 예약되어 있다. - 슬래시는 url의 구분자로 예약되어 있다. - 알파벳 외의 다른 (특수문자가 아닌) 문자는 허용된다. ## 이름 이름의 Doku는 독일어 Dokumentation에서 온 것이다. 주 개발자인 Andreas Gohr는 독일 출신이다. 참고: [docuwiki [DokuWiki]](https://www.dokuwiki.org/docuwiki) ## 기능 도쿠위키의 주요 기능에 대한 정리. ### 백업 최소한 다음 디렉토리를 백업하면 도쿠위키의 전체 컨텐츠를 복원할 수 있다. 나머지는 코어 파일을 그대로 사용하면 된다. 단 코어 파일을 고쳤다면 해당 파일도 백엄해야 한다. - data/pages: 최신 버전의 페이지 - data/attic: 페이지의 과거 리비전 - data/meta: 페이지 메타데이터 - data/media: 최신 버전의 미디어 - data/media_attic: 미디어의 과거 리비전 - data/media_meta: 미디어 메타데이터 - conf: 설정 - lib: 플러그인과 템플릿 ### ACL 도쿠위키는 ACL 규칙을 통해 특정 사용자/그룹이 특정 페이지/네임스페이스에 접근하지 못하도록 한다. 이 외에 다른 페이지 필터링 규칙은 없다. 예를 들어 특정 태그를 가진 페이지를 모두 접근하지 못하도록 하는 방법은 없다. 각 페이지별로 따로 규칙을 설정해주는 방법 정도다. ### remote 참고: [devel:xmlrpc [DokuWiki]](https://www.dokuwiki.org/devel:xmlrpc) Dokuwiki는 XML-RFC를 통한 원격 접근을 지원하며, 플러그인을 사용하면 필요한 기능을 추가로 구현할 수도 있다. #### 지원하는 (주요) 기능 너무 지엽적이거나 일반적으로 불필요한 함수는 생략. - dokuwiki.getPagelist: 주어진 네임스페이스의 페이지 목록을 출력 - dokuwiki.appendPage: 주어진 페이지에 입력한 텍스트를 덧붙임 - dokuwiki.setLocks: 주어진 페이지의 잠금 상태를 변경. 여러 페이지를 동시에 작업할 때 충돌이 일어나지 않게 하는 목적. - dokuwiki.login: 도쿠위키에 로그인. - dokuwiki.search: 입력한 문자열을 기준으로 검색 결과를 dokuwiki.getPagelist 형식으로 반환. - wiki.getPage: 주어진 페이지의 본문 텍스트를 출력. - wiki.getPageVersion: 주어진 페이지의 특정 타임스탬프의 리비전 내용을 반환. - wiki.getPageVersions: 주어진 페이지의 리비전 목록을 반환. - wiki.getPageInfo: 주어진 페이지의 정보를 반환. 정보에는 페이지명(이는 재귀적이다), 최종 수정 시간, 저자, 버전(타임스탬프)이 포함된다. - wiki.getPageInfoVersion: 주어진 페이지와 타임스탬프의 버전 정보를 반환. - wiki.putPage: 주어진 페이지에 입력한 위키텍스트를 입력함. 요약과 마이너 리비전 여부도 함께 선택할 수 있다. - wiki.getAllPages: 위키 내의 모든 페이지 목록과 그 정보를 반환. 정보에는 id, 권한, 크기, 버전(타임스탬프)이 포함된다. - wiki.getBackLinks: 주어진 페이지의 백링크를 목록으로 반환한다. - wiki.getRecentChanges: 주어진 타임스탬프 이후 위키 내 페이지의 변경 내역을 반환한다. 각 항목은 id, 최종 수정 시간, 저자, 버전(타임스탬프)을 포함한다. - wiki.getRecentMediaChanges: 주어진 타임스탬프 이후 위키 내 미디어의 변경 내역을 반환한다. 각 항목은 id, 최종 수정 시간, 저자, 버전(타임스탬프), 권한, 크기를 포함한다. - wiki.getAttachments: 주어진 네임스페이스 내의 미디어 목록 및 그 정보를 반환한다. 정보에는 id, 파일명, 크기, 업로드 시간(타임스탬프), 최종 수정 시간, 이미지 여부, 수정 가능 여부, 권한이 포함된다. - wiki.getAttachment: 입력한 id의 미디어를 바이너리 형태로 반환한다. - wiki.getAttachmentInfo: 입력한 id의 미디어 정보를 반환한다. 정보에는 크기와 최종 수정 시간이 포함된다. - wiki.putAttachment: 입력한 id의 미디어에 입력한 바이너리 데이터를 저장한다. - wiki.deleteAttachment: 입력한 id의 미디어를 제거한다. 페이지의 경우 특별히 삭제 동작이 없고, 페이지 내용을 지우면 된다. - plugin.acl.listAcls: ACL 규칙 목록을 반환한다. - plugin.acl.addAcl: ACL 규칙을 추가한다. - plugin.acl.delAcl: ACL 규칙을 제거한다. ## 플러그인 ### Data [링크](https://www.dokuwiki.org/plugin:data) 위키 페이지에 구조화된 데이터를 추가하고, 이를 쿼리할 수 있도록 한다. #### 기본 타입 Data 플러그인은 이름에 (밑줄과 함께) 붙은 접미사로 타입을 구분한다. 충분히 타입을 유추하는 것이 가능할 것이나, 무결성을 확보하기 위한 결정일 것이다. - `text`: 접미사가 없으면 기본적으로 텍스트로 인식한다. - `dt`: YYYY-MM-DD 형식의 날짜를 입력받는다. - `page`: 페이지명을 입력받는다. 절대경로만 인식하므로 주의해야 한다. - `title`: 페이지명에 더해, 파이프 기호와 함께 표시하고자 하는 제목을 함께 입력받을 수 있다. - `nspage` - `url` - `tag` - `mail` - `img`: 내부 id 또는 외부 url을 통해 이미지를 입력받는다. ``은 이미지의 너비를 뜻하며, 기본값은 40이다. - `wiki`: 위키텍스트를 입력받는다. 성능 저하의 가능성이 있으므로 남용하지 않는 것이 좋다. - `pageid` - `hidden`: 페이지나 편집기(하술)에 표시하지 않는 값. 한 항목에 여러 값을 받고 싶다면 (타입 식별자를 포함한) 맨뒤에 s를 붙이면 된다. 단 s로 끝나는 이름의 경우, 밑줄을 붙여서 혼동을 피해야 한다. #### 사용자 타입 사용자 타입(type aliases)은 기본 타입을 기반으로 새로운 타입을 생성하는 기능이다. 관리 메뉴의 ‘필드 별칭‘ 항목을 통해 정의할 수 있으며, 기본 타입에 대입할 때 앞뒤에 추가할 접두사/접미사. 유효한 값의 목록 등을 정의할 수 있다. ### Strata - [링크](https://www.dokuwiki.org/plugin:strata) - 원 제작자의 컨퍼런스 [논문](https://opensym.org/os2014/proceedings-files/p807.pdf) Data 플러그인이 하나의 페이지에 하나의 데이터 엔트리만을 삽입할 수 있다는 한계를 극복하기 위해 만들어진 플러그인. [[wiki:sqlite]] 외에 [[wiki:mysql]], [[wiki:postgresql]] 등의 데이터베이스 엔진을 선택할 수 있으며, [[wiki:sparql|SPARQL]] 형태의 쿼리를 요청할 수 있다. ## Tips - DokuWiki는 업그레이드시 기본 페이지를 함께 덮어씌우므로, 해당 페이지를 수정했을 경우 유의해야 한다. ## 링크 ### 외부 링크 - [Official site](https://www.dokuwiki.org/dokuwiki) - [GitHub 저장소](https://github.com/dokuwiki/dokuwiki)