문법

이 페이지에서는 지금까지 개발된 윤익희 문법을 설명한다.

1   위키 문법

이 문법은 위키와 비위키 페이지 모두에 적용된다.

1.1   헤더

윤익희 코드
= 페이지 제목
가장 상위레벨의 제목은 페이지 제목이다.
== 섹션 1
두번째 레벨의 제목부터 목차에 추가된다.
==! 목차에 나타나지 않는 섹션
느낌표를 붙이면 목차에 추가되지 않는다.
윤익희 출력

페이지 제목

가장 상위레벨의 제목은 페이지 제목이다.

2   섹션 1

두번째 레벨의 제목부터 목차에 추가된다.

목차에 나타나지 않는 섹션

느낌표를 붙이면 목차에 추가되지 않는다.

2.1   텍스트 스타일

윤익희 코드
//기울어진// **굵은** ''코드'' --줄 그은-- __밑줄 그은__ !!형광펜!!

//**''--__!!모두 적용!!__--''**//
윤익희 출력

기울어진 굵은 코드 줄 그은 밑줄 그은 형광펜

모두 적용

2.2   페이지 링크

윤익희 코드
[[페이지]], [[페이지|새 이름]]: 윤익희의 페이지로 링크를 생성한다.

[[ 페이지 ]], [[ 페이지 | 새 이름 ]]: 페이지 이름과 새 이름 앞뒤의 공백은 무시한다.

[[-페이지_+이름]]: 특수문자들(`~!@#$%^&*=+\;:'",/?()[]{}<>, 공백, 탭)은 공백으로 변환된 다음 $PAGE_NAME_STYLE 설정에 따라 하이픈이나 언더스코어로 변환된다. 여러개의 특수문자가 연속으로 입력되면 하나의 공백으로 변환된다.
윤익희 출력

페이지, 새 이름: 윤익희의 페이지로 링크를 생성한다.

페이지, 새 이름: 페이지 이름과 새 이름 앞뒤의 공백은 무시한다.

-페이지_+이름: 특수문자들(`~!@#$%^&*=+\;:'",/?()[]{}<>, 공백, 탭)은 공백으로 변환된 다음 $PAGE_NAME_STYLE 설정에 따라 하이픈이나 언더스코어로 변환된다. 여러개의 특수문자가 연속으로 입력되면 하나의 공백으로 변환된다.

2.3   페이지 파일 링크

윤익희 코드
{{.}}, {{./}}: 현재 페이지의 디렉토리로 링크를 생성한다.

{{파일}}, {{./파일}}: 현재 페이지의 파일로 링크를 생성한다.

{{페이지/}}: 페이지의 디렉토리로 링크를 생성한다.

{{페이지/파일}}: 페이지에 있는 파일로 링크를 생성한다.

{{페이지/이름에 //}}, {{페이지/이름에 //파일}}: 파일링크시 디렉토리와 파일을 구분짓는 슬래시(/)는 마지막 것으로 간주하고 그 앞의 슬래시들은 페이지이름으로 인코딩된다.

위와 같이 페이지 이름이 슬래시로 끝난다면 슬래시를 두 번 써서 디렉토리를 지정할 수 있다.
또는 /는 어차피 페이지 이름에서 제거되므로 {{페이지/이름에 /}}, {{페이지/이름에 /파일}}로 링크해도 결과는 비슷하다. 단, 출력되는 문자열에 차이가 난다.
윤익희 출력

문법/, 문법/: 현재 페이지의 디렉토리로 링크를 생성한다.

파일, 파일: 현재 페이지의 파일로 링크를 생성한다.

페이지/: 페이지의 디렉토리로 링크를 생성한다.

파일: 페이지에 있는 파일로 링크를 생성한다.

페이지-이름에/, 파일: 파일링크시 디렉토리와 파일을 구분짓는 슬래시(/)는 마지막 것으로 간주하고 그 앞의 슬래시들은 페이지이름으로 인코딩된다.

위와 같이 페이지 이름이 슬래시로 끝난다면 슬래시를 두 번 써서 디렉토리를 지정할 수 있다. 또는 /는 어차피 페이지 이름에서 제거되므로 페이지-이름에/, 파일로 링크해도 결과는 비슷하다. 단, 출력되는 문자열에 차이가 난다.

2.4   외부 링크

윤익희 코드
<<http://uniqki.isnew.info|Uniqki>>: URL로 링크를 생성한다.

[[http://uniqki.isnew.info]]: URL을 페이지 이름으로 입력한다.
윤익희 출력

Uniqki: URL로 링크를 생성한다.

http://uniqki.isnew.info: URL을 페이지 이름으로 입력한다.

2.5   이미지 링크

윤익희 코드
{{{페이지/이미지}}} {{{페이지/이미지}}}[width:100px; display:block; margin:0 auto;]

<<<https://idea.isnew.info/logo.png>>> <<<https://idea.isnew.info/logo.png>>>[width:100px; display:block; margin:0 auto;]

{{페이지/이미지}}와 <<https://idea.isnew.info/logo.png>>는 이미지 파일로 링크를 생성하지만 {와 <를 세 개 써서 이미지를 보여 줄 수 있다. 태그를 닫은 후 [] 안에 이미지의 CSS 스타일을 지정할 수도 있다.
윤익희 출력

https://idea.isnew.info/logo.png https://idea.isnew.info/logo.png

이미지https://idea.isnew.info/logo.png는 이미지 파일로 링크를 생성하지만 {와 <를 세 개 써서 이미지를 보여 줄 수 있다. 태그를 닫은 후 [] 안에 이미지의 CSS 스타일을 지정할 수도 있다.

2.6   인용

윤익희 코드
인용을 시작해 보자.
> 인용할 문장을 "> "로 시작한다.
  여러 줄에 걸쳐서 인용이 가능하다.
  .
  문단 나누기도 가능하다.
  > 인용문 안에
    인용문을 넣어 보자. 다음과 같이 둥근 괄호로 시작하고 끝나는 줄은 모두 합쳐져서 인용문 닫기 바로 전에 하나의 출처로 footer 태그 안에 출력된다.
    (--)
    (이사람)
    (저사람)
  바로 위의 인용문을 닫고
  원래의 인용문으로 돌아왔다.
  (-- 저자)

연속된 인용문들은 중첩되고 출처가 해당 인용문을 닫기 바로 전에 출력되기 때문에 다음과 같이 토론을 하면 원치 않는 결과가 나온다.
> (유저 1)
  (<http://example.com/user1>)
  나는 이렇게 생각한다.
  > (유저 2)
    (<http://example.com/user2>)
    나는 반대한다.

인라인 cite를 이용해서 다음과 같이 작성할 수 있다.
> 토론을 위해서는 둥근 괄호에 둘러 싸인 인라인 cite로 끝내면 된다. (유저 1 <http://example.com/user1>)
  > 그러면 글 중에 ''''()가 있으면 어떻게 하나? (방문자)
    > 괄호 앞에 공백이 있어야 하므로 파싱 후 제거되는 빈 폰트명령인 "".''''.""를 괄호 앞에 더하면 된다. 긴 글이 인용문에 중첩되면 점점 좁아지는 단점이 있다. (유저 1 <http://example.com/user1>)
윤익희 출력

인용을 시작해 보자.

인용할 문장을 “> ”로 시작한다. 여러 줄에 걸쳐서 인용이 가능하다.

문단 나누기도 가능하다.

인용문 안에 인용문을 넣어 보자. 다음과 같이 둥근 괄호로 시작하고 끝나는 줄은 모두 합쳐져서 인용문 닫기 바로 전에 하나의 출처로 footer 태그 안에 출력된다.

-- 이사람 저사람

바로 위의 인용문을 닫고 원래의 인용문으로 돌아왔다.

-- 저자

연속된 인용문들은 중첩되고 출처가 해당 인용문을 닫기 바로 전에 출력되기 때문에 다음과 같이 토론을 하면 원치 않는 결과가 나온다.

나는 이렇게 생각한다.

나는 반대한다.

인라인 cite를 이용해서 다음과 같이 작성할 수 있다.

토론을 위해서는 둥근 괄호에 둘러 싸인 인라인 cite로 끝내면 된다. 유저 1 <http://example.com/user1>

그러면 글 중에 ()가 있으면 어떻게 하나? 방문자

괄호 앞에 공백이 있어야 하므로 파싱 후 제거되는 빈 폰트명령인 ''''를 괄호 앞에 더하면 된다. 긴 글이 인용문에 중첩되면 점점 좁아지는 단점이 있다. 유저 1 <http://example.com/user1>

2.7   리스트

윤익희 코드
* 총알 리스트 1
  * 총알 리스트 1-1
    * 총알 리스트 1-1-1
  * 총알 리스트 1-2
* 총알 리스트 2:
  내용 계속
  .
  리스트 안에 문단
  .
  계속
  + 숫자 리스트로 바꾸기
  + 숫자 리스트
    - 거꾸로 숫자 리스트
    - 거꾸로 숫자 리스트

: 단어 1: 정의 1
  : 단어 2: 정의 2

>를 이용해서 토론을 하다 보면 댓글이 중첩된 인용문으로 처리되어서 점점 좁아지는 문제점이 있다. 다음과 같이 리스트를 써서 해결할 수 있다.
: : 토론을 위해서는 단어정의 리스트를 이용해서 공백의 단어를 정의하는 식으로 댓글을 이어 갈 수 있다. -- //유저 1 <http://example.com/user1>//
  : : 그러면 시작할 때마다 '': : ''를 입력하는 것이 귀찮지 않겠나? -- //방문자//
    : : 다음에 소개할 ''#regex'' 명령으로 입력을 쉽게 할 수 있다. 뿐만 아니라 긴 글이 리스트에 댓글로 달려도 인용문과는 달리 점점 좁아지는 단점이 없다. -- //유저 1 <http://example.com/user1>//
      : : 서명은 수동으로 할 수 밖에 없네? -- //방문자//
        : : 이 역시 ''#regex'' 명령으로 쉽게 처리할 수 있다. -- 방문자

#regex #^((?:  )*)@ (.*?)(-- .*[^@])$#\1: : \<span style="color:red;"\>\&\#x21AA;\</span\> \2 \<i\>\3\</i\>#
@ 토론을 위해서는 단어정의 리스트를 이용해서 공백의 단어를 정의하는 식으로 댓글을 이어 갈 수 있다. -- 유저 1 <http://example.com/user1>
  @ 그러면 시작할 때마다 '': : ''를 입력하는 것이 귀찮지 않겠나? -- 방문자
    @ 여기서 소개할 ''#regex'' 명령으로 입력을 쉽게 할 수 있다. 뿐만 아니라 긴 글이 리스트에 댓글로 달려도 인용문과는 달리 점점 좁아지는 단점이 없다. -- 유저 1 <http://example.com/user1>
      @ 서명은 수동으로 할 수 밖에 없네? -- 방문자
        @ 이 역시 ''#regex'' 명령으로 쉽게 처리할 수 있다. -- 방문자
윤익희 출력
  • 총알 리스트 1
    • 총알 리스트 1-1
      • 총알 리스트 1-1-1
    • 총알 리스트 1-2
  • 총알 리스트 2: 내용 계속

    리스트 안에 문단

    계속

    1. 숫자 리스트로 바꾸기
    2. 숫자 리스트
      1. 거꾸로 숫자 리스트
      2. 거꾸로 숫자 리스트
단어 1
정의 1
단어 2
정의 2

>를 이용해서 토론을 하다 보면 댓글이 중첩된 인용문으로 처리되어서 점점 좁아지는 문제점이 있다. 다음과 같이 리스트를 써서 해결할 수 있다.

토론을 위해서는 단어정의 리스트를 이용해서 공백의 단어를 정의하는 식으로 댓글을 이어 갈 수 있다. -- 유저 1 <http://example.com/user1>
그러면 시작할 때마다 : : 를 입력하는 것이 귀찮지 않겠나? -- 방문자
다음에 소개할 #regex 명령으로 입력을 쉽게 할 수 있다. 뿐만 아니라 긴 글이 리스트에 댓글로 달려도 인용문과는 달리 점점 좁아지는 단점이 없다. -- 유저 1 <http://example.com/user1>
서명은 수동으로 할 수 밖에 없네? -- 방문자
이 역시 #regex 명령으로 쉽게 처리할 수 있다. -- 방문자
토론을 위해서는 단어정의 리스트를 이용해서 공백의 단어를 정의하는 식으로 댓글을 이어 갈 수 있다. -- 유저 1 <http://example.com/user1>
그러면 시작할 때마다 : : 를 입력하는 것이 귀찮지 않겠나? -- 방문자
여기서 소개할 #regex 명령으로 입력을 쉽게 할 수 있다. 뿐만 아니라 긴 글이 리스트에 댓글로 달려도 인용문과는 달리 점점 좁아지는 단점이 없다. -- 유저 1 <http://example.com/user1>
서명은 수동으로 할 수 밖에 없네? -- 방문자
이 역시 #regex 명령으로 쉽게 처리할 수 있다. -- 방문자

2.8   테이블

테이블 문법은 도쿠위키를 참고했다. 기본적으로 구분자 앞뒤로 공백이 하나 이상 있어야 한다. 단, 시작하고 끝나는 구분자에는 각각 앞과 뒤에 공백이 있으면 안 된다.

  • <caption>: !로 시작해서 !로 끝난다.
  • <thead>: 각 열을 ^로 마친다.
  • <tfoot>: 각 열을 !로 마친다. !는 셀을 시작하는 구분자가 아니고 열을 마칠 때 <tfoot> 태그임을 알려 주는 역할만 한다. 따라서 다른 곳에는 쓸 수 없다.
  • <tbody>: 각 열을 |로 마친다. 여러 개의 <tbody>를 생성하기 위해서는 마지막 |뒤에 _를 입력해서 다음 <tbody>를 시작한다.
  • <th>: 각 셀을 ^로 시작한다.
  • <td>: 각 셀을 |로 시작한다.
  • 열 병합: 닫는 구분자를 연속으로 쓴다.
  • 행 병합: 병합될 셀에 .을 입력한다.
  • 왼쪽 정렬: 시작하는 구분자와 내용 사이에 공백을 하나만 입력한다.
  • 오른쪽 정렬: 닫는 구분자와 내용 사이에 공백을 하나만 입력한다. 단, 시작하는 구분자와 내용 사이에 공백이 하나만 있을 경우 왼쪽으로 정렬된다.
  • 가운데 정렬: 시작하는 구분자와 닫는 구분자로부터 공백을 두 개 이상씩 입력한다.
윤익희 코드
! 테이블 캡션을 옵션으로 붙일 수 있다. !
^ 요약   | <table> 안의 <caption>, <thead>, <tbody>, <tfoot>, <tr>, <th>, <td> 태그들을 지원한다. !!
^ 헤딩 1 ^ 헤딩 2 ^ 헤딩 3                   ^
^ 헤딩 4 |               열 병합 오른쪽 정렬 ||
! 헤딩 4는 열 병합과 오른쪽 정렬을 보여준다. !
^ 헤딩 5 |  행 병합    |  행 병합 가운데 정렬  |
^ 헤딩 6 | .          | .                  |
^ 헤딩 7 | .          | |가 셀을 시작하거나 닫지 못 하게 바로 뒤에 공백을 없애서 |로 입력 |_
^ 헤딩 8 | 두 번째 <tbody>는 바로 윗행의 마지막에 _를 입력해서 시작한다. ||
윤익희 출력
표 1: 테이블 캡션을 옵션으로 붙일 수 있다. 헤딩 4는 열 병합과 오른쪽 정렬을 보여준다.
헤딩 1헤딩 2헤딩 3
헤딩 4열 병합 오른쪽 정렬
헤딩 5행 병합행 병합 가운데 정렬
헤딩 6
헤딩 7|가 셀을 시작하거나 닫지 못 하게 바로 뒤에 공백을 없애서 |로 입력
헤딩 8두 번째 <tbody>는 바로 윗행의 마지막에 _를 입력해서 시작한다.
요약<table> 안의 <caption>, <thead>, <tbody>, <tfoot>, <tr>, <th>, <td> 태그들을 지원한다.

2.9   그림

윤익희 코드
@ <<<https://idea.isnew.info/logo.png>>> @
" Idea.IsNew.Info 로고 "

" Idea.IsNew.Info 로고 "
" 캡션을 계속 추가 "
@ <<<https://idea.isnew.info/logo.png>>>[padding:0 100px] @

" Hello World C 코드 "
@ (
---[c]
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    printf("Hello World!\n");
    exit(EXIT_SUCCESS);
}
---
) @
윤익희 출력
https://idea.isnew.info/logo.png
그림 1: Idea.IsNew.Info 로고
https://idea.isnew.info/logo.png
그림 2: Idea.IsNew.Info 로고 캡션을 계속 추가
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    printf("Hello World!\n");
    exit(EXIT_SUCCESS);
}
그림 3: Hello World C 코드

2.10   문법 네스팅

윤익희 코드
* 리스트 안에(
| 테이블 넣기 | (_
| 그 안에 | 또 |
| 테이블 | (__
* 리스트 1
* 리스트 2
---
그대로
입력
---
___
)__ |
)_ |
| 이렇게 | 입력한다. |
) 리스트 계속
* 리스트 2

인용문에 표를 추가하기.
> 다음 표를 보세요. (
| 인용문 | 안에 |
| 테이블 | 넣기 |
) 아하!
  (출처)
윤익희 출력
  • 리스트 안에
    테이블 넣기
    그 안에
    테이블
    • 리스트 1
    • 리스트 2
    그대로
    입력

    이렇게입력한다.
    리스트 계속
  • 리스트 2

인용문에 표를 추가하기.

다음 표를 보세요.

인용문안에
테이블넣기
아하!

출처

2.11   입력한 그대로 출력

입력한 그대로 출력하는 방법에는 블록과 인라인 두 가지가 있다.

블록의 경우 하이픈(-)을 세 번 이상 한 줄에 입력해서 시작하고 같은 수의 하이픈을 이용해서 마친다. 블록 내용 중에 하이픈이 세 번 이상 있는 줄이 있으면 그 개수를 달리 해서 입력하면 된다.

윤익희 코드
----
블록의 경우 여러 줄에
걸쳐서 입력이 가능하다.
---
-의 개수가 다르면 닫지 않는다.
----
윤익희 출력
블록의 경우 여러 줄에
걸쳐서 입력이 가능하다.
---
-의 개수가 다르면 닫지 않는다.

인라인의 경우 큰 따옴표(")를 두 번 입력하고 바로 다음 구분자로 쓸 문자를 입력한다. 원하는 내용을 입력한 다음 구분자와 큰 따옴표 두 번으로 마친다.

윤익희 코드
""|인라인 방법은
여러 줄에 걸쳐서는 작동하지 않는다.|""

"".//입력한// **그대로** 출력.""하는 방법을 보여 준다. ""|cos(3.14)=``sprintf "%.2f", cos(3.14)``|""

//입력한// **그대로** 출력하는 방법과 비교해 보자. cos(3.14)=``sprintf "%.2f", cos(3.14)``

''""|//이 문장//의 경우 구분자인 |이 중간에 들어가도 바로 뒤에 ""가 따라 오지 않기 때문에 //계속// 입력이 가능하다.|""''
윤익희 출력

""|인라인 방법은 여러 줄에 걸쳐서는 작동하지 않는다.|""

//입력한// **그대로** 출력하는 방법을 보여 준다. cos(3.14)=``sprintf "%.2f", cos(3.14)``

입력한 그대로 출력하는 방법과 비교해 보자. cos(3.14)=-1.00

//이 문장//의 경우 구분자인 |이 중간에 들어가도 바로 뒤에 ""가 따라 오지 않기 때문에 //계속// 입력이 가능하다.

3   비위키 문법

이 문법은 비위키 페이지에만 적용된다.

3.1   펄 코드 임베딩

윤익희 코드
비위키 페이지에서 백틱을 이용해서 펄 코드를 임베드할 수 있다. 코사인 3.14는 ``sprintf "%.2f", cos(3.14)``이다.
윤익희 출력

비위키 페이지에서 백틱을 이용해서 펄 코드를 임베드할 수 있다. 코사인 3.14는 -1.00이다.

3.2   MathJax와 Math::Trig 펄 모듈

MathJax를 이용해서 TeX 수식을 입력하려면 header.tpl 파일의 <head> 태그 안에 다음 한 줄을 추가하면 된다.

<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS_CHTML"></script>

다음과 같이 펄의 Math::Trig 모듈을 이용해서 삼각함수의 계산결과를 MathJax로 출력할 수 있다.

윤익희 코드
##{use Math::Trig; use vars qw($conv); sub radians{$conv=1;} sub degrees{$conv=pi/180;} radians}
#regex /:(sin|cos|tan)\((.*?)\)/``sprintf "%.3f", \1($conv*(\2))``/

$$\sin(\pi/2)=:sin(pi/2)$$
##{degrees}
$$\sin(90^\circ)=:sin(90)$$
$$\tan(45^\circ)=:tan(45)$$
##{radians}
$$\tan(\pi/4)=:tan(pi/4)$$
윤익희 출력

$$\sin(\pi/2)=1.000$$ $$\sin(90^\circ)=1.000$$ $$\tan(45^\circ)=1.000$$ $$\tan(\pi/4)=1.000$$