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