48 lines
20 KiB
JavaScript
48 lines
20 KiB
JavaScript
// 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;
|
|
}
|