Files

10 lines
9.8 KiB
JavaScript

const p=s=>'<p>'+s+'</p>';const ul=xs=>'<ul>'+xs.map(s=>'<li>'+s+'</li>').join('')+'</ul>';
export default {
141:({a,img})=>p('민감한 자료를 보관할 때 노트 보호 기능을 사용할 수 있습니다. 보호된 노트는 암호화되므로 '+a(0,'데이터베이스')+' 파일만으로 본문을 읽을 수 없습니다.')+p('보호 노트를 열려면 비밀번호로 보호 세션을 시작해야 합니다. 기본적으로 10분 동안 사용하지 않으면 세션이 끝납니다. 보호 노트를 편집하는 동안에는 시간이 연장되며 일반 노트로 이동하면 유휴 시간이 계산됩니다.')+p('보호 기능은 내용을 숨기는 기능입니다. 보호 세션 밖에서도 노트를 옮기거나 삭제할 수 있으므로 삭제 방지 기능과는 다릅니다.')+'<h2>보호 설정</h2>'+p('기본적으로 노트는 보호되지 않습니다. 제목 옆 방패 아이콘으로 설정하세요.')+p(img(0,'보호 노트 설정과 열기'))+'<h2>암호화 범위</h2>'+p('제목과 본문 및 이미지와 첨부 파일은 암호화합니다. 트리 구조와 수정 시각 같은 메타데이터 및 '+a(1,'속성')+'은 암호화하지 않습니다. 보호 노트가 있다는 사실과 위치는 보일 수 있습니다.')+'<h2>암호화 과정</h2>'+p('다음은 이 버전의 원문에 설명된 처리 과정입니다.')+ul(['입력한 비밀번호를 검증용 '+a(2,'scrypt')+'와 '+a(3,'솔트')+'로 확인합니다.','다른 솔트로 비밀번호를 다시 처리해 데이터 키를 여는 값을 만듭니다. scrypt는 비밀번호 추측 비용을 높이는 '+a(4,'키 강화')+'에 사용됩니다.','생성한 값으로 실제 데이터 암호화 키를 복호화합니다. 이 키는 '+a(5,'AES-128')+'과 무작위 '+a(6,'초기화 벡터')+'를 사용해 암호화되어 있습니다. 데이터 키는 '+a(7,'데이터베이스')+' 초기화 시 무작위로 만들며 비밀번호를 바꿀 때는 데이터 키를 다시 암호화합니다.','데이터 키로 제목과 본문을 복호화합니다. 원문은 AES-128의 '+a(8,'CBC 모드')+'를 사용하며 매 암호화 작업마다 다른 초기화 벡터를 생성해 암호문과 함께 저장한다고 설명합니다.'])+'<h2>공유</h2>'+p('보호 노트는 일반 노트처럼 공개 공유할 수 없습니다. 올바른 비밀번호로 보호 세션을 시작해야 내용을 볼 수 있습니다.'),
142:({a,pre})=>p(a(0,'스크립트')+'로 공개 REST 요청을 처리할 수 있습니다. 외부 서비스에서 제목과 본문을 보내 노트를 만드는 등의 연동에 사용합니다.')+'<h2>외부 요청으로 노트 만들기</h2>'+p('다음은 백엔드 JavaScript '+a(1,'코드 노트')+'예제입니다. 예시 비밀값을 그대로 공개 서비스에 사용하면 안 됩니다.')+pre(0).replace('// notes must be saved somewhere in the tree hierarchy specified by a parent note.','// 노트를 저장할 상위 노트를 지정합니다.').replace('// This is defined by a relation from this code note to the "target" parent note','// 이 코드 노트의 관계로 대상 상위 노트를 연결합니다.').replace('// alternetively you can just use constant noteId for simplicity (get that from "Note Info" dialog of the desired parent note)','// 간단한 예제에서는 노트 정보에서 확인한 고정 ID를 사용할 수도 있습니다.')+p('<code>#customRequestHandler=create-note</code> 라벨과 저장할 위치를 가리키는 <code>~targetNote</code> 관계를 지정합니다.')+'<h3>요청 예시</h3>'+pre(1).replace('"title": "hello"','"title": "인사"').replace('"content": "world"','"content": "안녕하세요."').replace(/\++(?=<\/code>)/,'')+p('<code>/custom</code> 아래 요청은 <code>customRequestHandler</code> '+a(2,'라벨')+'이 있는 노트에서 처리기를 찾습니다. 라벨 값은 경로에 대응하는 정규식입니다. 찾은 스크립트에는 Express의 '+a(3,'요청 객체')+'와 '+a(4,'응답 객체')+'가 <code>api.req</code>와 <code>api.res</code>로 제공됩니다.')+p('이 경로는 기본 인증을 자동으로 요구하지 않습니다. 처리기에서 인증을 구현해야 합니다. 예제는 POST 방식과 비밀값을 확인한 뒤 '+a(5,'스크립트 API')+'로 노트를 만듭니다.')+'<h2>파일 제공</h2>'+p('파일만 제공하려면 <code>customResourceProvider</code> 라벨에 경로 정규식을 지정할 수 있습니다. '+a(6,'사용자 지정 리소스 제공')+'을 참고하세요.')+'<h2>고급 사용</h2>'+p('요청과 응답 객체의 기능은 '+a(7,'Express 공식 문서')+'에서 확인할 수 있습니다.')+'<h3>경로 매개변수</h3>'+pre(2)+p('마지막 숫자처럼 바뀌는 부분을 정규식으로 받을 수 있습니다.')+pre(3)+p('괄호로 묶은 일치 결과는 <code>api.pathParams</code>에 들어갑니다.')+pre(4)+p('<code>?noteId=123</code> 같은 쿼리 매개변수는 <code>req.query.noteId</code>로 읽습니다.'),
143:({a,img})=>'<h2>외부 링크</h2>'+p(a(0,'위키백과의 남중국해 문서')+'처럼 외부 웹페이지로 연결하는 링크입니다. '+a(1,'서식 도구 모음')+'의 '+img(0,'링크 버튼')+'이나 <kbd>Ctrl</kbd>+<kbd>K</kbd>로 주소를 입력하고 Enter로 확정하세요. 주소를 붙여넣고 공백을 입력해 자동으로 만들 수도 있습니다.')+p('다른 글자로 표시하려면 먼저 글자를 입력하고 선택한 뒤 링크 주소를 지정하세요. 선택한 글자 위에 주소를 붙여넣는 방법도 있습니다.')+p('표시 글자는 나중에 바꿀 수 있습니다. 링크를 누른 뒤 '+img(1,'링크 편집 버튼')+'으로 주소를 수정하거나 '+img(2,'연결 해제 버튼')+'으로 링크를 없앱니다. 외부 링크를 두 번 클릭하거나 오른쪽 클릭 메뉴에서 새 탭으로 열기를 선택하면 이동합니다.')+'<h2>노트 사이의 링크</h2>'+p('<kbd>Ctrl</kbd>+<kbd>L</kbd>이나 '+a(2,'서식 도구 모음')+'의 '+img(3,'노트 링크 버튼')+'을 누르고 대상 노트를 선택합니다. 없는 제목을 입력하고 하위 노트 만들기 및 연결을 선택해 새로 만들 수도 있습니다.')+ul(['참조 링크 — 대상 노트의 제목과 아이콘을 표시합니다. 제목을 직접 바꿀 수 없으며 대상 노트의 제목이 바뀌면 자동 반영됩니다.','일반 링크 — 대상 노트와 다른 표시 글자를 자유롭게 지정할 수 있습니다.'])+p('두 번 클릭하면 노트를 엽니다. 마우스를 올리면 읽기 전용 미리보기를 확인할 수 있습니다.')+'<h2>붙여넣기</h2>'+p(a(3,'노트 트리')+'에서 노트를 복사한 뒤 본문에 붙이면 참조 링크가 됩니다. 글자를 선택한 상태에서 붙이면 일반 링크가 됩니다. 외부 주소도 글자 위에 붙여 링크로 바꿀 수 있습니다. 서식 있는 링크를 복사했다면 원래 표시 글자와 주소가 유지됩니다.')+'<h2>입력 중 연결</h2>'+p('<code>@</code> 뒤에 노트 제목 일부를 입력하면 자동 완성이 나타납니다. 원하는 노트를 선택하고 Enter를 누르세요.')+'<h2>노트 지도</h2>'+p('들어오는 링크와 나가는 링크는 '+a(4,'노트 지도')+'에서 시각적으로 확인할 수 있습니다.'),
144:({a})=>p(a(0,'스크립트')+'는 이벤트에 따라 실행할 수 있습니다. 노트에 관계로 연결하는 항목별 이벤트는 백엔드 JavaScript 코드 노트를 대상으로 합니다.')+'<h2>전체 이벤트</h2>'+p('<code>run</code> 라벨에 실행 시점을 지정합니다.')+ul(['<code>frontendStartup</code> — 일반 프런트엔드를 시작하거나 새로고침할 때 실행합니다.','<code>mobileStartup</code> — 모바일 프런트엔드를 시작하거나 새로고침할 때 실행합니다.','<code>backendStartup</code> — 백엔드를 시작할 때 실행합니다.','<code>hourly</code> — 백엔드에서 매시간 실행합니다. <code>runAtHour</code>로 특정 시각만 지정할 수 있습니다.','<code>daily</code> — 백엔드에서 하루에 한 번 실행합니다.'])+p('<code>runOnInstance</code>로 특정 '+a(1,'Trilium 인스턴스')+'에서만 실행하도록 지정할 수 있습니다. <code>runAtHour</code>는 <code>#run=hourly</code>와 함께 사용하며 여러 번 지정하면 하루에 여러 시각을 선택할 수 있습니다.')+'<h2>항목별 이벤트</h2>'+p('다음 '+a(2,'관계')+'를 노트에 직접 지정하거나 상속하면 관련 작업이 발생할 때 스크립트를 실행합니다.')+'<table><thead><tr><th>관계</th><th>실행 시점</th></tr></thead><tbody>'+[
['runOnNoteCreation','백엔드에서 노트를 만들 때입니다. 하위 트리의 모든 새 노트에 적용하려면 상위 노트에 관계를 지정하고 상속을 켭니다.'],['runOnChildNoteCreation','이 관계가 있는 노트 바로 아래에 새 노트를 만들 때입니다.'],['runOnNoteTitleChange','제목을 바꿀 때입니다. 노트 생성도 포함합니다.'],['runOnNoteContentChange','본문을 바꿀 때입니다. 노트 생성도 포함합니다.'],['runOnNoteChange','노트 속성을 변경할 때입니다. 생성은 포함하지만 본문 변경은 포함하지 않습니다.'],['runOnNoteDeletion','노트를 삭제할 때입니다.'],['runOnBranchCreation','상위 노트와 하위 노트 사이의 가지를 만들 때입니다. 복제나 이동 과정에서도 발생합니다.'],['runOnBranchChange','가지를 수정할 때입니다. 0.62부터 지원합니다.'],['runOnBranchDeletion','가지를 삭제할 때입니다. 이동할 때 기존 위치의 연결을 제거하는 경우도 포함합니다.'],['runOnAttributeCreation','해당 노트에 속성을 만들 때입니다.'],['runOnAttributeChange','해당 노트의 속성을 바꾸거나 삭제할 때입니다.']
].map(([k,v])=>'<tr><td><code>'+k+'</code></td><td>'+v+'</td></tr>').join('')+'</tbody></table>'
};