docs: 한글화 운영 적용본과 도움말 100개 작업 기록 보관
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -0,0 +1,29 @@
|
||||
import pathlib,shutil,subprocess,datetime,time,urllib.request
|
||||
target=pathlib.Path('/www/dk_project/dk_app/trilium/patched/main.cjs')
|
||||
source=pathlib.Path('/tmp/trilium-korean-release/main.cjs')
|
||||
text=source.read_text()
|
||||
# Static assets are mapped by Express from the SAME jg variable into public/src.
|
||||
# This is a URL prefix, not a new physical directory.
|
||||
assert 'jg=`assets/v${CR.version}-ko-20260905`' in text
|
||||
assert 'e.use(`/${jg}/src`,TQ(x2.default.join(n,"src")))' in text
|
||||
assert 'assetPath:jl' in text
|
||||
stamp=datetime.datetime.now().strftime('%Y%m%d-%H%M%S')
|
||||
backup=target.parent/('main.cjs.before-cache-fix-'+stamp)
|
||||
shutil.copy2(target,backup)
|
||||
try:
|
||||
target.write_bytes(source.read_bytes())
|
||||
subprocess.run(['docker','restart','trilium'],check=True,stdout=subprocess.DEVNULL)
|
||||
for attempt in range(20):
|
||||
try:
|
||||
with urllib.request.urlopen('http://127.0.0.1:18082/assets/v0.95.0-ko-20260905/src/layout_commons.js',timeout=3) as response:
|
||||
assert response.read(120).startswith(b'import triliumKoreanEditorTranslations')
|
||||
with urllib.request.urlopen('http://127.0.0.1:18082/api/health-check',timeout=3) as response: assert response.status==200
|
||||
print('Cache version fix verified. Backup: '+str(backup));break
|
||||
except Exception:
|
||||
if attempt==19:raise
|
||||
time.sleep(1)
|
||||
except Exception:
|
||||
target.write_bytes(backup.read_bytes())
|
||||
subprocess.run(['docker','restart','trilium'],check=True)
|
||||
print('Rolled back cache version fix')
|
||||
raise
|
||||
@@ -0,0 +1,46 @@
|
||||
import fs from 'node:fs';
|
||||
import crypto from 'node:crypto';
|
||||
import {translateProse} from './demo-prose.mjs';
|
||||
import {translateDiagram} from './demo-diagrams.mjs';
|
||||
import {translateStructured,translateCode} from './demo-structured.mjs';
|
||||
const b='work/trilium';
|
||||
const notes=JSON.parse(fs.readFileSync(b+'/scoped/notes.json'));
|
||||
const titles=JSON.parse(fs.readFileSync(b+'/demo-titles.json'));
|
||||
titles.Sequence='시퀀스 다이어그램';
|
||||
const simple=JSON.parse(fs.readFileSync(b+'/demo-simple.json'));
|
||||
Object.assign(simple,{
|
||||
'Bob likes to read popular science books so something like that…':'밥은 대중 과학서를 좋아하니 그런 책을 골라 보자.',
|
||||
'Main characters':'주요 등장인물','… here put main characters …':'주요 등장인물을 여기에 적습니다.','Plot':'줄거리','… describe main plot lines …':'주요 줄거리를 정리합니다.','Tone':'분위기','Genre':'장르','scifi / drama / romance':'과학소설 / 드라마 / 로맨스','Similar books':'비슷한 책','highlght 1':'인상 깊은 구절 1','my comment':'나의 생각','Carp of course!':'역시 잉어 요리지!',
|
||||
'This table shows notes with most revisions':'이전 버전이 많이 저장된 노트를 보여 줍니다.',
|
||||
'This table shows notes which are linked by other notes through relations':'다른 노트에서 관계로 연결한 횟수가 많은 노트를 보여 줍니다.',
|
||||
'This table shows 100 largest notes, including their revisions and attachments.':'이전 버전과 첨부 파일을 포함해 용량이 가장 큰 노트 100개를 보여 줍니다.',
|
||||
'Note':'노트','Revision count':'이전 버전 수','Relation count':'관계 수','Size':'용량','Attribute name':'속성 이름','Count':'개수','Clone count':'복제본 수','Note type':'노트 유형','Count (not deleted)':'현재 노트 수','Count (deleted)':'삭제된 노트 수','Word count:':'단어 수:','Character count:':'글자 수:'
|
||||
});
|
||||
const normalized=Object.fromEntries(Object.entries(simple).map(([k,v])=>[k.trim().replace(/\s+/g,' '),v.trim()]));
|
||||
function textNodes(c){return c.split(/(<[^>]*>)/).map((part,i)=>i%2?part:(normalized[part.trim().replace(/\s+/g,' ')]!==undefined?part.replace(/\S[\s\S]*\S|\S/,normalized[part.trim().replace(/\s+/g,' ')]):part)).join('')}
|
||||
const changes=[];const missing=[];
|
||||
for(const n of notes){
|
||||
let title=titles[n.title]||n.title;
|
||||
if(n.type==='code'&&title!==n.title){let label=title.replace(/[a-zA-Z0-9_.]+/g,'').trim()||'자바스크립트';title=label+' ('+n.title.replace(/[^a-z0-9_]/gi,'')+')';}
|
||||
let content=n.content;
|
||||
if(n.type==='text')content=textNodes(translateProse(n));
|
||||
if(n.type==='code'&&n.mime==='text/html')content=textNodes(content);
|
||||
if(n.type==='code'&&n.noteId==='SqPyuFmsgFMb')content=content.replace('Word count:','단어 수:').replace('Character count:','글자 수:');
|
||||
if(n.type==='code'&&n.noteId==='PUAIjmnDHzwt')content=content.replace('See explanation ','설명은 ').replace('>here<','>여기<').replace('</a></strong>.','</a>에서 확인하세요.</strong>');
|
||||
if(n.type==='code'&&n.noteId==='2Y8gtMg4lkeL')content=content.replace("title: 'New task'","title: '새 할 일'");
|
||||
if(n.type==='code'&&n.noteId==='LybeV4wPIF18')content=content.replace("'new task'","'새 할 일'");
|
||||
if(n.type==='code'&&n.noteId==='njPTYevnqFRO')content=content.replace('Weight (kg)','체중 (kg)');
|
||||
if(n.type==='code'&&n.noteId==='dq9PJyGEVMVu')content=content.replace('" bytes"','"바이트"');
|
||||
if(n.type==='code'&&['EW0u2LoAZTYv','C5fffQJ0Vzr1'].includes(n.noteId))content=content.replace("addRow('total'","addRow('합계'");
|
||||
if(n.type==='mermaid')content=translateDiagram(n);
|
||||
if(['mindMap','canvas'].includes(n.type))content=translateStructured(n);
|
||||
if(['code','text'].includes(n.type))content=translateCode(n,content);
|
||||
if(title!==n.title||content!==n.content){let o={noteId:n.noteId,oldTitle:n.title,title};if(content!==n.content){o.oldContentSha256=crypto.createHash('sha256').update(n.content||'').digest('hex');o.content=content}changes.push(o)}
|
||||
if(n.type==='text'){
|
||||
let text=content.replace(/<pre[\s\S]*?<\/pre>/g,'').replace(/<span class="math-tex">[\s\S]*?<\/span>/g,'').replace(/<[^>]*>/g,' ').replace(/https?:\/\/[^\s<]+/g,'').replace(/&\w+;/g,' ').replace(/\s+/g,' ');
|
||||
if(/[a-zA-Z]{3,} [a-zA-Z]{3,}/.test(text))missing.push({noteId:n.noteId,title,text});
|
||||
}
|
||||
}
|
||||
fs.writeFileSync(b+'/release/demo-migration.json',JSON.stringify({version:1,changes},null,2));
|
||||
fs.writeFileSync(b+'/demo-remaining.json',JSON.stringify(missing,null,2));
|
||||
console.log(JSON.stringify({changes:changes.length,remainingEnglishText:missing.length}));
|
||||
@@ -0,0 +1,32 @@
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import one from './docs-ko-001.mjs';
|
||||
import two from './docs-ko-002.mjs';
|
||||
import three from './docs-ko-003.mjs';
|
||||
import four from './docs-ko-004.mjs';
|
||||
import five from './docs-ko-005.mjs';
|
||||
import six from './docs-ko-006.mjs';
|
||||
import seven from './docs-ko-007.mjs';
|
||||
import eight from './docs-ko-008.mjs';
|
||||
const translations={...one,...two,...three,...four,...five,...six,...seven,...eight};
|
||||
const order=JSON.parse(fs.readFileSync('work/trilium/docs-order.json','utf8'));
|
||||
const base='work/trilium/scoped/doc_notes/en',out='work/trilium/release/doc_notes/en';
|
||||
const errors=[];
|
||||
const escape=s=>s.replaceAll('&','&').replaceAll('"','"').replaceAll('<','<');
|
||||
const assets=s=>[...s.matchAll(/\b(?:href|src)\s*=\s*["']([^"']+)["']/g)].map(m=>m[1]).sort();
|
||||
for(const [key,render]of Object.entries(translations)){
|
||||
const original=fs.readFileSync(base+'/'+order[key],'utf8');
|
||||
const anchors=[...original.matchAll(/<a\b([^>]*?)>([\s\S]*?)<\/a>/g)];
|
||||
const images=[...original.matchAll(/<img\b[^>]*>/g)];
|
||||
const pres=[...original.matchAll(/<pre\b[^>]*>[\s\S]*?<\/pre>/g)];
|
||||
const translated=render({
|
||||
a:(i,label)=>{if(!anchors[i])throw Error('Missing anchor '+key+':'+i);return '<a'+anchors[i][1]+'>'+label+'</a>';},
|
||||
img:(i,alt)=>{if(!images[i])throw Error('Missing image '+key+':'+i);return images[i][0].replace(/\s+alt\s*=\s*(?:"[^"]*"|'[^']*')/g,'').replace(/\s*\/?\s*>$/,' alt="'+escape(alt)+'">');},
|
||||
pre:i=>{if(!pres[i])throw Error('Missing code '+key+':'+i);return pres[i][0];}
|
||||
});
|
||||
if(JSON.stringify(assets(original))!==JSON.stringify(assets(translated)))errors.push({index:Number(key),path:order[key],reason:'Links or image references changed',original:assets(original),translated:assets(translated)});
|
||||
const dest=out+'/'+order[key];fs.mkdirSync(path.dirname(dest),{recursive:true});fs.writeFileSync(dest,translated+'\n');
|
||||
}
|
||||
fs.writeFileSync('work/trilium/docs-validation.json',JSON.stringify({translated:Object.keys(translations).length,total:order.length,errors},null,2));
|
||||
console.log(JSON.stringify({translated:Object.keys(translations).length,total:order.length,errors},null,2));
|
||||
if(errors.length)process.exitCode=1;
|
||||
@@ -0,0 +1,45 @@
|
||||
import fs from 'node:fs';
|
||||
import crypto from 'node:crypto';
|
||||
const b='work/trilium';
|
||||
let main=fs.readFileSync(b+'/scoped/main.cjs','utf8');
|
||||
const needle='vr.init(()=>{LN.checkHiddenSubtree()})';
|
||||
if(main.split(needle).length!==2)throw Error('Startup patch point mismatch');
|
||||
const migration=`
|
||||
function triliumApplyKoreanNotes(){
|
||||
const fs=require('fs'),crypto=require('crypto');
|
||||
const filename='/home/node/trilium-data/korean-notes-pending.json';
|
||||
if(!fs.existsSync(filename))return;
|
||||
const plan=JSON.parse(fs.readFileSync(filename,'utf8'));
|
||||
if(plan.version!==1||!Array.isArray(plan.changes))throw Error('Invalid Korean migration');
|
||||
const digest=s=>crypto.createHash('sha256').update(s||'').digest('hex');
|
||||
let applied=0,unchanged=0;
|
||||
de.transactional(()=>{
|
||||
for(const change of plan.changes){
|
||||
const note=J.getNoteOrThrow(change.noteId);
|
||||
const content=note.getContent();
|
||||
if(note.title===change.title&&(!('content' in change)||content===change.content)){unchanged++;continue;}
|
||||
if(note.isDeleted||note.isProtected||note.title!==change.oldTitle)throw Error('Korean migration title conflict: '+change.noteId);
|
||||
if(change.oldContentSha256&&digest(content)!==change.oldContentSha256)throw Error('Korean migration content conflict: '+change.noteId);
|
||||
}
|
||||
for(const change of plan.changes){
|
||||
const note=J.getNoteOrThrow(change.noteId),content=note.getContent();
|
||||
if(note.title===change.title&&(!('content' in change)||content===change.content))continue;
|
||||
const revision=new Mk({noteId:note.noteId,title:note.title,type:note.type,mime:note.mime,isProtected:note.isProtected,utcDateLastEdited:note.utcDateModified,utcDateCreated:kr.utcNowDateTime(),utcDateModified:kr.utcNowDateTime(),dateLastEdited:note.dateModified,dateCreated:kr.localNowDateTime()},true);
|
||||
revision.save();revision.setContent(content);
|
||||
note.title=change.title;note.save();
|
||||
if('content' in change)note.setContent(change.content);
|
||||
applied++;
|
||||
}
|
||||
});
|
||||
fs.renameSync(filename,filename+'.applied-'+Date.now());
|
||||
console.log('KOREAN_MIGRATION '+JSON.stringify({applied,unchanged}));
|
||||
}
|
||||
`;
|
||||
main=main.replace(needle,'vr.init(()=>{LN.checkHiddenSubtree();triliumApplyKoreanNotes()})');
|
||||
main=migration+main;
|
||||
if(!main.includes('jg=`assets/v${CR.version}`'))throw Error('Asset version patch point mismatch');
|
||||
main=main.replace('jg=`assets/v${CR.version}`','jg=`assets/v${CR.version}-ko-20260905`');
|
||||
fs.writeFileSync(b+'/release/main.cjs',main);
|
||||
const sources={};
|
||||
for(const [local,remote] of [['scoped/main.cjs','patched/main.cjs'],['layout_commons.js','patched/layout_commons.js'],['translation.ko.json','i18n_ko/translation.json']])sources[remote]=crypto.createHash('sha256').update(fs.readFileSync(b+'/'+local)).digest('hex');
|
||||
fs.writeFileSync(b+'/release/source-hashes.json',JSON.stringify(sources));
|
||||
@@ -0,0 +1,53 @@
|
||||
import fs from 'node:fs';
|
||||
const b='work/trilium';
|
||||
fs.mkdirSync(b+'/release',{recursive:true});
|
||||
let ko=JSON.parse(fs.readFileSync(b+'/translation.ko.json'));
|
||||
let overrides=JSON.parse(fs.readFileSync(b+'/ui-overrides.json'));
|
||||
function set(k,v){let keys=k.split('.'),o=ko;for(let p of keys.slice(0,-1))o=o[p];if(!(keys.at(-1) in o))throw Error(k);o[keys.at(-1)]=v}
|
||||
for(let[k,v]of Object.entries(overrides))set(k,v);
|
||||
for(let k of ['add_label.label_name_title','delete_label.label_name_title','rename_label.name_title','update_label_value.label_name_title','add_relation.allowed_characters','delete_relation.allowed_characters','rename_relation.allowed_characters','update_relation_target.allowed_characters'])set(k,'영문자와 숫자 및 콜론과 밑줄만 사용할 수 있습니다.');
|
||||
set('attribute_detail.print_page_size','PDF로 내보낼 때의 용지 크기입니다. A0~A6와 Legal 및 Letter를 지원합니다. Tabloid와 Ledger도 사용할 수 있습니다.');
|
||||
set('attribute_detail.title_template','하위 노트를 만들 때 사용할 기본 제목입니다. JavaScript 문자열로 처리되므로 <code>now</code>와 <code>parentNote</code> 변수를 사용할 수 있습니다.<ul><li><code>${parentNote.getLabelValue(\'authorName\')}의 작품</code></li><li><code>${now.format(\'YYYY-MM-DD HH:mm:ss\')} 기록</code></li></ul>자세한 내용은 <a href="https://triliumnext.github.io/Docs/Wiki/default-note-title.html">도움말</a>과 <a href="https://zadam.github.io/trilium/backend_api/Note.html">parentNote API</a> 및 <a href="https://day.js.org/docs/en/display/format">now API</a> 문서를 참고하세요.');
|
||||
fs.writeFileSync(b+'/release/translation.json',JSON.stringify(ko,null,2)+'\n');
|
||||
const official=await import('data:text/javascript;base64,'+fs.readFileSync(b+'/ckeditor.ko.official.js').toString('base64'));
|
||||
const dict=official.default.ko.dictionary;
|
||||
Object.assign(dict,{
|
||||
'Include note':'노트 포함','Keyboard shortcut':'단축키','Insert mermaid source code':'Mermaid 소스 코드 입력','Mermaid widget':'Mermaid 다이어그램','Mermaid toolbar':'Mermaid 도구 모음','Insert Mermaid diagram':'Mermaid 다이어그램 삽입','Read more about Mermaid diagram syntax':'Mermaid 다이어그램 문법 도움말','Equation preview':'수식 미리 보기','Insert equation in TeX format.':'TeX 형식으로 수식을 입력하세요.','Display mode':'표시 방식','Insert math':'수식 삽입','Code block copied to clipboard':'코드 블록을 클립보드에 복사했습니다.','No code block selected or found.':'선택한 코드 블록이 없거나 코드 블록을 찾을 수 없습니다.','Unable to find code block element to copy from.':'복사할 코드 블록을 찾을 수 없습니다.',
|
||||
'Editor toolbar':'편집 도구 모음','Text formatting':'글자 서식','Italic':'기울임','Paragraph':'본문','Bulleted List':'글머리 기호 목록','Numbered List':'번호 목록','To-do List':'체크리스트','Show more items':'도구 더 보기','Font Size':'글자 크기','Font Color':'글자 색상','Font Background Color':'글자 배경색','Remove Format':'서식 지우기','Text Alternative':'대체 텍스트','Block quote':'인용문','Widget toolbar':'위젯 도구 모음',
|
||||
'Keystrokes that can be used when a widget is selected (for example: image, table, etc.)':'이미지나 표 등의 위젯을 선택했을 때 사용할 수 있는 단축키',
|
||||
'Move focus between form fields (inputs, buttons, etc.)':'입력란과 버튼 사이에서 초점 이동',
|
||||
'Move focus to the toolbar, navigate between toolbars':'도구 모음으로 초점 이동 또는 도구 모음 사이 이동',
|
||||
'Move focus to the menu bar, navigate between menu bars':'메뉴 모음으로 초점 이동 또는 메뉴 모음 사이 이동',
|
||||
'Close contextual balloons, dropdowns, and dialogs':'팝업과 펼침 메뉴 및 대화상자 닫기',
|
||||
'Rich Text Editor':'서식 있는 텍스트 편집기','Rich Text Editor. Editing area: %0':'서식 있는 텍스트 편집기. 편집 영역: %0',
|
||||
'TeX':'TeX','Mermaid':'Mermaid','Copy':'복사','Preview':'미리 보기','Source':'소스','Cancel':'취소','Save':'저장'
|
||||
});
|
||||
Object.assign(dict,{'Admonition':'안내 상자','Insert table':'표 삽입','Insert code block':'코드 블록 삽입','Code block':'코드 블록','Rich Text Editor. Editing area: %0':'서식 있는 본문 편집기'});
|
||||
fs.writeFileSync(b+'/release/ckeditor-ko.js','/* CKEditor 45.2.0 Korean translations. Copyright CKSource. See https://ckeditor.com/legal/ckeditor-licensing-options */\nexport default '+JSON.stringify({ko:{dictionary:dict}})+';\n');
|
||||
let layout=fs.readFileSync(b+'/layout_commons.js','utf8');
|
||||
if((layout.match(/clipboard:\{copy:ib\},language:"en"/g)||[]).length!==1)throw Error('Unexpected editor language occurrences');
|
||||
layout='import triliumKoreanEditorTranslations from "./ckeditor-ko.js";\n'+layout.replace('clipboard:{copy:ib},language:"en"','clipboard:{copy:ib},language:"ko",translations:triliumKoreanEditorTranslations').replace('a.language:"en",content:l','a.language:"ko",content:l');
|
||||
layout=layout.replace('label:"Text formatting"','label:"글자 서식"').replace('title:"Block align"','title:"블록 정렬"');
|
||||
layout=layout.replace('new e({theme:this.themeStyle,onChange:','new e({langCode:"ko-KR",theme:this.themeStyle,onChange:');
|
||||
layout=layout.replace('new this.MindElixir({el:this.$content[0],direction:','new this.MindElixir({locale:"ko",el:this.$content[0],direction:');
|
||||
const mindKo={addChild:'하위 항목 추가',addParent:'상위 항목 추가',addSibling:'같은 단계의 항목 추가',removeNode:'항목 삭제',focus:'집중 모드',cancelFocus:'집중 모드 해제',moveUp:'위로 이동',moveDown:'아래로 이동',link:'연결',clickTips:'연결할 항목을 클릭하세요',font:'글자 색상',background:'배경색',tag:'태그',icon:'아이콘',tagsSeparate:'태그를 쉼표로 구분하세요',iconsSeparate:'아이콘을 쉼표로 구분하세요',url:'웹페이지 주소',memo:'메모',summary:'요약'};
|
||||
layout=layout.replace('Yn={cn:vf,','Yn={ko:'+JSON.stringify(mindKo)+',cn:vf,');
|
||||
layout=layout.replace('new URL("en.json",import.meta.url)','new URL("emoji-ko.json",import.meta.url)');
|
||||
fs.writeFileSync(b+'/release/layout_commons.js',layout);
|
||||
let editor=fs.readFileSync(b+'/ckeditor5.js','utf8');
|
||||
editor=editor.replace('s9={note:{title:"Note"},tip:{title:"Tip"},important:{title:"Important"},caution:{title:"Caution"},warning:{title:"Warning"}}','s9={note:{title:"참고"},tip:{title:"도움말"},important:{title:"중요"},caution:{title:"주의"},warning:{title:"경고"}}');
|
||||
fs.writeFileSync(b+'/release/ckeditor5.js',editor);
|
||||
let mind=fs.readFileSync(b+'/MindElixir.js','utf8');
|
||||
mind=mind.replace(/ko:\{addChild:"자식 추가"[^}]+\}/,'ko:'+JSON.stringify(mindKo));
|
||||
for(const[k,v]of Object.entries({'Bidirectional Link':'양방향 연결','Can not remove root node':'최상위 항목은 삭제할 수 없습니다','Custom Link':'사용자 지정 연결','No selected node.':'선택한 항목이 없습니다.','Can not select root node.':'최상위 항목은 선택할 수 없습니다.','Please select nodes in the same main topic.':'같은 주제에 속한 항목을 선택하세요.'}))mind=mind.replaceAll(JSON.stringify(k),JSON.stringify(v));
|
||||
fs.writeFileSync(b+'/release/MindElixir.js',mind);
|
||||
const rawEmoji=JSON.parse(fs.readFileSync(b+'/emoji-en.json'));
|
||||
const cldr={...JSON.parse(fs.readFileSync(b+'/emoji-cldr-ko.json')).annotations.annotations,...JSON.parse(fs.readFileSync(b+'/emoji-cldr-derived-ko.json')).annotationsDerived.annotations};
|
||||
const canon=s=>s.replace(/\uFE0F/g,'');
|
||||
const emojiMap=Object.fromEntries(Object.entries(cldr).map(([k,v])=>[canon(k),v]));
|
||||
const missingEmoji=[];
|
||||
function localizeEmoji(items){for(const item of items){const found=emojiMap[canon(item.emoji)];if(found){item.annotation=found.tts[0].replace(/, /g,' · ');item.tags=found.default||[];}else missingEmoji.push({emoji:item.emoji,annotation:item.annotation});if(item.skins)localizeEmoji(item.skins)}}
|
||||
localizeEmoji(rawEmoji);
|
||||
fs.writeFileSync(b+'/release/emoji-ko.json',JSON.stringify(rawEmoji));
|
||||
fs.writeFileSync(b+'/emoji-missing.json',JSON.stringify(missingEmoji,null,2));
|
||||
console.log(JSON.stringify({uiOverrides:Object.keys(overrides).length+10,editorTranslations:Object.keys(dict).length}));
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,102 @@
|
||||
export function translateDiagram(n){
|
||||
switch(n.noteId){
|
||||
case '2lpgmasyYDzj':return `sequenceDiagram
|
||||
participant Alice as 앨리스
|
||||
participant John as 존
|
||||
participant Bob as 밥
|
||||
Alice->>John: 존 안녕? 잘 지내?
|
||||
loop 건강 확인
|
||||
John->>John: 건강에 대한 걱정 떨치기
|
||||
end
|
||||
Note right of John: 합리적으로 생각하자!
|
||||
John-->>Alice: 잘 지내!
|
||||
John->>Bob: 너는 어때?
|
||||
Bob-->>John: 아주 좋아!
|
||||
`;
|
||||
case 'AKehCOdmh8N4':return `mindmap
|
||||
root((마인드맵))
|
||||
기원
|
||||
오랜 역사
|
||||
::icon(fa fa-book)
|
||||
대중화
|
||||
영국의 대중 심리학 저술가 토니 부잔
|
||||
연구
|
||||
효과와 특징
|
||||
자동 생성
|
||||
활용
|
||||
창의적 발상
|
||||
전략 수립
|
||||
논증 구조 정리
|
||||
도구
|
||||
펜과 종이
|
||||
Mermaid
|
||||
`;
|
||||
case 'H9buVO01mMRb':return `gantt
|
||||
section 작업
|
||||
완료된 작업 :done, des1, 2014-01-06,2014-01-08
|
||||
진행 중인 작업 :active, des2, 2014-01-07, 3d
|
||||
병렬 작업 1 :des3, after des1, 1d
|
||||
병렬 작업 2 :des4, after des1, 1d
|
||||
병렬 작업 3 :des5, after des3, 1d
|
||||
병렬 작업 4 :des6, after des4, 1d
|
||||
`;
|
||||
case 'VzyZ9ykt9htN':return `journey
|
||||
title 나의 근무일
|
||||
section 출근
|
||||
차 끓이기: 5: 나
|
||||
위층으로 이동: 3: 나
|
||||
일하기: 1: 나, 고양이
|
||||
section 퇴근
|
||||
아래층으로 이동: 5: 나
|
||||
앉아서 쉬기: 3: 나
|
||||
`;
|
||||
case 'W5T6rJy0WKmY':return `graph TD
|
||||
A[사각형] -->|연결 문구| B(둥근 사각형)
|
||||
B --> C{판단}
|
||||
C -->|첫 번째| D[결과 1]
|
||||
C -->|두 번째| E[결과 2]
|
||||
`;
|
||||
case 'Z56PMxIxGueC':return 'pie\n"개" : 386\n"고양이" : 85\n"쥐" : 15\n';
|
||||
case 'bp1FVvjsJB0V':return `erDiagram
|
||||
고객 }|..|{ 배송지 : 보유
|
||||
고객 ||--o{ 주문 : 주문함
|
||||
고객 ||--o{ 청구서 : 지불책임
|
||||
배송지 ||--o{ 주문 : 수령
|
||||
청구서 ||--|{ 주문 : 청구대상
|
||||
주문 ||--|{ 주문항목 : 포함
|
||||
상품분류 ||--|{ 상품 : 분류
|
||||
상품 ||--o{ 주문항목 : 주문됨
|
||||
`;
|
||||
case 'iP3r5W4tQFLb':return `stateDiagram-v2
|
||||
state "정지" as Still
|
||||
state "이동" as Moving
|
||||
state "충돌" as Crash
|
||||
[*] --> Still
|
||||
Still --> [*]
|
||||
Still --> Moving
|
||||
Moving --> Still
|
||||
Moving --> Crash
|
||||
Crash --> [*]
|
||||
`;
|
||||
}
|
||||
let c=n.content;
|
||||
const map={
|
||||
'System Context diagram for Internet Banking System':'인터넷뱅킹 시스템의 구성',
|
||||
'Banking Customer A':'은행 고객 A','Banking Customer B':'은행 고객 B','Banking Customer C':'은행 고객 C','Banking Customer D':'은행 고객 D',
|
||||
'A customer of the bank, with personal bank accounts.':'개인 계좌를 보유한 은행 고객입니다.',
|
||||
'Internet Banking System':'인터넷뱅킹 시스템','Allows customers to view information about their bank accounts, and make payments.':'계좌 정보를 확인하고 결제할 수 있습니다.',
|
||||
'A customer of the bank, <br/> with personal bank accounts.':'개인 계좌를 보유한<br/>은행 고객입니다.',
|
||||
'Mainframe Banking System':'메인프레임 뱅킹 시스템','Stores all of the core banking information about customers, accounts, transactions, etc.':'고객과 계좌 및 거래에 관한 핵심 정보를 저장합니다.',
|
||||
'BankBoundary2':'은행 내부 영역 2','BankBoundary3':'은행 내부 영역 3','BankBoundary':'은행 내부 영역',
|
||||
'Banking System A':'은행 시스템 A','Banking System B':'은행 시스템 B','A system of the bank, with personal bank accounts.':'개인 계좌를 관리하는 은행 시스템입니다.',
|
||||
'E-mail system':'전자우편 시스템','The internal Microsoft Exchange e-mail system.':'내부 Microsoft Exchange 전자우편 시스템입니다.',
|
||||
'Banking System D Database':'은행 시스템 D 데이터베이스','Banking System F Queue':'은행 시스템 F 대기열','Banking System G Queue':'은행 시스템 G 대기열',
|
||||
'Sends e-mails to':'전자우편 발송 대상','Sends e-mails':'전자우편 발송','Uses':'사용','"boundary"':'"영역"',
|
||||
'Git Issues - days since last update':'Git 이슈 — 마지막 수정 후 경과 일수','section Issue':'section 이슈 ',
|
||||
'Guarantee':'보증','User attributes':'사용자 속성','Master data':'기준 데이터','Exchange Rate':'환율','Profit Centers':'수익 부서','Vendor Partners':'공급 협력사','Work Situation':'업무 현황','Customer':'고객',
|
||||
'Cool':'멋진 관계','Where am i?':'현재 위치는?',
|
||||
'branch develop':'branch 개발','checkout main':'checkout main'
|
||||
};
|
||||
if(n.type==='mermaid')for(let[k,v]of Object.entries(map))c=c.replaceAll(k,v);
|
||||
return c;
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
// Full Korean prose. Link targets and non-text structure are retained by helpers.
|
||||
export function translateProse(note){
|
||||
let c=note.content||'';
|
||||
const anchors=[...c.matchAll(/<a\b([^>]*)>([\s\S]*?)<\/a>/g)].map(m=>({attrs:m[1],text:m[2]}));
|
||||
const a=(i,text)=>{if(!anchors[i])throw Error('missing anchor '+note.noteId+':'+i);return '<a'+anchors[i].attrs+'>'+text+'</a>'};
|
||||
const p=s=>'<p>'+s+'</p>';
|
||||
const paragraphs=arr=>{let i=0;return c.replace(/<p\b[^>]*>[\s\S]*?<\/p>/g,old=>arr[i]===undefined?(i++,old):p(arr[i++]));};
|
||||
const first=s=>{let firstP=c.match(/<p\b[^>]*>([\s\S]*?)<\/p>/)[1];let foot=firstP.match(/<span\s+class="footnote-reference"[\s\S]*$/)?.[0]||'';return c.replace(/<p\b[^>]*>[\s\S]*?<\/p>/,p(s+foot));};
|
||||
switch(note.noteId){
|
||||
case '2WPW8XuNCa5O':return '<ul><li>Super 키를 길게 누르면 실행 도구 모음과 단축키가 표시됩니다.</li><li>Super 키를 누른 채 1부터 9 또는 0을 누르면 해당 앱을 열거나 그 앱으로 이동합니다. 숫자는 실행 도구 모음의 위쪽부터 나열된 아이콘 순서입니다.<ul><li>Shift 키를 함께 누르면 이미 실행 중인 앱의 새 창을 엽니다.</li><li>대시 화면을 열지 않고 실행 도구 모음으로 이동할 때도 키를 길게 누르면 편리합니다.</li></ul></li><li>Super + T — 휴지통을 엽니다.</li><li>Alt + F1 — 실행 도구 모음으로 초점을 옮깁니다. 방향키로 이동한 뒤 Enter를 누르면 앱이 실행됩니다. 앱에 빠른 실행 목록이 있으면 오른쪽 방향키로 펼칠 수 있습니다.</li><li>Ctrl + Alt + T — 터미널 창을 엽니다.</li></ul>';
|
||||
case '3aJm04cq98Xt':return [
|
||||
'메마른 골짜기를 따라 바다로 흘러가는 빗방울처럼 그의 몸은 고통의 굴곡을 감지하고 힘없이 그 경사를 따라갔다. 잭스를 떠미는 것은 중력이 아니라 연금술의 강제력이었다. 그는 인간의 변덕이 파 놓은 골짜기를 따라 걷잡을 수 없이 굴러가는 바위가 되었다.',
|
||||
'자유 의지는 진공과 같았다. 무엇인가가 빠져나간 빈자리였다. 강요가 없고 강제가 없고 고통이 없는 상태였다.',
|
||||
'압도적이었다. 그는 원하는 것은 무엇이든 할 수 있었다. 하지만 무엇이든 할 수 있다는 가능성을 모두 더한 결과는 아무것도 하지 못한다는 것이었다. 자유의 지형에는 그를 떠밀어 줄 경사도 길을 알려 줄 이정표도 없었다. 인간은 어떻게 스스로 방향을 잡는 걸까? 무엇을 해야 하고 무엇을 하지 말아야 하는지 어떻게 아는 걸까? 깨어 있는 동안 모든 행동의 우선순위를 정해 주는 게아스와 메타게아스도 없이 언제 무엇을 해야 하는지 어떻게 아는 걸까? 누가 할 일을 지시하지 않는데도 어떻게 하루하루의 삶을 꾸려 가는 걸까?',
|
||||
'노예의 삶은 말로 다 할 수 없었다. 잠깐이나마 자유를 맛본 노예의 삶은 상상조차 할 수 없었다. 클래커는 연금술 때문에 복잡한 게아스를 짊어졌다. 인간도 무거운 의무를 짊어지고 있었지만 그것을 문화라고 불렀다. 사회라고 불렀다.'
|
||||
].map(s=>'<blockquote>'+p(s)+'</blockquote>').join('');
|
||||
case '6zGuLZ6EgMtN':return paragraphs([
|
||||
'위키백과: '+a(0,'신뢰할 수 있는 타임스탬프'),
|
||||
'보조의 기술 블로그: '+a(1,'Java에서 신뢰할 수 있는 타임스탬프 사용하기'),
|
||||
'<strong>신뢰할 수 있는 타임스탬프</strong>는 문서의 생성 시각과 수정 시각을 '+a(2,'안전하게')+' 기록하는 절차입니다. 여기서 안전하다는 것은 타임스탬프를 발급하는 시스템의 무결성이 유지되는 한 기록이 끝난 뒤에는 문서 소유자를 포함한 누구도 그 시각을 바꿀 수 없어야 한다는 뜻입니다.',
|
||||
'운영 측면에서는 타임스탬프를 수집하고 처리하며 갱신할 수 있는 신뢰할 만한 관리 기반 시설을 구축해야 합니다. 이 기반 시설은 누구나 이용할 수 있어야 합니다.'
|
||||
]);
|
||||
case '7ClNUW83JOLe':return paragraphs(['<strong>Node.js</strong>는 브라우저 밖에서 '+a(2,'JavaScript')+' 코드를 실행하는 '+a(3,'실행 환경')+'입니다. '+a(0,'오픈 소스')+'로 제공되며 '+a(1,'여러 운영체제에서 사용할 수 있습니다')+'. 개발자는 JavaScript로 명령줄 도구를 만들거나 '+a(4,'서버 측 스크립트')+'를 작성할 수 있습니다. 서버 측 스크립트는 사용자의 브라우저로 페이지를 보내기 전에 서버에서 실행되어 '+a(5,'동적 웹페이지')+'의 내용을 만듭니다.']);
|
||||
case '8wxJN0J6VKyI':return paragraphs(['Node.js는 '+a(0,'라이언 달')+'이 2009년에 처음 만들었습니다.'+a(1,'[24]')+' 넷스케이프의 라이브와이어 프로 웹이라는 초기 서버 측 JavaScript 환경이 등장한 지 약 13년 뒤였습니다.'+a(2,'[25]')+' 최초 버전은 Linux와 Mac OS X만 지원했습니다. 달이 개발과 유지보수를 이끌었고 이후에는 '+a(3,'Joyent')+'가 후원했습니다.'+a(4,'[26]')]);
|
||||
case 'A2chnjfm2Lsp':return paragraphs([a(0,'《블랙 스완》 소개'),'<em><strong>블랙 스완: 극히 일어나기 어려운 사건이 미치는 영향</strong></em>은 과거 '+a(1,'옵션 거래자')+'로 일한 작가 '+a(2,'나심 니콜라스 탈레브')+'가 2007년에 펴낸 책입니다. 드물고 예측하기 어려운 '+a(3,'예외적 사건')+'이 미치는 막대한 영향과 그런 사건이 벌어진 뒤 단순한 설명을 붙이려는 인간의 성향을 다룹니다. 탈레브는 이를 '+a(4,'블랙 스완 이론')+'이라고 부릅니다.']);
|
||||
case 'AJq0qJ04ejku':return first('브라질 리우데자네이루를 내려다보는 '+a(1,'코르코바두산')+' 정상에는 '+a(0,'구세주 그리스도상')+'이 서 있습니다. 높이 30미터의 이 기념물은 브라질을 대표하는 상징입니다. '+a(2,'폴란드계 프랑스 조각가 폴 란도프스키가 1920년대에 설계')+'한 거대한 공공 조형물을 브라질 공학자 에이토르 다 시우바 코스타와 프랑스 공학자 알베르 카코가 1931년에 완성했습니다. '+a(3,'철근 콘크리트로 만들고')+' 600만 개가 넘는 동석 타일을 입힌 이 조각상은 세계에서 가장 큰 '+a(4,'아르데코')+' 조각입니다. 제1차 세계대전이 끝난 뒤 세상이 깊은 상처를 입은 시기에 세워져 기독교와 희망을 상징했습니다.');
|
||||
case 'EUFHVXneqbx5':return first(a(0,'만리장성')+'은 중국의 옛 북쪽 국경을 따라 수천 킬로미터에 걸쳐 이어진 거대한 방벽입니다. 수천 년 동안 축조된 장성의 시작은 기원전 7세기까지 거슬러 올라갑니다. 당시에는 '+a(1,'유목민의 습격을 막기 위해')+' 여러 지역에 비교적 작은 성벽을 쌓았습니다. 기원전 220년에 중국의 첫 황제 '+a(2,'진시황')+'은 흩어진 성벽을 하나로 연결하는 사업을 추진했습니다. 북방의 침입을 막기 위해 성벽을 보강하고 확장했습니다.');
|
||||
case 'HPalPupDqMGJ':return paragraphs(['<strong>Bash</strong>는 '+a(0,'유닉스 셸')+'이자 '+a(1,'명령 언어')+'입니다. '+a(2,'브라이언 폭스')+'가 '+a(3,'GNU 프로젝트')+'를 위해 '+a(5,'본 셸')+'을 대체할 '+a(4,'자유 소프트웨어')+'로 개발했습니다. 1989년에 처음 공개된 뒤 대부분의 '+a(7,'Linux')+' 배포판과 '+a(8,'애플')+'의 '+a(9,'macOS')+'에서 기본 '+a(6,'로그인')+' 셸로 널리 사용되었습니다. '+a(10,'Windows 10에서도 사용할 수 있는 버전')+'이 있습니다.',a(11,'위키백과의 Bash 소개')]);
|
||||
case 'JfRGxD2Yl7Lw':return first('요르단 남부의 고대 도시 '+a(0,'페트라')+'는 바위의 따뜻한 빛깔 때문에 장밋빛 도시라고도 불립니다. 그 역사는 기원전 312년까지 거슬러 올라갑니다. 외딴 계곡에 자리한 이 도시는 아랍계 나바테아인이 세웠습니다. 이들은 주변 암벽을 깎아 아름다운 건축물과 복잡한 수로를 만들 만큼 발달한 문명을 이루었습니다. 페트라는 번성하는 교역 중심지로 성장해 막대한 부를 쌓고 인구도 크게 늘었지만 훗날 지진으로 큰 피해를 입었습니다.');
|
||||
case 'K7ubChwTqcjt':return '<h3>로그인 셸</h3>'+p('Bash가 로그인 셸로 시작되면 먼저 <code>/etc/profile</code>을 읽고 실행합니다. 이어서 <code>~/.bash_profile</code>과 <code>~/.bash_login</code> 및 <code>~/.profile</code>을 차례로 확인해 읽을 수 있는 첫 번째 파일을 실행합니다.')+p('로그인 셸이 종료될 때 <code>~/.bash_logout</code> 파일이 있으면 그 안의 명령을 실행합니다.')+p('로그인 셸 모드를 따로 두는 이유는 사용자가 처음 로그인할 때만 필요한 작업과 환경 변수 설정이 있기 때문입니다. 그래서 유닉스 셸에는 로그인 모드가 필요합니다.')+p('<strong>로그인 셸로 시작하는 방법</strong>')+'<ul><li><code>argv[0]</code>의 첫 글자가 하이픈(-)인 경우입니다. 전통적인 유닉스 셸은 login 프로그램을 통해 이렇게 시작됩니다.</li><li><code>-l</code> 옵션으로 Bash를 실행합니다.</li><li><code>--login</code> 옵션으로 Bash를 실행합니다.</li></ul>'+p('<strong>로그인 셸인지 확인하는 방법</strong>')+'<ul><li>'+a(0,'login_shell')+' 셸 옵션이 설정되어 있는지 확인합니다.</li></ul>'+p('<strong>관련 옵션</strong>')+'<ul><li><code>--noprofile</code>을 지정하면 모든 프로필 파일을 읽지 않습니다.</li></ul><h3>대화형 셸</h3>'+p('Bash가 로그인 셸이 아닌 대화형 셸로 시작되면 <code>~/.bashrc</code>의 명령을 읽고 실행합니다. 예를 들어 별칭은 상위 셸에서 상속되지 않으므로 각 셸에서 정의할 수 있도록 이 파일에 넣는 것이 좋습니다.')+p('시스템 전체에 적용되는 <code>/etc/bash.bashrc</code> 또는 이와 비슷한 설정 파일은 공급자나 배포판에서 수정한 Bash에 따라 지원 여부가 다릅니다. 전통적인 방법은 각 사용자의 <code>~/.bashrc</code>에서 <code>/etc/bashrc</code>를 불러오는 것입니다.')+p('<strong>대화형 셸인지 확인하는 방법</strong>')+'<ul><li>특수 매개변수 <code>$-</code>에 소문자 <code>i</code>가 포함되어 있는지 확인합니다.</li></ul>'+p('<strong>관련 옵션</strong>')+'<ul><li><code>-i</code>는 대화형 모드로 실행합니다.</li><li><code>--norc</code>는 <code>~/.bashrc</code>와 지원되는 시스템 시작 파일을 읽지 않습니다.</li><li><code>--rcfile</code>은 기본 시작 파일 대신 다른 파일을 지정합니다.</li></ul><h3>sh 호환 모드</h3>'+p('Bash는 sh 호환 모드에서 POSIX 표준을 따르면서 오래된 sh의 시작 동작을 최대한 재현합니다. 로그인 셸이면 <code>/etc/profile</code>과 <code>~/.profile</code>을 읽습니다.')+p('로그인 셸이 아니면 환경 변수 '+a(1,'ENV')+'의 값을 해석해 얻은 파일 이름을 시작 파일로 사용합니다.')+p('시작 파일을 읽은 뒤에는 '+a(2,'POSIX 호환 실행 모드')+'로 전환합니다. 이 모드는 시작 과정이 아니라 명령 실행에 적용됩니다.')+p('<strong>sh 호환 모드로 시작하는 조건</strong>')+'<ul><li><code>argv[0]</code>의 기본 파일 이름이 <code>sh</code>인 경우입니다. <code>/bin/sh</code>가 <code>/bin/bash</code>를 가리키더라도 일반 Bash와 똑같이 동작하는 것은 아닙니다.</li></ul>';
|
||||
case 'Les04WQwgFxW':return paragraphs(['Node.js에서는 '+a(1,'JavaScript')+'와 핵심 기능을 제공하는 여러 모듈을 이용해 '+a(0,'웹서버')+'와 네트워크 도구를 만들 수 있습니다.'+[2,3,4,5,6].map(i=>a(i,anchors[i].text)).join('')+' 모듈은 '+a(7,'파일 시스템')+' 입출력을 비롯해 '+a(8,'DNS')+'와 '+a(9,'HTTP')+' 및 '+a(10,'TCP')+' 같은 네트워크 기능을 제공합니다. '+a(11,'TLS/SSL')+'과 '+a(12,'UDP')+'도 지원합니다. 그 밖에 버퍼를 이용한 '+a(13,'바이너리 데이터')+' 처리와 '+a(14,'암호화')+' 및 '+a(15,'데이터 스트림')+' 등 다양한 핵심 기능을 제공합니다.'+[16,17,18].map(i=>a(i,anchors[i].text)).join('')+' 이러한 모듈의 API는 서버 애플리케이션을 더 간단하게 작성할 수 있도록 설계되었습니다.'+[19,20].map(i=>a(i,anchors[i].text)).join('')]);
|
||||
case 'LzN9kXj9lckq':return paragraphs(['무척 재미있게 읽었다. 작가가 대화와 묘사에 공을 들이다 보니 때로는 전개가 느리다. 설정은 매우 흥미롭지만 더 깊게 다뤄 주지 않은 점은 아쉽다. 예를 들어 하위헌스와 관련된 클래커 기술의 역사와 발전 과정이나 스피노자가 이 이야기에 어떻게 연결되는지 궁금했다. 나머지 두 권을 위해 남겨 둔 내용일지도 모르겠다.','작가가 폭넓은 어휘를 사용해서 영어가 모국어가 아닌 독자에게는 처음에 문장이 어렵게 느껴질 수 있다. 다행히 조금 읽다 보면 문체에 익숙해져 한결 수월해진다.']);
|
||||
case 'Q8PtvZKwyiBS':return paragraphs(['<span class="text-big">우주왕복선 디스커버리</span>의 궤도선 식별 번호는 <code>OV-103</code>입니다. NASA 우주왕복선 계획에서 실제 운용 가능한 형태로 완성된 다섯 궤도선 중 세 번째 기체입니다. 첫 임무인 STS-41-D는 1984년 8월 30일부터 9월 5일까지 진행되었습니다. 27년간 운용되면서 <span style="background-color:hsl(60,75%,60%);">39차례 발사와 착륙</span>을 수행해 원문 작성 당시 다른 어떤 우주선보다 많은 우주 비행 기록을 세웠습니다. 우주왕복선은 궤도선과 중앙 연료 탱크 및 두 개의 보조 로켓으로 구성됩니다. 궤도선을 덮은 약 <span style="background-color:hsl(120,75%,60%);">2만 5천 개의 내열 타일</span>은 대기권 재진입 때 발생하는 고온으로부터 기체를 보호합니다.','디스커버리는 컬럼비아와 챌린저에 이어 세 번째로 운용에 들어간 궤도선입니다. <span style="color:hsl(270,75%,60%);">2011년 2월 24일에 마지막 임무인 STS-133을 시작</span>했으며 3월 9일 케네디 우주센터에 마지막으로 착륙했습니다. 우주에 머문 시간을 모두 합하면 거의 1년에 이릅니다. 과학 연구와 국제우주정거장 조립 임무를 수행했고 허블 우주망원경을 궤도로 운반하기도 했습니다.']);
|
||||
case 'SBzfvGlDr57r':return first('인도 아그라의 야무나강 기슭에는 흰 대리석으로 지은 아름다운 묘당 '+a(0,'타지마할')+'이 있습니다. 이름은 페르시아어로 궁전의 왕관을 뜻하며 세계 7대 불가사의 중 하나로 선정되었습니다. 무굴 제국의 황제 '+a(1,'샤 자한')+'은 1631년 출산 중 세상을 떠난 사랑하는 아내 뭄타즈 마할을 기리기 위해 이 묘당을 세웠습니다. 중앙의 대리석 묘당을 둘러싼 약 17헥타르의 부지에는 정원과 모스크 및 영빈관과 연못이 조성되어 있습니다.');
|
||||
case 'USEHdGknRYoS':return first(a(0,'마추픽추')+'는 페루의 성스러운 계곡을 내려다보는 안데스산맥 높은 곳에 자리한 15세기의 유적입니다. 오랫동안 잊혀 있던 이 성채는 콜럼버스 이전 시대의 유적 가운데 거의 온전한 모습으로 발견된 드문 사례입니다. 광장과 사원 및 계단식 경작지와 주거지의 흔적이 남아 있습니다. 고고학자들은 1450년 무렵 '+a(1,'잉카 황제 파차쿠티')+'의 거처로 지어졌다고 봅니다. 매끈하게 다듬은 돌을 모르타르 없이 맞물려 쌓은 벽이 특징입니다.');
|
||||
case 'VY3TZfeVrTG7':return first('멕시코 유카탄주 내륙에 있는 '+a(0,'치첸이트사')+'는 9~12세기에 건설된 역사적인 '+a(1,'마야')+' 도시입니다. 콜럼버스 이전 시대의 마야계 '+a(2,'이트사족')+'이 세운 이곳에는 여러 기념물과 사원이 남아 있습니다. 가장 유명한 건축물은 쿠쿨칸 신전이라고도 불리는 '+a(3,'엘 카스티요')+'입니다. 도시 중심에 자리한 거대한 계단식 피라미드로 쿠쿨칸 신을 모시기 위해 지어졌습니다.');
|
||||
case 'XHxfAez5yL7L':return first(a(0,'콜로세움')+'은 로마 중심부에 있는 거대한 타원형 '+a(1,'원형 경기장')+'입니다. 한때 '+a(2,'검투사들이 목숨을 걸고 싸우며')+' 관중을 즐겁게 했던 장소입니다. 서기 72년부터 80년까지 8년에 걸쳐 모래와 돌로 지었으며 지금까지 건설된 원형 경기장 가운데 가장 큰 규모입니다. 중앙 무대를 둥글게 에워싼 관람석에는 최대 8만 명을 수용할 수 있었습니다. 이곳에서는 검투 경기뿐 아니라 고전 연극과 동물 사냥 및 처형 등 극적이고 때로는 끔찍한 행사가 열렸습니다. 경기장에 물을 채워 '+a(3,'나우마키아')+'라고 부르는 모의 해전을 벌였다는 이야기도 있습니다.');
|
||||
case 'b9yJwiBeOUrS':return paragraphs(['간단한 할 일 관리 예제입니다. 사용 방법과 구성은 '+a(0,'할 일 관리 도움말')+'에서 확인할 수 있습니다.','스크립트 작성 방법을 보여 주기 위한 예제입니다. 기능 추가와 오류 수정에 대한 지원은 제한적입니다.']);
|
||||
case 'epQLc7F5XSSE':return paragraphs(['코드 블록을 사용하면 텍스트 노트 안에 짧은 코드를 넣을 수 있습니다. 필요에 따라 자동 줄 바꿈을 켜거나 끌 수 있습니다.','코드 블록은 문법에 따라 색상을 구분해 표시합니다. 처음 만들면 프로그래밍 언어를 자동으로 감지합니다. 감지 결과가 맞지 않으면 직접 언어를 선택할 수 있습니다. 문법 강조 색상은 설정에서 바꿀 수 있습니다.','긴 코드를 작성할 때는 코드 노트를 사용하는 편이 좋습니다. 코드 노트에는 CodeMirror 편집기가 제공됩니다. '+a(0,'사용자 지정 요청 처리기')+'에서 코드 노트 예제를 확인할 수 있습니다.']).replace('alert("Hello world")','alert("안녕하세요")');
|
||||
case 'iI7WMuc3JWBE':return paragraphs(['Node.js에는 수천 개의 오픈 소스 라이브러리가 있으며 대부분 '+a(0,'npm')+'에 등록되어 있습니다. 원문 작성 당시 개발자 커뮤니티는 두 개의 주요 메일링 리스트와 '+a(2,'freenode')+'의 '+a(1,'IRC')+' 채널 <code>#node.js</code>를 사용했습니다.']);
|
||||
case 'iktTbXUysByR':return paragraphs(['원문에서 소개하는 Node.js 출시 방식은 다음과 같습니다. 6개월마다 '+a(0,'GitHub')+'의 master 브랜치에서 새 주 버전을 분리합니다. 짝수 버전은 4월에 출시하고 홀수 버전은 10월에 출시합니다. 새 홀수 버전이 나오면 직전 짝수 버전이 장기 지원(LTS) 단계로 전환됩니다. LTS로 지정된 날부터 18개월 동안 적극적인 지원을 제공합니다.']);
|
||||
case 'tvhCqQ46phWm':return paragraphs(['<strong>마지막 질문</strong>은 미국 작가 '+a(2,'아이작 아시모프')+'의 '+a(0,'과학소설')+' '+a(1,'단편')+'입니다. 1956년 11월호 '+a(3,'《사이언스 픽션 쿼털리》')+'에 처음 실렸습니다.','이 페이지는 다음 두 가지 기능을 보여 줍니다.']).replace('possibility to ','').replace('include one note into another','다른 노트를 본문에 포함하기').replace('PDF preview - you can read PDFs directly in Trilium!','PDF 미리 보기 — Trilium 안에서 PDF를 바로 읽을 수 있습니다.');
|
||||
case 'uixDvTBXMvwV':return paragraphs(['Node.js는 '+a(1,'웹서버')+'에 '+a(0,'이벤트 기반 프로그래밍')+'을 도입해 JavaScript로 빠른 웹서버를 만들 수 있게 합니다.'+a(2,'[31]')+' 개발자는 작업이 끝났을 때 콜백으로 알리는 단순한 '+a(4,'이벤트 기반 모델')+'을 사용하므로 직접 '+a(3,'스레드')+'를 다루지 않고도 확장 가능한 서버를 만들 수 있습니다.'+a(5,'[31]')]);
|
||||
case 'w6PuTy73hxRz':return paragraphs(['<strong>Linux의 역사</strong>는 1991년 '+a(0,'핀란드')+' 학생 '+a(1,'리누스 토르발스')+'가 새로운 자유 운영체제 커널을 만들기 위해 시작한 개인 프로젝트에서 출발합니다. 이후 '+a(2,'Linux 커널')+'은 꾸준히 성장했습니다. 1991년에 처음 공개한 '+a(3,'소스 코드')+'는 상업적 배포를 금지하는 라이선스가 적용된 소수의 '+a(4,'C')+' 파일로 이루어져 있었습니다. 2015년의 4.2.3 버전은 '+a(5,'GNU 일반 공중 사용 허가서')+' 2판에 따라 배포되며 코드가 1천8백만 줄을 넘었습니다.']);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
[]
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"This is a place I use to put notes waiting for better categorization":"아직 분류하지 않은 노트를 잠시 모아 두는 곳입니다.",
|
||||
"Here I'd keep various notes related to my work's projects etc.":"업무 프로젝트와 관련된 노트를 모아 두는 곳입니다.",
|
||||
"Maybe CodeNames? ":"코드네임은 어떨까? ",
|
||||
"HR stuff":"인사 업무 관련 내용",
|
||||
"How to be a stoic from Massimo Pigliuci:":"마시모 피글리우치의 《스토아 철학자가 되는 법》:",
|
||||
"This christmas is going to be awesome!":"이번 크리스마스는 정말 즐거울 것 같다!",
|
||||
"TODO:":"할 일:",
|
||||
"Planning stuff etc.":"휴가 계획과 준비 사항",
|
||||
"Bla bla bla ...":"통화 내용을 여기에 적어 두자.",
|
||||
"Candles":"양초",
|
||||
"Portable speakers":"휴대용 스피커",
|
||||
"Miscellaneous notes done on monday ...":"월요일에 적어 둔 여러 가지 메모",
|
||||
"Interesting video: ":"흥미로운 영상: ",
|
||||
"25. 12., 26. 12., 1. 1. - statutory holidays":"공휴일: 12월 25일과 26일 및 1월 1일",
|
||||
"27. 12. - 29. 12., 2. 1. - vacation days":"휴가: 12월 27~29일과 1월 2일",
|
||||
"That was fun!":"정말 즐거웠다!",
|
||||
"cucumber":"오이","cheese":"치즈","beer":"맥주",
|
||||
"Just in time for new years resolution!":"새해 다짐을 실천하기에 딱 좋은 때다!",
|
||||
"You can read some explanation on how this journal works here: ":"일지 사용 방법은 다음 문서에서 확인할 수 있습니다: ",
|
||||
"bla bla...":"관련 절차를 여기에 정리합니다.",
|
||||
"bla bla bla...":"회의 내용을 여기에 정리합니다.",
|
||||
"Checkout Kindle daily deals: ":"킨들 오늘의 할인 도서 확인: ",
|
||||
"Cixin Liu - ":"류츠신 — ","The Dark Forest":"암흑의 숲","Ann Leckie - ":"앤 레키 — ","Ancillary Sword":"보조 검",
|
||||
"Bought a book!":"책을 샀다!",
|
||||
"Expand note on the left pane to see content.":"왼쪽 노트 트리에서 이 노트를 펼치면 하위 내용을 볼 수 있습니다.",
|
||||
"Create easy TODO-lists with checkboxes:":"체크박스로 할 일 목록을 간단하게 만들어 보세요.",
|
||||
"buy milk ":"우유 사기 ","do the laundry ":"빨래하기 ","watch TV ":"텔레비전 보기 ","eat ice cream ":"아이스크림 먹기 ",
|
||||
"Some math examples:":"수식 예제:","Another:":"다른 예제:","Inline math is also possible: ":"문장 안에도 수식을 넣을 수 있습니다: ",
|
||||
"Epic is kind of medium-term events or projects spread over days or months.":"장기 일정은 며칠에서 몇 달에 걸쳐 진행하는 행사나 프로젝트를 모아 두는 곳입니다.",
|
||||
"Remember that Trilium is all free form so you can organise your stuff in whatever way you'd like.":"Trilium에는 정해진 정리 방식이 없습니다. 자신에게 편한 방식으로 자유롭게 구성해 보세요.",
|
||||
"Monday":"월요일","Tuesday":"화요일","Wednesday":"수요일","Thursday":"목요일","Friday":"금요일","P.E.":"체육","Math":"수학","Computer Science":"컴퓨터 과학","History":"역사","English":"영어","Physics":"물리","Chemistry":"화학","Physics Lab":"물리 실험","Geography":"지리","Latin":"라틴어","School schedule":"학교 시간표",
|
||||
"Documentation: ":"도움말: ",
|
||||
"What Are the 7 Wonders of the World? (with HD Images) | TheCollector":"세계 7대 불가사의 소개 — 고화질 사진 포함 | TheCollector"
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
const words={
|
||||
'Mind Map Core':'마인드맵 엔진','What is Mind Elixir':'Mind Elixir 소개','A mind map core':'마인드맵을 만드는 엔진','Free':'무료','Open-Source':'오픈 소스','Use without JavaScript framework':'별도 JavaScript 프레임워크 없이 사용','Use in your own project':'내 프로젝트에 적용','Easy to use':'쉬운 사용법','Use it like other mind map application':'다른 마인드맵 앱처럼 사용할 수 있습니다','Basics':'기본 조작','tab - Create a child node':'Tab — 하위 항목 만들기','enter - Create a sibling node':'Enter — 같은 단계의 항목 만들기','del - Remove a node':'Delete — 항목 삭제','Focus mode':'집중 모드','Right click and select Focus Mode':'마우스 오른쪽 버튼을 누르고 집중 모드 선택','Right click and select Cancel Focus Mode':'마우스 오른쪽 버튼을 누르고 집중 모드 해제 선택','Left menu':'왼쪽 메뉴','Node distribution':'항목 배치','Left':'왼쪽','Right':'오른쪽','Both l & r':'양쪽','Bottom menu':'아래쪽 메뉴','Full screen':'전체 화면','Return to Center':'중앙으로 이동','Zoom in':'확대','Zoom out':'축소','Link':'연결','Right click and select Link':'마우스 오른쪽 버튼을 누르고 연결 선택','Click the target you want to link':'연결할 대상 항목 클릭','Modify link with control points':'조절점을 움직여 연결선 수정','Node style':'항목 모양','Font Size':'글자 크기','Font Color':'글자 색상','Background Color':'배경색','Add tags':'태그 추가','Completed':'완료','Add icons':'아이콘 추가','Bolder':'굵게','Hyper link':'웹페이지 링크','Draggable':'끌어서 이동','Drag a node to another node\nand the former one will become a child node of latter one':'항목을 다른 항목 위로 끌어 놓으면\n그 항목의 하위 항목으로 이동합니다','Export data':'데이터 내보내기','Caution':'주의 사항','Only save manually':'직접 저장해야 합니다','Save button in the top-right corner':'오른쪽 위의 저장 버튼','Render':'화면으로 표시','summary':'요약',
|
||||
'convert':'변환','List :\n- one\n- two':'목록:\n- 하나\n- 둘','Rotated text':'회전한 글자','> some code':'> 코드 예제','Big text':'큰 글자'
|
||||
};
|
||||
export function translateStructured(n){
|
||||
const obj=JSON.parse(n.content);
|
||||
function walk(o){
|
||||
if(!o||typeof o!=='object')return;
|
||||
for(const [k,v] of Object.entries(o)){
|
||||
if(['text','originalText','topic','label'].includes(k)&&typeof v==='string'&&words[v])o[k]=words[v];
|
||||
else if(k==='tags'&&Array.isArray(v))o[k]=v.map(s=>words[s]||s);
|
||||
else if(typeof v==='object')walk(v);
|
||||
}
|
||||
}
|
||||
walk(obj);
|
||||
if(n.type==='canvas')for(const e of obj.elements.filter(e=>e.type==='text')){e.fontFamily=2;e.height=e.text.split('\n').length*e.fontSize*1.25;e.width=Math.max(e.width,...e.text.split('\n').map(s=>[...s].reduce((a,c)=>a+(/[가-힣]/.test(c)?e.fontSize:e.fontSize*.6),0)));e.version++;}
|
||||
return JSON.stringify(obj);
|
||||
}
|
||||
export function translateCode(n,c){
|
||||
const replacements={
|
||||
'This is a demo of how you can create custom theme for Trilium. You can activate it by going':'Trilium의 사용자 지정 테마를 만드는 예제입니다. 설정의 화면 모양 항목에서',
|
||||
'into options in first tab "Appearance".':'이 테마를 선택하면 적용됩니다.',
|
||||
'You can read some details on theming here:':'테마에 관한 자세한 내용:',
|
||||
'This will be used as main UI font (see below)':'화면의 기본 글꼴로 사용합니다. 아래 설정을 참고하세요.',
|
||||
'This will be used as text content font (see below)':'본문의 기본 글꼴로 사용합니다. 아래 설정을 참고하세요.',
|
||||
'Garamond is subjectively smaller':'Garamond는 시각적으로 작게 느껴집니다',
|
||||
'will add a launcher to the left sidebar':'왼쪽 사이드바에 실행 버튼을 추가합니다',
|
||||
'creating notes is backend (server) responsibility so we need to pass':'노트 생성은 서버에서 처리하므로 실행을 서버로 넘깁니다.',
|
||||
'the control there':'서버에서 새 노트를 만든 뒤 노트 ID를 돌려줍니다.',
|
||||
'wait until the frontend is fully synced with the changes made on the backend above':'서버에서 변경한 내용이 화면에 모두 동기화될 때까지 기다립니다',
|
||||
'we got an ID of newly created note and we want to immediatelly display it':'새로 만든 노트의 ID를 이용해 바로 화면에 표시합니다',
|
||||
'This defines a custom widget which displays number of words and characters in a current text note.':'현재 텍스트 노트의 단어 수와 글자 수를 표시하는 사용자 지정 위젯입니다.',
|
||||
"To be activated for a given note, add label 'wordCount' to the note, you can also make it inheritable and thus activate it for the whole subtree.":"노트에 'wordCount' 라벨을 추가하면 작동합니다. 상속을 켜면 하위 노트 전체에 적용됩니다.",
|
||||
'See it in action in "Books" and its subtree.':'책 노트와 그 하위 노트에서 작동하는 모습을 확인할 수 있습니다.',
|
||||
'higher value means position towards the bottom/right':'값이 클수록 아래쪽 또는 오른쪽에 배치됩니다',
|
||||
'get plain text only':'서식 없는 텍스트만 가져옵니다',
|
||||
'One of the tagRootNote, doneRootNote or todoRootNote does not exist':'태그 또는 완료 목록 또는 할 일 목록의 기준 노트를 찾을 수 없습니다.',
|
||||
'One or both dates - ${todoDate}, ${doneDate} - is outside of expected range':'날짜가 허용 범위를 벗어났습니다. 예정일: ${todoDate} / 완료일: ${doneDate}',
|
||||
'To activate this demo, comment (or remove) the very first line of this code note.':'이 예제를 사용하려면 첫 번째 줄을 주석으로 바꾸거나 제거해야 합니다.',
|
||||
'This is deactivated because custom request handler like this one can be a security risk.':'이러한 사용자 지정 요청 처리기는 보안 위험이 있을 수 있어 기본적으로 작동하지 않도록 해 두었습니다.',
|
||||
'To test this, execute the following curl request:':'시험하려면 다음 curl 요청을 실행합니다:',
|
||||
'(host and port might have to be adjusted based on your setup)':'(서버 주소와 포트는 사용 환경에 맞게 조정하세요)',
|
||||
'See https://github.com/zadam/trilium/wiki/Custom-request-handler for details.':'자세한 내용: https://github.com/zadam/trilium/wiki/Custom-request-handler',
|
||||
'notes must be saved somewhere in the tree hierarchy specified by a parent note.':'노트는 상위 노트로 지정한 위치 아래에 저장해야 합니다.',
|
||||
'This is defined by a relation from this code note to the "target" parent note':'이 코드 노트에서 저장 대상 상위 노트를 가리키는 관계로 지정합니다.',
|
||||
'alternetively you can just use constant noteId for simplicity (get that from "Note Info" dialog of the desired parent note)':'간단히 고정된 noteId를 사용해도 됩니다. 대상 상위 노트의 노트 정보에서 확인할 수 있습니다.',
|
||||
'# This script opens 4 terminal windows.':'# 터미널 창 네 개를 여는 스크립트입니다.'
|
||||
};
|
||||
for(let[k,v]of Object.entries(replacements))c=c.replaceAll(k,v);
|
||||
return c;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"Inbox":"임시 보관함","Projects":"프로젝트","Dentist appointment":"치과 예약","Geo Map (The Seven Wonders of the World)":"지도 — 세계 7대 불가사의","Steel Blue":"강철빛 파랑","template":"템플릿","Buy a board game for Alice":"앨리스에게 줄 보드게임 사기","Unity shortcuts":"유니티 단축키","Create Launcher":"실행 버튼 만들기","Weight Tracker":"체중 기록","HR":"인사 업무","Sequence":"순서도","TODO":"할 일","Book to read":"읽을 책","Highlights":"인상 깊은 구절","While loop":"while 반복문","Formatting examples":"서식 예제","C4":"C4 구조도","Christmas":"크리스마스","Trusted timestamping":"신뢰할 수 있는 타임스탬프","Intro":"소개","Day template":"일일 노트 템플릿","work":"업무","Vacation":"휴가","History":"역사","Phone call about work project":"업무 프로젝트 관련 통화","23 - Saturday":"23일 토요일","Maybe Black Swan?":"블랙 스완은 어떨까?","Christ the Redeemer, Brazil":"브라질의 구세주 그리스도상","Mind Map":"마인드맵","Christmas gift ideas":"크리스마스 선물 아이디어","renderTable":"표 표시","Bar chart":"막대그래프","christmas":"크리스마스","mall":"쇼핑몰","11 - November":"11월","18 - Monday":"18일 월요일","Statistics":"통계","The Great Wall of China":"중국의 만리장성","Security":"보안","Photos from the trip":"여행 사진","Note Types":"노트 유형","24 - Sunday - Christmas Eve!":"24일 일요일 — 크리스마스이브!","Vacation days":"휴가 일정","Gantt":"간트 차트","Bash scripting":"Bash 스크립트","Send invites for christmas party":"크리스마스 파티 초대장 보내기","Petra, Jordan":"요르단의 페트라","Bash startup modes":"Bash 실행 모드","Christmas dinner":"크리스마스 저녁 식사","Overview":"개요","Locations":"장소","createNewTask":"새 할 일 만들기","The Mechanical":"기계인간","Buy some book for Bob":"밥에게 줄 책 사기","Book template":"도서 기록 템플릿","20 - Wednesday":"20일 수요일","Implementation":"구현","Mermaid Diagrams":"Mermaid 다이어그램","Tags":"태그","Highlighting":"강조 표시","renderPieChart":"원형 차트 표시","12 - December":"12월","The Taj Mahal, India":"인도의 타지마할","health":"건강","Word count widget":"단어 수 위젯","22 - Friday":"22일 금요일","tesco":"테스코","Machu Picchu, Peru":"페루의 마추픽추","Most edited notes":"수정이 잦은 노트","21 - Thursday":"21일 목요일","Chichén Itzá, Mexico":"멕시코의 치첸이트사","reconcileAssignments":"할 일 분류 동기화","Journey":"여정도","Flow":"흐름도","Office party":"직장 파티","Done":"완료","30 - Thursday":"30일 목요일","The Colosseum, Rome, Italy":"이탈리아 로마의 콜로세움","shopping":"쇼핑","Pie":"원형 차트","19 - Tuesday":"19일 화요일","Christmas shopping":"크리스마스 쇼핑","Canvas":"캔버스","Programming":"프로그래밍","Work":"업무","Task manager":"할 일 관리","gym":"체육관","Entity Relationship":"개체 관계도","Largest notes":"용량이 큰 노트","Books":"책","Grocery list for today":"오늘 장볼 목록","Code blocks":"코드 블록","Buy milk":"우유 사기","attribute changed":"속성 변경 처리","State":"상태도","Industry support":"개발 생태계","Releases":"출시 주기","School schedule":"학교 시간표","Get a gym membership":"체육관 등록하기","Journal":"일지","Processes":"절차","To read":"읽고 싶은 책","Tech":"기술","Checkbox lists":"체크리스트","JS code":"JavaScript 코드","Attribute count":"속성별 노트 수","Math":"수식","Most linked notes":"링크가 많은 노트","Custom request handler":"사용자 지정 요청 처리기","task template":"할 일 템플릿","Flow (ELK)":"흐름도 — ELK 배치","Note type count":"유형별 노트 수","The Last Question by Issac Asimov.pdf":"아이작 아시모프의 마지막 질문.pdf","groceries":"식료품","The Last Question":"마지막 질문","Platform architecture":"플랫폼 구조","Epics":"장기 일정","28 - Tuesday":"28일 화요일","Most cloned notes":"복제본이 많은 노트","Reviews":"서평","Git":"Git 이력도","Meeting minutes":"회의록","Scripting examples":"스크립트 예제","js":"JavaScript","CSS":"CSS 스타일","Class":"클래스 다이어그램"
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
import pathlib,subprocess,datetime,shutil,time,urllib.request,hashlib,json
|
||||
base=pathlib.Path('/www/dk_project/dk_app/trilium')
|
||||
release=pathlib.Path('/tmp/trilium-korean-ui-phase2')
|
||||
files={'translation.json':'i18n_ko/translation.json','layout_commons.js':'patched/layout_commons.js','ckeditor-ko.js':'patched/ckeditor-ko.js','ckeditor5.js':'patched/ckeditor5.js','MindElixir.js':'patched/MindElixir.js','emoji-ko.json':'patched/emoji-ko.json'}
|
||||
compose=base/'docker-compose.yml'
|
||||
before=compose.read_text()
|
||||
anchor=' - ./patched/layout_commons.js:/usr/src/app/public/src/layout_commons.js:ro'
|
||||
assert anchor in before
|
||||
main=base/'patched/main.cjs'
|
||||
oldmain=main.read_text()
|
||||
oldprefix='jg=`assets/v${CR.version}-ko-20260905`'
|
||||
newprefix='jg=`assets/v${CR.version}-ko-20260905-r2`'
|
||||
assert oldprefix in oldmain
|
||||
assert 'e.use(`/${jg}/src`,TQ(x2.default.join(n,"src")))' in oldmain
|
||||
for src in files:
|
||||
assert (release/src).is_file() and (release/src).stat().st_size>100
|
||||
assert not (base/'data/korean-notes-pending.json').exists(), 'Pending data migration must finish first'
|
||||
stamp=datetime.datetime.now().strftime('%Y%m%d-%H%M%S')
|
||||
backup=base/'backups'/('before-korean-ui-phase2-'+stamp)
|
||||
backup.mkdir(parents=True,mode=0o700)
|
||||
targets=list(files.values())+['patched/main.cjs','docker-compose.yml']
|
||||
existing=[]
|
||||
for rel in targets:
|
||||
target=base/rel
|
||||
if target.exists():
|
||||
dest=backup/rel;dest.parent.mkdir(parents=True,exist_ok=True);shutil.copy2(target,dest);existing.append(rel)
|
||||
(backup/'manifest.json').write_text(json.dumps({'existing':existing,'targets':targets}))
|
||||
after=before
|
||||
for name in ['ckeditor5.js','MindElixir.js','emoji-ko.json']:
|
||||
mount=' - ./patched/'+name+':/usr/src/app/public/src/'+name+':ro'
|
||||
if mount not in after:after=after.replace(anchor,anchor+'\n'+mount)
|
||||
try:
|
||||
for src,rel in files.items():(base/rel).write_bytes((release/src).read_bytes())
|
||||
main.write_text(oldmain.replace(oldprefix,newprefix))
|
||||
compose.write_text(after)
|
||||
subprocess.run(['docker','compose','-f',str(compose),'config','--quiet'],check=True)
|
||||
subprocess.run(['docker','compose','-f',str(compose),'up','-d','--no-deps','trilium'],check=True)
|
||||
for attempt in range(25):
|
||||
try:
|
||||
with urllib.request.urlopen('http://127.0.0.1:18082/api/health-check',timeout=3) as response:assert response.status==200
|
||||
for src in ['layout_commons.js','ckeditor-ko.js','ckeditor5.js','MindElixir.js','emoji-ko.json']:
|
||||
url='http://127.0.0.1:18082/assets/v0.95.0-ko-20260905-r2/src/'+src
|
||||
with urllib.request.urlopen(url,timeout=5) as response:
|
||||
assert hashlib.sha256(response.read()).digest()==hashlib.sha256((release/src).read_bytes()).digest(),src
|
||||
print(json.dumps({'status':'verified','backup':str(backup),'servedAssets':5}));break
|
||||
except Exception:
|
||||
if attempt==24:raise
|
||||
time.sleep(1)
|
||||
except Exception:
|
||||
for rel in existing:(base/rel).write_bytes((backup/rel).read_bytes())
|
||||
subprocess.run(['docker','compose','-f',str(compose),'up','-d','--no-deps','trilium'],check=True)
|
||||
print('Restored previous files and compose configuration from '+str(backup))
|
||||
raise
|
||||
@@ -0,0 +1,29 @@
|
||||
import pathlib,json,hashlib,subprocess,sqlite3,datetime,shutil
|
||||
base=pathlib.Path('/www/dk_project/dk_app/trilium')
|
||||
release=pathlib.Path('/tmp/trilium-korean-release')
|
||||
for name,expected in json.loads((release/'source-hashes.json').read_text()).items():
|
||||
actual=hashlib.sha256((base/name).read_bytes()).hexdigest()
|
||||
if actual!=expected: raise RuntimeError('Source changed: '+name)
|
||||
stamp=datetime.datetime.now().strftime('%Y%m%d-%H%M%S')
|
||||
backup=base/'backups'/('before-korean-apply-'+stamp)
|
||||
backup.mkdir(mode=0o700,parents=True)
|
||||
sqlite3.connect(f'file:{base}/data/document.db?mode=ro',uri=True).backup(sqlite3.connect(backup/'document.db'))
|
||||
subprocess.run(['tar','-czf',str(backup/'patches.tar.gz'),'-C',str(base),'patched','i18n_ko','docker-compose.yml'],check=True)
|
||||
for src,dest in [('translation.json','i18n_ko/translation.json'),('layout_commons.js','patched/layout_commons.js'),('ckeditor-ko.js','patched/ckeditor-ko.js'),('main.cjs','patched/main.cjs')]:
|
||||
(base/dest).write_bytes((release/src).read_bytes())
|
||||
plan=base/'data/korean-notes-pending.json'
|
||||
plan.write_bytes((release/'demo-migration.json').read_bytes())
|
||||
stat=(base/'data/document.db').stat()
|
||||
import os
|
||||
os.chown(plan,stat.st_uid,stat.st_gid)
|
||||
os.chmod(plan,0o600)
|
||||
compose=base/'docker-compose.yml'
|
||||
text=compose.read_text()
|
||||
old=' - ./patched/layout_commons.js:/usr/src/app/public/src/layout_commons.js:ro'
|
||||
if old not in text: raise RuntimeError('Compose layout mount not found')
|
||||
new=' - ./patched/ckeditor-ko.js:/usr/src/app/public/src/ckeditor-ko.js:ro'
|
||||
if new not in text:text=text.replace(old,old+'\n'+new)
|
||||
compose.write_text(text)
|
||||
subprocess.run(['docker','compose','-f',str(compose),'config','--quiet'],check=True)
|
||||
subprocess.run(['docker','compose','-f',str(compose),'up','-d','--no-deps','trilium'],check=True)
|
||||
print(json.dumps({'backup':str(backup),'status':'deployed'}))
|
||||
@@ -0,0 +1,7 @@
|
||||
import fs from 'node:fs';
|
||||
const base='work/trilium/scoped/doc_notes/en';
|
||||
const paths=JSON.parse(fs.readFileSync('work/trilium/docs-list.json'));
|
||||
const rows=paths.map(p=>({path:p,content:fs.readFileSync(base+'/'+p,'utf8')})).sort((a,b)=>a.content.length-b.content.length);
|
||||
const start=Number(process.argv[2]||0),count=Number(process.argv[3]||30);
|
||||
for(const [index,row]of rows.slice(start,start+count).entries())console.log('\n### '+(start+index)+' '+row.path.replaceAll('\\','/')+'\n'+row.content);
|
||||
fs.writeFileSync('work/trilium/docs-order.json',JSON.stringify(rows.map(r=>r.path.replaceAll('\\','/')),null,2));
|
||||
@@ -0,0 +1,31 @@
|
||||
const p=s=>'<p>'+s+'</p>';
|
||||
export default {
|
||||
0:()=>'',1:()=>'',2:()=>'',
|
||||
3:()=>p('공유 중인 노트를 모두 확인할 수 있습니다.'),
|
||||
4:()=>p('이 실행 버튼의 단축키는 설정 → 단축키에서 지정할 수 있습니다.'),
|
||||
5:()=>p('사용자 스크립트가 만든 데이터를 보관하는 전용 하위 트리입니다. 스크립트의 데이터는 숨겨진 시스템 트리의 다른 위치에 임의로 만들지 말고 이곳에 저장하세요.'),
|
||||
6:({a})=>p(a(0,'TriliumNext 문제 보고 페이지')+'에서 새 이슈를 만드는 버튼을 누르세요.')+p('오류를 보고하려면 오류 보고 양식을 선택한 뒤 자세한 내용을 작성하세요.'),
|
||||
7:()=>p('일부 변경 사항은 바로 적용되지 않습니다. 이때는 애플리케이션을 직접 새로고침해야 합니다.')+p('<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>R</kbd>을 누르면 새로고침할 수 있습니다.'),
|
||||
8:()=>p('뒤로 가기와 앞으로 가기 버튼으로 이전에 열었던 노트 사이를 이동할 수 있습니다.')+p('이 실행 버튼은 데스크톱 앱에서만 작동합니다. 서버 버전에서는 웹브라우저의 뒤로 가기와 앞으로 가기 버튼을 사용하세요.'),
|
||||
9:()=>p('숨겨진 트리는 일반적으로 화면에 표시할 필요가 없는 애플리케이션 내부 데이터를 보관합니다.')+p('이곳의 구조와 역할을 이해한 상태에서만 수정하세요. 잘못 수정하면 애플리케이션이 작동하지 않을 수 있습니다.'),
|
||||
10:({img})=>p('Trilium 0.52 버전부터 사용할 수 있습니다.')+p('캔버스 노트는 Excalidraw를 사용합니다. 마우스와 펜 또는 터치로 무한한 캔버스 위에 필기할 수 있습니다. 간단한 도표와 글자 및 그림을 넣는 기능도 제공합니다.')+p(img(0,'캔버스 노트 예시')),
|
||||
11:({a})=>p(a(0,'빠른 검색창')+'은 가로 배치에서만 별도 항목으로 표시됩니다. 세로 배치에서는 기본적으로 보이기 때문입니다.')+p('자세한 내용은 '+a(1,'세로 배치와 가로 배치')+'를 참고하세요.'),
|
||||
12:({a})=>p('Leaflet은 '+a(0,'지도 노트')+'에 사용하는 라이브러리입니다.')+'<h2>플러그인</h2>'+p('외부 플러그인을 이용해 기능을 폭넓게 확장할 수 있습니다.')+p('현재 다음 플러그인을 사용합니다:')+'<ul><li>'+a(1,'leaflet-gpx — Leaflet에서 GPX 경로를 표시하는 플러그인')+'</li></ul>',
|
||||
13:()=>p('간격을 넣으면 실행 버튼들을 눈에 띄게 구분할 수 있습니다. 주요 속성에서 다음 값을 설정하세요.')+'<ul><li><code>baseSize</code> — 공간이 충분할 때 사용할 기본 크기입니다. 단위는 픽셀입니다.</li><li><code>growthFactor</code> — 0으로 설정하면 기본 크기를 유지합니다. 양수로 설정하면 남는 공간에 맞춰 늘어납니다.</li></ul>',
|
||||
14:()=>p('사용자 지정 위젯을 만들어 원하는 내용을 표시할 수 있습니다. 다음 위치 중 하나에 배치하세요.')+'<ul><li><code>left-pane</code> — 왼쪽 영역</li><li><code>center-pane</code> — 가운데 영역</li><li><code>note-detail-pane</code> — 가운데 영역 안에서 각 노트의 본문에 해당하는 영역입니다. 화면을 분할한 경우 각 노트에 따로 적용됩니다.</li><li><code>right-pane</code> — 오른쪽 영역</li></ul>',
|
||||
15:({a})=>p('Trilium은 이미 개발된 여러 라이브러리를 활용해 다양한 '+a(0,'노트 유형')+'을 지원합니다.')+p('하위 문서에서는 사용 중인 기술을 소개합니다. Trilium의 작동 방식을 이해하는 데 도움을 주고 각 기술을 만든 개발자들의 기여를 알리기 위한 문서입니다.'),
|
||||
16:({a,img})=>p('전체 메뉴에서는 화면 확대 비율과 창을 항상 위에 표시하는 옵션 등 현재 창의 동작을 설정할 수 있습니다. 여러 고급 기능에도 접근할 수 있습니다.')+p(img(0,'전체 메뉴'))+'<h2>전체 메뉴 열기</h2>'+p('선택한 화면 배치에 따라 메뉴 위치가 달라집니다. '+a(0,'세로 배치와 가로 배치')+'를 참고하세요.'),
|
||||
17:({a})=>p(a(0,'Excalidraw')+'는 '+a(1,'캔버스 노트')+'에 사용하는 기술입니다. 소스 코드는 '+a(2,'GitHub')+'에서 확인할 수 있습니다.')+p('수정하지 않은 원본 라이브러리를 사용하므로 원본에 알려진 '+a(3,'문제')+'가 여기에도 나타날 수 있습니다.'),
|
||||
18:({img})=>p('자주 사용하는 노트를 북마크에 등록하면 빠르게 열 수 있습니다. 아래 예시를 참고하세요.')+p(img(0,'북마크 등록과 사용'))+'<h2>북마크 폴더</h2>'+p('왼쪽 영역의 공간은 한정되어 있습니다. 여러 노트를 등록하려면 폴더를 북마크로 지정해 그 안의 노트를 펼쳐 보는 방법이 있습니다.')+p(img(1,'북마크 폴더'))+p('폴더로 사용할 노트에 <code>#bookmarkFolder</code> 라벨을 추가하세요.'),
|
||||
19:()=>p('스크립트 실행 버튼은 <code>~script</code> 관계로 연결된 코드 노트를 실행합니다.')+'<ol><li><code>script</code> — 버튼을 눌렀을 때 실행할 스크립트 노트를 가리키는 관계입니다.</li><li><code>keyboardShortcut</code> — 필요할 때 지정하는 단축키입니다. 단축키를 누르면 스크립트를 실행합니다.</li></ol><h4>스크립트 예제</h4><pre>api.showMessage("현재 노트: " + api.getActiveContextNote().title);</pre>',
|
||||
20:({a,img})=>p('텍스트 노트 안에 다른 노트를 읽기 전용 위젯으로 포함할 수 있습니다. 예를 들어 스크립트와 HTML 표시 노트로 만든 동적 차트를 본문 안에 넣을 수 있습니다.')+'<h2>노트 포함하기</h2>'+p(a(0,'서식 도구 모음')+'에서 '+img(0,'노트 포함 버튼')+' 버튼을 찾으세요. 이 기능의 단축키 항목도 있지만 기본 키는 지정되어 있지 않습니다.'),
|
||||
21:()=>p('다음 속성을 지정할 수 있습니다.')+'<ol><li><code>target</code> — 버튼을 눌렀을 때 열 노트입니다.</li><li><code>hoistedNote</code> — 필요할 때 지정합니다. 대상 노트를 열기 전에 트리의 표시 범위를 이 노트 아래로 좁힙니다.</li><li><code>keyboardShortcut</code> — 필요할 때 지정하는 단축키입니다. 누르면 대상 노트를 엽니다.</li></ol>'+p('실행 도구 모음에는 실행 버튼 자체의 제목과 아이콘이 표시됩니다. 대상 노트의 제목이나 아이콘과 다를 수 있습니다.'),
|
||||
22:({a,img})=>p('특정 노트와 그 하위 트리만 표시해 집중하는 기능입니다. 상위 노트와 같은 단계의 다른 노트를 숨겨 표시 범위를 좁힙니다.')+p(img(0,'하위 트리만 표시하는 기능'))+p('본문 검색과 '+a(0,'노트로 이동')+' 기능의 검색 범위도 현재 표시 중인 하위 트리로 제한됩니다.')+p('이 기능을 확장한 '+a(1,'작업 공간')+'도 참고하세요.'),
|
||||
23:({a,img})=>'<figure class="image image-style-align-center">'+img(0,'노트 지도 예시')+'</figure>'+p('노트 지도 유형은 '+a(0,'노트 지도 기능')+'을 독립된 노트로 제공합니다.')+p('노트 지도를 만들면 노트 사이의 관계가 표시됩니다. 지도 노트의 상위 노트에 속한 노트와 그 하위 노트만 표시됩니다.'),
|
||||
24:({a,img})=>p(a(0,'리본 메뉴')+' 오른쪽에는 다음과 같은 버튼이 있습니다.')+p(img(0,'노트 작업 버튼'))+'<ul><li>이전 버전 버튼을 누르면 현재 노트의 '+a(1,'이전 버전')+'을 확인할 수 있습니다.</li><li>노트 메뉴에서는 현재 노트나 하위 트리에 적용할 작업을 선택합니다. 가져오기와 내보내기를 비롯해 '+a(2,'노트 소스')+' 확인과 '+a(3,'첨부 파일')+' 관리 기능을 제공합니다.</li></ul>',
|
||||
25:()=>p('실행 도구 모음 설정입니다.')+p('다음 작업을 할 수 있습니다.')+'<ul><li>사용 가능한 실행 버튼을 표시 목록으로 끌어 놓으면 도구 모음에 나타납니다.</li><li>표시 중인 버튼을 사용 가능 목록으로 옮기면 도구 모음에서 숨겨집니다.</li><li>항목을 끌어서 순서를 바꿀 수 있습니다.</li><li>표시 중인 실행 버튼 폴더에서 마우스 오른쪽 버튼을 누르면 새 실행 버튼을 만들 수 있습니다.</li><li>기본 구성으로 되돌리려면 메뉴에서 초기화를 선택하세요.</li></ul>',
|
||||
26:({img})=>p('아이콘을 사용하면 노트를 쉽게 구분할 수 있습니다. 내부적으로는 <code>iconClass</code> 속성으로 노트에 CSS 클래스를 지정합니다. 예를 들어 <code>#iconClass="bx bx-calendar"</code>는 기본 문서나 폴더 아이콘 대신 달력 아이콘을 표시합니다. 클래스 이름을 외울 필요는 없습니다. 노트를 편집하면서 제목 옆의 아이콘을 누르면 선택 창이 열립니다.')+p(img(0,'노트 아이콘 바꾸기'))+p(img(1,'노트 아이콘 선택 창')),
|
||||
27:({a,img})=>p('보관된 노트는 <code>archived</code> '+a(0,'속성')+'을 직접 지정했거나 '+a(1,'상속')+'받은 노트입니다.')+p('기본적으로 자동 완성 목록과 본문 '+a(2,'검색')+' 결과에 나타나지 않습니다.')+p('자주 사용하지는 않지만 보관할 가치가 있는 노트를 정리할 때 유용합니다. 필요한 정보는 남겨 두면서 평소 작업에 방해되지 않게 할 수 있습니다.')+p('노트 트리에 보관된 노트를 표시할지는 설정에서 선택할 수 있습니다.')+p(img(0,'보관된 노트 표시 설정')),
|
||||
28:({a})=>p(a(1,'노트 복제')+' 기능을 사용하면 하나의 노트가 '+a(0,'노트 트리')+'의 여러 위치에 나타날 수 있습니다. 어느 위치에서도 뜻이 통하는 제목을 사용하는 것이 좋습니다.')+p('위치마다 다른 설명이 필요할 때는 가지 접두사를 사용할 수 있습니다. 노트 제목 앞에 해당 위치에 맞는 설명을 붙여 줍니다.')+p('접두사는 위치별로 지정하며 노트 트리에서만 표시됩니다.'),
|
||||
29:({a,img})=>p('여러 노트를 한꺼번에 선택할 수 있습니다.')+p('먼저 선택 범위의 첫 노트를 클릭하세요. Shift 키를 누른 채 마지막 노트를 클릭하면 그 사이에 있는 노트가 모두 선택됩니다.')+p(img(0,'여러 노트 선택'))+p('선택한 노트에서 마우스 오른쪽 버튼을 누르면 잘라내기와 복사 및 이동과 복제 또는 삭제를 한꺼번에 적용할 수 있습니다. '+a(0,'일괄 작업')+'도 사용할 수 있습니다. 여러 노트에 적용할 수 없는 메뉴는 비활성화됩니다.')
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
const p=s=>'<p>'+s+'</p>';
|
||||
export default {
|
||||
30:({a,pre})=>p('동기화 중에 갱신할 항목을 계산하는 데 시간이 오래 걸릴 수 있습니다. 역방향 프록시를 사용하는 환경에서는 이때 요청 시간이 초과될 수 있습니다.')+p('프록시의 시간 제한을 늘리면 해결할 수 있습니다.')+'<h2>Nginx</h2>'+p('설정 파일에 다음 내용을 추가하세요.')+pre(0)+p('설정을 저장한 뒤 서버를 다시 시작하세요.')+p('Nginx 설정에 관한 자세한 내용은 '+a(0,'Nginx 프록시 설정')+'을 참고하세요.')+p('문제가 계속되면 시간 제한을 더 늘려 보세요.'),
|
||||
31:({a})=>p('MindElixir는 '+a(0,'마인드맵 노트')+'에 사용하는 라이브러리입니다.')+p('핵심 라이브러리는 '+a(1,'GitHub의 mind-elixir-core')+'에서 확인할 수 있습니다.')+p('기본 배포판에서는 라이브러리를 추가 수정 없이 포함합니다.')+p('라이브러리 자체의 기능에 문제가 있다면 일반적으로 '+a(2,'원본 프로젝트')+'에 보고하는 것이 좋습니다.')+'<h2>플러그인</h2>'+p('MindElixir는 플러그인을 지원합니다. Trilium에서는 '+a(3,'node-menu 플러그인')+'을 이용해 항목의 글꼴과 색상 및 링크를 편집할 수 있게 합니다.'),
|
||||
32:({a,img})=>p(img(0,'유사한 노트 목록'))+p('유사한 노트 기능은 본문 내용과 노트 사이의 관계 및 생성 날짜를 살펴 현재 노트와 관련된 노트를 찾습니다.')+p(a(0,'리본 메뉴')+'에서 유사한 노트 탭을 누르면 목록을 볼 수 있습니다.')+'<h2>사용 방법</h2><ul><li>노트 위에 마우스를 올리면 내용을 간단히 미리 볼 수 있습니다.</li><li>노트를 클릭하면 현재 화면에서 열립니다.</li><li><kbd>Ctrl</kbd>을 누른 채 클릭하면 별도 탭에서 열립니다.</li></ul>',
|
||||
33:({img})=>p(img(0,'본문 언어 설정'))+p('텍스트 노트에 작성 언어를 지정할 수 있습니다. 브라우저나 데스크톱 앱이 본문의 언어를 알 수 있어 맞춤법 검사 등에 도움이 됩니다. 아랍어나 히브리어처럼 오른쪽에서 왼쪽으로 쓰는 언어의 표시 방향도 이 설정에 따라 결정됩니다.')+'<h2>언어 지정</h2>'+p('기본 속성에서 언어 항목을 찾으세요.')+'<h2>언어 목록 구성</h2>'+p('처음에는 언어가 설정되어 있지 않습니다. 전체 설정에서 언어를 추가하거나 노트의 언어 선택 목록에서 언어 구성을 선택하세요.'),
|
||||
34:({a,img,pre})=>p('Mermaid는 복잡한 다이어그램을 배치하는 데 사용할 수 있는 '+a(0,'Eclipse Layout Kernel(ELK)')+' 엔진을 지원합니다. Trilium에서도 사용할 수 있지만 기본적으로 켜져 있지는 않습니다.')+p('다이어그램 맨 앞에 다음 YAML 머리말을 넣으면 ELK를 사용합니다.')+pre(0)+'<table><thead><tr><th>ELK를 사용하지 않은 배치</th><th>ELK를 사용한 배치</th></tr></thead><tbody><tr><td>'+img(0,'ELK를 사용하지 않은 다이어그램')+'</td><td>'+img(1,'ELK를 사용한 다이어그램')+'</td></tr></tbody></table>',
|
||||
35:({a})=>p('Trilium에서는 '+a(0,'스크립트')+'와 '+a(1,'주요 속성')+'을 활용해 고급 기능을 만들 수 있습니다. 사용 방법을 보여 주기 위해 '+a(2,'기본 예제 노트')+'에 다음 사례를 준비했습니다.')+'<ul>'+['관계 지도','일일 노트','체중 기록','할 일 관리'].map((s,i)=>'<li>'+a(i+3,s)+'</li>').join('')+'</ul>'+p('이 예제들은 Trilium에서 구성할 수 있는 기능을 보여 주기 위한 것입니다. 모든 기능이 완성된 기본 기능으로 제공되는 것은 아닙니다.'),
|
||||
36:({a,img})=>p('Trilium은 노트 사이를 빠르고 편하게 이동할 수 있도록 설계되었습니다.')+'<h2>뒤로 가기와 앞으로 가기</h2>'+p('<kbd>Alt</kbd>+<kbd>←</kbd>와 <kbd>Alt</kbd>+<kbd>→</kbd>를 누르면 이전에 본 노트 사이를 이동할 수 있습니다.')+p('웹브라우저의 방문 기록 기능을 이용하므로 브라우저의 뒤로 가기와 앞으로 가기와 같은 방식으로 작동합니다.')+p(img(0,'노트 이동 버튼'))+'<h2>노트로 이동</h2>'+p('상단의 노트로 이동 버튼을 누르거나 <kbd>Ctrl</kbd>+<kbd>J</kbd>를 누르세요. 제목 일부를 입력하면 자동 완성 목록에서 원하는 노트를 골라 바로 열 수 있습니다.')+p('자세한 내용은 '+a(0,'노트로 이동')+'을 참고하세요.'),
|
||||
37:({a,img})=>p('자주 사용하는 검색을 노트 트리에 저장할 수 있습니다. 검색 결과는 저장된 검색 노트 아래에 하위 노트처럼 표시됩니다.')+p(img(0,'검색 저장 예시'))+'<h2>저장 위치</h2>'+p('기본 저장 위치는 일일 노트입니다. 다른 곳에 저장하려면 원하는 노트에 <code>#searchHome</code> 라벨을 추가하세요. '+a(0,'작업 공간')+' 안에서는 <code>#workspaceSearchHome</code> 라벨로 해당 작업 공간의 검색 저장 위치를 지정할 수 있습니다.'),
|
||||
38:({a,img})=>p('이 버전에서 지원하는 제공자는 다음과 같습니다.')+'<ul><li>'+a(0,'Ollama')+'</li><li>'+a(1,'OpenAI')+'</li><li>'+a(2,'Anthropic')+'</li><li>Voyage AI</li></ul>'+p('사용할 대화 모델의 제공자 이름을 다음 위치에 입력하세요.')+p(img(0,'대화 모델 제공자 설정'))+p('임베딩 제공자는 다음 위치에서 지정합니다.')+p(img(1,'임베딩 제공자 설정')),
|
||||
39:({img})=>p(img(0,'선택한 내용을 하위 노트로 옮기기'))+p('문서가 너무 길어지면 내용을 하위 노트로 나눌 수 있습니다.')+'<ol><li>옮길 내용을 선택해 잘라냅니다.</li><li>새 하위 노트를 만들고 제목을 입력합니다.</li><li>잘라낸 내용을 하위 노트에 붙여 넣습니다.</li></ol>'+p('Trilium은 이 과정을 한 번에 처리할 수 있습니다. 본문에서 내용을 선택한 뒤 선택 영역 도구 모음의 가위 아이콘을 눌러 하위 노트로 옮기기를 실행하세요. 선택한 내용의 제목을 감지해 새 노트 이름으로 사용합니다. 이 작업에 단축키를 지정할 수도 있습니다. 블록 도구 모음에서도 사용할 수 있습니다.'),
|
||||
40:({a,pre})=>p('NixOS에 포함된 Trilium 모듈을 설정하는 방법입니다.')+'<h2>준비 사항</h2>'+p(a(0,'NixOS')+'가 설치되어 있어야 합니다.')+'<h2>설정</h2>'+p('<code>configuration.nix</code>에 다음 내용을 추가하세요.')+pre(0).replace('default data directory:','기본 데이터 폴더:').replace('default bind address: 127.0.0.1, port 8080','기본 수신 주소: 127.0.0.1 / 포트: 8080')+p('바꾸려는 옵션은 앞의 주석 표시를 제거하세요.')+p('Nginx 역방향 프록시 설정을 비롯한 다른 항목은 '+a(1,'NixOS 옵션 목록')+'에서 확인할 수 있습니다.'),
|
||||
41:({pre})=>p('주요 속성에서 사용할 위젯 노트를 지정하세요. 해당 위젯으로 실행 도구 모음의 아이콘을 표시합니다.')+'<h4>실행 도구 모음 위젯 예제</h4>'+pre(0),
|
||||
42:({a,pre})=>p('Trilium은 '+a(0,'스크립트 코드 노트')+'에서 애플리케이션의 여러 기능을 사용할 수 있도록 API를 제공합니다.')+p('API는 두 종류입니다.')+'<ul><li>화면에서 실행하는 스크립트용 '+a(1,'프런트엔드 API')+'</li><li>서버에서 실행하는 스크립트용 '+a(2,'백엔드 API')+'</li></ul>'+p('두 API 모두 전역 변수 <code>api</code>를 통해 사용합니다. 스크립트 어디에서나 접근할 수 있습니다.')+p('예를 들어 화면에 메시지를 표시하려면 다음 프런트엔드 스크립트를 사용합니다.')+pre(0).replace('Hello world.','안녕하세요.')+'<aside class="admonition note">'+p('<strong>참고</strong><br>스크립트 API는 실험 단계입니다. 이후 버전에서 변경될 수 있습니다.')+'</aside>',
|
||||
43:({a})=>p('Trilium은 Evernote의 백업·내보내기 형식인 ENEX 파일을 가져올 수 있습니다. ENEX 파일 하나에는 노트북 하나의 노트와 관련 자료가 담깁니다.')+'<h2>Evernote에서 ENEX 내보내기</h2>'+p('원문에서 안내하는 방식은 구형 Evernote 데스크톱 앱을 사용합니다. 웹이나 모바일 버전이 아닙니다. 노트북에서 마우스 오른쪽 버튼을 누르고 내보내기를 선택한 뒤 안내를 따르세요.')+'<h2>Trilium으로 ENEX 가져오기</h2>'+p('가져올 위치의 노트에서 마우스 오른쪽 버튼을 누르세요. 가져오기를 선택한 뒤 ENEX 파일을 지정합니다.')+p('완료되면 노트와 자료를 살펴 누락된 내용이 없는지 확인하세요.')+'<h2>제한 사항</h2>'+p('이미지를 제외한 자료는 노트의 첨부 파일로 만들어집니다.')+p('ENEX 내부의 HTML은 표준과 완전히 일치하지 않아 일부 서식이 달라지거나 사라질 수 있습니다. 큰 문제가 있으면 '+a(0,'Trilium 문제 보고 페이지')+'에 알려 주세요.'),
|
||||
44:({img,pre})=>p('사용자 지정 테마는 기본적으로 기존 밝은 테마를 바탕으로 합니다. TriliumNext 테마를 바탕으로 쓰려면 기존 테마 노트에 <code>#appThemeBase=next</code> 속성을 추가하세요. <code>appTheme</code> 속성도 있어야 합니다.')+p(img(0,'테마 기반 설정'))+p('<code>appThemeBase</code>에 사용할 수 있는 값은 다음과 같습니다.')+'<ul><li><code>next</code> — 밝은 화면과 어두운 화면을 자동으로 전환합니다.</li><li><code>next-light</code> — 항상 밝은 테마를 사용합니다.</li><li><code>next-dark</code> — 항상 어두운 테마를 사용합니다.</li><li>그 밖의 값은 무시하며 기존 밝은 테마를 사용합니다.</li></ul><h2>스타일 덮어쓰기</h2>'+p('TriliumNext 테마에는 기존 테마보다 우선순위가 높은 스타일 규칙이 더 있습니다. 변경한 스타일이 적용되지 않으면 값 뒤에 <code>!important</code>를 붙여 보세요.')+pre(0),
|
||||
45:({img})=>p(img(0,'각주 예시'))+p('각주는 문단의 참고 자료나 보충 설명을 노트 아래쪽에 정리할 때 유용합니다.')+'<h2>사용 방법</h2><ul><li>새 각주를 넣으려면 '+img(1,'각주 삽입 버튼')+' 버튼을 누르세요. 옆의 화살표를 눌러 새 각주를 선택해도 됩니다.</li><li>기존 각주를 다시 참조하려면 화살표를 누르고 각주 삽입을 선택한 뒤 번호를 고르세요.</li><li><code>[1]</code> 같은 참조 표시 위에 마우스를 올리면 각주 내용을 미리 볼 수 있습니다.</li><li>본문의 참조 표시를 누르면 해당 각주로 이동합니다.</li><li>각주의 <code>^</code> 버튼을 누르면 본문의 참조 위치로 돌아갑니다.</li></ul>',
|
||||
46:({a,img})=>p('<strong>책 노트</strong>는 하위 노트의 내용을 차례로 보여 주는 특별한 '+a(0,'노트')+' 유형입니다. 여러 짧은 노트를 하나의 책처럼 이어서 읽을 때 유용합니다.')+p(img(0,'책 노트 예시'))+p('위 예시에서 왼쪽의 Node.js 노트에는 여러 하위 노트가 있습니다. 오른쪽에서는 그 내용을 하나의 연속된 문서로 보여 줍니다.')+'<h2>기능</h2>'+p('여러 하위 노트의 내용을 한 화면에서 이어 볼 수 있습니다. 긴 내용을 관리하기 쉬운 단위로 나누어 작성한 뒤 읽을 때 편리합니다.')+p(a(1,'노트 목록')+' 기능을 사용하므로 격자와 목록 및 달력 보기 중에서 선택할 수 있습니다.')+p('보기 방식은 '+a(2,'리본 메뉴')+'의 책 속성 탭에서 바꾸세요.'),
|
||||
47:({a,pre})=>p('Trilium 인스턴스는 실행 중인 서버 하나를 뜻합니다. '+a(0,'동기화')+'를 구성하면 데스크톱 앱 내부의 서버와 동기화 대상 서버 등 여러 인스턴스를 사용하게 됩니다. 이때 현재 어느 인스턴스에서 실행 중인지 구분하면 편리합니다.')+'<h2>인스턴스 이름 지정</h2>'+p('<code>config.ini</code>에 다음과 같이 이름을 설정하세요.')+pre(0).replace('instanceName=Hello','instanceName=내서버')+'<h2>서버에서 인스턴스 구분</h2>'+p('<code>api.getInstanceName()</code>을 호출하면 설정 파일이나 환경 변수에 지정한 현재 서버의 인스턴스 이름을 얻을 수 있습니다.')+'<h2>특정 인스턴스에서만 스크립트 실행</h2>'+p('정기적으로 실행하거나 특정 이벤트에 반응하는 스크립트를 일부 인스턴스에서만 실행할 수 있습니다. 코드를 바꿀 필요 없이 <code>runOnInstance</code> 라벨의 값에 실행할 인스턴스 이름을 넣으세요. 여러 인스턴스에서 실행하려면 라벨을 여러 개 추가하세요.'),
|
||||
48:({a,img})=>p(img(0,'노트별 추가 작업 버튼'))+p('현재 노트의 종류에 따라 '+a(0,'리본 메뉴')+' 바로 아래 오른쪽에 추가 작업 버튼이 나타납니다. 해당 노트에 필요한 기능을 제공합니다.')+p('예를 들면 다음과 같습니다.')+'<ul><li>'+a(1,'Mermaid 다이어그램')+'과 '+a(2,'캔버스')+'에서는 SVG로 내려받거나 참조를 복사해 '+a(3,'텍스트 노트')+'에 붙여 넣을 수 있습니다.</li><li>'+a(4,'읽기 전용 노트')+'에서는 잠시 편집을 허용해 빠르게 수정할 수 있습니다.</li></ul><h2>사용 방법</h2>'+p('오른쪽 끝의 화살표 두 개를 누르면 버튼 영역을 접을 수 있습니다.'),
|
||||
49:({a,img})=>p(img(0,'오른쪽 사이드바'))+p('오른쪽 사이드바는 현재 노트와 관련된 다음 내용을 보여 줍니다.')+'<ul><li>'+a(0,'목차')+'</li><li>'+a(1,'강조 표시 목록')+'</li></ul>'+p('표시할 내용이 없으면 사이드바가 나타나지 않습니다. 예를 들어 제목이 적고 강조 표시도 없으면 숨겨집니다.')+'<h2>사이드바 표시와 숨기기</h2>'+p('<code>toggleRightPane</code> 단축키를 지정해 사이드바를 표시하거나 숨길 수 있습니다. 기본 키는 지정되어 있지 않습니다.')+'<h2>분할 화면에서 사용</h2>'+p(a(2,'화면 분할')+'을 사용해도 현재 '+a(3,'탭')+'에는 사이드바가 하나만 표시됩니다.')+p('분할된 화면에서 노트를 클릭하면 해당 노트의 내용으로 사이드바가 바뀝니다. 표시할 내용이 없으면 닫힌 상태를 유지합니다.'),
|
||||
50:({img})=>p('공유 노트를 열면 기본적으로 웹페이지 형태로 표시됩니다. 스크립트에서 이용하거나 파일로 내려받을 때는 원본 내용을 그대로 제공하는 편이 나을 수 있습니다.')+'<table><thead><tr><th>웹페이지로 표시한 노트</th><th>원본 형식으로 표시한 노트</th></tr></thead><tbody><tr><td>'+img(0,'웹페이지 형태의 공유 노트')+'</td><td>'+img(1,'원본 형식의 공유 노트')+'</td></tr></tbody></table><h2>노트 속성으로 지정</h2>'+p('<code>#shareRaw</code> 속성을 추가하면 공유 주소로 접근할 때 항상 원본 형식으로 제공합니다.')+'<h2>주소에 옵션 추가</h2>'+p('주소 끝에 <code>?raw</code>를 붙이면 <code>#shareRaw</code> 속성이 없어도 원본 형식으로 볼 수 있습니다.')+p(img(2,'주소로 원본 형식 요청')),
|
||||
51:({a,img})=>p('노트 지도는 노트 사이의 연결을 시각적으로 보여 줍니다. 노트들이 어떤 구조로 묶여 있는지 파악할 수 있습니다.')+p('다음 두 가지 보기가 있습니다.')+'<ul><li>링크 지도 — 노트 사이의 관계를 표시합니다.</li><li>트리 지도 — 노트의 계층 구조를 표시합니다.</li></ul><h2>링크 지도</h2>'+p('노트 사이의 '+a(0,'관계')+'를 보여 줍니다.')+p(img(0,'링크 지도'))+'<h2>트리 지도</h2>'+p('노트의 상위·하위 구조를 보여 줍니다.')+p(img(1,'트리 지도'))+'<h2>독립된 노트 유형</h2>'+p('모든 노트에서 열 수 있는 지도 기능 외에 관계를 전체 화면에 표시하는 전용 노트를 만들 수도 있습니다. '+a(1,'노트 지도 유형')+'을 참고하세요.')+'<h2>관련 기능</h2>'+p(a(2,'관계 지도')+'는 비슷한 기능이지만 다음과 같은 차이가 있습니다.')+'<ul><li>노트 지도는 자동으로 만들어집니다. 관계 지도는 직접 구성합니다.</li><li>관계 지도는 하나의 노트 유형입니다. 링크 지도는 연결을 화면에 보여 주는 보기 기능입니다.</li></ul>',
|
||||
52:({a,img})=>p('책갈피를 사용하면 특정 제목처럼 노트 안의 원하는 위치를 가리키는 '+a(0,'링크')+'를 만들 수 있습니다.')+p('내부적으로는 HTML 앵커를 사용합니다. 이 기능은 TriliumNext 0.94.0에서 추가되었습니다.')+'<h2>사용 방법</h2>'+p('<strong>책갈피 만들기</strong>')+'<ol><li>책갈피를 둘 위치에 커서를 놓으세요.</li><li>'+a(1,'서식 도구 모음')+'에서 '+img(0,'책갈피 메뉴 버튼')+' 버튼을 누른 뒤 '+img(1,'새 책갈피 버튼')+' 버튼을 선택하세요.</li></ol>'+p('<strong>책갈피로 연결하기</strong>')+'<ol><li>링크를 넣을 위치에 커서를 놓으세요.</li><li>'+a(2,'링크')+' 창에서 책갈피 항목을 열고 원하는 책갈피를 선택하세요.</li></ol><h2>제한 사항</h2>'+p('이 버전에서는 다른 노트의 책갈피로 연결할 수 없습니다. 내부 링크가 책갈피를 지원하도록 개선된 뒤 추가될 예정입니다.'),
|
||||
53:({a,img})=>p('Trilium은 일정한 간격으로 노트의 상태를 저장해 이전 버전을 보관합니다.')+'<h2>이전 버전 저장 간격</h2>'+p('설정 → 기타에서 저장 간격을 바꿀 수 있습니다. 간격이 짧을수록 더 많은 버전을 남기지만 저장 공간도 더 필요합니다.')+p('특정 노트나 하위 트리의 버전 기록을 끄려면 <code>disableVersioning</code> '+a(0,'라벨')+'을 추가하세요.')+'<h2>보관 개수 제한</h2>'+p('설정 → 기타에서 노트마다 보관할 이전 버전의 최대 개수를 지정할 수 있습니다. -1은 제한 없음이며 0은 모든 이전 버전을 삭제한다는 뜻입니다. 개별 노트에는 <code>versioningLimit=X</code> 라벨로 따로 지정할 수 있습니다.')+p('변경한 제한은 해당 노트를 수정할 때 적용됩니다.')+p('초과한 이전 버전 지금 삭제 버튼을 누르면 즉시 적용할 수 있습니다.')+p('이전 버전은 리본 메뉴 오른쪽의 버튼으로 확인할 수 있습니다.')+p(img(0,'이전 버전 보기')),
|
||||
54:({a,img})=>p(img(0,'빠른 검색'))+p('빠른 검색은 노트 제목뿐 아니라 본문까지 검색하고 결과를 바로 선택할 수 있게 보여 줍니다.')+p('별도 탭에서 고급 조건으로 검색하려면 '+a(0,'검색')+' 기능을 사용하세요.')+p('본문 대신 제목만 검색해 빠르게 이동하려면 '+a(1,'노트로 이동')+' 기능을 사용하세요.')+'<h2>화면 배치</h2>'+p(a(2,'세로 배치와 가로 배치')+'에 따라 빠른 검색창의 위치가 달라집니다.')+'<ul><li>세로 배치에서는 '+a(3,'노트 트리')+' 바로 위에 표시됩니다.</li><li>가로 배치에서는 '+a(4,'실행 도구 모음')+'에 표시됩니다. 다른 아이콘처럼 위치를 옮길 수 있습니다.</li></ul>'
|
||||
};
|
||||
@@ -0,0 +1,13 @@
|
||||
const p=s=>'<p>'+s+'</p>'; const list=xs=>'<ul>'+xs.map(x=>'<li>'+x+'</li>').join('')+'</ul>';
|
||||
export default {
|
||||
55:({a,img})=>p('SQL 콘솔은 Trilium에 내장된 데이터베이스 편집기입니다.')+p(a(0,'전체 메뉴')+' → 고급 → SQL 콘솔 열기에서 실행할 수 있습니다.')+p(img(0,'SQL 콘솔 화면'))+'<h3>사용 방법</h3>'+list(['화면 위쪽의 테이블 이름에 마우스를 올리면 열 이름과 자료형을 확인할 수 있습니다.','SQL 문은 한 번에 하나씩 실행할 수 있습니다.',img(1,'실행 버튼')+'을 누르면 작성한 SQL 문을 실행합니다.','조회 결과는 표로 표시됩니다.'+p(img(2,'SQL 조회 결과'))])+'<h3>SQL 콘솔 저장하기</h3>'+p('SQL 조회문이나 명령을 전용 노트로 저장할 수 있습니다. SQL 문을 작성한 뒤 '+img(3,'저장 버튼')+'을 누르세요. 저장한 노트는 '+a(1,'날짜별 노트')+'에 나타납니다.')+list(['SQL 문은 기본 화면에 표시되지 않습니다. 노트의 오른쪽 클릭 메뉴에서 노트 소스 보기를 선택하면 확인할 수 있습니다.','저장된 SQL 문은 직접 수정할 수 없습니다. 변경하려면 SQL 콘솔에 복사해 수정한 뒤 다시 저장하세요.']),
|
||||
56:({a})=>'<h2>설치 방식 선택하기</h2>'+p('<strong>컴퓨터 한 대에서 사용</strong> — 데스크톱 앱을 설치하면 노트를 해당 컴퓨터에 저장합니다.')+list([a(0,'데스크톱 설치')])+p('<strong>서버에 설치하고 웹으로 접속</strong> — 서버에 애플리케이션을 설치하면 모바일을 포함한 여러 기기의 웹브라우저에서 접속할 수 있습니다.')+list([a(1,'서버 설치'),a(2,'모바일 화면')+' — 선택 사항',a(3,'PikaPods 관리형 호스팅')])+p('<strong>서버와 데스크톱 앱을 함께 사용</strong> — 서버는 웹 접속과 데이터 동기화를 담당합니다. 데스크톱 앱은 데이터를 동기화해 컴퓨터에도 저장하므로 인터넷에 연결되지 않은 상태에서도 사용할 수 있습니다.')+list([a(4,'서버 설치'),a(5,'모바일 화면')+' — 선택 사항',a(6,'데스크톱 설치'),a(7,'동기화')]),
|
||||
57:({a})=>p('Trilium을 처음 실행하면 사용 예제가 포함된 데이터베이스를 만듭니다. 예제에서는 다음 기능을 살펴볼 수 있습니다.')+list([a(0,'관계 지도'),a(1,'날짜별 노트'),a(2,'체중 기록'),a(3,'할 일 관리'),a(4,'테마')])+'<h3>사용 예제 복원하기</h3>'+p('고급 기능을 시험한 뒤 원래 예제를 다시 확인하고 싶거나 새 기능이 추가된 최신 예제를 살펴보고 싶을 때 원본 예제를 가져올 수 있습니다.')+p('Trilium의 가져오기 기능을 사용하세요.')+list([a(5,'최신 예제 ZIP 파일')+'을 내려받습니다.','예제를 넣을 상위 노트를 트리에서 마우스 오른쪽 버튼으로 클릭합니다.','노트로 가져오기를 선택합니다.','내려받은 ZIP 파일을 선택합니다.']),
|
||||
58:({a,img})=>p(img(0,'최근 변경 사항 화면'))+'<h2>최근 변경 사항 열기</h2>'+list([a(0,'실행 도구 모음')+'의 '+img(1,'최근 변경 사항 버튼')+'을 누르면 전체 노트의 변경 사항을 확인할 수 있습니다. '+a(1,'하위 트리만 표시')+' 기능이나 '+a(2,'작업 공간')+'을 사용 중이면 해당 범위의 변경 사항만 표시됩니다.','특정 노트와 그 하위 노트의 변경 사항만 보려면 '+a(3,'노트 트리의 오른쪽 클릭 메뉴')+' → 고급에서 해당 항목을 선택하세요.'])+'<h2>사용 방법</h2>'+list(['가장 최근에 변경한 노트부터 표시됩니다.','노트 제목과 경로가 함께 표시됩니다. 제목을 누르면 창이 닫히고 해당 노트로 이동합니다.','삭제한 노트도 삭제 시점을 기준으로 표시됩니다. 옆의 삭제 취소를 누르면 복원할 수 있습니다.']),
|
||||
59:({a})=>p('TriliumNext의 노트 트리 구조를 이해하는 데 필요한 기본 개념을 설명합니다.')+'<h2>노트</h2>'+p('노트는 TriliumNext에서 정보를 담는 기본 단위입니다. 자세한 내용은 '+a(0,'노트')+'를 참고하세요.')+'<h2>가지</h2>'+p('가지는 노트가 트리의 어느 위치에 놓이는지를 나타냅니다. <code>parentNoteId</code>와 <code>noteId</code>의 쌍으로 상위 노트와 하위 노트의 관계를 표현합니다.')+p('한 노트에 여러 가지를 연결하면 같은 노트를 트리의 여러 위치에 놓을 수 있습니다. 이를 '+a(1,'복제')+'라고 합니다.')+'<h2>접두사</h2>'+p('접두사는 특정 가지에서만 노트 제목 앞에 붙는 문구입니다. 같은 노트를 두 위치에 놓고 한쪽에서만 제목을 구분하고 싶을 때 사용합니다.')+p('트리에서 노트를 마우스 오른쪽 버튼으로 클릭한 뒤 가지 접두사 편집을 선택하세요.')+p('접두사는 노트 본문에 속하지 않으므로 노트를 보호해도 암호화되지 않습니다. 보호된 노트를 구분할 수 있도록 제목 일부를 트리에 계속 표시할 때 유용합니다.')+'<h2>하위 트리</h2>'+p('하위 트리는 기준이 되는 노트와 그 아래에 속한 모든 노트를 포함합니다. 내보내기 같은 일부 작업은 하위 트리 전체에 적용할 수 있습니다.'),
|
||||
60:({a,img})=>p(img(0,'노트로 이동 창'))+p('노트로 이동 기능은 제목을 검색해 원하는 노트를 빠르게 엽니다. 전체 검색을 실행하거나 새 노트를 만들 수도 있습니다.')+'<h2>노트로 이동 열기</h2>'+list([a(0,'실행 도구 모음')+'에서 '+img(1,'노트로 이동 버튼')+'을 누르세요.','단축키 <kbd>Ctrl</kbd>+<kbd>J</kbd>를 사용할 수도 있습니다.'])+'<h2>최근 노트</h2>'+p('최근에 보거나 편집한 노트 목록에서 원하는 노트로 바로 이동할 수 있습니다. 위쪽의 노트로 이동 버튼을 누르고 검색어를 입력하지 않으면 최근 노트가 표시됩니다. 오른쪽의 시계 아이콘으로도 열 수 있습니다.')+p(img(2,'최근 노트 사용 예시'))+'<h2>사용 방법</h2>'+list(['검색어가 없으면 최근 노트를 표시합니다.','위쪽과 아래쪽 화살표 키로 항목을 선택한 뒤 <kbd>Enter</kbd>를 누르면 노트를 엽니다.','원하는 노트가 없다면 제목을 입력한 뒤 하위 노트 만들기 및 연결을 선택해 새로 만들 수 있습니다.']),
|
||||
61:({a})=>p('Trilium을 새 버전으로 업그레이드하는 방법을 안내합니다.')+'<h2>업그레이드 방법</h2>'+p('이 버전의 Trilium에는 자동 업그레이드 기능이 없습니다. 설치 방식에 따라 직접 업데이트하세요.')+list([a(0,'Docker 서버 설치')+' — 새 이미지를 내려받고 컨테이너를 다시 시작합니다.','그 밖의 설치 방식 — '+a(1,'릴리스 페이지')+'에서 최신 버전을 내려받아 기존 애플리케이션 파일을 교체합니다.'])+'<h2>데이터베이스 호환성과 변환</h2>'+p('새 버전을 실행하면 '+a(2,'데이터베이스')+'를 필요한 형식으로 자동 변환합니다. 변환된 데이터베이스는 이전 버전에서 읽지 못할 수 있습니다. 이전 버전으로 돌아가려면 변환 전에 생성한 '+a(3,'백업')+'을 복원하세요.')+'<h2>동기화 호환성</h2>'+p(a(4,'동기화')+'에 사용하는 통신 규약에는 버전이 있습니다. 함께 동기화하는 모든 인스턴스는 같은 규약 버전을 사용해야 하므로 업그레이드할 때 다른 인스턴스도 함께 업데이트해야 할 수 있습니다. 규약 버전의 변경 여부는 릴리스 안내를 확인하세요.'),
|
||||
62:({a,img})=>p(img(0,'이미지 참조 예시'))+p('이미지 참조를 사용하면 다른 유형의 노트 미리보기를 '+a(0,'텍스트 노트')+'에 넣을 수 있습니다.')+'<h2>지원하는 노트 유형</h2>'+list([a(1,'캔버스'),a(2,'Mermaid 도표'),a(3,'마인드맵')])+'<h2>사용 순서</h2>'+list(['위 유형의 노트를 열고 '+a(4,'떠 있는 버튼')+' 영역에서 '+img(1,'이미지 참조 복사 버튼')+'을 누르세요.',a(5,'텍스트 노트')+'로 이동한 뒤 붙여넣으면 해당 노트의 이미지 참조가 삽입됩니다.'])+'<h2>사용 방법</h2>'+list(['이미지 참조를 두 번 클릭하면 원본 노트가 열립니다.','<kbd>Ctrl</kbd>을 누른 채 클릭하면 원본 노트가 새 탭에서 열립니다.','원본 노트를 수정하면 이미지 참조도 갱신됩니다. 반영되지 않으면 '+a(6,'애플리케이션 새로고침')+'을 실행하세요.']),
|
||||
63:({a,pre})=>p('Trilium은 <code>config.ini</code> 파일과 환경 변수로 설정할 수 있습니다. 지원하는 항목은 '+a(0,'config-sample.ini 예제')+'와 '+a(1,'Notes 저장소')+'를 참고하세요.')+p('환경 변수는 다음 규칙을 따릅니다.')+list(['이름 앞에 <code>TRILIUM_</code>을 붙이고 INI의 구역과 키를 밑줄로 구분합니다.','형식은 <code>TRILIUM_<SECTION>_<KEY>=<VALUE></code>입니다.','같은 항목이 파일에도 있으면 환경 변수의 값이 우선합니다.'])+p('예를 들어 설정 파일에 다음 내용이 있다고 가정합니다.')+pre(0)+p('다음 환경 변수로 값을 바꿀 수 있습니다.')+pre(1)+p('설정은 다음 순서로 읽습니다.')+list(['<code>config.ini</code> 파일을 불러옵니다.','<code>TRILIUM_</code>으로 시작하는 환경 변수를 찾습니다.','환경 변수 이름에서 구역과 키를 구분합니다.','환경 변수의 값을 우선해 파일의 설정과 합칩니다.']),
|
||||
64:({a})=>p('기본 설정에서는 다른 도메인이나 출처의 웹페이지가 브라우저를 통해 Trilium에 요청하는 것을 허용하지 않습니다.')+p('Trilium 0.93.0부터 환경 변수나 <code>config.ini</code>를 사용해 '+a(0,'교차 출처 리소스 공유(CORS)')+'를 설정할 수 있습니다.')+'<table><thead><tr><th>CORS 헤더</th><th>환경 변수</th><th>config.ini의 Network 구역 설정</th></tr></thead><tbody>'+[['Origin','ORIGIN','Origin'],['Methods','METHODS','Methods'],['Headers','HEADERS','Headers']].map(([h,e,k])=>'<tr><td><code>Access-Control-Allow-'+h+'</code></td><td><code>TRILIUM_NETWORK_CORS_ALLOW_'+e+'</code></td><td><code>corsAllow'+k+'</code></td></tr>').join('')+'</tbody></table>'
|
||||
};
|
||||
@@ -0,0 +1,13 @@
|
||||
const p=s=>'<p>'+s+'</p>'; const list=xs=>'<ul>'+xs.map(x=>'<li>'+x+'</li>').join('')+'</ul>';
|
||||
export default {
|
||||
65:({img,pre})=>p('사용자가 선택한 테마와 관계없이 애플리케이션 전체에 적용할 CSS를 지정할 수 있습니다.')+list(['새 노트를 만들고 유형을 CSS로 설정합니다.'+p(img(0,'CSS 노트 만들기')),'상단 리본의 직접 지정한 속성에서 <code>#appCss</code>를 입력합니다.'+p(img(1,'appCss 라벨 지정')),'원하는 CSS를 작성합니다. 다른 스타일이 덮어쓰지 않도록 필요한 속성에 <code>!important</code>를 붙일 수 있습니다.'+p(img(2,'CSS 작성 예시'))])+'<h2>변경 사항 확인하기</h2>'+p('애플리케이션 CSS 노트를 추가하거나 수정해도 바로 반영되지는 않습니다. <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>R</kbd>로 페이지를 새로고침하세요.')+'<h2>활용 예시: 인쇄 스타일 바꾸기</h2>'+p('인쇄하거나 PDF로 내보낼 때의 모양은 <code>@media</code> 규칙을 사용하는 CSS 노트로 바꿀 수 있습니다. 다음 예제는 인쇄 글꼴을 명조 계열로 지정합니다.')+pre(0),
|
||||
66:({a,img})=>p(img(0,'설정 화면'))+p('설정에서 TriliumNext 클라이언트와 서버의 동작을 바꿀 수 있습니다.')+'<h2>설정 열기</h2>'+list([a(0,'전체 메뉴')+'에서 설정을 선택합니다.',a(1,'실행 도구 모음')+'의 '+img(1,'설정 버튼')+'을 누릅니다. 필요하지 않으면 이 버튼을 숨길 수도 있습니다.','설정 열기에 단축키를 지정할 수 있습니다. 기본 단축키는 없습니다.',a(2,'설정 바로가기')+'를 눌러 열 수도 있습니다.'])+p('설정을 연 뒤 '+a(3,'노트 트리')+'에서 원하는 설정 범주를 선택하세요.')+'<h2>설정 닫기</h2>'+p('설정은 새 '+a(4,'탭')+'에서 열립니다. 해당 탭을 닫으면 됩니다.')+'<h2>설정 동기화</h2>'+p(a(5,'동기화')+'를 사용하면 일부 설정은 모든 기기에 함께 적용됩니다. 나머지 설정은 기기마다 다르게 지정할 수 있습니다.')+p('테마와 화면의 가로·세로 배치 및 코드 블록 테마처럼 화면 표시와 관련된 설정은 각 기기에 맞게 조정할 수 있도록 일반적으로 동기화하지 않습니다.'),
|
||||
67:({a,img})=>p(img(0,'목차 예시'))+p('텍스트 노트에 여러 제목이 있으면 '+a(0,'오른쪽 사이드바')+'에 목차가 자동으로 표시됩니다.')+'<h2>사용 방법</h2>'+list(['목차의 제목을 누르면 본문에서 해당 위치로 이동합니다.','닫기 버튼으로 목차를 숨길 수 있습니다. 다시 표시하려면 '+a(1,'떠 있는 버튼')+' 영역을 이용하세요.'])+'<h2>전체 설정</h2>'+p(a(2,'텍스트 노트 설정')+'의 목차 항목에서 목차를 표시하는 데 필요한 최소 제목 수를 지정할 수 있습니다.')+list(['항상 숨기려면 10000처럼 매우 큰 값을 지정하세요.','제목이 하나라도 있을 때 표시하려면 1로 지정하세요.'])+'<h2>노트별 설정</h2>'+p(a(3,'속성')+'으로 특정 노트의 목차 표시 여부를 지정할 수 있습니다.')+list(['<code>#toc=show</code> — 전체 설정과 관계없이 목차를 표시합니다.','<code>#toc=hide</code> — 해당 노트의 목차를 항상 숨깁니다.']),
|
||||
68:({a,img})=>p(img(0,'강조 목록 예시'))+p(a(0,'목차')+'와 비슷하지만 제목 대신 강조한 글자를 모아 보여 줍니다. 강조한 내용이 하나 이상 있으면 '+a(1,'오른쪽 사이드바')+'에 목록이 나타납니다.')+p('다음 서식을 적용한 글자가 강조 목록에 포함됩니다.')+list(['굵게','기울임꼴','밑줄','글자색','배경색이나 형광펜'])+'<h2>사용 방법</h2>'+list(['목록의 항목을 누르면 본문의 해당 위치로 이동합니다.','닫기 버튼으로 목록을 숨길 수 있습니다. '+a(2,'떠 있는 버튼')+' 영역에서 다시 표시할 수 있습니다.'])+'<h2>전체 설정</h2>'+p(a(3,'텍스트 노트 설정')+'의 강조 목록 항목에서 목록에 포함할 서식 종류를 선택할 수 있습니다.')+'<h2>노트별 설정</h2>'+p('특정 노트에서 강조 목록을 숨기려면 '+a(4,'속성')+'에 <code>#hideHighlightWidget</code> 라벨을 추가하세요.'),
|
||||
69:({a})=>p('데스크톱에 Trilium을 설치하는 순서입니다.')+list(['<strong>설치 파일 내려받기</strong> — GitHub의 '+a(0,'최신 릴리스 페이지')+'에서 운영체제에 맞는 실행 파일 패키지를 내려받습니다.','<strong>압축 풀기</strong> — 원하는 폴더에 압축을 풉니다.','<strong>실행하기</strong> — 압축을 푼 폴더의 <code>trilium</code> 실행 파일을 엽니다.'])+'<h2>시작 스크립트</h2>'+p('용도에 따라 다음 스크립트를 사용할 수 있습니다.')+list(['<code>trilium-no-cert-check</code> — '+a(1,'TLS 인증서')+'를 검증하지 않고 실행합니다. 자체 서명 인증서를 사용하는 서버에 연결할 때 사용할 수 있습니다. 실행 전에 <code>NODE_TLS_REJECT_UNAUTHORIZED=0</code> 환경 변수를 지정하는 방법도 있습니다.','<code>trilium-portable</code> — 이동식 모드로 실행합니다. 애플리케이션 폴더 안에 '+a(2,'데이터 폴더')+'를 만들어 프로그램과 데이터를 함께 옮기기 쉽습니다.','<code>trilium-safe-mode</code> — 안전 모드로 실행합니다. 실행 중 오류를 일으킬 수 있는 사용자 시작 스크립트를 비활성화합니다.'])+'<h2>동기화</h2>'+p('데스크톱 앱의 데이터를 서버와 동기화하려면 '+a(3,'동기화 안내')+'를 참고하세요.'),
|
||||
70:({a,img})=>p('노트 트리에서 노트를 이동하고 구조를 정리하는 방법을 설명합니다.')+p(img(0,'노트 트리'))+'<h2>끌어서 놓기</h2>'+p(img(1,'노트를 끌어서 이동하는 예시'))+p('노트를 원하는 위치로 끌어서 놓으면 트리의 순서와 구조를 바꿀 수 있습니다.')+'<h2>키보드로 이동하기</h2>'+p(img(2,'키보드로 노트를 이동하는 예시'))+p('다음 '+a(0,'단축키')+'를 사용할 수 있습니다.')+list(['<kbd>Ctrl</kbd>+<kbd>↑</kbd> 또는 <kbd>Ctrl</kbd>+<kbd>↓</kbd> — 같은 단계에서 노트를 위아래로 이동합니다.','<kbd>Ctrl</kbd>+<kbd>←</kbd> — 노트를 한 단계 위로 올립니다. 현재 상위 노트의 상위 노트 아래로 옮깁니다.','<kbd>Ctrl</kbd>+<kbd>→</kbd> — 바로 위에 있는 노트의 하위 노트로 옮깁니다.','<kbd>←</kbd>와 <kbd>→</kbd> — 하위 트리를 접거나 펼칩니다.'])+'<h2>오른쪽 클릭 메뉴</h2>'+p('잘라내기와 붙여넣기로도 노트를 이동할 수 있습니다. 관련 '+a(1,'단축키')+'는 <kbd>Ctrl</kbd>+<kbd>C</kbd>('+a(2,'복사')+')와 <kbd>Ctrl</kbd>+<kbd>X</kbd>(잘라내기) 및 <kbd>Ctrl</kbd>+<kbd>V</kbd>(붙여넣기)입니다.')+p('자세한 내용은 '+a(3,'노트 트리 메뉴')+'를 참고하세요.'),
|
||||
71:({a,img})=>p('Trilium '+a(0,'서버 버전')+'은 스마트폰과 태블릿의 터치 조작에 맞춘 모바일 웹 화면을 제공합니다. 로그인할 때 브라우저를 감지해 자동으로 전환합니다.')+p('모바일 화면은 데스크톱 화면보다 지원하는 기능이 적습니다. Android나 iOS에 설치하는 별도 앱이 아니라 '+a(1,'서버 버전')+'에서 제공하는 웹페이지입니다.')+'<h2>화면 예시</h2><h3>스마트폰</h3>'+p(img(0,'스마트폰 화면'))+'<h3>태블릿</h3>'+p(img(1,'태블릿 화면'))+'<h2>제한 사항</h2>'+list(['전체 노트 트리를 탐색하고 모든 유형의 노트를 읽거나 편집할 수 있습니다. 새로 만들 수 있는 유형은 텍스트 노트뿐입니다.',a(2,'보호된 노트')+'를 읽거나 편집할 수 있지만 새로 보호된 노트를 만들 수는 없습니다.','설정 변경을 지원하지 않습니다.','노트 복제를 지원하지 않습니다.','첨부 파일 업로드를 지원하지 않습니다.'])+'<h2>화면 종류 직접 선택하기</h2>'+p('자동으로 선택된 화면이 적합하지 않으면 로그인 페이지 주소에 <code>?mobile</code> 또는 <code>?desktop</code>을 붙이세요. 먼저 로그아웃해야 할 수도 있습니다.')+'<h2>스크립트</h2>'+p('일반 화면처럼 '+a(3,'스크립트')+'로 동작을 바꿀 수 있습니다. 모바일 화면을 시작할 때 실행할 스크립트 노트에는 <code>#run=mobileStartup</code> 라벨을 지정하세요.'),
|
||||
72:({a,pre})=>'<h2>설정</h2>'+p('웹 보기에서 열 주소는 <code>webViewSrc</code> '+a(0,'라벨')+'로 지정합니다. 예시는 다음과 같습니다.')+pre(0)+'<h2>서버와 데스크톱 앱의 차이</h2>'+p('웹브라우저로 Trilium에 접속한 경우에도 웹 보기는 지정한 페이지를 표시하려고 시도합니다. 다만 브라우저의 보안 정책 때문에 데스크톱 앱보다 제약이 많습니다.')+p('일부 웹사이트는 <code>X-Frame-Options</code> 헤더로 다른 사이트 안에 표시되는 것을 막습니다. Trilium에서 이 제한을 우회할 수 없으므로 해당 페이지는 표시되지 않습니다.')+p('원인을 확인하려면 Trilium 페이지를 마우스 오른쪽 버튼으로 클릭해 검사를 연 뒤 개발자 도구의 콘솔 탭을 확인하세요. 다음과 같은 오류가 나타날 수 있습니다.')+list(['<code>Refused to display \'https://www.google.com/\' in a frame because it set \'X-Frame-Options\' to \'sameorigin\'.</code> — 같은 출처의 프레임만 허용하므로 표시를 거부했다는 뜻입니다.','<code>Refused to frame \'https://duckduckgo.com/\' because an ancestor violates the following Content Security Policy directive: "frame-ancestors \'self\' https://html.duckduckgo.com".</code> — 상위 페이지가 콘텐츠 보안 정책의 허용 범위에 포함되지 않는다는 뜻입니다.'])+p('<code>wikipedia.org</code>처럼 표시를 허용하는 사이트도 있습니다.')+p('서버 버전에서는 별도의 샌드박스 제한도 적용합니다. 위의 프레임 차단과 다른 문제가 있으면 문제를 보고해 주세요.')+p('데스크톱 앱은 <code>iframe</code> 대신 <code>webview</code> 기술을 사용하므로 이와 같은 프레임 제약을 받지 않습니다.'),
|
||||
73:({a,pre})=>p('이 버전의 Trilium은 다중 사용자를 지원하지 않습니다. 여러 사람이 각자의 노트를 사용하려면 서버 인스턴스를 따로 설치해야 합니다. 여러 '+a(0,'동기화')+' 서버를 동시에 사용하는 것도 지원하지 않습니다.')+p('물리 서버 한 대에서 여러 인스턴스를 실행하는 방법은 다음과 같습니다.')+p(a(1,'Linux 패키지')+'나 '+a(2,'수동 설치')+'를 사용한다면 인스턴스마다 포트와 데이터 폴더를 다르게 지정하세요.')+pre(0)+p('두 번째 인스턴스의 예시입니다.')+pre(1)+p('<code>systemd</code>를 사용한다면 '+a(3,'서비스 설정에 환경 변수를 지정')+'하세요.')+p(a(4,'Docker')+'에서는 컨테이너를 각각 만들고 포트 연결과 데이터 폴더를 다르게 지정하면 됩니다.')+p(a(5,'NixOS')+'에서는 Docker OCI 컨테이너를 사용하거나 별도의 서비스 정의를 가진 NixOS 컨테이너를 하나 이상 사용해야 합니다.')+p('관련 설명과 도움은 '+a(6,'GitHub 토론')+'을 참고하세요.'),
|
||||
74:({a,img})=>p('텍스트 노트의 서식 도구 모음은 두 가지 방식 중에서 선택할 수 있습니다.')+p(a(0,'설정')+' → '+a(1,'텍스트 노트')+'의 서식 도구 모음 항목에서 표시 방식을 바꾸세요.')+'<h2>떠 있는 도구 모음</h2>'+p('평소에는 도구 모음을 숨기고 필요한 순간에 두 종류의 팝업으로 서식 옵션을 표시합니다.')+'<h3>문단 서식 팝업</h3>'+p('편집 중인 문단 왼쪽에 점 모양 버튼이 나타납니다.')+p(img(0,'문단 서식 버튼'))+p('버튼을 누르면 제목과 목록 및 표처럼 문단 전체에 적용하는 옵션이 표시됩니다.')+p(img(1,'문단 서식 팝업'))+'<h3>글자 서식 팝업</h3>'+p('글자를 선택하면 자동으로 나타납니다.')+p(img(2,'글자 서식 팝업'))+p('글자 크기와 굵게 등 선택한 글자에만 적용하는 옵션을 제공합니다.')+'<h2>고정 도구 모음</h2>'+p('서식을 자주 적용한다면 모든 옵션이 한곳에 표시되는 고정 도구 모음이 편리합니다. '+a(2,'상단 리본')+'에 도구 모음이 표시됩니다.')+p(img(3,'고정 서식 도구 모음'))+p('화면 너비가 부족하면 나머지 옵션은 끝부분의 더 보기 메뉴에 모입니다. 서식 도구 모음 설정에서 여러 줄 표시를 선택하면 옵션을 여러 줄로 배치할 수 있습니다.')
|
||||
};
|
||||
@@ -0,0 +1,13 @@
|
||||
const p=s=>'<p>'+s+'</p>'; const ul=xs=>'<ul>'+xs.map(s=>'<li>'+s+'</li>').join('')+'</ul>';
|
||||
export default {
|
||||
75:({a,img})=>p('Trilium의 '+a(0,'노트')+'에는 이미지나 파일을 하나 이상 첨부할 수 있습니다. 첨부 파일은 해당 노트 안에 표시하거나 링크로 연결할 수 있습니다.')+p(a(1,'스크립트')+'에 필요한 라이브러리를 포함할 때도 유용합니다. '+a(2,'체중 기록')+' 예제에서는 스크립트 노트에 첨부한 '+a(3,'Chart.js')+'를 사용하는 방법을 보여 줍니다.')+p('첨부 파일은 각각 하나의 노트에 속합니다. 다른 노트와 같은 첨부 파일을 공유하지 않습니다. 첨부 파일 링크를 다른 노트에 복사하면 파일도 복제되며 이후에는 서로 독립적으로 관리됩니다.')+p('노트에 이미지를 넣을 때는 첨부 기능을 사용하는 것이 좋습니다. 이미지 첨부 파일은 해당 노트 본문에서 참조해야 합니다. 참조되지 않는 이미지는 설정된 유예 시간이 지나면 자동으로 삭제됩니다.')+'<h2>노트를 첨부 파일로 변환하기</h2>'+p(a(4,'파일 노트')+'를 상위 노트의 첨부 파일로 바꿀 수 있습니다.')+ul(['하나만 변환하려면 '+a(5,'노트 버튼')+'의 메뉴에서 첨부 파일로 변환을 선택하세요.','여러 개를 변환하려면 '+a(6,'노트 트리')+'에서 대상 노트를 선택한 뒤 마우스 오른쪽 버튼 → 고급 → 첨부 파일로 변환을 선택하세요.'])+'<h2>첨부 파일 미리보기</h2>'+p('이미지와 동영상 및 PDF 등의 첨부 파일은 '+a(7,'파일 노트')+'와 같은 미리보기 기능을 사용합니다.'),
|
||||
76:({a,img,pre})=>p('고급 개발이나 문제 해결 과정에서 Trilium의 SQLite 데이터베이스를 직접 수정해야 할 때가 있습니다. 수정하기 전에 <code>document.db</code>를 백업하세요.')+'<h2>내장 SQL 콘솔 사용하기</h2>'+p('Trilium에는 데이터베이스 편집기가 내장되어 있습니다. '+a(0,'SQL 콘솔')+'을 참고하세요.')+'<h2>외부 도구로 수정하기</h2>'+p('애플리케이션이 실행되지 않는 경우처럼 SQL 콘솔을 사용할 수 없을 때는 외부 도구를 이용할 수 있습니다. 데스크톱 앱을 종료하거나 서버 서비스와 Docker 컨테이너를 중지한 뒤 작업하세요.')+'<h3>DB Browser for SQLite 사용하기</h3>'+p('여러 운영체제에서 사용할 수 있는 그래픽 데이터베이스 편집기입니다.')+ul(['파일 메뉴에서 데이터베이스 열기를 선택하고 '+a(1,'데이터 폴더')+'의 데이터베이스를 엽니다.','SQL 실행 탭을 선택합니다.','원하는 SQL 문을 입력합니다.','탭 아래 도구 모음의 실행 버튼을 누르거나 <kbd>F5</kbd>를 누릅니다.','주 도구 모음에서 변경 사항 쓰기를 누릅니다.','데이터베이스나 프로그램을 닫습니다.'])+p(img(0,'외부 데이터베이스 편집기 사용 예시'))+'<h3>SQLite 명령줄 도구 사용하기</h3>'+p('데이터베이스 경로를 지정해 실행하세요.')+pre(0)+ul(['SQL 문 끝에 <code>;</code>을 붙여 입력합니다.','종료하려면 <code>.quit</code>을 입력하고 <kbd>Enter</kbd>를 누릅니다.']),
|
||||
77:({a})=>p('Trilium은 파일 이름 대신 노트 ID로 각 노트를 구분합니다. 일반적으로 새 노트를 만들 때 영문 대소문자와 숫자로 이루어진 12자리 ID를 무작위로 생성합니다.')+'<h2>가져오기와 내보내기의 영향</h2>'+p('노트를 내보내면 ID도 메타데이터에 기록됩니다. 하지만 다시 가져올 때는 모든 노트에 새 ID를 부여합니다. '+a(0,'첨부 파일')+'처럼 함께 가져오는 다른 항목도 새 ID를 받습니다.')+'<h2>ID 충돌</h2>'+p('ID는 길이가 정해져 있고 무작위로 만들어지므로 '+a(1,'비둘기집 원리')+'에 따라 기존 노트와 같은 ID가 생성될 가능성이 있습니다.')+p('사용할 수 있는 문자가 62개이고 길이가 12자리이므로 가능한 ID 수는 <span class="math-tex">\\(62^{12}\\)</span>개입니다. 원문은 '+a(2,'Nano ID 충돌 계산기')+'를 이용해 매시간 1000개의 노트를 약 900년 동안 만들어야 충돌 확률이 1% 정도가 된다고 설명합니다.')+p('이처럼 가능성이 매우 작아 Trilium은 별도의 충돌 방지 절차를 두지 않습니다. 고유 해시를 사용하는 '+a(3,'Git')+'에도 비슷한 문제가 있습니다. 이론적으로 충돌이 발생하면 기존 노트를 새 노트가 덮어쓸 가능성이 있습니다.'),
|
||||
78:({pre})=>p('Google 설문지의 스프레드시트 연결 기능을 이용해 응답을 내려받는 간단한 연동 예제입니다.')+p('웹에 게시한 링크는 주소를 아는 누구나 열 수 있습니다. 주소를 추측하기 어렵더라도 공개된 자료이므로 민감한 정보를 게시하지 않도록 확인하세요.')+'<h2>CSV 주소 얻기</h2>'+ul(['브라우저에서 Google 설문지를 엽니다.','응답 탭에서 스프레드시트에 연결을 누릅니다.','새 스프레드시트 만들기를 선택하고 만들기를 누릅니다.','Google 스프레드시트에서 파일 → 공유 → 웹에 게시를 선택합니다.','링크 탭에서 웹페이지 대신 쉼표로 구분된 값(.csv)을 선택합니다.','표시된 주소를 복사합니다. 다음 스크립트에서 사용할 주소입니다.'])+'<h2>스크립트 만들기</h2>'+p('프런트엔드 JavaScript 코드 노트를 만드세요.')+pre(0).replace('// Do something with the data.','// 이곳에서 내려받은 데이터를 처리합니다.')+p('응답은 문자열로 전달됩니다. 이 예제에는 CSV 분석 라이브러리가 없으므로 아주 단순한 자료는 다음처럼 나눌 수 있습니다.')+pre(1)+p('결과는 각 행을 배열로 담은 배열입니다. 따옴표로 감싼 값 안에 쉼표나 줄바꿈이 있는 일반적인 CSV는 이 방식으로 정확히 처리할 수 없습니다.'),
|
||||
79:({a})=>p('Trilium은 노트와 트리 구조 및 메타데이터와 대부분의 설정을 '+a(0,'SQLite')+' 데이터베이스에 저장합니다. 파일 이름은 <code>document.db</code>이며 기본 '+a(1,'데이터 폴더')+'에 있습니다.')+'<h2>사용 예제</h2>'+p('처음 실행하면 주요 기능을 소개하는 예제 노트를 제공합니다. '+a(2,'사용 예제')+'를 참고하세요.')+'<h2>데이터베이스 직접 수정하기</h2>'+p('고급 사용자는 '+a(3,'DB Browser for SQLite')+' 같은 도구로 데이터베이스를 살펴보거나 수정할 수 있습니다. 자세한 내용은 '+a(4,'데이터베이스 직접 수정하기')+'를 참고하세요.')+'<h2>데이터베이스 초기화하기</h2>'+p('시험 중인 환경을 초기 상태로 되돌리려면 기존 데이터베이스를 제거할 수 있습니다. 다음 실행 시 원본 예제 노트가 포함된 새 데이터베이스를 만듭니다. 기존 노트가 사라지므로 필요한 데이터를 먼저 백업하고 애플리케이션을 종료하세요.')+p(a(5,'데이터 폴더')+'에서 <code>document.db</code>와 이름이 <code>document.db</code>로 시작하는 관련 파일을 제거합니다.')+p('<code>config.ini</code>의 설정도 보존할 필요가 없다면 '+a(6,'데이터 폴더')+'의 내용을 모두 제거해 초기화할 수 있습니다. 파일 대신 환경 변수로 설정하는 방법은 '+a(7,'설정 안내')+'를 참고하세요.'),
|
||||
80:({a,img})=>'<h3>문장 안의 코드</h3>'+p('코드 서식은 고정폭 글꼴을 사용해 문장 안의 코드나 파일 경로 같은 기술적인 내용을 구분합니다.')+p(img(0,'경로와 git 명령의 코드 서식 예시'))+p('다음 방법으로 적용할 수 있습니다.')+ul([a(0,'서식 도구 모음')+'의 '+img(1,'코드 서식 버튼')+'을 누릅니다.','원하는 글자 양쪽에 역따옴표를 붙여 입력하면 코드 서식으로 바뀝니다. 예: <code>`code`</code>'])+'<h3>코드 블록</h3>'+p('여러 줄의 코드를 별도 블록으로 표시합니다.')+p(img(2,'JavaScript 구문 강조를 적용한 코드 블록'))+p('코드가 매우 길다면 전용 '+a(1,'코드 노트')+'를 사용하세요. 자세한 내용은 '+a(2,'코드 블록')+'을 참고하세요.')+'<h3>단축키 서식</h3>'+p('글자를 키보드의 키처럼 표시하는 서식입니다.')+p(img(3,'단축키 서식 예시'))+p(a(3,'서식 도구 모음')+'에서 '+img(5,'글자 서식 그룹')+'을 열고 '+img(4,'단축키 서식 버튼')+'을 누르세요. 떠 있는 도구 모음에서는 글자를 선택하면 버튼이 나타납니다.')+p('<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>K</kbd>로 선택한 글자에 적용할 수도 있습니다. 같은 버튼이나 단축키를 다시 누르면 해제됩니다. '+img(6,'서식 지우기 버튼')+'으로도 서식을 지울 수 있습니다.'),
|
||||
81:({pre})=>p('사용자 지정 리소스 제공 기능은 Trilium에 가져온 이미지와 글꼴 및 스타일시트 등의 파일을 공개 주소로 제공합니다. 테마와 함께 사용자 글꼴을 제공할 때 활용할 수 있습니다.')+'<h2>설정 순서</h2>'+ul(['이미지나 글꼴 파일을 Trilium으로 끌어서 가져옵니다.','파일 노트를 선택하고 소유한 속성을 엽니다.','<code>#customResourceProvider=hello</code> 라벨을 추가합니다.','브라우저에서 <code><protocol>://<host>/custom/hello</code>를 엽니다. protocol에는 환경에 맞는 <code>http</code>나 <code>https</code>를 사용합니다. host는 Trilium 서버의 주소입니다. 별도 서버 없이 데스크톱 앱만 사용한다면 기본 주소는 <code>http://localhost:37840</code>입니다.','정상적으로 설정되었다면 가져온 파일이 내려받아집니다.'])+p('<code>hello</code> 대신 다음과 같은 이름도 사용할 수 있습니다.')+ul(['경로 — <code>fonts/Roboto.ttf</code>로 지정하면 <code><host>/custom/fonts/Roboto.ttf</code>로 접근합니다.','정규식 — <code>hello/.*</code>로 지정하면 <code>/custom/hello/1</code>과 <code>/custom/hello/2</code> 또는 <code>/custom/hello/world</code>처럼 여러 경로에 대응합니다.'])+'<h2>테마에서 사용하기</h2>'+p('글꼴 파일을 가져온 뒤 <code>#customResourceProvider=fonts/myfont.ttf</code> 속성을 지정하세요. 테마 CSS에서는 다음처럼 불러올 수 있습니다.')+pre(0),
|
||||
82:({a,pre})=>'<h2>인증 비활성화</h2>'+p('Trilium을 <code>localhost</code>에서만 사용하거나 다른 구성 요소가 인증을 담당한다면 <code>config.ini</code>에 다음 설정을 추가해 Trilium 자체 인증을 끌 수 있습니다.')+pre(0)+p('0.94.1부터는 인증을 끄면 '+a(0,'다중 인증')+'도 생략됩니다.')+'<h2>로그인 세션의 동작</h2>'+p('로그인하면 브라우저에는 쿠키를 저장하고 서버에는 로그인 세션을 보관합니다.')+p('로그인 상태 유지를 선택하면 기본적으로 21일 뒤 만료됩니다. <code>config.ini</code>의 <code>Session.cookieMaxAge</code>로 기간을 바꿀 수 있습니다. 하루 뒤 만료시키는 예시입니다.')+pre(1)+p('로그인 상태 유지를 선택하지 않으면 브라우저 쿠키에 만료 시각을 지정하지 않으며 브라우저를 닫을 때 지워집니다. 서버의 세션은 애플리케이션을 마지막으로 사용한 시점부터 약 24시간 뒤 만료됩니다.')+'<h2>활성 세션 확인하기</h2>'+p('로그인 세션은 사용자 데이터와 같은 '+a(1,'데이터베이스')+'에 저장됩니다. '+a(2,'SQL 콘솔')+'에서 다음 조회문으로 확인할 수 있습니다.')+pre(2)+p('만료된 세션은 서버가 주기적으로 정리합니다. 일반적으로 한 시간 간격입니다.')+'<h2>관련 문서</h2>'+ul([a(3,'다중 인증')]),
|
||||
83:({a,img})=>p(img(0,'마인드맵 예시'))+p('마인드맵은 떠오르는 생각을 빠르게 적고 계층 구조로 정리하는 노트입니다.')+'<h2>용어</h2>'+ul(['<strong>항목</strong>은 하나의 생각을 나타냅니다. 최상위 항목은 배경색이 있는 둥근 사각형으로 표시됩니다. 하위 항목은 테두리만 있는 사각형으로 표시되며 더 아래 단계에서는 선으로 표시됩니다.','<strong>최상위 항목</strong>은 모든 항목의 출발점입니다. 마인드맵마다 하나만 있습니다.'])+'<h2>사용 방법</h2>'+ul(['같은 단계의 항목을 만들려면 <kbd>Enter</kbd>를 누르고 내용을 입력한 뒤 다시 <kbd>Enter</kbd>를 누르세요.','하위 항목은 <kbd>Tab</kbd>을 누른 뒤 내용을 입력하고 <kbd>Enter</kbd>로 확정합니다.','상위 항목은 <kbd>Ctrl</kbd>+<kbd>Enter</kbd>로 만듭니다.','항목을 삭제하려면 <kbd>Delete</kbd>를 누릅니다.','<kbd>Page Up</kbd>과 <kbd>Page Down</kbd>으로 항목을 위아래로 이동합니다.','항목을 선택하면 오른쪽에 나타나는 패널에서 글자 크기와 글자색 및 배경색을 바꾸거나 링크를 추가할 수 있습니다.','마인드맵 위에서 마우스를 끌어 여러 항목을 선택할 수 있습니다.','항목을 마우스 오른쪽 버튼으로 클릭하면 항목 추가와 집중 모드 및 항목 사이 연결 등의 메뉴가 나타납니다.','왼쪽 위 버튼으로 하위 항목을 최상위 항목의 왼쪽이나 오른쪽 또는 양쪽에 배치할 수 있습니다.',a(0,'떠 있는 버튼')+' 영역에서는 '+a(1,'이미지 참조')+'를 복사해 텍스트 노트에 넣거나 SVG와 PNG 파일로 내보낼 수 있습니다.']),
|
||||
84:({a,img,pre})=>p(img(0,'데이터베이스 익명화 화면'))+p('오류를 조사할 때 데이터베이스 구조가 필요할 수 있습니다. 개인 노트가 담긴 '+a(0,'데이터베이스')+' 원본을 공유하는 대신 익명화 기능을 사용할 수 있습니다. 메뉴 → 설정 → 고급에서 실행하세요.')+p('익명화 기능은 복사본을 만든 뒤 노트 제목과 본문 및 수정 이력과 사용 기록을 제거합니다. 일부 설정과 시스템용이 아닌 속성도 제거하며 구조와 수정 날짜 등의 메타데이터는 남깁니다. 이후 '+a(1,'VACUUM 정리')+'를 수행해 삭제된 데이터가 파일 내부에 남지 않도록 합니다.')+p('결과는 '+a(2,'데이터 폴더')+' 아래의 <code>anonymized</code> 폴더에 저장됩니다. 원본은 이 과정에서 변경되지 않습니다.')+p('정리된 복사본에도 구조와 날짜 등의 정보는 남습니다. 공유 전에 필요한 익명화 범위를 확인하세요. '+a(3,'VACUUM')+' 처리가 끝난 결과 파일의 위치는 '+a(4,'데이터 폴더 안내')+'에서도 확인할 수 있습니다.')+'<h2>명령줄에서 익명화하기</h2>'+p(a(5,'데이터베이스')+' 문제로 Trilium을 시작할 수 없다면 다음 명령을 사용할 수 있습니다.')+pre(0)+p('Trilium 소스 파일이 있는 폴더에서 실행하세요. 데스크톱 배포판에서는 일반적으로 <code>resources/app</code> 폴더입니다.')
|
||||
};
|
||||
@@ -0,0 +1,8 @@
|
||||
const p=s=>'<p>'+s+'</p>';const ul=xs=>'<ul>'+xs.map(s=>'<li>'+s+'</li>').join('')+'</ul>';
|
||||
export default {
|
||||
85:({a,img})=>p(img(0,'수식 입력 창'))+p('텍스트 노트에서 '+a(0,'서식 도구 모음')+'의 '+img(1,'수식 삽입 버튼')+'으로 수식을 넣을 수 있습니다. 보통 '+a(1,'삽입 버튼')+' 그룹 안에 있습니다.')+p('자주 사용한다면 <kbd>Ctrl</kbd>+<kbd>M</kbd>을 누르세요. <code>$$</code>나 <code>\\[</code>를 입력해 창을 열 수도 있습니다. 이미 입력한 수식 양쪽에 <code>$</code>를 붙이거나 선택한 뒤 단축키를 누르는 자동 변환 방식은 지원하지 않습니다.')+p('수식은 TeX 형식으로 작성합니다. 미리보기는 제공하지만 기호를 마우스로 조립하는 시각적 편집기는 없습니다.')+p('별도 표시 모드를 선택하면 수식을 조금 크게 표시하고 가운데 정렬합니다. 합계 기호나 분수가 포함된 수식에서 차이가 뚜렷합니다. 이 모드의 수식은 문단이나 표처럼 독립된 블록이 되어 목록 안에도 넣을 수 있습니다. 일반 모드의 수식은 문장 안에 들어갑니다.')+'<h2>지원하는 수식</h2>'+p('KaTeX 라이브러리를 사용하며 TeX 문법의 일부를 지원합니다. 공식 문서의 '+a(2,'지원 함수')+'와 '+a(3,'지원 여부 표')+'를 확인하세요.')+'<h2>Markdown 지원</h2>'+p('Markdown으로 가져오거나 내보낼 때도 수식이 유지됩니다. 수식 구분 기호를 이용해 문장 안의 수식과 별도 블록 수식을 표현합니다.')+p('수식을 가져오거나 내보내는 과정에서 문제가 생기면 해당 수식을 포함해 '+a(4,'문제를 보고')+'해 주세요.'),
|
||||
86:({a,img})=>p(img(0,'노트 안에서 찾기'))+p('현재 표시된 노트 안에서 글자를 찾는 기능입니다.')+'<h2>다른 검색 기능과의 차이</h2>'+ul(['브라우저에서 '+a(0,'텍스트 노트')+'나 '+a(1,'코드 노트')+'에 초점이 없는 상태로 <kbd>Ctrl</kbd>+<kbd>F</kbd>를 누르면 브라우저의 찾기 기능이 열립니다. 이때는 Trilium 메뉴의 글자도 검색됩니다.',a(2,'텍스트 노트')+'를 편집하는 중에 같은 단축키를 누르면 '+a(3,'CKEditor')+'의 찾기 기능이 열립니다.'])+'<h2>검색 열기</h2>'+ul(['데스크톱에서는 <kbd>Ctrl</kbd>+<kbd>F</kbd>를 누르세요.',a(4,'노트 버튼')+'의 메뉴에서 노트 안에서 찾기를 선택할 수도 있습니다.'])+'<h2>찾기</h2>'+p('찾을 내용을 입력하면 자동으로 검색합니다. 입력란 옆의 위아래 화살표로 결과 사이를 이동하세요.')+'<h2>바꾸기</h2>'+p('찾을 내용과 바꿀 내용을 입력하세요. 바꾸기는 현재 결과 하나를 변경하며 모두 바꾸기는 일치하는 내용을 한 번에 변경합니다.')+'<h2>검색 옵션</h2>'+ul(['대소문자 구분 — 영문 대문자와 소문자를 구분합니다. <code>Hello</code>를 찾으면 <code>hello</code>는 일치하지 않습니다.','단어 단위로 찾기 — 단어 전체가 일치할 때만 찾습니다. <code>Java</code>를 찾으면 <code>JavaScript</code>는 일치하지 않습니다.']),
|
||||
87:({a,img})=>p(img(0,'웹 클리퍼 화면'))+p('Trilium Web Clipper는 웹페이지의 글자와 이미지 및 화면 캡처와 짧은 메모를 Trilium에 바로 저장하는 브라우저 확장 프로그램입니다. '+a(0,'프로젝트 저장소')+'에서 소스를 확인할 수 있습니다.')+p('Firefox와 Chrome을 지원합니다. Chrome용 배포판은 다른 Chromium 기반 브라우저에서도 사용할 수 있습니다.')+'<h2>주요 기능</h2>'+ul(['글자를 선택하고 오른쪽 클릭 메뉴로 저장합니다.','이미지나 링크를 오른쪽 클릭해 저장합니다.','팝업이나 오른쪽 클릭 메뉴에서 페이지 전체를 저장합니다.','화면을 캡처하고 필요한 부분을 잘라 저장합니다.','팝업에서 짧은 텍스트 노트를 만듭니다.'])+p('저장한 자료는 클리퍼 수신함 노트의 하위 노트로 만들어집니다. 기본 위치는 '+a(1,'오늘의 노트')+'입니다. 다른 노트에 <code>clipperInbox</code> '+a(2,'라벨')+'을 지정하면 저장 위치를 바꿀 수 있습니다.')+p('같은 날 같은 페이지에서 여러 번 저장하면 하나의 노트에 모입니다.')+'<h2>확장 프로그램 내려받기</h2>'+ul([a(3,'프로젝트 릴리스 페이지')+' — Firefox용 XPI와 Chromium용 ZIP 파일을 제공합니다.',a(4,'Chrome 웹 스토어')])+'<h2>연결 설정</h2>'+p('실행 중인 Trilium에 연결해야 합니다. 기본적으로 로컬 컴퓨터의 포트 범위를 확인해 데스크톱 앱을 찾습니다. 데스크톱 앱을 사용하지 않거나 종료한 상태에서도 저장하려면 '+a(5,'서버')+' 주소를 지정할 수 있습니다.')+'<h2>사용자 이름</h2>'+p('0.50 이전 버전에서는 사용자 이름과 비밀번호가 필요했습니다. 이후 버전에서는 사용자 이름을 사용하지 않으므로 해당 입력란에 어떤 값을 넣어도 인증에 영향을 주지 않습니다.'),
|
||||
88:({a,img})=>p(img(0,'노트 탭'))+p('탭을 사용하면 여러 노트 사이를 빠르게 전환할 수 있습니다.')+'<h2>배치</h2>'+p(a(0,'세로 배치와 가로 배치')+' 설정에 따라 위치가 달라집니다.')+ul(['세로 배치에서는 '+a(1,'노트 트리')+' 오른쪽 영역의 위에 표시됩니다.','가로 배치에서는 '+a(2,'노트 트리')+' 위에서 화면 너비 전체를 사용하므로 더 많은 탭을 표시할 수 있습니다.'])+'<h2>사용 방법</h2>'+ul(['마지막 탭 오른쪽의 '+img(1,'새 탭 버튼')+'으로 탭을 만듭니다.','각 탭의 '+img(2,'탭 닫기 버튼')+'으로 닫습니다.',a(3,'분할 보기')+'와 함께 사용하면 탭마다 여러 노트를 나란히 표시할 수 있습니다.','탭을 끌어서 순서를 바꿀 수 있습니다.','탭을 위아래로 끌어 별도 창으로 분리할 수 있습니다. 분리한 탭을 다른 창으로 다시 합치는 기능은 지원하지 않습니다.'])+'<h2>단축키</h2>'+ul(['<kbd>Ctrl</kbd>+<kbd>T</kbd> — 새 탭 열기','<kbd>Ctrl</kbd>+<kbd>W</kbd> — 현재 탭 닫기','<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>T</kbd> — 마지막으로 닫은 탭 다시 열기','<kbd>Ctrl</kbd>+<kbd>Tab</kbd> — 다음 탭으로 이동','<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>Tab</kbd> — 이전 탭으로 이동','<kbd>Ctrl</kbd>+<kbd>1</kbd>부터 <kbd>Ctrl</kbd>+<kbd>9</kbd>까지 — 첫 번째부터 아홉 번째 탭으로 이동','마지막 탭으로 이동하는 기능에도 단축키를 지정할 수 있습니다. 기본 키는 없습니다.']),
|
||||
89:({a,img})=>p('분할 보기를 사용하면 둘 이상의 노트를 나란히 열고 작업할 수 있습니다.')+p(img(0,'여러 노트를 나란히 연 화면'))+'<h2>사용 방법</h2>'+ul(['노트 제목 오른쪽의 '+img(1,'분할 보기 추가 버튼')+'을 누르면 오른쪽에 새 영역이 열립니다. 여러 번 눌러 영역을 더 만들 수 있습니다. 좌우 배치만 지원하며 위아래 배치나 끌어서 나누기는 지원하지 않습니다.','분할 영역 옆의 '+img(2,'분할 보기 닫기 버튼')+'으로 해당 영역을 닫습니다.',img(3,'이전 분할 영역으로 이동')+'과 '+img(4,'다음 분할 영역으로 이동')+'으로 영역 사이를 이동합니다.',a(0,'탭')+'마다 분할 구성을 따로 유지합니다. 탭 제목에는 첫 번째 노트의 제목만 표시됩니다.'])+'<h2>노트 트리와 표시 범위</h2>'+p('분할 영역의 본문을 누르면 해당 영역이 활성화됩니다. '+a(1,'노트 트리')+'에서도 그 영역에서 편집 중인 노트를 표시합니다.')+p('각 영역에 서로 다른 '+a(2,'하위 트리 표시 범위')+'를 지정할 수 있습니다. 새 영역을 만들면 기존 영역의 표시 범위를 이어받으므로 만든 뒤 원하는 범위로 바꾸세요.')+p('노트를 정리할 때 한쪽은 원래 위치의 하위 트리로 제한하고 다른 쪽은 옮길 위치로 제한하면 편리합니다. 노트를 전환할 때마다 트리 위치가 크게 바뀌지 않아 잘라내기와 붙여넣기로 옮기기 쉽습니다.')
|
||||
};
|
||||
@@ -0,0 +1,8 @@
|
||||
const p=s=>'<p>'+s+'</p>';const ul=xs=>'<ul>'+xs.map(s=>'<li>'+s+'</li>').join('')+'</ul>';
|
||||
export default {
|
||||
90:({a,pre})=>p('Trilium은 Docker 컨테이너로 실행할 수 있으므로 Kubernetes에도 배포할 수 있습니다. 공식 Helm 차트나 커뮤니티 차트를 사용하거나 배포 구성을 직접 작성할 수 있습니다. 이 문서는 Helm 차트를 사용하는 방법을 안내합니다.')+'<h2>실행 권한</h2>'+p('이 문서에 해당하는 컨테이너는 초기화할 때 루트 권한이 필요합니다. 초기화 후에는 사용자와 그룹을 <code>1000:1000</code>으로 전환해 Node.js 프로세스를 실행합니다. 주 프로세스는 루트 권한으로 실행되지 않습니다.')+p('사용자 ID를 바꾸는 <code>PodSecurityContext</code> 설정은 사용하지 마세요. 저장 파일과 애플리케이션에 다른 사용자·그룹 ID를 사용하려면 <code>USER_UID</code>와 <code>USER_GID</code> 환경 변수를 지정하세요. 이미지가 <code>/home/node</code>의 권한도 조정하므로 별도 초기화 컨테이너는 필요하지 않습니다.')+'<h2>Helm 차트</h2>'+ul([a(0,'TriliumNext 공식 Helm 차트'),a(1,'ohdearaugustin')+'이 제공하는 '+a(2,'커뮤니티 차트')])+'<h2>저장소 추가하기</h2>'+p('다음 명령으로 저장소를 추가합니다. 명령 아래의 영문은 정상 실행 시 표시되는 응답 예시입니다.')+pre(0)+'<h2>차트 설치하기</h2>'+p('차트의 '+a(3,'values.yaml')+'을 검토하고 필요한 값을 수정해 설정 파일을 준비한 뒤 실행하세요.')+pre(1)+p('Helm 사용법은 Helm 공식 문서를 참고하세요. Trilium 관련 질문은 TriliumNext GitHub의 토론 게시판에 남길 수 있습니다.'),
|
||||
91:({img,pre})=>p('주요 속성을 사용하면 스크립트에 필요한 값을 입력란으로 제공할 수 있습니다. 입력·출력 노트를 선택하게 하거나 체크박스로 동작을 바꾸는 데 유용합니다.')+p(img(0,'스크립트 설정용 주요 속성'))+'<h2>체크박스로 기능 켜고 끄기</h2>'+p('사용자가 코드의 논리값을 직접 수정하는 대신 체크박스를 제공할 수 있습니다. 먼저 다음 속성을 정의하세요.')+pre(0).replace('alias=Group by extension','alias=확장자별로 묶기')+p('스크립트에서는 다음처럼 값을 읽습니다.')+pre(1).replace('// Do something.','// 선택한 경우에 실행할 작업을 작성합니다.')+p('이 방식은 프런트엔드와 백엔드 스크립트에서 모두 사용할 수 있습니다.')+'<h2>관계로 노트 선택하기</h2>'+p('다른 노트에서 데이터를 읽고 결과를 별도 노트에 기록하려면 입력과 출력 관계를 주요 속성으로 정의합니다.')+pre(2).replace('alias=Input','alias=입력 노트').replace('alias=Output','alias=출력 노트')+p('필수 입력란이 비어 있는지 확인할 수 있습니다.')+pre(3).replace('Missing input.','입력 노트를 선택하세요.').replace('Missing output.','출력 노트를 선택하세요.')+p('<code>api.showError</code>는 프런트엔드에서만 사용할 수 있습니다. 백엔드 스크립트에서는 이 호출을 제거해야 합니다. 제거하면 사용자에게 오류 이유가 표시되지 않으므로 필요한 경우 별도의 안내 방식을 마련하세요.')+p('선택한 노트와 본문은 다음처럼 읽습니다.')+pre(4),
|
||||
92:({a,img})=>p('오류 보고에 관련 로그를 함께 제공하면 원인을 파악하는 데 도움이 됩니다.')+'<h2>백엔드 로그</h2>'+p(a(0,'데이터 폴더')+'의 <code>log</code> 하위 폴더에서 가장 최근 파일을 찾으세요. 이름은 <code>trilium-2022-12-14.log</code>와 같은 형식입니다. 전체 파일을 첨부하거나 마지막 부분과 관련된 내용을 복사할 수 있습니다.')+p('파일을 찾기 어렵다면 왼쪽 위 메뉴 → 고급 → 백엔드 로그 보기를 사용하세요.')+'<h2>프런트엔드 로그</h2>'+p('대부분의 브라우저와 데스크톱 앱에서는 <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>I</kbd>로 개발자 도구를 엽니다. 애플리케이션을 다시 시작하면 콘솔이 지워지므로 오류를 재현한 직후 로그를 복사하세요.')+ul(['데스크톱 앱에서는 왼쪽 위 메뉴 → 고급 → 개발자 도구 열기로도 접근할 수 있습니다.','Firefox와 Chrome에서는 페이지를 마우스 오른쪽 버튼으로 클릭하고 검사를 선택할 수 있습니다.'])+p(img(0,'브라우저에서 개발자 도구 열기'))+p('개발자 도구의 콘솔 탭을 선택하세요.')+p(img(1,'개발자 도구 콘솔'))+p('로그를 복사하거나 화면을 캡처합니다. 오류 전후의 기록을 함께 제공하면 발생 상황을 이해하기 쉽습니다.')+'<h2>민감한 정보가 포함된 경우</h2>'+p('공개 GitHub 이슈에 올리기 어려운 자료는 먼저 Matrix '+a(1,'지원 채널')+'에서 개발자에게 전달 방법을 문의하세요. 가져오기 중 문제가 발생한 파일이나 이미지 및 ZIP 파일과 '+a(2,'익명화한 데이터베이스')+'도 원인 분석에 도움이 될 수 있습니다.')+'<h3>문제 재현용 하위 트리 내보내기</h3>'+p('특정 노트에서만 발생하는 문제라면 해당 노트를 제공하는 것이 재현에 도움이 됩니다. 왼쪽 트리에서 관련 노트를 마우스 오른쪽 버튼으로 클릭한 뒤 내보내기 → HTML을 ZIP으로 내보내기를 선택하세요.')+p(img(2,'문제 재현용 노트 내보내기')),
|
||||
93:({a,img,pre})=>'<h2>1. 테마를 모아 둘 노트 만들기</h2>'+p('직접 만든 테마와 가져온 테마를 한곳에 모으면 관리하기 쉽습니다. 먼저 테마를 보관할 상위 노트를 만드세요.')+p(img(0,'테마 보관용 노트'))+'<h2>2. 테마 노트 만들기</h2>'+p('테마는 특별한 속성을 지정한 코드 노트입니다. 새 코드 노트를 만드세요.')+p(img(1,'새 코드 노트 만들기'))+p('노트 유형을 CSS 코드로 바꿉니다.')+p(img(2,'CSS 유형 선택'))+p('소유한 속성에 <code>#appTheme</code>를 추가하고 원하는 테마 이름을 값으로 지정하세요. 이 이름이 화면 설정의 테마 목록에 나타납니다.')+p(img(3,'테마 이름 지정'))+'<h2>3. 테마 CSS 작성하기</h2>'+p('다음 예제는 실행 도구 모음의 배경색을 파란색으로 바꿉니다.')+pre(0)+'<h2>4. 테마 적용하기</h2>'+p('<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>R</kbd>로 새로고침한 뒤 설정을 열면 새 테마가 목록에 나타납니다.')+p(img(4,'새 테마 선택'))+p('테마를 선택하면 새 모양으로 화면이 갱신됩니다.')+p(img(5,'테마 적용 결과'))+p('기본적으로 기존 테마를 바탕으로 합니다. 새 TriliumNext 테마를 기반으로 만들려면 '+a(0,'테마 기반 선택')+'을 참고하세요.')+'<h2>5. 테마 수정하기</h2>'+p('테마 노트의 CSS를 수정한 뒤 <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>R</kbd>로 새로고침하면 반영됩니다. 창을 두 개 열어 한쪽에서는 편집하고 다른 쪽에서는 결과를 확인하면 편리합니다.'),
|
||||
94:({a,img,pre})=>p(a(0,'Ollama')+'는 여러 방식으로 설치할 수 있으며 '+a(1,'Docker 컨테이너')+'에서도 실행할 수 있습니다. 지원되는 GPU를 사용하면 일반적으로 더 빠릅니다. CPU와 메모리만으로도 실행할 수 있습니다. 직접 설치하려면 공식 '+a(2,'설치 프로그램')+'을 이용하세요.')+p(img(0,'Ollama 내려받기 화면'))+p(img(1,'설치 파일'))+p(img(2,'설치 진행 화면'))+p('Windows에서는 설치 후 시작 메뉴에서 실행할 수 있습니다.')+p(img(3,'시작 메뉴의 Ollama'))+p('PowerShell이나 명령 프롬프트에서 <code>ollama</code> 명령도 사용할 수 있습니다.')+p(img(4,'Ollama 명령줄 실행'))+p('설치 후 <code>pull</code> 명령으로 사용할 모델을 내려받습니다. 다음은 원문 작성 시점인 2025년 4월에 소개한 도구 호출용 모델과 임베딩 모델의 예시입니다.')+pre(0)+p('기본 포트는 11434입니다. '+a(3,'로컬 Ollama 상태 페이지')+'를 열면 실행 여부를 확인할 수 있습니다.')+p(img(5,'Ollama 정상 실행 응답'))+p('서비스를 실행하고 모델을 내려받았다면 Trilium에서 채팅 제공자와 임베딩 제공자로 설정할 준비가 된 것입니다.')
|
||||
};
|
||||
@@ -0,0 +1,8 @@
|
||||
const p=s=>'<p>'+s+'</p>';const ul=xs=>'<ul>'+xs.map(s=>'<li>'+s+'</li>').join('')+'</ul>';
|
||||
export default {
|
||||
95:({a,img})=>p(img(0,'노트 속성'))+p('속성은 노트에 지정하는 이름과 값의 쌍입니다. 추가 정보를 저장하거나 기능을 설정하며 크게 두 종류로 나뉩니다.')+ul([a(0,'라벨')+' — 메타데이터를 저장하거나 노트의 동작을 설정합니다. 검색에도 사용할 수 있습니다. 미리 정의된 항목은 '+a(1,'라벨 안내')+'를 참고하세요.',a(2,'관계')+' — 링크처럼 노트 사이의 연결을 정의합니다. 메타데이터와 스크립트에 활용할 수 있습니다. 미리 정의된 항목은 '+a(3,'관계 안내')+'를 참고하세요.'])+'<h2>속성 목록 확인하기</h2>'+p('현재 노트에 직접 지정한 라벨과 관계는 '+a(4,'상단 리본')+'의 소유한 속성에서 확인하고 수정할 수 있습니다. 상위 노트에서 물려받은 항목은 상속된 속성에서 확인할 수 있으며 그곳에서는 수정할 수 없습니다.')+p('목록에서 라벨 앞에는 <code>#</code>이 붙고 관계 앞에는 <code>~</code>가 붙습니다.')+'<h2>같은 이름의 여러 값</h2>'+p('같은 이름의 속성을 여러 개 지정할 수 있습니다. 이를 통해 한 항목에 여러 값을 저장할 수 있습니다.')+'<h2>속성 정의와 주요 속성</h2>'+p('특별한 라벨로 속성의 형식과 표시 방법을 정의할 수 있습니다. '+a(5,'주요 속성')+'을 참고하세요.')+'<h2>속성 상속</h2>'+p('하위 노트가 상위 노트의 속성을 물려받을 수 있습니다. 자세한 내용은 '+a(6,'속성 상속')+'을 참고하세요.'),
|
||||
96:({a,img,pre})=>p(img(0,'HTML 표시 노트'))+p('HTML 표시 노트는 '+a(0,'스크립트')+'에서 활용하는 유형입니다. 관계 속성으로 연결된 '+a(1,'코드 노트')+'의 HTML을 화면에 표시합니다.')+'<h2>HTML 표시 노트 만들기</h2>'+ul(['HTML 언어의 '+a(2,'코드 노트')+'를 만들고 표시할 내용을 작성합니다. 예: <code><p>안녕하세요.</p></code>',a(3,'HTML 표시 노트')+'를 만듭니다.','<code>renderNote</code> '+a(4,'관계')+'가 앞서 만든 HTML 코드 노트를 가리키도록 지정합니다.'])+'<h2>동적 내용 표시하기</h2>'+p(a(5,'스크립트')+'로 HTML의 일부를 바꾸면 동적 화면을 만들 수 있습니다. 현재 날짜와 시각을 표시하는 예제를 만들어 보겠습니다.')+p('먼저 다음 내용의 HTML 코드 노트를 만드세요.')+pre(0).replace('Current date & time','현재 날짜와 시각').replace('The current date & time is','현재 날짜와 시각:')+p('그 바로 아래에 프런트엔드 JavaScript '+a(6,'코드 노트')+'를 만들고 다음 코드를 작성합니다.')+pre(1).replace('$dateEl.text(new Date());','$dateEl.text(new Date().toLocaleString("ko-KR"));')+p('원하는 위치에 HTML 표시 노트를 만들고 <code>~renderNote</code> 관계로 HTML 노트를 연결하세요. 열면 현재 날짜와 시각이 한국어 형식으로 표시됩니다. 예: <strong>현재 날짜와 시각</strong> — 현재 날짜와 시각: 2025. 4. 6. 오후 3:26:29')+'<h2>관련 예제</h2>'+p(a(7,'체중 기록')+'은 기본 '+a(8,'사용 예제')+'에 포함되어 있습니다.'),
|
||||
97:({a,img})=>p('Trilium은 호환성을 최대한 유지하면서 Markdown 가져오기와 내보내기를 지원합니다.')+'<h2>가져오기</h2><h3>클립보드에서 가져오기</h3>'+p('일부 Markdown 내용을 복사했다면 편집기의 블록 메뉴에서 가져올 수 있습니다.')+p(img(0,'클립보드의 Markdown 가져오기'))+'<h3>파일에서 가져오기</h3>'+p('확장자가 <code>.md</code>인 파일 하나를 가져오거나 여러 파일의 폴더 구조를 '+a(0,'압축 파일')+'로 묶어 가져올 수 있습니다. 이 기능에서는 ZIP 형식을 사용하세요. 브라우저가 폴더를 직접 읽지 못하므로 '+a(1,'7-Zip')+' 같은 도구로 폴더를 ZIP으로 압축해야 합니다.')+p(img(1,'Markdown 파일 가져오기'))+'<h2>내보내기</h2><h3>하위 트리 내보내기</h3>'+p('하위 트리 전체를 ZIP으로 내보내면 노트 구조에 맞춰 폴더가 만들어집니다.')+p(img(2,'하위 트리의 Markdown 내보내기'))+'<h3>노트 하나만 내보내기</h3>'+p('하위 노트를 제외하고 현재 노트만 내보내려면 노트 작업 메뉴를 사용하세요.')+p(img(3,'현재 노트의 Markdown 내보내기'))+'<h3>보호된 노트 내보내기</h3>'+p('먼저 보호 세션을 시작해야 합니다. 내보낸 파일은 암호화되지 않습니다. 다시 가져온 노트도 필요하면 보호 설정을 다시 적용하세요.')+'<h2>지원 문법</h2>'+ul([a(2,'GitHub 확장 Markdown')+'을 주된 기준으로 사용합니다.','이미지를 지원합니다. 사용자 지정 너비가 있으면 HTML로 내보내며 그림 요소도 HTML로 포함합니다.','표를 지원합니다. 구조가 복잡하거나 HTML이 필요한 요소를 포함한 표는 HTML로 내보냅니다.',a(3,'안내 상자')+'는 GitHub 형식을 사용합니다.','링크를 지원합니다. 노트의 제목과 아이콘을 반영하는 참조 링크는 정보를 보존하기 위해 HTML로 포함합니다.','수식은 <code>$</code>와 <code>$$</code> 구분 기호를 지원합니다.']),
|
||||
98:({img})=>p(img(0,'집중 모드 화면'))+p('Windows 11에서 운영체제 제목 표시줄을 끄고 배경 효과를 켠 예시입니다. 집중 모드는 대부분의 메뉴를 숨겨 읽기와 쓰기에 집중할 수 있도록 합니다.')+p(img(1,'전체 메뉴의 집중 모드'))+'<h2>켜고 끄기</h2>'+p('전체 메뉴에서 집중 모드를 선택하세요. 0.92.5부터는 <kbd>F9</kbd>로 전환할 수 있습니다. 이전 버전의 기본 단축키는 <kbd>Alt</kbd>+<kbd>Z</kbd>입니다. 단축키 설정에서는 <code>toggleZenMode</code> 항목을 찾으세요.')+p('집중 모드에서는 전체 메뉴도 숨겨집니다. 오른쪽 위의 '+img(2,'집중 모드 종료 버튼')+'을 누르거나 단축키를 다시 누르면 해제됩니다. 현재 창에만 적용되며 앱을 다시 시작하면 해제됩니다.')+'<h2>창 이동하기</h2>'+p('운영체제 제목 표시줄을 사용한다면 해당 부분을 끌어 창을 옮기세요. 제목 표시줄을 껐다면 노트 제목이 있는 창 위쪽을 끌어 이동할 수 있습니다.')+p(img(3,'집중 모드의 분할 보기'))+p('Windows 11에서 배경 효과를 끄고 두 노트를 나란히 표시한 예시입니다.')+'<h2>탭과 분할 보기</h2>'+p('탭은 숨겨지지만 단축키는 사용할 수 있습니다. <code>firstTab</code>의 기본 키는 <kbd>Ctrl</kbd>+<kbd>1</kbd>이며 <code>secondTab</code>은 <kbd>Ctrl</kbd>+<kbd>2</kbd>입니다. 다음 탭으로 이동하는 <code>activateNextTab</code>은 <kbd>Ctrl</kbd>+<kbd>Tab</kbd>을 사용하며 이전 탭으로 이동하는 <code>activatePreviousTab</code>은 <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>Tab</kbd>을 사용합니다. 실제 지정된 키는 설정에서 확인하세요.')+p('이 문서의 버전에서는 분할 보기 단축키가 없습니다. 집중 모드를 끈 상태에서 분할 구성을 만든 뒤 다시 집중 모드를 켜면 사용할 수 있습니다.'),
|
||||
99:({a,pre})=>p('ETAPI는 외부 프로그램에서 Trilium을 사용하는 REST API입니다. 0.50부터 제공됩니다. 명세는 '+a(0,'OpenAPI 문서')+'에서 확인할 수 있습니다.')+'<h2>클라이언트 라이브러리</h2>'+p(a(1,'trilium-py')+'를 사용하면 Python에서 Trilium에 접근하는 코드를 더 쉽게 작성할 수 있습니다.')+'<h2>토큰 발급</h2>'+p('모든 API 작업은 토큰으로 인증해야 합니다. 설정 → ETAPI에서 발급하거나 <code>/auth/login</code> 요청으로 받을 수 있습니다. 자세한 요청 형식은 '+a(2,'API 명세')+'를 참고하세요.')+'<h2>인증</h2><h3>Authorization 헤더</h3>'+pre(0)+p('<code>ETAPITOKEN</code>을 발급받은 토큰으로 바꾸세요. 0.93.0부터는 다른 도구와의 호환성을 위해 <code>Bearer ETAPITOKEN</code> 형식도 지원합니다.')+'<h3>기본 인증</h3>'+p('0.56부터 다음 형식도 지원합니다.')+pre(1)+ul(['<code>BATOKEN = BASE64(username + \':\' + password)</code> 형식으로 만듭니다.','사용자 이름은 <code>etapi</code>입니다.','비밀번호 자리에 발급받은 ETAPI 토큰을 넣습니다.'])+p('기본 인증만 지원하는 도구에서 사용할 수 있는 방식입니다.')+'<h2>Bash 스크립트 예제</h2>'+p('다음 예제는 노트의 HTML 본문을 내려받습니다.')+pre(2).replace('# Configuration','# 연결 설정').replace('# Download a note by ID','# 노트 ID로 본문 내려받기').replace('TOKEN=z1vA4fkGxjOR_ZXLrZeqHEFOv65yV3882iFCRtNIK9k9iWrHliITNSLQ=','TOKEN=YOUR_ETAPI_TOKEN')+p('실행 전에 다음 값을 바꾸세요.')+ul(['<code>TOKEN</code> — 직접 발급받은 ETAPI 토큰','<code>SERVER</code> — 사용 중인 Trilium의 프로토콜과 호스트 및 포트','<code>NOTE_ID</code> — 내려받을 노트의 ID'])
|
||||
};
|
||||
@@ -0,0 +1,175 @@
|
||||
[
|
||||
"hidden.html",
|
||||
"launchbar_command_launcher.html",
|
||||
"launchbar_history_navigation.html",
|
||||
"launchbar_intro.html",
|
||||
"launchbar_note_launcher.html",
|
||||
"launchbar_quick_search.html",
|
||||
"launchbar_script_launcher.html",
|
||||
"launchbar_spacer.html",
|
||||
"launchbar_widget_launcher.html",
|
||||
"share.html",
|
||||
"user_hidden.html",
|
||||
"User Guide/User Guide/FAQ.html",
|
||||
"User Guide/User Guide/Note Types.html",
|
||||
"User Guide/User Guide/Quick Start.html",
|
||||
"User Guide/User Guide/Scripting.html",
|
||||
"User Guide/User Guide/Troubleshooting.html",
|
||||
"User Guide/User Guide/Advanced Usage/Advanced Showcases.html",
|
||||
"User Guide/User Guide/Advanced Usage/Attributes.html",
|
||||
"User Guide/User Guide/Advanced Usage/Bulk Actions.html",
|
||||
"User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.html",
|
||||
"User Guide/User Guide/Advanced Usage/Custom Request Handler.html",
|
||||
"User Guide/User Guide/Advanced Usage/Custom Resource Providers.html",
|
||||
"User Guide/User Guide/Advanced Usage/Database.html",
|
||||
"User Guide/User Guide/Advanced Usage/Default Note Title.html",
|
||||
"User Guide/User Guide/Advanced Usage/ETAPI (REST API).html",
|
||||
"User Guide/User Guide/Advanced Usage/Hidden Notes.html",
|
||||
"User Guide/User Guide/Advanced Usage/Metrics.html",
|
||||
"User Guide/User Guide/Advanced Usage/Note ID.html",
|
||||
"User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map).html",
|
||||
"User Guide/User Guide/Advanced Usage/Note source.html",
|
||||
"User Guide/User Guide/Advanced Usage/Sharing.html",
|
||||
"User Guide/User Guide/Advanced Usage/Technologies used.html",
|
||||
"User Guide/User Guide/Advanced Usage/Templates.html",
|
||||
"User Guide/User Guide/AI/AI Provider Information.html",
|
||||
"User Guide/User Guide/AI/Introduction.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Keyboard Shortcuts.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Themes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Zen mode.html",
|
||||
"User Guide/User Guide/Installation & Setup/Backup.html",
|
||||
"User Guide/User Guide/Installation & Setup/Data directory.html",
|
||||
"User Guide/User Guide/Installation & Setup/Desktop Installation.html",
|
||||
"User Guide/User Guide/Installation & Setup/Mobile Frontend.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation.html",
|
||||
"User Guide/User Guide/Installation & Setup/Synchronization.html",
|
||||
"User Guide/User Guide/Installation & Setup/Upgrading TriliumNext.html",
|
||||
"User Guide/User Guide/Installation & Setup/Web Clipper.html",
|
||||
"User Guide/User Guide/Note Types/Book.html",
|
||||
"User Guide/User Guide/Note Types/Canvas.html",
|
||||
"User Guide/User Guide/Note Types/Code.html",
|
||||
"User Guide/User Guide/Note Types/File.html",
|
||||
"User Guide/User Guide/Note Types/Geo Map.html",
|
||||
"User Guide/User Guide/Note Types/Mermaid Diagrams.html",
|
||||
"User Guide/User Guide/Note Types/Mind Map.html",
|
||||
"User Guide/User Guide/Note Types/Note Map.html",
|
||||
"User Guide/User Guide/Note Types/Relation Map.html",
|
||||
"User Guide/User Guide/Note Types/Render Note.html",
|
||||
"User Guide/User Guide/Note Types/Saved Search.html",
|
||||
"User Guide/User Guide/Note Types/Text.html",
|
||||
"User Guide/User Guide/Note Types/Web View.html",
|
||||
"User Guide/User Guide/Scripting/Custom Widgets.html",
|
||||
"User Guide/User Guide/Scripting/Events.html",
|
||||
"User Guide/User Guide/Scripting/Frontend Basics.html",
|
||||
"User Guide/User Guide/Scripting/Script API.html",
|
||||
"User Guide/User Guide/Theme development/Creating a custom theme.html",
|
||||
"User Guide/User Guide/Theme development/Custom app-wide CSS.html",
|
||||
"User Guide/User Guide/Theme development/Customize the Next theme.html",
|
||||
"User Guide/User Guide/Theme development/Reference.html",
|
||||
"User Guide/User Guide/Troubleshooting/Anonymized Database.html",
|
||||
"User Guide/User Guide/Troubleshooting/Error logs.html",
|
||||
"User Guide/User Guide/Troubleshooting/Refreshing the application.html",
|
||||
"User Guide/User Guide/Troubleshooting/Reporting issues.html",
|
||||
"User Guide/User Guide/Troubleshooting/Synchronization fails with 504.html",
|
||||
"User Guide/User Guide/Advanced Usage/Advanced Showcases/Day Notes.html",
|
||||
"User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.html",
|
||||
"User Guide/User Guide/Advanced Usage/Advanced Showcases/Weight Tracker.html",
|
||||
"User Guide/User Guide/Advanced Usage/Attributes/Attribute Inheritance.html",
|
||||
"User Guide/User Guide/Advanced Usage/Attributes/Labels.html",
|
||||
"User Guide/User Guide/Advanced Usage/Attributes/Promoted Attributes.html",
|
||||
"User Guide/User Guide/Advanced Usage/Attributes/Relations.html",
|
||||
"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Cross-Origin Resource Sharing .html",
|
||||
"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Trilium instance.html",
|
||||
"User Guide/User Guide/Advanced Usage/Database/Demo Notes.html",
|
||||
"User Guide/User Guide/Advanced Usage/Database/Manually altering the database.html",
|
||||
"User Guide/User Guide/Advanced Usage/Sharing/Serving directly the content o.html",
|
||||
"User Guide/User Guide/Advanced Usage/Technologies used/CKEditor.html",
|
||||
"User Guide/User Guide/Advanced Usage/Technologies used/Excalidraw.html",
|
||||
"User Guide/User Guide/Advanced Usage/Technologies used/Leaflet.html",
|
||||
"User Guide/User Guide/Advanced Usage/Technologies used/MindElixir.html",
|
||||
"User Guide/User Guide/AI/AI Provider Information/Anthropic.html",
|
||||
"User Guide/User Guide/AI/AI Provider Information/OpenAI.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Import & Export/Evernote.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Import & Export/OneNote.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Bookmarks.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to Note.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Hoisting.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Navigation.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick search.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Search in note.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Search.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Similar Notes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Tree Concepts.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Workspaces.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Archived Notes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Attachments.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Export as PDF.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Note Icons.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Note List.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Note Revisions.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Protected Notes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Sorting Notes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Themes/Theme Gallery.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Floating buttons.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Global menu.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note buttons.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Options.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Recent Changes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Right Sidebar.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Split View.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Tabs.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Vertical and horizontal layout.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/Authentication.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/Multi-Factor Authentication.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/TLS Configuration.html",
|
||||
"User Guide/User Guide/Note Types/Mermaid Diagrams/ELK layout.html",
|
||||
"User Guide/User Guide/Note Types/Text/Block quotes & admonitions.html",
|
||||
"User Guide/User Guide/Note Types/Text/Bookmarks.html",
|
||||
"User Guide/User Guide/Note Types/Text/Content language & Right-to-le.html",
|
||||
"User Guide/User Guide/Note Types/Text/Cut to subnote.html",
|
||||
"User Guide/User Guide/Note Types/Text/Developer-specific formatting.html",
|
||||
"User Guide/User Guide/Note Types/Text/Footnotes.html",
|
||||
"User Guide/User Guide/Note Types/Text/Formatting toolbar.html",
|
||||
"User Guide/User Guide/Note Types/Text/General formatting.html",
|
||||
"User Guide/User Guide/Note Types/Text/Highlights list.html",
|
||||
"User Guide/User Guide/Note Types/Text/Images.html",
|
||||
"User Guide/User Guide/Note Types/Text/Include Note.html",
|
||||
"User Guide/User Guide/Note Types/Text/Insert buttons.html",
|
||||
"User Guide/User Guide/Note Types/Text/Keyboard shortcuts.html",
|
||||
"User Guide/User Guide/Note Types/Text/Links.html",
|
||||
"User Guide/User Guide/Note Types/Text/Lists.html",
|
||||
"User Guide/User Guide/Note Types/Text/Markdown-like formatting.html",
|
||||
"User Guide/User Guide/Note Types/Text/Math Equations.html",
|
||||
"User Guide/User Guide/Note Types/Text/Other features.html",
|
||||
"User Guide/User Guide/Note Types/Text/Table of contents.html",
|
||||
"User Guide/User Guide/Note Types/Text/Tables.html",
|
||||
"User Guide/User Guide/Scripting/Custom Widgets/Widget Basics.html",
|
||||
"User Guide/User Guide/Scripting/Custom Widgets/Word count widget.html",
|
||||
"User Guide/User Guide/Scripting/Examples/Downloading responses from Goo.html",
|
||||
"User Guide/User Guide/Scripting/Examples/New Task launcher button.html",
|
||||
"User Guide/User Guide/Scripting/Examples/Using promoted attributes to c.html",
|
||||
"User Guide/User Guide/Advanced Usage/Database/Manually altering the database/SQL Console.html",
|
||||
"User Guide/User Guide/AI/AI Provider Information/Ollama/Installing Ollama.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes/Branch prefix.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Note List/Calendar View.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Multiple selection.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Multiple server instances.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/On NixOS.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Kubernetes.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx.html",
|
||||
"User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.html",
|
||||
"User Guide/User Guide/Note Types/Text/Images/Image references.html"
|
||||
]
|
||||
@@ -0,0 +1,175 @@
|
||||
[
|
||||
"User Guide/User Guide/AI/AI Provider Information/Anthropic.html",
|
||||
"User Guide/User Guide/AI/AI Provider Information/OpenAI.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom.html",
|
||||
"share.html",
|
||||
"launchbar_command_launcher.html",
|
||||
"user_hidden.html",
|
||||
"User Guide/User Guide/Troubleshooting/Reporting issues.html",
|
||||
"User Guide/User Guide/Troubleshooting/Refreshing the application.html",
|
||||
"launchbar_history_navigation.html",
|
||||
"hidden.html",
|
||||
"User Guide/User Guide/Note Types/Canvas.html",
|
||||
"launchbar_quick_search.html",
|
||||
"User Guide/User Guide/Advanced Usage/Technologies used/Leaflet.html",
|
||||
"launchbar_spacer.html",
|
||||
"User Guide/User Guide/Scripting/Custom Widgets.html",
|
||||
"User Guide/User Guide/Advanced Usage/Technologies used.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Global menu.html",
|
||||
"User Guide/User Guide/Advanced Usage/Technologies used/Excalidraw.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Bookmarks.html",
|
||||
"launchbar_script_launcher.html",
|
||||
"User Guide/User Guide/Note Types/Text/Include Note.html",
|
||||
"launchbar_note_launcher.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Hoisting.html",
|
||||
"User Guide/User Guide/Note Types/Note Map.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note buttons.html",
|
||||
"launchbar_intro.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Note Icons.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Archived Notes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes/Branch prefix.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Multiple selection.html",
|
||||
"User Guide/User Guide/Troubleshooting/Synchronization fails with 504.html",
|
||||
"User Guide/User Guide/Advanced Usage/Technologies used/MindElixir.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Similar Notes.html",
|
||||
"User Guide/User Guide/Note Types/Text/Content language & Right-to-le.html",
|
||||
"User Guide/User Guide/Note Types/Mermaid Diagrams/ELK layout.html",
|
||||
"User Guide/User Guide/Advanced Usage/Advanced Showcases.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Navigation.html",
|
||||
"User Guide/User Guide/Note Types/Saved Search.html",
|
||||
"User Guide/User Guide/AI/AI Provider Information.html",
|
||||
"User Guide/User Guide/Note Types/Text/Cut to subnote.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/On NixOS.html",
|
||||
"launchbar_widget_launcher.html",
|
||||
"User Guide/User Guide/Scripting/Script API.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Import & Export/Evernote.html",
|
||||
"User Guide/User Guide/Theme development/Customize the Next theme.html",
|
||||
"User Guide/User Guide/Note Types/Text/Footnotes.html",
|
||||
"User Guide/User Guide/Note Types/Book.html",
|
||||
"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Trilium instance.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Floating buttons.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Right Sidebar.html",
|
||||
"User Guide/User Guide/Advanced Usage/Sharing/Serving directly the content o.html",
|
||||
"User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map).html",
|
||||
"User Guide/User Guide/Note Types/Text/Bookmarks.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Note Revisions.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick search.html",
|
||||
"User Guide/User Guide/Advanced Usage/Database/Manually altering the database/SQL Console.html",
|
||||
"User Guide/User Guide/Quick Start.html",
|
||||
"User Guide/User Guide/Advanced Usage/Database/Demo Notes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Recent Changes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Tree Concepts.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to Note.html",
|
||||
"User Guide/User Guide/Installation & Setup/Upgrading TriliumNext.html",
|
||||
"User Guide/User Guide/Note Types/Text/Images/Image references.html",
|
||||
"User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.html",
|
||||
"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Cross-Origin Resource Sharing .html",
|
||||
"User Guide/User Guide/Theme development/Custom app-wide CSS.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Options.html",
|
||||
"User Guide/User Guide/Note Types/Text/Table of contents.html",
|
||||
"User Guide/User Guide/Note Types/Text/Highlights list.html",
|
||||
"User Guide/User Guide/Installation & Setup/Desktop Installation.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree.html",
|
||||
"User Guide/User Guide/Installation & Setup/Mobile Frontend.html",
|
||||
"User Guide/User Guide/Note Types/Web View.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Multiple server instances.html",
|
||||
"User Guide/User Guide/Note Types/Text/Formatting toolbar.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Attachments.html",
|
||||
"User Guide/User Guide/Advanced Usage/Database/Manually altering the database.html",
|
||||
"User Guide/User Guide/Advanced Usage/Note ID.html",
|
||||
"User Guide/User Guide/Scripting/Examples/Downloading responses from Goo.html",
|
||||
"User Guide/User Guide/Advanced Usage/Database.html",
|
||||
"User Guide/User Guide/Note Types/Text/Developer-specific formatting.html",
|
||||
"User Guide/User Guide/Advanced Usage/Custom Resource Providers.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/Authentication.html",
|
||||
"User Guide/User Guide/Note Types/Mind Map.html",
|
||||
"User Guide/User Guide/Troubleshooting/Anonymized Database.html",
|
||||
"User Guide/User Guide/Note Types/Text/Math Equations.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Search in note.html",
|
||||
"User Guide/User Guide/Installation & Setup/Web Clipper.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Tabs.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Split View.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Kubernetes.html",
|
||||
"User Guide/User Guide/Scripting/Examples/Using promoted attributes to c.html",
|
||||
"User Guide/User Guide/Troubleshooting/Error logs.html",
|
||||
"User Guide/User Guide/Theme development/Creating a custom theme.html",
|
||||
"User Guide/User Guide/AI/AI Provider Information/Ollama/Installing Ollama.html",
|
||||
"User Guide/User Guide/Advanced Usage/Attributes.html",
|
||||
"User Guide/User Guide/Note Types/Render Note.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Zen mode.html",
|
||||
"User Guide/User Guide/Advanced Usage/ETAPI (REST API).html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually.html",
|
||||
"User Guide/User Guide/Advanced Usage/Default Note Title.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Workspaces.html",
|
||||
"User Guide/User Guide/Advanced Usage/Technologies used/CKEditor.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Export as PDF.html",
|
||||
"User Guide/User Guide/Note Types/Text/Markdown-like formatting.html",
|
||||
"User Guide/User Guide/Note Types/Text/Other features.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Sorting Notes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Note List.html",
|
||||
"User Guide/User Guide/Scripting.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/TLS Configuration.html",
|
||||
"User Guide/User Guide/Note Types/Code.html",
|
||||
"User Guide/User Guide/Installation & Setup/Backup.html",
|
||||
"User Guide/User Guide/Advanced Usage/Attributes/Promoted Attributes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Vertical and horizontal layout.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes.html",
|
||||
"User Guide/User Guide/Advanced Usage/Advanced Showcases/Weight Tracker.html",
|
||||
"User Guide/User Guide/Scripting/Custom Widgets/Word count widget.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux.html",
|
||||
"User Guide/User Guide/Advanced Usage/Attributes/Attribute Inheritance.html",
|
||||
"User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.html",
|
||||
"User Guide/User Guide/Note Types/Text/Block quotes & admonitions.html",
|
||||
"User Guide/User Guide/Installation & Setup/Data directory.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes.html",
|
||||
"User Guide/User Guide/Note Types/Text/Lists.html",
|
||||
"User Guide/User Guide/Note Types/Mermaid Diagrams.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes.html",
|
||||
"User Guide/User Guide/Note Types/Relation Map.html",
|
||||
"User Guide/User Guide/Advanced Usage/Templates.html",
|
||||
"User Guide/User Guide/Note Types/Text/Images.html",
|
||||
"User Guide/User Guide/Advanced Usage/Note source.html",
|
||||
"User Guide/User Guide/Scripting/Custom Widgets/Widget Basics.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Import & Export/OneNote.html",
|
||||
"User Guide/User Guide/Troubleshooting.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/Multi-Factor Authentication.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Themes/Theme Gallery.html",
|
||||
"User Guide/User Guide/Note Types/Text/Insert buttons.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Protected Notes.html",
|
||||
"User Guide/User Guide/Advanced Usage/Custom Request Handler.html",
|
||||
"User Guide/User Guide/Note Types/Text/Links.html",
|
||||
"User Guide/User Guide/Scripting/Events.html",
|
||||
"User Guide/User Guide/Advanced Usage/Metrics.html",
|
||||
"User Guide/User Guide/Scripting/Frontend Basics.html",
|
||||
"User Guide/User Guide/Note Types/Text/General formatting.html",
|
||||
"User Guide/User Guide/FAQ.html",
|
||||
"User Guide/User Guide/Installation & Setup/Synchronization.html",
|
||||
"User Guide/User Guide/Scripting/Examples/New Task launcher button.html",
|
||||
"User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Keyboard Shortcuts.html",
|
||||
"User Guide/User Guide/Note Types/Text.html",
|
||||
"User Guide/User Guide/Note Types.html",
|
||||
"User Guide/User Guide/Advanced Usage/Attributes/Relations.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Themes.html",
|
||||
"User Guide/User Guide/Note Types/File.html",
|
||||
"User Guide/User Guide/Theme development/Reference.html",
|
||||
"User Guide/User Guide/Note Types/Text/Tables.html",
|
||||
"User Guide/User Guide/Advanced Usage/Bulk Actions.html",
|
||||
"User Guide/User Guide/AI/Introduction.html",
|
||||
"User Guide/User Guide/Advanced Usage/Advanced Showcases/Day Notes.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.html",
|
||||
"User Guide/User Guide/Advanced Usage/Hidden Notes.html",
|
||||
"User Guide/User Guide/Note Types/Text/Keyboard shortcuts.html",
|
||||
"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker.html",
|
||||
"User Guide/User Guide/Note Types/Geo Map.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Navigation/Search.html",
|
||||
"User Guide/User Guide/Advanced Usage/Sharing.html",
|
||||
"User Guide/User Guide/Basic Concepts and Features/Notes/Note List/Calendar View.html",
|
||||
"User Guide/User Guide/Advanced Usage/Attributes/Labels.html"
|
||||
]
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"translated": 100,
|
||||
"total": 173,
|
||||
"errors": []
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
[]
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+3
@@ -0,0 +1,3 @@
|
||||
<p>이 버전에서 지원하는 제공자는 다음과 같습니다.</p><ul><li><a class="reference-link" href="#root/_help_7EdTxPADv95W">Ollama</a></li><li><a class="reference-link" href="#root/_help_ZavFigBX9AwP">OpenAI</a></li><li><a class="reference-link" href="#root/_help_e0lkirXEiSNc">Anthropic</a></li><li>Voyage AI</li></ul><p>사용할 대화 모델의 제공자 이름을 다음 위치에 입력하세요.</p><p><img style="aspect-ratio:1884/1267;" src="AI Provider Information_im.png"
|
||||
width="1884" height="1267" alt="대화 모델 제공자 설정"></p><p>임베딩 제공자는 다음 위치에서 지정합니다.</p><p><img style="aspect-ratio:1907/1002;" src="1_AI Provider Information_im.png"
|
||||
width="1907" height="1002" alt="임베딩 제공자 설정"></p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
<p><a href="https://ollama.com/">Ollama</a>는 여러 방식으로 설치할 수 있으며 <a href="https://hub.docker.com/r/ollama/ollama">Docker 컨테이너</a>에서도 실행할 수 있습니다. 지원되는 GPU를 사용하면 일반적으로 더 빠릅니다. CPU와 메모리만으로도 실행할 수 있습니다. 직접 설치하려면 공식 <a href="https://ollama.com/download">설치 프로그램</a>을 이용하세요.</p><p><img style="aspect-ratio:785/498;" src="3_Installing Ollama_image.png"
|
||||
width="785" height="498" alt="Ollama 내려받기 화면"></p><p><img style="aspect-ratio:467/100;" src="Installing Ollama_image.png" width="467"
|
||||
height="100" alt="설치 파일"></p><p><img style="aspect-ratio:1296/1011;" src="1_Installing Ollama_image.png"
|
||||
width="1296" height="1011" alt="설치 진행 화면"></p><p>Windows에서는 설치 후 시작 메뉴에서 실행할 수 있습니다.</p><p><img style="aspect-ratio:1161/480;" src="2_Installing Ollama_image.png"
|
||||
width="1161" height="480" alt="시작 메뉴의 Ollama"></p><p>PowerShell이나 명령 프롬프트에서 <code>ollama</code> 명령도 사용할 수 있습니다.</p><p><img style="aspect-ratio:1730/924;" src="5_Installing Ollama_image.png"
|
||||
width="1730" height="924" alt="Ollama 명령줄 실행"></p><p>설치 후 <code>pull</code> 명령으로 사용할 모델을 내려받습니다. 다음은 원문 작성 시점인 2025년 4월에 소개한 도구 호출용 모델과 임베딩 모델의 예시입니다.</p><pre><code class="language-text-x-trilium-auto">ollama pull llama3.1:8b
|
||||
ollama pull mxbai-embed-large</code></pre><p>기본 포트는 11434입니다. <a href="http://localhost:11434">로컬 Ollama 상태 페이지</a>를 열면 실행 여부를 확인할 수 있습니다.</p><p><img style="aspect-ratio:585/202;" src="4_Installing Ollama_image.png"
|
||||
width="585" height="202" alt="Ollama 정상 실행 응답"></p><p>서비스를 실행하고 모델을 내려받았다면 Trilium에서 채팅 제공자와 임베딩 제공자로 설정할 준비가 된 것입니다.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<p>Trilium에서는 <a href="#root/_help_CdNpE2pqjmI6">스크립트</a>와 <a
|
||||
href="#root/_help_OFXdgB2nNk1F">주요 속성</a>을 활용해 고급 기능을 만들 수 있습니다. 사용 방법을 보여 주기 위해 <a href="#root/_help_wX4HbRucYSDD">기본 예제 노트</a>에 다음 사례를 준비했습니다.</p><ul><li><a href="#root/_help_iRwzGnHPzonm">관계 지도</a></li><li><a href="#root/_help_l0tKav7yLHGF">일일 노트</a></li><li><a href="#root/_help_R7abl2fc6Mxi">체중 기록</a></li><li><a href="#root/_help_xYjQUYhpbUEW">할 일 관리</a></li></ul><p>이 예제들은 Trilium에서 구성할 수 있는 기능을 보여 주기 위한 것입니다. 모든 기능이 완성된 기본 기능으로 제공되는 것은 아닙니다.</p>
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
<p><img style="aspect-ratio:1071/146;" src="Attributes_image.png" width="1071"
|
||||
height="146" alt="노트 속성"></p><p>속성은 노트에 지정하는 이름과 값의 쌍입니다. 추가 정보를 저장하거나 기능을 설정하며 크게 두 종류로 나뉩니다.</p><ul><li><a class="reference-link" href="#root/_help_HI6GBBIduIgv">라벨</a> — 메타데이터를 저장하거나 노트의 동작을 설정합니다. 검색에도 사용할 수 있습니다. 미리 정의된 항목은 <a class="reference-link"
|
||||
href="#root/_help_HI6GBBIduIgv">라벨 안내</a>를 참고하세요.</li><li><a class="reference-link" href="#root/_help_Cq5X6iKQop6R">관계</a> — 링크처럼 노트 사이의 연결을 정의합니다. 메타데이터와 스크립트에 활용할 수 있습니다. 미리 정의된 항목은 <a
|
||||
class="reference-link" href="#root/_help_Cq5X6iKQop6R">관계 안내</a>를 참고하세요.</li></ul><h2>속성 목록 확인하기</h2><p>현재 노트에 직접 지정한 라벨과 관계는 <a class="reference-link" href="#root/_help_BlN9DFI679QC">상단 리본</a>의 소유한 속성에서 확인하고 수정할 수 있습니다. 상위 노트에서 물려받은 항목은 상속된 속성에서 확인할 수 있으며 그곳에서는 수정할 수 없습니다.</p><p>목록에서 라벨 앞에는 <code>#</code>이 붙고 관계 앞에는 <code>~</code>가 붙습니다.</p><h2>같은 이름의 여러 값</h2><p>같은 이름의 속성을 여러 개 지정할 수 있습니다. 이를 통해 한 항목에 여러 값을 저장할 수 있습니다.</p><h2>속성 정의와 주요 속성</h2><p>특별한 라벨로 속성의 형식과 표시 방법을 정의할 수 있습니다. <a class="reference-link"
|
||||
href="#root/_help_OFXdgB2nNk1F">주요 속성</a>을 참고하세요.</p><h2>속성 상속</h2><p>하위 노트가 상위 노트의 속성을 물려받을 수 있습니다. 자세한 내용은 <a class="reference-link"
|
||||
href="#root/_help_bwZpz2ajCEwO">속성 상속</a>을 참고하세요.</p>
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
<p>Trilium은 <code>config.ini</code> 파일과 환경 변수로 설정할 수 있습니다. 지원하는 항목은 <a href="https://github.com/TriliumNext/Notes/blob/develop/apps/server/src/assets/config-sample.ini">config-sample.ini 예제</a>와 <a href="https://github.com/TriliumNext/Notes">Notes 저장소</a>를 참고하세요.</p><p>환경 변수는 다음 규칙을 따릅니다.</p><ul><li>이름 앞에 <code>TRILIUM_</code>을 붙이고 INI의 구역과 키를 밑줄로 구분합니다.</li><li>형식은 <code>TRILIUM_<SECTION>_<KEY>=<VALUE></code>입니다.</li><li>같은 항목이 파일에도 있으면 환경 변수의 값이 우선합니다.</li></ul><p>예를 들어 설정 파일에 다음 내용이 있다고 가정합니다.</p><pre><code class="language-text-x-trilium-auto">[Network]
|
||||
host=localhost
|
||||
port=8080</code></pre><p>다음 환경 변수로 값을 바꿀 수 있습니다.</p><pre><code class="language-text-x-trilium-auto">TRILIUM_NETWORK_HOST=0.0.0.0
|
||||
TRILIUM_NETWORK_PORT=9000</code></pre><p>설정은 다음 순서로 읽습니다.</p><ul><li><code>config.ini</code> 파일을 불러옵니다.</li><li><code>TRILIUM_</code>으로 시작하는 환경 변수를 찾습니다.</li><li>환경 변수 이름에서 구역과 키를 구분합니다.</li><li>환경 변수의 값을 우선해 파일의 설정과 합칩니다.</li></ul>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>기본 설정에서는 다른 도메인이나 출처의 웹페이지가 브라우저를 통해 Trilium에 요청하는 것을 허용하지 않습니다.</p><p>Trilium 0.93.0부터 환경 변수나 <code>config.ini</code>를 사용해 <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS">교차 출처 리소스 공유(CORS)</a>를 설정할 수 있습니다.</p><table><thead><tr><th>CORS 헤더</th><th>환경 변수</th><th>config.ini의 Network 구역 설정</th></tr></thead><tbody><tr><td><code>Access-Control-Allow-Origin</code></td><td><code>TRILIUM_NETWORK_CORS_ALLOW_ORIGIN</code></td><td><code>corsAllowOrigin</code></td></tr><tr><td><code>Access-Control-Allow-Methods</code></td><td><code>TRILIUM_NETWORK_CORS_ALLOW_METHODS</code></td><td><code>corsAllowMethods</code></td></tr><tr><td><code>Access-Control-Allow-Headers</code></td><td><code>TRILIUM_NETWORK_CORS_ALLOW_HEADERS</code></td><td><code>corsAllowHeaders</code></td></tr></tbody></table>
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
<p>Trilium 인스턴스는 실행 중인 서버 하나를 뜻합니다. <a class="reference-link"
|
||||
href="#root/_help_cbkrhQjrkKrh">동기화</a>를 구성하면 데스크톱 앱 내부의 서버와 동기화 대상 서버 등 여러 인스턴스를 사용하게 됩니다. 이때 현재 어느 인스턴스에서 실행 중인지 구분하면 편리합니다.</p><h2>인스턴스 이름 지정</h2><p><code>config.ini</code>에 다음과 같이 이름을 설정하세요.</p><pre><code class="language-text-x-trilium-auto">[General]
|
||||
instanceName=내서버</code></pre><h2>서버에서 인스턴스 구분</h2><p><code>api.getInstanceName()</code>을 호출하면 설정 파일이나 환경 변수에 지정한 현재 서버의 인스턴스 이름을 얻을 수 있습니다.</p><h2>특정 인스턴스에서만 스크립트 실행</h2><p>정기적으로 실행하거나 특정 이벤트에 반응하는 스크립트를 일부 인스턴스에서만 실행할 수 있습니다. 코드를 바꿀 필요 없이 <code>runOnInstance</code> 라벨의 값에 실행할 인스턴스 이름을 넣으세요. 여러 인스턴스에서 실행하려면 라벨을 여러 개 추가하세요.</p>
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
<p>사용자 지정 리소스 제공 기능은 Trilium에 가져온 이미지와 글꼴 및 스타일시트 등의 파일을 공개 주소로 제공합니다. 테마와 함께 사용자 글꼴을 제공할 때 활용할 수 있습니다.</p><h2>설정 순서</h2><ul><li>이미지나 글꼴 파일을 Trilium으로 끌어서 가져옵니다.</li><li>파일 노트를 선택하고 소유한 속성을 엽니다.</li><li><code>#customResourceProvider=hello</code> 라벨을 추가합니다.</li><li>브라우저에서 <code><protocol>://<host>/custom/hello</code>를 엽니다. protocol에는 환경에 맞는 <code>http</code>나 <code>https</code>를 사용합니다. host는 Trilium 서버의 주소입니다. 별도 서버 없이 데스크톱 앱만 사용한다면 기본 주소는 <code>http://localhost:37840</code>입니다.</li><li>정상적으로 설정되었다면 가져온 파일이 내려받아집니다.</li></ul><p><code>hello</code> 대신 다음과 같은 이름도 사용할 수 있습니다.</p><ul><li>경로 — <code>fonts/Roboto.ttf</code>로 지정하면 <code><host>/custom/fonts/Roboto.ttf</code>로 접근합니다.</li><li>정규식 — <code>hello/.*</code>로 지정하면 <code>/custom/hello/1</code>과 <code>/custom/hello/2</code> 또는 <code>/custom/hello/world</code>처럼 여러 경로에 대응합니다.</li></ul><h2>테마에서 사용하기</h2><p>글꼴 파일을 가져온 뒤 <code>#customResourceProvider=fonts/myfont.ttf</code> 속성을 지정하세요. 테마 CSS에서는 다음처럼 불러올 수 있습니다.</p><pre><code class="language-text-css">@font-face {
|
||||
font-family: customFont;
|
||||
src: url("/custom/fonts/myfont.ttf");
|
||||
}
|
||||
|
||||
div {
|
||||
font-family: customFont;
|
||||
}</code></pre>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>Trilium은 노트와 트리 구조 및 메타데이터와 대부분의 설정을 <a href="https://www.sqlite.org">SQLite</a> 데이터베이스에 저장합니다. 파일 이름은 <code>document.db</code>이며 기본 <a href="#root/_help_tAassRL4RSQL">데이터 폴더</a>에 있습니다.</p><h2>사용 예제</h2><p>처음 실행하면 주요 기능을 소개하는 예제 노트를 제공합니다. <a class="reference-link" href="#root/_help_6tZeKvSHEUiB">사용 예제</a>를 참고하세요.</p><h2>데이터베이스 직접 수정하기</h2><p>고급 사용자는 <a href="https://sqlitebrowser.org/">DB Browser for SQLite</a> 같은 도구로 데이터베이스를 살펴보거나 수정할 수 있습니다. 자세한 내용은 <a href="#root/_help_oyIAJ9PvvwHX">데이터베이스 직접 수정하기</a>를 참고하세요.</p><h2>데이터베이스 초기화하기</h2><p>시험 중인 환경을 초기 상태로 되돌리려면 기존 데이터베이스를 제거할 수 있습니다. 다음 실행 시 원본 예제 노트가 포함된 새 데이터베이스를 만듭니다. 기존 노트가 사라지므로 필요한 데이터를 먼저 백업하고 애플리케이션을 종료하세요.</p><p><a href="#root/_help_tAassRL4RSQL">데이터 폴더</a>에서 <code>document.db</code>와 이름이 <code>document.db</code>로 시작하는 관련 파일을 제거합니다.</p><p><code>config.ini</code>의 설정도 보존할 필요가 없다면 <a href="#root/_help_tAassRL4RSQL">데이터 폴더</a>의 내용을 모두 제거해 초기화할 수 있습니다. 파일 대신 환경 변수로 설정하는 방법은 <a href="#root/_help_Gzjqa934BdH4">설정 안내</a>를 참고하세요.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>Trilium을 처음 실행하면 사용 예제가 포함된 데이터베이스를 만듭니다. 예제에서는 다음 기능을 살펴볼 수 있습니다.</p><ul><li><a class="reference-link" href="#root/_help_iRwzGnHPzonm">관계 지도</a></li><li><a class="reference-link" href="#root/_help_l0tKav7yLHGF">날짜별 노트</a></li><li><a class="reference-link" href="#root/_help_R7abl2fc6Mxi">체중 기록</a></li><li><a class="reference-link" href="#root/_help_xYjQUYhpbUEW">할 일 관리</a></li><li><a class="reference-link" href="#root/_help_Wy267RK4M69c">테마</a></li></ul><h3>사용 예제 복원하기</h3><p>고급 기능을 시험한 뒤 원래 예제를 다시 확인하고 싶거나 새 기능이 추가된 최신 예제를 살펴보고 싶을 때 원본 예제를 가져올 수 있습니다.</p><p>Trilium의 가져오기 기능을 사용하세요.</p><ul><li><a href="https://github.com/TriliumNext/Notes/raw/develop/db/demo.zip">최신 예제 ZIP 파일</a>을 내려받습니다.</li><li>예제를 넣을 상위 노트를 트리에서 마우스 오른쪽 버튼으로 클릭합니다.</li><li>노트로 가져오기를 선택합니다.</li><li>내려받은 ZIP 파일을 선택합니다.</li></ul>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>고급 개발이나 문제 해결 과정에서 Trilium의 SQLite 데이터베이스를 직접 수정해야 할 때가 있습니다. 수정하기 전에 <code>document.db</code>를 백업하세요.</p><h2>내장 SQL 콘솔 사용하기</h2><p>Trilium에는 데이터베이스 편집기가 내장되어 있습니다. <a class="reference-link" href="#root/_help_YKWqdJhzi2VY">SQL 콘솔</a>을 참고하세요.</p><h2>외부 도구로 수정하기</h2><p>애플리케이션이 실행되지 않는 경우처럼 SQL 콘솔을 사용할 수 없을 때는 외부 도구를 이용할 수 있습니다. 데스크톱 앱을 종료하거나 서버 서비스와 Docker 컨테이너를 중지한 뒤 작업하세요.</p><h3>DB Browser for SQLite 사용하기</h3><p>여러 운영체제에서 사용할 수 있는 그래픽 데이터베이스 편집기입니다.</p><ul><li>파일 메뉴에서 데이터베이스 열기를 선택하고 <a href="#root/_help_tAassRL4RSQL">데이터 폴더</a>의 데이터베이스를 엽니다.</li><li>SQL 실행 탭을 선택합니다.</li><li>원하는 SQL 문을 입력합니다.</li><li>탭 아래 도구 모음의 실행 버튼을 누르거나 <kbd>F5</kbd>를 누릅니다.</li><li>주 도구 모음에서 변경 사항 쓰기를 누릅니다.</li><li>데이터베이스나 프로그램을 닫습니다.</li></ul><p><img src="Manually altering the data.png" alt="외부 데이터베이스 편집기 사용 예시"></p><h3>SQLite 명령줄 도구 사용하기</h3><p>데이터베이스 경로를 지정해 실행하세요.</p><pre><code class="language-text-x-trilium-auto">sqlite3 ~/.local/share/trilium-data/document.db</code></pre><ul><li>SQL 문 끝에 <code>;</code>을 붙여 입력합니다.</li><li>종료하려면 <code>.quit</code>을 입력하고 <kbd>Enter</kbd>를 누릅니다.</li></ul>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>SQL 콘솔은 Trilium에 내장된 데이터베이스 편집기입니다.</p><p><a href="#root/_help_Vc8PjrjAGuOp">전체 메뉴</a> → 고급 → SQL 콘솔 열기에서 실행할 수 있습니다.</p><p><img src="SQL Console_image.png" alt="SQL 콘솔 화면"></p><h3>사용 방법</h3><ul><li>화면 위쪽의 테이블 이름에 마우스를 올리면 열 이름과 자료형을 확인할 수 있습니다.</li><li>SQL 문은 한 번에 하나씩 실행할 수 있습니다.</li><li><img src="3_SQL Console_image.png" alt="실행 버튼">을 누르면 작성한 SQL 문을 실행합니다.</li><li>조회 결과는 표로 표시됩니다.<p><img src="1_SQL Console_image.png" alt="SQL 조회 결과"></p></li></ul><h3>SQL 콘솔 저장하기</h3><p>SQL 조회문이나 명령을 전용 노트로 저장할 수 있습니다. SQL 문을 작성한 뒤 <img src="2_SQL Console_image.png" alt="저장 버튼">을 누르세요. 저장한 노트는 <a href="#root/_help_l0tKav7yLHGF">날짜별 노트</a>에 나타납니다.</p><ul><li>SQL 문은 기본 화면에 표시되지 않습니다. 노트의 오른쪽 클릭 메뉴에서 노트 소스 보기를 선택하면 확인할 수 있습니다.</li><li>저장된 SQL 문은 직접 수정할 수 없습니다. 변경하려면 SQL 콘솔에 복사해 수정한 뒤 다시 저장하세요.</li></ul>
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
<p>ETAPI는 외부 프로그램에서 Trilium을 사용하는 REST API입니다. 0.50부터 제공됩니다. 명세는 <a href="https://github.com/TriliumNext/Notes/blob/master/src/etapi/etapi.openapi.yaml">OpenAPI 문서</a>에서 확인할 수 있습니다.</p><h2>클라이언트 라이브러리</h2><p><a href="https://github.com/Nriver/trilium-py">trilium-py</a>를 사용하면 Python에서 Trilium에 접근하는 코드를 더 쉽게 작성할 수 있습니다.</p><h2>토큰 발급</h2><p>모든 API 작업은 토큰으로 인증해야 합니다. 설정 → ETAPI에서 발급하거나 <code>/auth/login</code> 요청으로 받을 수 있습니다. 자세한 요청 형식은 <a href="https://github.com/TriliumNext/Notes/blob/master/src/etapi/etapi.openapi.yaml">API 명세</a>를 참고하세요.</p><h2>인증</h2><h3>Authorization 헤더</h3><pre><code class="language-text-x-trilium-auto">GET https://myserver.com/etapi/app-info
|
||||
Authorization: ETAPITOKEN</code></pre><p><code>ETAPITOKEN</code>을 발급받은 토큰으로 바꾸세요. 0.93.0부터는 다른 도구와의 호환성을 위해 <code>Bearer ETAPITOKEN</code> 형식도 지원합니다.</p><h3>기본 인증</h3><p>0.56부터 다음 형식도 지원합니다.</p><pre><code class="language-text-x-trilium-auto">GET https://myserver.com/etapi/app-info
|
||||
Authorization: Basic BATOKEN</code></pre><ul><li><code>BATOKEN = BASE64(username + ':' + password)</code> 형식으로 만듭니다.</li><li>사용자 이름은 <code>etapi</code>입니다.</li><li>비밀번호 자리에 발급받은 ETAPI 토큰을 넣습니다.</li></ul><p>기본 인증만 지원하는 도구에서 사용할 수 있는 방식입니다.</p><h2>Bash 스크립트 예제</h2><p>다음 예제는 노트의 HTML 본문을 내려받습니다.</p><pre><code class="language-text-x-trilium-auto">#!/usr/bin/env bash
|
||||
|
||||
# 연결 설정
|
||||
TOKEN=YOUR_ETAPI_TOKEN
|
||||
SERVER=http://localhost:8080
|
||||
|
||||
# 노트 ID로 본문 내려받기
|
||||
NOTE_ID="i6ra4ZshJhgN"
|
||||
curl "$SERVER/etapi/notes/$NOTE_ID/content" -H "Authorization: $TOKEN" </code></pre><p>실행 전에 다음 값을 바꾸세요.</p><ul><li><code>TOKEN</code> — 직접 발급받은 ETAPI 토큰</li><li><code>SERVER</code> — 사용 중인 Trilium의 프로토콜과 호스트 및 포트</li><li><code>NOTE_ID</code> — 내려받을 노트의 ID</li></ul>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<p>Trilium은 파일 이름 대신 노트 ID로 각 노트를 구분합니다. 일반적으로 새 노트를 만들 때 영문 대소문자와 숫자로 이루어진 12자리 ID를 무작위로 생성합니다.</p><h2>가져오기와 내보내기의 영향</h2><p>노트를 내보내면 ID도 메타데이터에 기록됩니다. 하지만 다시 가져올 때는 모든 노트에 새 ID를 부여합니다. <a class="reference-link" href="#root/_help_0vhv7lsOLy82">첨부 파일</a>처럼 함께 가져오는 다른 항목도 새 ID를 받습니다.</p><h2>ID 충돌</h2><p>ID는 길이가 정해져 있고 무작위로 만들어지므로 <a
|
||||
href="https://en.wikipedia.org/wiki/Pigeonhole_principle">비둘기집 원리</a>에 따라 기존 노트와 같은 ID가 생성될 가능성이 있습니다.</p><p>사용할 수 있는 문자가 62개이고 길이가 12자리이므로 가능한 ID 수는 <span class="math-tex">\(62^{12}\)</span>개입니다. 원문은 <a href="https://alex7kom.github.io/nano-nanoid-cc/?alphabet=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&size=12&speed=1000&speedUnit=hour">Nano ID 충돌 계산기</a>를 이용해 매시간 1000개의 노트를 약 900년 동안 만들어야 충돌 확률이 1% 정도가 된다고 설명합니다.</p><p>이처럼 가능성이 매우 작아 Trilium은 별도의 충돌 방지 절차를 두지 않습니다. 고유 해시를 사용하는 <a href="https://stackoverflow.com/questions/10434326/hash-collision-in-git">Git</a>에도 비슷한 문제가 있습니다. 이론적으로 충돌이 발생하면 기존 노트를 새 노트가 덮어쓸 가능성이 있습니다.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>노트 지도는 노트 사이의 연결을 시각적으로 보여 줍니다. 노트들이 어떤 구조로 묶여 있는지 파악할 수 있습니다.</p><p>다음 두 가지 보기가 있습니다.</p><ul><li>링크 지도 — 노트 사이의 관계를 표시합니다.</li><li>트리 지도 — 노트의 계층 구조를 표시합니다.</li></ul><h2>링크 지도</h2><p>노트 사이의 <a href="#root/_help_zEY4DaJG4YT5">관계</a>를 보여 줍니다.</p><p><img src="1_Note Map (Link map, Tree m.png" alt="링크 지도"></p><h2>트리 지도</h2><p>노트의 상위·하위 구조를 보여 줍니다.</p><p><img src="Note Map (Link map, Tree m.png" alt="트리 지도"></p><h2>독립된 노트 유형</h2><p>모든 노트에서 열 수 있는 지도 기능 외에 관계를 전체 화면에 표시하는 전용 노트를 만들 수도 있습니다. <a href="#root/_help_bdUJEHsAPYQR">노트 지도 유형</a>을 참고하세요.</p><h2>관련 기능</h2><p><a href="#root/_help_iRwzGnHPzonm">관계 지도</a>는 비슷한 기능이지만 다음과 같은 차이가 있습니다.</p><ul><li>노트 지도는 자동으로 만들어집니다. 관계 지도는 직접 구성합니다.</li><li>관계 지도는 하나의 노트 유형입니다. 링크 지도는 연결을 화면에 보여 주는 보기 기능입니다.</li></ul>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<p>공유 노트를 열면 기본적으로 웹페이지 형태로 표시됩니다. 스크립트에서 이용하거나 파일로 내려받을 때는 원본 내용을 그대로 제공하는 편이 나을 수 있습니다.</p><table><thead><tr><th>웹페이지로 표시한 노트</th><th>원본 형식으로 표시한 노트</th></tr></thead><tbody><tr><td><img style="aspect-ratio:738/275;" src="1_Serving directly the conte.png"
|
||||
width="738" height="275" alt="웹페이지 형태의 공유 노트"></td><td><img src="Serving directly the conte.png" alt="원본 형식의 공유 노트"></td></tr></tbody></table><h2>노트 속성으로 지정</h2><p><code>#shareRaw</code> 속성을 추가하면 공유 주소로 접근할 때 항상 원본 형식으로 제공합니다.</p><h2>주소에 옵션 추가</h2><p>주소 끝에 <code>?raw</code>를 붙이면 <code>#shareRaw</code> 속성이 없어도 원본 형식으로 볼 수 있습니다.</p><p><img src="Serving directly the conte.png" alt="주소로 원본 형식 요청"></p>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<p>Trilium은 이미 개발된 여러 라이브러리를 활용해 다양한 <a
|
||||
href="#root/_help_KSZ04uQ2D1St">노트 유형</a>을 지원합니다.</p><p>하위 문서에서는 사용 중인 기술을 소개합니다. Trilium의 작동 방식을 이해하는 데 도움을 주고 각 기술을 만든 개발자들의 기여를 알리기 위한 문서입니다.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p><a href="https://excalidraw.com/">Excalidraw</a>는 <a href="#root/_help_grjYqerjn243">캔버스 노트</a>에 사용하는 기술입니다. 소스 코드는 <a href="https://github.com/excalidraw/excalidraw">GitHub</a>에서 확인할 수 있습니다.</p><p>수정하지 않은 원본 라이브러리를 사용하므로 원본에 알려진 <a href="https://github.com/excalidraw/excalidraw/issues">문제</a>가 여기에도 나타날 수 있습니다.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>Leaflet은 <a href="#root/_help_81SGnPGMk7Xc">지도 노트</a>에 사용하는 라이브러리입니다.</p><h2>플러그인</h2><p>외부 플러그인을 이용해 기능을 폭넓게 확장할 수 있습니다.</p><p>현재 다음 플러그인을 사용합니다:</p><ul><li><a href="https://github.com/mpetazzoni/leaflet-gpx">leaflet-gpx — Leaflet에서 GPX 경로를 표시하는 플러그인</a></li></ul>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>MindElixir는 <a href="#root/_help_gBbsAeiuUxI5">마인드맵 노트</a>에 사용하는 라이브러리입니다.</p><p>핵심 라이브러리는 <a href="https://github.com/SSShooter/mind-elixir-core/issues">GitHub의 mind-elixir-core</a>에서 확인할 수 있습니다.</p><p>기본 배포판에서는 라이브러리를 추가 수정 없이 포함합니다.</p><p>라이브러리 자체의 기능에 문제가 있다면 일반적으로 <a href="https://github.com/ssshooter/mind-elixir-core">원본 프로젝트</a>에 보고하는 것이 좋습니다.</p><h2>플러그인</h2><p>MindElixir는 플러그인을 지원합니다. Trilium에서는 <a href="https://github.com/SSShooter/node-menu">node-menu 플러그인</a>을 이용해 항목의 글꼴과 색상 및 링크를 편집할 수 있게 합니다.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>Trilium은 Evernote의 백업·내보내기 형식인 ENEX 파일을 가져올 수 있습니다. ENEX 파일 하나에는 노트북 하나의 노트와 관련 자료가 담깁니다.</p><h2>Evernote에서 ENEX 내보내기</h2><p>원문에서 안내하는 방식은 구형 Evernote 데스크톱 앱을 사용합니다. 웹이나 모바일 버전이 아닙니다. 노트북에서 마우스 오른쪽 버튼을 누르고 내보내기를 선택한 뒤 안내를 따르세요.</p><h2>Trilium으로 ENEX 가져오기</h2><p>가져올 위치의 노트에서 마우스 오른쪽 버튼을 누르세요. 가져오기를 선택한 뒤 ENEX 파일을 지정합니다.</p><p>완료되면 노트와 자료를 살펴 누락된 내용이 없는지 확인하세요.</p><h2>제한 사항</h2><p>이미지를 제외한 자료는 노트의 첨부 파일로 만들어집니다.</p><p>ENEX 내부의 HTML은 표준과 완전히 일치하지 않아 일부 서식이 달라지거나 사라질 수 있습니다. 큰 문제가 있으면 <a href="https://github.com/TriliumNext/Notes/issues">Trilium 문제 보고 페이지</a>에 알려 주세요.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>Trilium은 호환성을 최대한 유지하면서 Markdown 가져오기와 내보내기를 지원합니다.</p><h2>가져오기</h2><h3>클립보드에서 가져오기</h3><p>일부 Markdown 내용을 복사했다면 편집기의 블록 메뉴에서 가져올 수 있습니다.</p><p><img src="Markdown_markdown-inline-i.gif" alt="클립보드의 Markdown 가져오기"></p><h3>파일에서 가져오기</h3><p>확장자가 <code>.md</code>인 파일 하나를 가져오거나 여러 파일의 폴더 구조를 <a href="https://en.wikipedia.org/wiki/Tar_(computing)">압축 파일</a>로 묶어 가져올 수 있습니다. 이 기능에서는 ZIP 형식을 사용하세요. 브라우저가 폴더를 직접 읽지 못하므로 <a href="https://www.7-zip.org">7-Zip</a> 같은 도구로 폴더를 ZIP으로 압축해야 합니다.</p><p><img src="Markdown_markdown-file-imp.gif" alt="Markdown 파일 가져오기"></p><h2>내보내기</h2><h3>하위 트리 내보내기</h3><p>하위 트리 전체를 ZIP으로 내보내면 노트 구조에 맞춰 폴더가 만들어집니다.</p><p><img src="Markdown_markdown-export-s.gif" alt="하위 트리의 Markdown 내보내기"></p><h3>노트 하나만 내보내기</h3><p>하위 노트를 제외하고 현재 노트만 내보내려면 노트 작업 메뉴를 사용하세요.</p><p><img src="Markdown_markdown-export-n.gif" alt="현재 노트의 Markdown 내보내기"></p><h3>보호된 노트 내보내기</h3><p>먼저 보호 세션을 시작해야 합니다. 내보낸 파일은 암호화되지 않습니다. 다시 가져온 노트도 필요하면 보호 설정을 다시 적용하세요.</p><h2>지원 문법</h2><ul><li><a href="https://github.github.com/gfm/">GitHub 확장 Markdown</a>을 주된 기준으로 사용합니다.</li><li>이미지를 지원합니다. 사용자 지정 너비가 있으면 HTML로 내보내며 그림 요소도 HTML로 포함합니다.</li><li>표를 지원합니다. 구조가 복잡하거나 HTML이 필요한 요소를 포함한 표는 HTML로 내보냅니다.</li><li><a class="reference-link" href="#root/_help_NwBbFdNZ9h7O">안내 상자</a>는 GitHub 형식을 사용합니다.</li><li>링크를 지원합니다. 노트의 제목과 아이콘을 반영하는 참조 링크는 정보를 보존하기 위해 HTML로 포함합니다.</li><li>수식은 <code>$</code>와 <code>$$</code> 구분 기호를 지원합니다.</li></ul>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>자주 사용하는 노트를 북마크에 등록하면 빠르게 열 수 있습니다. 아래 예시를 참고하세요.</p><p><img src="Bookmarks_bookmarks.gif" alt="북마크 등록과 사용"></p><h2>북마크 폴더</h2><p>왼쪽 영역의 공간은 한정되어 있습니다. 여러 노트를 등록하려면 폴더를 북마크로 지정해 그 안의 노트를 펼쳐 보는 방법이 있습니다.</p><p><img src="Bookmarks_bookmark-folder.png" alt="북마크 폴더"></p><p>폴더로 사용할 노트에 <code>#bookmarkFolder</code> 라벨을 추가하세요.</p>
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
<p><img style="aspect-ratio:991/403;" src="Jump to Note_image.png" width="991"
|
||||
height="403" alt="노트로 이동 창"></p><p>노트로 이동 기능은 제목을 검색해 원하는 노트를 빠르게 엽니다. 전체 검색을 실행하거나 새 노트를 만들 수도 있습니다.</p><h2>노트로 이동 열기</h2><ul><li><a class="reference-link" href="#root/_help_xYmIYSP6wE3F">실행 도구 모음</a>에서 <img src="1_Jump to Note_image.png" alt="노트로 이동 버튼">을 누르세요.</li><li>단축키 <kbd>Ctrl</kbd>+<kbd>J</kbd>를 사용할 수도 있습니다.</li></ul><h2>최근 노트</h2><p>최근에 보거나 편집한 노트 목록에서 원하는 노트로 바로 이동할 수 있습니다. 위쪽의 노트로 이동 버튼을 누르고 검색어를 입력하지 않으면 최근 노트가 표시됩니다. 오른쪽의 시계 아이콘으로도 열 수 있습니다.</p><p><img src="Jump to Note_recent-notes.gif"
|
||||
width="812" height="585" alt="최근 노트 사용 예시"></p><h2>사용 방법</h2><ul><li>검색어가 없으면 최근 노트를 표시합니다.</li><li>위쪽과 아래쪽 화살표 키로 항목을 선택한 뒤 <kbd>Enter</kbd>를 누르면 노트를 엽니다.</li><li>원하는 노트가 없다면 제목을 입력한 뒤 하위 노트 만들기 및 연결을 선택해 새로 만들 수 있습니다.</li></ul>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>특정 노트와 그 하위 트리만 표시해 집중하는 기능입니다. 상위 노트와 같은 단계의 다른 노트를 숨겨 표시 범위를 좁힙니다.</p><p><img src="Note Hoisting_note-hoistin.gif" alt="하위 트리만 표시하는 기능"></p><p>본문 검색과 <a href="#root/_help_MMiBEQljMQh2">노트로 이동</a> 기능의 검색 범위도 현재 표시 중인 하위 트리로 제한됩니다.</p><p>이 기능을 확장한 <a href="#root/_help_9sRHySam5fXb">작업 공간</a>도 참고하세요.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>Trilium은 노트 사이를 빠르고 편하게 이동할 수 있도록 설계되었습니다.</p><h2>뒤로 가기와 앞으로 가기</h2><p><kbd>Alt</kbd>+<kbd>←</kbd>와 <kbd>Alt</kbd>+<kbd>→</kbd>를 누르면 이전에 본 노트 사이를 이동할 수 있습니다.</p><p>웹브라우저의 방문 기록 기능을 이용하므로 브라우저의 뒤로 가기와 앞으로 가기와 같은 방식으로 작동합니다.</p><p><img src="Note Navigation_image.png" alt="노트 이동 버튼"></p><h2>노트로 이동</h2><p>상단의 노트로 이동 버튼을 누르거나 <kbd>Ctrl</kbd>+<kbd>J</kbd>를 누르세요. 제목 일부를 입력하면 자동 완성 목록에서 원하는 노트를 골라 바로 열 수 있습니다.</p><p>자세한 내용은 <a class="reference-link" href="#root/_help_F1r9QtzQLZqm">노트로 이동</a>을 참고하세요.</p>
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
<p><img style="aspect-ratio:659/256;" src="Quick search_image.png" width="659"
|
||||
height="256" alt="빠른 검색"></p><p>빠른 검색은 노트 제목뿐 아니라 본문까지 검색하고 결과를 바로 선택할 수 있게 보여 줍니다.</p><p>별도 탭에서 고급 조건으로 검색하려면 <a class="reference-link"
|
||||
href="#root/_help_eIg8jdvaoNNd">검색</a> 기능을 사용하세요.</p><p>본문 대신 제목만 검색해 빠르게 이동하려면 <a class="reference-link"
|
||||
href="#root/_help_F1r9QtzQLZqm">노트로 이동</a> 기능을 사용하세요.</p><h2>화면 배치</h2><p><a class="reference-link" href="#root/_help_x0JgW8UqGXvq">세로 배치와 가로 배치</a>에 따라 빠른 검색창의 위치가 달라집니다.</p><ul><li>세로 배치에서는 <a class="reference-link"
|
||||
href="#root/_help_oPVyFC7WL2Lp">노트 트리</a> 바로 위에 표시됩니다.</li><li>가로 배치에서는 <a class="reference-link"
|
||||
href="#root/_help_xYmIYSP6wE3F">실행 도구 모음</a>에 표시됩니다. 다른 아이콘처럼 위치를 옮길 수 있습니다.</li></ul>
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
<p><img style="aspect-ratio:898/93;" src="Search in note_image.png" width="898"
|
||||
height="93" alt="노트 안에서 찾기"></p><p>현재 표시된 노트 안에서 글자를 찾는 기능입니다.</p><h2>다른 검색 기능과의 차이</h2><ul><li>브라우저에서 <a class="reference-link"
|
||||
href="#root/_help_iPIMuisry3hd">텍스트 노트</a>나 <a class="reference-link"
|
||||
href="#root/_help_6f9hih2hXXZk">코드 노트</a>에 초점이 없는 상태로 <kbd>Ctrl</kbd>+<kbd>F</kbd>를 누르면 브라우저의 찾기 기능이 열립니다. 이때는 Trilium 메뉴의 글자도 검색됩니다.</li><li><a class="reference-link" href="#root/_help_iPIMuisry3hd">텍스트 노트</a>를 편집하는 중에 같은 단축키를 누르면 <a class="reference-link" href="#root/_help_MI26XDLSAlCD">CKEditor</a>의 찾기 기능이 열립니다.</li></ul><h2>검색 열기</h2><ul><li>데스크톱에서는 <kbd>Ctrl</kbd>+<kbd>F</kbd>를 누르세요.</li><li><a class="reference-link" href="#root/_help_8YBEPzcpUgxw">노트 버튼</a>의 메뉴에서 노트 안에서 찾기를 선택할 수도 있습니다.</li></ul><h2>찾기</h2><p>찾을 내용을 입력하면 자동으로 검색합니다. 입력란 옆의 위아래 화살표로 결과 사이를 이동하세요.</p><h2>바꾸기</h2><p>찾을 내용과 바꿀 내용을 입력하세요. 바꾸기는 현재 결과 하나를 변경하며 모두 바꾸기는 일치하는 내용을 한 번에 변경합니다.</p><h2>검색 옵션</h2><ul><li>대소문자 구분 — 영문 대문자와 소문자를 구분합니다. <code>Hello</code>를 찾으면 <code>hello</code>는 일치하지 않습니다.</li><li>단어 단위로 찾기 — 단어 전체가 일치할 때만 찾습니다. <code>Java</code>를 찾으면 <code>JavaScript</code>는 일치하지 않습니다.</li></ul>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<p><img style="aspect-ratio:1626/540;" src="Similar Notes_image.png" width="1626"
|
||||
height="540" alt="유사한 노트 목록"></p><p>유사한 노트 기능은 본문 내용과 노트 사이의 관계 및 생성 날짜를 살펴 현재 노트와 관련된 노트를 찾습니다.</p><p><a class="reference-link" href="#root/_help_BlN9DFI679QC">리본 메뉴</a>에서 유사한 노트 탭을 누르면 목록을 볼 수 있습니다.</p><h2>사용 방법</h2><ul><li>노트 위에 마우스를 올리면 내용을 간단히 미리 볼 수 있습니다.</li><li>노트를 클릭하면 현재 화면에서 열립니다.</li><li><kbd>Ctrl</kbd>을 누른 채 클릭하면 별도 탭에서 열립니다.</li></ul>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<p>TriliumNext의 노트 트리 구조를 이해하는 데 필요한 기본 개념을 설명합니다.</p><h2>노트</h2><p>노트는 TriliumNext에서 정보를 담는 기본 단위입니다. 자세한 내용은 <a href="#root/_help_BFs8mudNFgCS">노트</a>를 참고하세요.</p><h2>가지</h2><p>가지는 노트가 트리의 어느 위치에 놓이는지를 나타냅니다. <code>parentNoteId</code>와 <code>noteId</code>의 쌍으로 상위 노트와 하위 노트의 관계를 표현합니다.</p><p>한 노트에 여러 가지를 연결하면 같은 노트를 트리의 여러 위치에 놓을 수 있습니다. 이를 <a
|
||||
href="#root/_help_IakOLONlIfGI">복제</a>라고 합니다.</p><h2>접두사</h2><p>접두사는 특정 가지에서만 노트 제목 앞에 붙는 문구입니다. 같은 노트를 두 위치에 놓고 한쪽에서만 제목을 구분하고 싶을 때 사용합니다.</p><p>트리에서 노트를 마우스 오른쪽 버튼으로 클릭한 뒤 가지 접두사 편집을 선택하세요.</p><p>접두사는 노트 본문에 속하지 않으므로 노트를 보호해도 암호화되지 않습니다. 보호된 노트를 구분할 수 있도록 제목 일부를 트리에 계속 표시할 때 유용합니다.</p><h2>하위 트리</h2><p>하위 트리는 기준이 되는 노트와 그 아래에 속한 모든 노트를 포함합니다. 내보내기 같은 일부 작업은 하위 트리 전체에 적용할 수 있습니다.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>보관된 노트는 <code>archived</code> <a href="#root/_help_zEY4DaJG4YT5">속성</a>을 직접 지정했거나 <a href="#root/_help_bwZpz2ajCEwO">상속</a>받은 노트입니다.</p><p>기본적으로 자동 완성 목록과 본문 <a href="#root/_help_eIg8jdvaoNNd">검색</a> 결과에 나타나지 않습니다.</p><p>자주 사용하지는 않지만 보관할 가치가 있는 노트를 정리할 때 유용합니다. 필요한 정보는 남겨 두면서 평소 작업에 방해되지 않게 할 수 있습니다.</p><p>노트 트리에 보관된 노트를 표시할지는 설정에서 선택할 수 있습니다.</p><p><img src="Archived Notes_hide-archiv.png" alt="보관된 노트 표시 설정"></p>
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
<p>Trilium의 <a href="#root/_help_BFs8mudNFgCS">노트</a>에는 이미지나 파일을 하나 이상 첨부할 수 있습니다. 첨부 파일은 해당 노트 안에 표시하거나 링크로 연결할 수 있습니다.</p><p><a href="#root/_help_CdNpE2pqjmI6">스크립트</a>에 필요한 라이브러리를 포함할 때도 유용합니다. <a class="reference-link" href="#root/_help_R7abl2fc6Mxi">체중 기록</a> 예제에서는 스크립트 노트에 첨부한 <a href="https://chartjs.org/">Chart.js</a>를 사용하는 방법을 보여 줍니다.</p><p>첨부 파일은 각각 하나의 노트에 속합니다. 다른 노트와 같은 첨부 파일을 공유하지 않습니다. 첨부 파일 링크를 다른 노트에 복사하면 파일도 복제되며 이후에는 서로 독립적으로 관리됩니다.</p><p>노트에 이미지를 넣을 때는 첨부 기능을 사용하는 것이 좋습니다. 이미지 첨부 파일은 해당 노트 본문에서 참조해야 합니다. 참조되지 않는 이미지는 설정된 유예 시간이 지나면 자동으로 삭제됩니다.</p><h2>노트를 첨부 파일로 변환하기</h2><p><a class="reference-link" href="#root/_help_W8vYD3Q1zjCR">파일 노트</a>를 상위 노트의 첨부 파일로 바꿀 수 있습니다.</p><ul><li>하나만 변환하려면 <a class="reference-link"
|
||||
href="#root/_help_8YBEPzcpUgxw">노트 버튼</a>의 메뉴에서 첨부 파일로 변환을 선택하세요.</li><li>여러 개를 변환하려면 <a class="reference-link"
|
||||
href="#root/_help_oPVyFC7WL2Lp">노트 트리</a>에서 대상 노트를 선택한 뒤 마우스 오른쪽 버튼 → 고급 → 첨부 파일로 변환을 선택하세요.</li></ul><h2>첨부 파일 미리보기</h2><p>이미지와 동영상 및 PDF 등의 첨부 파일은 <a class="reference-link" href="#root/_help_W8vYD3Q1zjCR">파일 노트</a>와 같은 미리보기 기능을 사용합니다.</p>
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
<p><a
|
||||
class="reference-link" href="#root/_help_IakOLONlIfGI">노트 복제</a> 기능을 사용하면 하나의 노트가 <a class="reference-link"
|
||||
href="#root/_help_oPVyFC7WL2Lp">노트 트리</a>의 여러 위치에 나타날 수 있습니다. 어느 위치에서도 뜻이 통하는 제목을 사용하는 것이 좋습니다.</p><p>위치마다 다른 설명이 필요할 때는 가지 접두사를 사용할 수 있습니다. 노트 제목 앞에 해당 위치에 맞는 설명을 붙여 줍니다.</p><p>접두사는 위치별로 지정하며 노트 트리에서만 표시됩니다.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>아이콘을 사용하면 노트를 쉽게 구분할 수 있습니다. 내부적으로는 <code>iconClass</code> 속성으로 노트에 CSS 클래스를 지정합니다. 예를 들어 <code>#iconClass="bx bx-calendar"</code>는 기본 문서나 폴더 아이콘 대신 달력 아이콘을 표시합니다. 클래스 이름을 외울 필요는 없습니다. 노트를 편집하면서 제목 옆의 아이콘을 누르면 선택 창이 열립니다.</p><p><img src="Note Icons_note-icon-chang.png" alt="노트 아이콘 바꾸기"></p><p><img src="Note Icons_note-icon-galle.png" alt="노트 아이콘 선택 창"></p>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<p>Trilium은 일정한 간격으로 노트의 상태를 저장해 이전 버전을 보관합니다.</p><h2>이전 버전 저장 간격</h2><p>설정 → 기타에서 저장 간격을 바꿀 수 있습니다. 간격이 짧을수록 더 많은 버전을 남기지만 저장 공간도 더 필요합니다.</p><p>특정 노트나 하위 트리의 버전 기록을 끄려면 <code>disableVersioning</code> <a
|
||||
href="#root/_help_zEY4DaJG4YT5">라벨</a>을 추가하세요.</p><h2>보관 개수 제한</h2><p>설정 → 기타에서 노트마다 보관할 이전 버전의 최대 개수를 지정할 수 있습니다. -1은 제한 없음이며 0은 모든 이전 버전을 삭제한다는 뜻입니다. 개별 노트에는 <code>versioningLimit=X</code> 라벨로 따로 지정할 수 있습니다.</p><p>변경한 제한은 해당 노트를 수정할 때 적용됩니다.</p><p>초과한 이전 버전 지금 삭제 버튼을 누르면 즉시 적용할 수 있습니다.</p><p>이전 버전은 리본 메뉴 오른쪽의 버튼으로 확인할 수 있습니다.</p><p><img src="Note Revisions_note-revisi.png" alt="이전 버전 보기"></p>
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
<p><img style="aspect-ratio:893/144;" src="Floating buttons_image.png" width="893"
|
||||
height="144" alt="노트별 추가 작업 버튼"></p><p>현재 노트의 종류에 따라 <a class="reference-link" href="#root/_help_BlN9DFI679QC">리본 메뉴</a> 바로 아래 오른쪽에 추가 작업 버튼이 나타납니다. 해당 노트에 필요한 기능을 제공합니다.</p><p>예를 들면 다음과 같습니다.</p><ul><li><a class="reference-link" href="#root/_help_s1aBHPd79XYj">Mermaid 다이어그램</a>과 <a
|
||||
class="reference-link" href="#root/_help_grjYqerjn243">캔버스</a>에서는 SVG로 내려받거나 참조를 복사해 <a class="reference-link"
|
||||
href="#root/_help_iPIMuisry3hd">텍스트 노트</a>에 붙여 넣을 수 있습니다.</li><li><a href="#root/_help_CoFPLs3dRlXc">읽기 전용 노트</a>에서는 잠시 편집을 허용해 빠르게 수정할 수 있습니다.</li></ul><h2>사용 방법</h2><p>오른쪽 끝의 화살표 두 개를 누르면 버튼 영역을 접을 수 있습니다.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>전체 메뉴에서는 화면 확대 비율과 창을 항상 위에 표시하는 옵션 등 현재 창의 동작을 설정할 수 있습니다. 여러 고급 기능에도 접근할 수 있습니다.</p><p><img src="Global menu_image.png" alt="전체 메뉴"></p><h2>전체 메뉴 열기</h2><p>선택한 화면 배치에 따라 메뉴 위치가 달라집니다. <a href="#root/_help_x0JgW8UqGXvq">세로 배치와 가로 배치</a>를 참고하세요.</p>
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
<p>노트 트리에서 노트를 이동하고 구조를 정리하는 방법을 설명합니다.</p><p><img src="Note Tree_image.png" alt="노트 트리"></p><h2>끌어서 놓기</h2><p><img src="Note Tree_drag-and-drop.gif" alt="노트를 끌어서 이동하는 예시"></p><p>노트를 원하는 위치로 끌어서 놓으면 트리의 순서와 구조를 바꿀 수 있습니다.</p><h2>키보드로 이동하기</h2><p><img src="Note Tree_move-note-with-k.gif" alt="키보드로 노트를 이동하는 예시"></p><p>다음 <a
|
||||
href="#root/_help_A9Oc6YKKc65v">단축키</a>를 사용할 수 있습니다.</p><ul><li><kbd>Ctrl</kbd>+<kbd>↑</kbd> 또는 <kbd>Ctrl</kbd>+<kbd>↓</kbd> — 같은 단계에서 노트를 위아래로 이동합니다.</li><li><kbd>Ctrl</kbd>+<kbd>←</kbd> — 노트를 한 단계 위로 올립니다. 현재 상위 노트의 상위 노트 아래로 옮깁니다.</li><li><kbd>Ctrl</kbd>+<kbd>→</kbd> — 바로 위에 있는 노트의 하위 노트로 옮깁니다.</li><li><kbd>←</kbd>와 <kbd>→</kbd> — 하위 트리를 접거나 펼칩니다.</li></ul><h2>오른쪽 클릭 메뉴</h2><p>잘라내기와 붙여넣기로도 노트를 이동할 수 있습니다. 관련 <a href="#root/_help_A9Oc6YKKc65v">단축키</a>는 <kbd>Ctrl</kbd>+<kbd>C</kbd>(<a
|
||||
href="#root/_help_IakOLONlIfGI">복사</a>)와 <kbd>Ctrl</kbd>+<kbd>X</kbd>(잘라내기) 및 <kbd>Ctrl</kbd>+<kbd>V</kbd>(붙여넣기)입니다.</p><p>자세한 내용은 <a class="reference-link" href="#root/_help_YtSN43OrfzaA">노트 트리 메뉴</a>를 참고하세요.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>여러 노트를 한꺼번에 선택할 수 있습니다.</p><p>먼저 선택 범위의 첫 노트를 클릭하세요. Shift 키를 누른 채 마지막 노트를 클릭하면 그 사이에 있는 노트가 모두 선택됩니다.</p><p><img src="Multiple selection_image.png" alt="여러 노트 선택"></p><p>선택한 노트에서 마우스 오른쪽 버튼을 누르면 잘라내기와 복사 및 이동과 복제 또는 삭제를 한꺼번에 적용할 수 있습니다. <a class="reference-link" href="#root/_help_ivYnonVFBxbQ">일괄 작업</a>도 사용할 수 있습니다. 여러 노트에 적용할 수 없는 메뉴는 비활성화됩니다.</p>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<p><a href="#root/_help_BlN9DFI679QC">리본 메뉴</a> 오른쪽에는 다음과 같은 버튼이 있습니다.</p><p><img src="Note buttons_image.png" alt="노트 작업 버튼"></p><ul><li>이전 버전 버튼을 누르면 현재 노트의 <a href="#root/_help_vZWERwf8U3nx">이전 버전</a>을 확인할 수 있습니다.</li><li>노트 메뉴에서는 현재 노트나 하위 트리에 적용할 작업을 선택합니다. 가져오기와 내보내기를 비롯해 <a href="#root/_help_4FahAwuGTAwC">노트 소스</a> 확인과 <a
|
||||
href="#root/_help_0vhv7lsOLy82">첨부 파일</a> 관리 기능을 제공합니다.</li></ul>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<p><img style="aspect-ratio:1189/709;" src="Options_image.png" width="1189"
|
||||
height="709" alt="설정 화면"></p><p>설정에서 TriliumNext 클라이언트와 서버의 동작을 바꿀 수 있습니다.</p><h2>설정 열기</h2><ul><li><a href="#root/_help_x3i7MxGccDuM">전체 메뉴</a>에서 설정을 선택합니다.</li><li><a href="#root/_help_xYmIYSP6wE3F">실행 도구 모음</a>의 <img src="1_Options_image.png" alt="설정 버튼">을 누릅니다. 필요하지 않으면 이 버튼을 숨길 수도 있습니다.</li><li>설정 열기에 단축키를 지정할 수 있습니다. 기본 단축키는 없습니다.</li><li><a class="reference-link" href="#root/_hidden/_help__options">설정 바로가기</a>를 눌러 열 수도 있습니다.</li></ul><p>설정을 연 뒤 <a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">노트 트리</a>에서 원하는 설정 범주를 선택하세요.</p><h2>설정 닫기</h2><p>설정은 새 <a href="#root/_help_3seOhtN8uLIY">탭</a>에서 열립니다. 해당 탭을 닫으면 됩니다.</p><h2>설정 동기화</h2><p><a class="reference-link" href="#root/_help_cbkrhQjrkKrh">동기화</a>를 사용하면 일부 설정은 모든 기기에 함께 적용됩니다. 나머지 설정은 기기마다 다르게 지정할 수 있습니다.</p><p>테마와 화면의 가로·세로 배치 및 코드 블록 테마처럼 화면 표시와 관련된 설정은 각 기기에 맞게 조정할 수 있도록 일반적으로 동기화하지 않습니다.</p>
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
<p><img style="aspect-ratio:988/572;" src="1_Recent Changes_image.png" width="988"
|
||||
height="572" alt="최근 변경 사항 화면"></p><h2>최근 변경 사항 열기</h2><ul><li><a class="reference-link" href="#root/_help_xYmIYSP6wE3F">실행 도구 모음</a>의 <img src="Recent Changes_image.png"
|
||||
width="25" height="21" alt="최근 변경 사항 버튼">을 누르면 전체 노트의 변경 사항을 확인할 수 있습니다. <a href="#root/_help_OR8WJ7Iz9K4U">하위 트리만 표시</a> 기능이나 <a
|
||||
href="#root/_help_9sRHySam5fXb">작업 공간</a>을 사용 중이면 해당 범위의 변경 사항만 표시됩니다.</li><li>특정 노트와 그 하위 노트의 변경 사항만 보려면 <a class="reference-link" href="#root/_help_YtSN43OrfzaA">노트 트리의 오른쪽 클릭 메뉴</a> → 고급에서 해당 항목을 선택하세요.</li></ul><h2>사용 방법</h2><ul><li>가장 최근에 변경한 노트부터 표시됩니다.</li><li>노트 제목과 경로가 함께 표시됩니다. 제목을 누르면 창이 닫히고 해당 노트로 이동합니다.</li><li>삭제한 노트도 삭제 시점을 기준으로 표시됩니다. 옆의 삭제 취소를 누르면 복원할 수 있습니다.</li></ul>
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
<p><img style="aspect-ratio:1036/372;" src="Right Sidebar_image.png" width="1036"
|
||||
height="372" alt="오른쪽 사이드바"></p><p>오른쪽 사이드바는 현재 노트와 관련된 다음 내용을 보여 줍니다.</p><ul><li><a class="reference-link" href="#root/_help_BFvAtE74rbP6">목차</a></li><li><a class="reference-link" href="#root/_help_AxshuNRegLAv">강조 표시 목록</a></li></ul><p>표시할 내용이 없으면 사이드바가 나타나지 않습니다. 예를 들어 제목이 적고 강조 표시도 없으면 숨겨집니다.</p><h2>사이드바 표시와 숨기기</h2><p><code>toggleRightPane</code> 단축키를 지정해 사이드바를 표시하거나 숨길 수 있습니다. 기본 키는 지정되어 있지 않습니다.</p><h2>분할 화면에서 사용</h2><p><a class="reference-link" href="#root/_help_luNhaphA37EO">화면 분할</a>을 사용해도 현재 <a
|
||||
href="#root/_help_3seOhtN8uLIY">탭</a>에는 사이드바가 하나만 표시됩니다.</p><p>분할된 화면에서 노트를 클릭하면 해당 노트의 내용으로 사이드바가 바뀝니다. 표시할 내용이 없으면 닫힌 상태를 유지합니다.</p>
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
<p>분할 보기를 사용하면 둘 이상의 노트를 나란히 열고 작업할 수 있습니다.</p><p><img style="aspect-ratio:1398/1015;" src="Split View_2_Split View_im.png"
|
||||
width="1398" height="1015" alt="여러 노트를 나란히 연 화면"></p><h2>사용 방법</h2><ul><li>노트 제목 오른쪽의 <img src="Split View_Split View_imag.png" alt="분할 보기 추가 버튼">을 누르면 오른쪽에 새 영역이 열립니다. 여러 번 눌러 영역을 더 만들 수 있습니다. 좌우 배치만 지원하며 위아래 배치나 끌어서 나누기는 지원하지 않습니다.</li><li>분할 영역 옆의 <img src="Split View_3_Split View_im.png" alt="분할 보기 닫기 버튼">으로 해당 영역을 닫습니다.</li><li><img src="Split View_4_Split View_im.png" alt="이전 분할 영역으로 이동">과 <img src="Split View_1_Split View_im.png" alt="다음 분할 영역으로 이동">으로 영역 사이를 이동합니다.</li><li><a href="#root/_help_3seOhtN8uLIY">탭</a>마다 분할 구성을 따로 유지합니다. 탭 제목에는 첫 번째 노트의 제목만 표시됩니다.</li></ul><h2>노트 트리와 표시 범위</h2><p>분할 영역의 본문을 누르면 해당 영역이 활성화됩니다. <a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">노트 트리</a>에서도 그 영역에서 편집 중인 노트를 표시합니다.</p><p>각 영역에 서로 다른 <a class="reference-link"
|
||||
href="#root/_help_OR8WJ7Iz9K4U">하위 트리 표시 범위</a>를 지정할 수 있습니다. 새 영역을 만들면 기존 영역의 표시 범위를 이어받으므로 만든 뒤 원하는 범위로 바꾸세요.</p><p>노트를 정리할 때 한쪽은 원래 위치의 하위 트리로 제한하고 다른 쪽은 옮길 위치로 제한하면 편리합니다. 노트를 전환할 때마다 트리 위치가 크게 바뀌지 않아 잘라내기와 붙여넣기로 옮기기 쉽습니다.</p>
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
<p><img style="aspect-ratio:1119/43;" src="2_Tabs_image.png" width="1119"
|
||||
height="43" alt="노트 탭"></p><p>탭을 사용하면 여러 노트 사이를 빠르게 전환할 수 있습니다.</p><h2>배치</h2><p><a class="reference-link" href="#root/_help_x0JgW8UqGXvq">세로 배치와 가로 배치</a> 설정에 따라 위치가 달라집니다.</p><ul><li>세로 배치에서는 <a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">노트 트리</a> 오른쪽 영역의 위에 표시됩니다.</li><li>가로 배치에서는 <a href="#root/_help_oPVyFC7WL2Lp">노트 트리</a> 위에서 화면 너비 전체를 사용하므로 더 많은 탭을 표시할 수 있습니다.</li></ul><h2>사용 방법</h2><ul><li>마지막 탭 오른쪽의 <img src="1_Tabs_image.png" alt="새 탭 버튼">으로 탭을 만듭니다.</li><li>각 탭의 <img src="Tabs_image.png" alt="탭 닫기 버튼">으로 닫습니다.</li><li><a class="reference-link"
|
||||
href="#root/_help_luNhaphA37EO">분할 보기</a>와 함께 사용하면 탭마다 여러 노트를 나란히 표시할 수 있습니다.</li><li>탭을 끌어서 순서를 바꿀 수 있습니다.</li><li>탭을 위아래로 끌어 별도 창으로 분리할 수 있습니다. 분리한 탭을 다른 창으로 다시 합치는 기능은 지원하지 않습니다.</li></ul><h2>단축키</h2><ul><li><kbd>Ctrl</kbd>+<kbd>T</kbd> — 새 탭 열기</li><li><kbd>Ctrl</kbd>+<kbd>W</kbd> — 현재 탭 닫기</li><li><kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>T</kbd> — 마지막으로 닫은 탭 다시 열기</li><li><kbd>Ctrl</kbd>+<kbd>Tab</kbd> — 다음 탭으로 이동</li><li><kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>Tab</kbd> — 이전 탭으로 이동</li><li><kbd>Ctrl</kbd>+<kbd>1</kbd>부터 <kbd>Ctrl</kbd>+<kbd>9</kbd>까지 — 첫 번째부터 아홉 번째 탭으로 이동</li><li>마지막 탭으로 이동하는 기능에도 단축키를 지정할 수 있습니다. 기본 키는 없습니다.</li></ul>
|
||||
+1
@@ -0,0 +1 @@
|
||||
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p><img src="3_Zen mode_image.png" alt="집중 모드 화면"></p><p>Windows 11에서 운영체제 제목 표시줄을 끄고 배경 효과를 켠 예시입니다. 집중 모드는 대부분의 메뉴를 숨겨 읽기와 쓰기에 집중할 수 있도록 합니다.</p><p><img src="2_Zen mode_image.png" alt="전체 메뉴의 집중 모드"></p><h2>켜고 끄기</h2><p>전체 메뉴에서 집중 모드를 선택하세요. 0.92.5부터는 <kbd>F9</kbd>로 전환할 수 있습니다. 이전 버전의 기본 단축키는 <kbd>Alt</kbd>+<kbd>Z</kbd>입니다. 단축키 설정에서는 <code>toggleZenMode</code> 항목을 찾으세요.</p><p>집중 모드에서는 전체 메뉴도 숨겨집니다. 오른쪽 위의 <img src="Zen mode_image.png" alt="집중 모드 종료 버튼">을 누르거나 단축키를 다시 누르면 해제됩니다. 현재 창에만 적용되며 앱을 다시 시작하면 해제됩니다.</p><h2>창 이동하기</h2><p>운영체제 제목 표시줄을 사용한다면 해당 부분을 끌어 창을 옮기세요. 제목 표시줄을 껐다면 노트 제목이 있는 창 위쪽을 끌어 이동할 수 있습니다.</p><p><img src="1_Zen mode_image.png" alt="집중 모드의 분할 보기"></p><p>Windows 11에서 배경 효과를 끄고 두 노트를 나란히 표시한 예시입니다.</p><h2>탭과 분할 보기</h2><p>탭은 숨겨지지만 단축키는 사용할 수 있습니다. <code>firstTab</code>의 기본 키는 <kbd>Ctrl</kbd>+<kbd>1</kbd>이며 <code>secondTab</code>은 <kbd>Ctrl</kbd>+<kbd>2</kbd>입니다. 다음 탭으로 이동하는 <code>activateNextTab</code>은 <kbd>Ctrl</kbd>+<kbd>Tab</kbd>을 사용하며 이전 탭으로 이동하는 <code>activatePreviousTab</code>은 <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>Tab</kbd>을 사용합니다. 실제 지정된 키는 설정에서 확인하세요.</p><p>이 문서의 버전에서는 분할 보기 단축키가 없습니다. 집중 모드를 끈 상태에서 분할 구성을 만든 뒤 다시 집중 모드를 켜면 사용할 수 있습니다.</p>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<p>데스크톱에 Trilium을 설치하는 순서입니다.</p><ul><li><strong>설치 파일 내려받기</strong> — GitHub의 <a href="https://github.com/TriliumNext/Notes/releases/latest">최신 릴리스 페이지</a>에서 운영체제에 맞는 실행 파일 패키지를 내려받습니다.</li><li><strong>압축 풀기</strong> — 원하는 폴더에 압축을 풉니다.</li><li><strong>실행하기</strong> — 압축을 푼 폴더의 <code>trilium</code> 실행 파일을 엽니다.</li></ul><h2>시작 스크립트</h2><p>용도에 따라 다음 스크립트를 사용할 수 있습니다.</p><ul><li><code>trilium-no-cert-check</code> — <a
|
||||
href="#root/_help_l2VkvOwUNfZj">TLS 인증서</a>를 검증하지 않고 실행합니다. 자체 서명 인증서를 사용하는 서버에 연결할 때 사용할 수 있습니다. 실행 전에 <code>NODE_TLS_REJECT_UNAUTHORIZED=0</code> 환경 변수를 지정하는 방법도 있습니다.</li><li><code>trilium-portable</code> — 이동식 모드로 실행합니다. 애플리케이션 폴더 안에 <a href="#root/_help_tAassRL4RSQL">데이터 폴더</a>를 만들어 프로그램과 데이터를 함께 옮기기 쉽습니다.</li><li><code>trilium-safe-mode</code> — 안전 모드로 실행합니다. 실행 중 오류를 일으킬 수 있는 사용자 시작 스크립트를 비활성화합니다.</li></ul><h2>동기화</h2><p>데스크톱 앱의 데이터를 서버와 동기화하려면 <a class="reference-link" href="#root/_help_cbkrhQjrkKrh">동기화 안내</a>를 참고하세요.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>Trilium <a href="#root/_help_WOcw2SLH6tbX">서버 버전</a>은 스마트폰과 태블릿의 터치 조작에 맞춘 모바일 웹 화면을 제공합니다. 로그인할 때 브라우저를 감지해 자동으로 전환합니다.</p><p>모바일 화면은 데스크톱 화면보다 지원하는 기능이 적습니다. Android나 iOS에 설치하는 별도 앱이 아니라 <a href="#root/_help_WOcw2SLH6tbX">서버 버전</a>에서 제공하는 웹페이지입니다.</p><h2>화면 예시</h2><h3>스마트폰</h3><p><img src="Mobile Frontend_mobile-sma.png" alt="스마트폰 화면"></p><h3>태블릿</h3><p><img src="Mobile Frontend_mobile-tab.png" alt="태블릿 화면"></p><h2>제한 사항</h2><ul><li>전체 노트 트리를 탐색하고 모든 유형의 노트를 읽거나 편집할 수 있습니다. 새로 만들 수 있는 유형은 텍스트 노트뿐입니다.</li><li><a href="#root/_help_bwg0e8ewQMak">보호된 노트</a>를 읽거나 편집할 수 있지만 새로 보호된 노트를 만들 수는 없습니다.</li><li>설정 변경을 지원하지 않습니다.</li><li>노트 복제를 지원하지 않습니다.</li><li>첨부 파일 업로드를 지원하지 않습니다.</li></ul><h2>화면 종류 직접 선택하기</h2><p>자동으로 선택된 화면이 적합하지 않으면 로그인 페이지 주소에 <code>?mobile</code> 또는 <code>?desktop</code>을 붙이세요. 먼저 로그아웃해야 할 수도 있습니다.</p><h2>스크립트</h2><p>일반 화면처럼 <a href="#root/_help_CdNpE2pqjmI6">스크립트</a>로 동작을 바꿀 수 있습니다. 모바일 화면을 시작할 때 실행할 스크립트 노트에는 <code>#run=mobileStartup</code> 라벨을 지정하세요.</p>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<p>이 버전의 Trilium은 다중 사용자를 지원하지 않습니다. 여러 사람이 각자의 노트를 사용하려면 서버 인스턴스를 따로 설치해야 합니다. 여러 <a href="#root/_help_cbkrhQjrkKrh">동기화</a> 서버를 동시에 사용하는 것도 지원하지 않습니다.</p><p>물리 서버 한 대에서 여러 인스턴스를 실행하는 방법은 다음과 같습니다.</p><p><a class="reference-link" href="#root/_help_3tW6mORuTHnB">Linux 패키지</a>나 <a
|
||||
class="reference-link" href="#root/_help_J1Bb6lVlwU5T">수동 설치</a>를 사용한다면 인스턴스마다 포트와 데이터 폴더를 다르게 지정하세요.</p><pre><code class="language-text-x-trilium-auto">TRILIUM_NETWORK_PORT=8080 TRILIUM_DATA_DIR=/path/to/your/data-dir-A /opt/trilium/trilium.sh</code></pre><p>두 번째 인스턴스의 예시입니다.</p><pre><code class="language-text-x-trilium-auto">TRILIUM_NETWORK_PORT=8081 TRILIUM_DATA_DIR=/path/to/your/data-dir-B /opt/trilium/trilium.sh</code></pre><p><code>systemd</code>를 사용한다면 <a href="https://serverfault.com/questions/413397/how-to-set-environment-variable-in-systemd-service">서비스 설정에 환경 변수를 지정</a>하세요.</p><p><a class="reference-link" href="#root/_help_rWX5eY045zbE">Docker</a>에서는 컨테이너를 각각 만들고 포트 연결과 데이터 폴더를 다르게 지정하면 됩니다.</p><p><a class="reference-link" href="#root/_help_moVgBcoxE3EK">NixOS</a>에서는 Docker OCI 컨테이너를 사용하거나 별도의 서비스 정의를 가진 NixOS 컨테이너를 하나 이상 사용해야 합니다.</p><p>관련 설명과 도움은 <a href="https://github.com/orgs/TriliumNext/discussions/1642#discussioncomment-12768808">GitHub 토론</a>을 참고하세요.</p>
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
<p>NixOS에 포함된 Trilium 모듈을 설정하는 방법입니다.</p><h2>준비 사항</h2><p><a href="https://nixos.org/">NixOS</a>가 설치되어 있어야 합니다.</p><h2>설정</h2><p><code>configuration.nix</code>에 다음 내용을 추가하세요.</p><pre><code class="language-text-x-trilium-auto">services.trilium-server.enable = true;
|
||||
|
||||
# 기본 데이터 폴더: /var/lib/trilium
|
||||
#services.trilium-server.dataDir = "/var/lib/trilium-sync-server";
|
||||
|
||||
# 기본 수신 주소: 127.0.0.1 / 포트: 8080
|
||||
#services.trilium-server.host = "0.0.0.0";
|
||||
#services.trilium-server.port = 12783;</code></pre><p>바꾸려는 옵션은 앞의 주석 표시를 제거하세요.</p><p>Nginx 역방향 프록시 설정을 비롯한 다른 항목은 <a href="https://search.nixos.org/options?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=trilium-server">NixOS 옵션 목록</a>에서 확인할 수 있습니다.</p>
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
<p>Trilium은 Docker 컨테이너로 실행할 수 있으므로 Kubernetes에도 배포할 수 있습니다. 공식 Helm 차트나 커뮤니티 차트를 사용하거나 배포 구성을 직접 작성할 수 있습니다. 이 문서는 Helm 차트를 사용하는 방법을 안내합니다.</p><h2>실행 권한</h2><p>이 문서에 해당하는 컨테이너는 초기화할 때 루트 권한이 필요합니다. 초기화 후에는 사용자와 그룹을 <code>1000:1000</code>으로 전환해 Node.js 프로세스를 실행합니다. 주 프로세스는 루트 권한으로 실행되지 않습니다.</p><p>사용자 ID를 바꾸는 <code>PodSecurityContext</code> 설정은 사용하지 마세요. 저장 파일과 애플리케이션에 다른 사용자·그룹 ID를 사용하려면 <code>USER_UID</code>와 <code>USER_GID</code> 환경 변수를 지정하세요. 이미지가 <code>/home/node</code>의 권한도 조정하므로 별도 초기화 컨테이너는 필요하지 않습니다.</p><h2>Helm 차트</h2><ul><li><a href="https://github.com/TriliumNext/helm-charts">TriliumNext 공식 Helm 차트</a></li><li><a href="https://github.com/ohdearaugustin">ohdearaugustin</a>이 제공하는 <a
|
||||
href="https://github.com/ohdearaugustin/charts">커뮤니티 차트</a></li></ul><h2>저장소 추가하기</h2><p>다음 명령으로 저장소를 추가합니다. 명령 아래의 영문은 정상 실행 시 표시되는 응답 예시입니다.</p><pre><code class="language-text-x-trilium-auto">helm repo add trilium https://triliumnext.github.io/helm-charts
|
||||
"trilium" has been added to your repositories</code></pre><h2>차트 설치하기</h2><p>차트의 <a href="https://github.com/TriliumNext/helm-charts/blob/main/charts/trilium/values.yaml">values.yaml</a>을 검토하고 필요한 값을 수정해 설정 파일을 준비한 뒤 실행하세요.</p><pre><code class="language-text-x-trilium-auto">helm install --create-namespace --namespace trilium trilium trilium/trilium -f values.yaml</code></pre><p>Helm 사용법은 Helm 공식 문서를 참고하세요. Trilium 관련 질문은 TriliumNext GitHub의 토론 게시판에 남길 수 있습니다.</p>
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
<h2>인증 비활성화</h2><p>Trilium을 <code>localhost</code>에서만 사용하거나 다른 구성 요소가 인증을 담당한다면 <code>config.ini</code>에 다음 설정을 추가해 Trilium 자체 인증을 끌 수 있습니다.</p><pre><code class="language-text-x-trilium-auto">[General]
|
||||
noAuthentication=true</code></pre><p>0.94.1부터는 인증을 끄면 <a class="reference-link"
|
||||
href="#root/_help_7DAiwaf8Z7Rz">다중 인증</a>도 생략됩니다.</p><h2>로그인 세션의 동작</h2><p>로그인하면 브라우저에는 쿠키를 저장하고 서버에는 로그인 세션을 보관합니다.</p><p>로그인 상태 유지를 선택하면 기본적으로 21일 뒤 만료됩니다. <code>config.ini</code>의 <code>Session.cookieMaxAge</code>로 기간을 바꿀 수 있습니다. 하루 뒤 만료시키는 예시입니다.</p><pre><code class="language-text-x-trilium-auto">[Session]
|
||||
cookieMaxAge=86400</code></pre><p>로그인 상태 유지를 선택하지 않으면 브라우저 쿠키에 만료 시각을 지정하지 않으며 브라우저를 닫을 때 지워집니다. 서버의 세션은 애플리케이션을 마지막으로 사용한 시점부터 약 24시간 뒤 만료됩니다.</p><h2>활성 세션 확인하기</h2><p>로그인 세션은 사용자 데이터와 같은 <a class="reference-link"
|
||||
href="#root/_help_wX4HbRucYSDD">데이터베이스</a>에 저장됩니다. <a class="reference-link"
|
||||
href="#root/_help_YKWqdJhzi2VY">SQL 콘솔</a>에서 다음 조회문으로 확인할 수 있습니다.</p><pre><code class="language-text-x-trilium-auto">SELECT * FROM sessions</code></pre><p>만료된 세션은 서버가 주기적으로 정리합니다. 일반적으로 한 시간 간격입니다.</p><h2>관련 문서</h2><ul><li><a class="reference-link" href="#root/_help_7DAiwaf8Z7Rz">다중 인증</a></li></ul>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>Trilium을 새 버전으로 업그레이드하는 방법을 안내합니다.</p><h2>업그레이드 방법</h2><p>이 버전의 Trilium에는 자동 업그레이드 기능이 없습니다. 설치 방식에 따라 직접 업데이트하세요.</p><ul><li><a href="#root/_help_rWX5eY045zbE">Docker 서버 설치</a> — 새 이미지를 내려받고 컨테이너를 다시 시작합니다.</li><li>그 밖의 설치 방식 — <a href="https://github.com/TriliumNext/Notes/releases/latest">릴리스 페이지</a>에서 최신 버전을 내려받아 기존 애플리케이션 파일을 교체합니다.</li></ul><h2>데이터베이스 호환성과 변환</h2><p>새 버전을 실행하면 <a href="#root/_help_wX4HbRucYSDD">데이터베이스</a>를 필요한 형식으로 자동 변환합니다. 변환된 데이터베이스는 이전 버전에서 읽지 못할 수 있습니다. 이전 버전으로 돌아가려면 변환 전에 생성한 <a href="#root/_help_ODY7qQn5m2FT">백업</a>을 복원하세요.</p><h2>동기화 호환성</h2><p><a href="#root/_help_cbkrhQjrkKrh">동기화</a>에 사용하는 통신 규약에는 버전이 있습니다. 함께 동기화하는 모든 인스턴스는 같은 규약 버전을 사용해야 하므로 업그레이드할 때 다른 인스턴스도 함께 업데이트해야 할 수 있습니다. 규약 버전의 변경 여부는 릴리스 안내를 확인하세요.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p><img src="Web Clipper_image.png" alt="웹 클리퍼 화면"></p><p>Trilium Web Clipper는 웹페이지의 글자와 이미지 및 화면 캡처와 짧은 메모를 Trilium에 바로 저장하는 브라우저 확장 프로그램입니다. <a href="https://github.com/TriliumNext/web-clipper">프로젝트 저장소</a>에서 소스를 확인할 수 있습니다.</p><p>Firefox와 Chrome을 지원합니다. Chrome용 배포판은 다른 Chromium 기반 브라우저에서도 사용할 수 있습니다.</p><h2>주요 기능</h2><ul><li>글자를 선택하고 오른쪽 클릭 메뉴로 저장합니다.</li><li>이미지나 링크를 오른쪽 클릭해 저장합니다.</li><li>팝업이나 오른쪽 클릭 메뉴에서 페이지 전체를 저장합니다.</li><li>화면을 캡처하고 필요한 부분을 잘라 저장합니다.</li><li>팝업에서 짧은 텍스트 노트를 만듭니다.</li></ul><p>저장한 자료는 클리퍼 수신함 노트의 하위 노트로 만들어집니다. 기본 위치는 <a href="#root/_help_l0tKav7yLHGF">오늘의 노트</a>입니다. 다른 노트에 <code>clipperInbox</code> <a href="#root/_help_zEY4DaJG4YT5">라벨</a>을 지정하면 저장 위치를 바꿀 수 있습니다.</p><p>같은 날 같은 페이지에서 여러 번 저장하면 하나의 노트에 모입니다.</p><h2>확장 프로그램 내려받기</h2><ul><li><a href="https://github.com/TriliumNext/web-clipper/releases">프로젝트 릴리스 페이지</a> — Firefox용 XPI와 Chromium용 ZIP 파일을 제공합니다.</li><li><a href="https://chromewebstore.google.com/detail/trilium-web-clipper/dfhgmnfclbebfobmblelddiejjcijbjm">Chrome 웹 스토어</a></li></ul><h2>연결 설정</h2><p>실행 중인 Trilium에 연결해야 합니다. 기본적으로 로컬 컴퓨터의 포트 범위를 확인해 데스크톱 앱을 찾습니다. 데스크톱 앱을 사용하지 않거나 종료한 상태에서도 저장하려면 <a href="#root/_help_WOcw2SLH6tbX">서버</a> 주소를 지정할 수 있습니다.</p><h2>사용자 이름</h2><p>0.50 이전 버전에서는 사용자 이름과 비밀번호가 필요했습니다. 이후 버전에서는 사용자 이름을 사용하지 않으므로 해당 입력란에 어떤 값을 넣어도 인증에 영향을 주지 않습니다.</p>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<p><strong>책 노트</strong>는 하위 노트의 내용을 차례로 보여 주는 특별한 <a href="#root/_help_BFs8mudNFgCS">노트</a> 유형입니다. 여러 짧은 노트를 하나의 책처럼 이어서 읽을 때 유용합니다.</p><p><img src="Book_image.png" alt="책 노트 예시"></p><p>위 예시에서 왼쪽의 Node.js 노트에는 여러 하위 노트가 있습니다. 오른쪽에서는 그 내용을 하나의 연속된 문서로 보여 줍니다.</p><h2>기능</h2><p>여러 하위 노트의 내용을 한 화면에서 이어 볼 수 있습니다. 긴 내용을 관리하기 쉬운 단위로 나누어 작성한 뒤 읽을 때 편리합니다.</p><p><a class="reference-link" href="#root/_help_0ESUbbAxVnoK">노트 목록</a> 기능을 사용하므로 격자와 목록 및 달력 보기 중에서 선택할 수 있습니다.</p><p>보기 방식은 <a
|
||||
class="reference-link" href="#root/_help_BlN9DFI679QC">리본 메뉴</a>의 책 속성 탭에서 바꾸세요.</p>
|
||||
+1
@@ -0,0 +1 @@
|
||||
<p>Trilium 0.52 버전부터 사용할 수 있습니다.</p><p>캔버스 노트는 Excalidraw를 사용합니다. 마우스와 펜 또는 터치로 무한한 캔버스 위에 필기할 수 있습니다. 간단한 도표와 글자 및 그림을 넣는 기능도 제공합니다.</p><p><img src="Canvas_image.png" alt="캔버스 노트 예시"></p>
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
<p>Mermaid는 복잡한 다이어그램을 배치하는 데 사용할 수 있는 <a href="https://eclipse.dev/elk/">Eclipse Layout Kernel(ELK)</a> 엔진을 지원합니다. Trilium에서도 사용할 수 있지만 기본적으로 켜져 있지는 않습니다.</p><p>다이어그램 맨 앞에 다음 YAML 머리말을 넣으면 ELK를 사용합니다.</p><pre><code class="language-text-x-yaml">---
|
||||
config:
|
||||
layout: elk
|
||||
---</code></pre><table><thead><tr><th>ELK를 사용하지 않은 배치</th><th>ELK를 사용한 배치</th></tr></thead><tbody><tr><td><img src="ELK layout_ELK off.svg" alt="ELK를 사용하지 않은 다이어그램"></td><td><img src="ELK layout_ELK on.svg" alt="ELK를 사용한 다이어그램"></td></tr></tbody></table>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<p><img style="aspect-ratio:892/675;" src="Mind Map_image.png" width="892"
|
||||
height="675" alt="마인드맵 예시"></p><p>마인드맵은 떠오르는 생각을 빠르게 적고 계층 구조로 정리하는 노트입니다.</p><h2>용어</h2><ul><li><strong>항목</strong>은 하나의 생각을 나타냅니다. 최상위 항목은 배경색이 있는 둥근 사각형으로 표시됩니다. 하위 항목은 테두리만 있는 사각형으로 표시되며 더 아래 단계에서는 선으로 표시됩니다.</li><li><strong>최상위 항목</strong>은 모든 항목의 출발점입니다. 마인드맵마다 하나만 있습니다.</li></ul><h2>사용 방법</h2><ul><li>같은 단계의 항목을 만들려면 <kbd>Enter</kbd>를 누르고 내용을 입력한 뒤 다시 <kbd>Enter</kbd>를 누르세요.</li><li>하위 항목은 <kbd>Tab</kbd>을 누른 뒤 내용을 입력하고 <kbd>Enter</kbd>로 확정합니다.</li><li>상위 항목은 <kbd>Ctrl</kbd>+<kbd>Enter</kbd>로 만듭니다.</li><li>항목을 삭제하려면 <kbd>Delete</kbd>를 누릅니다.</li><li><kbd>Page Up</kbd>과 <kbd>Page Down</kbd>으로 항목을 위아래로 이동합니다.</li><li>항목을 선택하면 오른쪽에 나타나는 패널에서 글자 크기와 글자색 및 배경색을 바꾸거나 링크를 추가할 수 있습니다.</li><li>마인드맵 위에서 마우스를 끌어 여러 항목을 선택할 수 있습니다.</li><li>항목을 마우스 오른쪽 버튼으로 클릭하면 항목 추가와 집중 모드 및 항목 사이 연결 등의 메뉴가 나타납니다.</li><li>왼쪽 위 버튼으로 하위 항목을 최상위 항목의 왼쪽이나 오른쪽 또는 양쪽에 배치할 수 있습니다.</li><li><a class="reference-link" href="#root/_help_XpOYSgsLkTJy">떠 있는 버튼</a> 영역에서는 <a href="#root/_help_0Ofbk1aSuVRu">이미지 참조</a>를 복사해 텍스트 노트에 넣거나 SVG와 PNG 파일로 내보낼 수 있습니다.</li></ul>
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
<figure class="image image-style-align-center"><img style="aspect-ratio:856/763;" src="Note Map_image.png" width="856"
|
||||
height="763" alt="노트 지도 예시"></figure><p>노트 지도 유형은 <a href="#root/_help_BCkXAVs63Ttv">노트 지도 기능</a>을 독립된 노트로 제공합니다.</p><p>노트 지도를 만들면 노트 사이의 관계가 표시됩니다. 지도 노트의 상위 노트에 속한 노트와 그 하위 노트만 표시됩니다.</p>
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
<p><img style="aspect-ratio:601/216;" src="Render Note_image.png" width="601"
|
||||
height="216" alt="HTML 표시 노트"></p><p>HTML 표시 노트는 <a class="reference-link" href="#root/_help_CdNpE2pqjmI6">스크립트</a>에서 활용하는 유형입니다. 관계 속성으로 연결된 <a class="reference-link" href="#root/_help_6f9hih2hXXZk">코드 노트</a>의 HTML을 화면에 표시합니다.</p><h2>HTML 표시 노트 만들기</h2><ul><li>HTML 언어의 <a class="reference-link" href="#root/_help_6f9hih2hXXZk">코드 노트</a>를 만들고 표시할 내용을 작성합니다. 예: <code><p>안녕하세요.</p></code></li><li><a class="reference-link" href="#root/_help_HcABDtFCkbFN">HTML 표시 노트</a>를 만듭니다.</li><li><code>renderNote</code> <a href="#root/_help_zEY4DaJG4YT5">관계</a>가 앞서 만든 HTML 코드 노트를 가리키도록 지정합니다.</li></ul><h2>동적 내용 표시하기</h2><p><a class="reference-link"
|
||||
href="#root/_help_CdNpE2pqjmI6">스크립트</a>로 HTML의 일부를 바꾸면 동적 화면을 만들 수 있습니다. 현재 날짜와 시각을 표시하는 예제를 만들어 보겠습니다.</p><p>먼저 다음 내용의 HTML 코드 노트를 만드세요.</p><pre><code class="language-text-x-trilium-auto"><h1>현재 날짜와 시각</h1>
|
||||
현재 날짜와 시각: <span class="date"></span></code></pre><p>그 바로 아래에 프런트엔드 JavaScript <a class="reference-link"
|
||||
href="#root/_help_6f9hih2hXXZk">코드 노트</a>를 만들고 다음 코드를 작성합니다.</p><pre><code class="language-text-x-trilium-auto">const $dateEl = api.$container.find(".date");
|
||||
$dateEl.text(new Date().toLocaleString("ko-KR"));</code></pre><p>원하는 위치에 HTML 표시 노트를 만들고 <code>~renderNote</code> 관계로 HTML 노트를 연결하세요. 열면 현재 날짜와 시각이 한국어 형식으로 표시됩니다. 예: <strong>현재 날짜와 시각</strong> — 현재 날짜와 시각: 2025. 4. 6. 오후 3:26:29</p><h2>관련 예제</h2><p><a class="reference-link" href="#root/_help_R7abl2fc6Mxi">체중 기록</a>은 기본 <a class="reference-link" href="#root/_help_6tZeKvSHEUiB">사용 예제</a>에 포함되어 있습니다.</p>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user