남은 API 참고 화면 5개 한글화와 Swagger 문서 표시 복구
This commit is contained in:
@@ -155,3 +155,25 @@ PDF SHA-256: 1141ea4fb9d619fd55d75d0bdcd6bbd5678b161633586764d0eadfc4b9235400
|
|||||||
### 미완료 범위
|
### 미완료 범위
|
||||||
|
|
||||||
API 참고 웹 보기 5개가 남았습니다. 내부 주소 /etapi/docs 및 /api/docs와 외부 스크립트 API 문서 3개입니다. 이들 페이지의 본문 번역은 아직 완료하지 않았습니다. 도움말 173개 및 목록 제목 181개와 이번 이미지 설명 206개가 완료됐다는 수치를 전체 100%로 해석하지 않습니다. 이미지 설명 보완 선택은 외부 API 원문을 번역한 것으로 간주하는 허가가 아닙니다.
|
API 참고 웹 보기 5개가 남았습니다. 내부 주소 /etapi/docs 및 /api/docs와 외부 스크립트 API 문서 3개입니다. 이들 페이지의 본문 번역은 아직 완료하지 않았습니다. 도움말 173개 및 목록 제목 181개와 이번 이미지 설명 206개가 완료됐다는 수치를 전체 100%로 해석하지 않습니다. 이미지 설명 보완 선택은 외부 API 원문을 번역한 것으로 간주하는 허가가 아닙니다.
|
||||||
|
|
||||||
|
## 2026-09-13 API 참고 화면 5개 추가 완료
|
||||||
|
|
||||||
|
- 외부 ETAPI 명세: 경로 24개. 제목과 설명 154개 필드에 원문 중복을 제외한 번역 118개를 적용했습니다.
|
||||||
|
- 내부 API 명세: 경로 37개. 제목과 설명 198개 필드에 원문 중복을 제외한 번역 166개를 적용했습니다.
|
||||||
|
- 스크립트 참고 자료: 프런트엔드 API와 FNote 및 백엔드 API의 한국어 사본을 만들었습니다. 설명 문구와 반환값 및 매개변수 설명을 번역했습니다. 최종 변환된 텍스트 노드는 각각 170개와 179개 및 213개입니다. 식별자와 코드 형식은 유지했습니다.
|
||||||
|
- 기본 도움말 노트 3개의 webViewSrc를 한국어 사본으로 연결했습니다. 원문 링크와 연결된 다른 형식의 공식 문서 링크는 보존했습니다. 개인 노트는 수정하지 않았습니다.
|
||||||
|
- Swagger 화면의 인증 설정과 직접 실행 및 매개변수와 응답 등 조작 문구를 번역했습니다. 예제 오류 메시지 3개도 번역했습니다. ETAPI 예제 서버 주소는 브라우저에서 현재 서버를 사용할 수 있도록 /etapi로 지정했습니다.
|
||||||
|
- 실제 화면 검증 중 기존 번들에서 Swagger 정적 파일이 빠져 문서가 비어 보이는 문제를 발견했습니다. 공식 npm swagger-ui-dist 5.21.0의 배포 무결성을 검증한 뒤 필요한 파일만 추가했습니다. LICENSE와 NOTICE를 보존했습니다. 번들 내부 정적 경로도 해당 위치로 연결했습니다.
|
||||||
|
- 새 정적 파일의 읽기 권한을 컨테이너에 맞췄습니다. 초기 검증의 일반 문구 검사 조건은 문서별 실제 제목 검사로 수정했습니다. 최종 검증은 모두 통과했습니다.
|
||||||
|
- 검증: API 호출 방식과 매개변수 및 스키마의 구조를 원본과 비교했습니다. 번역 대상 설명과 예제 메시지 및 문서용 서버 주소 외에는 일치합니다. 스크립트 문서의 미번역 일반 영문 문장 검사 결과는 0개입니다. 코드와 이름 및 URL은 이 검사에서 번역 대상으로 보지 않습니다.
|
||||||
|
- 운영 검증: 정적 응답 8개 해시 일치. Swagger 경로 2개 정상. 기본 노트 연결 3개 일치. 브라우저에서 외부 API 검색 항목을 펼쳐 한국어 설명과 매개변수를 확인했습니다. 내부 API 목록과 프런트엔드 한국어 사본도 실제로 열어 확인했습니다. API 실행 요청으로 사용자 데이터를 생성하거나 삭제하지 않았습니다.
|
||||||
|
- 현재 자산 버전: v0.95.0-ko-20260913-r8
|
||||||
|
- 현재 main.cjs SHA-256: 5209c39355837fb21714c1b61d8569d3eee71f620a8e8c1a3755ccc38aa92616
|
||||||
|
- 최초 백업: /www/dk_project/dk_app/trilium/backups/before-korean-phase9-20260913-181647
|
||||||
|
- 최종 보완 전 백업: /www/dk_project/dk_app/trilium/backups/before-api-final-20260913-182417
|
||||||
|
|
||||||
|
### 적용 범위와 유지한 원문
|
||||||
|
|
||||||
|
앞서 남겨 둔 API 참고 화면 5개는 이번에 모두 처리했습니다. 기존 이미지를 유지하고 한국어 설명을 추가한다는 사용자 선택을 따릅니다. 코드 문법과 함수·매개변수 이름 및 제품 이름과 URL은 원문을 유지합니다. 한국어 사본에서 다시 연결되는 외부 사이트 전체를 번역하거나 수정한 것은 아닙니다. 외부 스크립트 문서는 공식 연결 주소의 사본이므로 현재 운영 버전 0.95.0과 API 지원 범위가 다를 수 있음을 화면에 명시했습니다.
|
||||||
|
|
||||||
|
현재 도움말 구성은 phase3/doc_notes/en에 phase8/doc_notes/en을 덮고 phase9/doc_notes/en을 덮은 결과입니다. 현재 앱 파일은 deployed에 있습니다. 초기 빌드 산출물과 단계별 파일을 현재 운영본으로 오인하지 마세요.
|
||||||
|
|||||||
@@ -2,29 +2,35 @@
|
|||||||
|
|
||||||
갱신: 2026-09-13
|
갱신: 2026-09-13
|
||||||
|
|
||||||
대상은 Trilium입니다. 한국어 표기는 이스톰을 사용합니다.
|
이번에 남아 있던 API 참고 화면 5개까지 번역과 서버 반영 및 검증을 마쳤습니다. 대상은 Trilium입니다.
|
||||||
|
|
||||||
| 구분 | 완료 | 진행률 |
|
| 구분 | 완료 | 진행률 |
|
||||||
|---|---:|---:|
|
|---|---:|---:|
|
||||||
| 도움말 본문 | 173/173 | 100% |
|
| 도움말 본문 | 173/173 | 100% |
|
||||||
| 도움말 목록 제목 | 181/181 | 100% |
|
| 도움말 목록 제목 | 181/181 | 100% |
|
||||||
| 영문 감지 이미지의 한국어 설명 보완 | 206/206 | 100% |
|
| 영문 감지 이미지의 한국어 설명 | 206/206 | 100% |
|
||||||
| API 참고 웹 보기 | 0/5 | 0% |
|
| API 참고 화면 | 5/5 | 100% |
|
||||||
|
|
||||||
기본 예제의 본문과 도표 및 통계 표시와 속성 이름 및 PDF는 번역하여 운영에 적용했습니다. PDF는 11쪽이며 194개 문단의 누락 검사와 브라우저 확인을 마쳤습니다. 전체 완료율은 항목마다 규모가 달라 단순 평균으로 계산하지 않습니다.
|
기본 예제와 예제 PDF 및 UI 수정분도 운영에 반영했습니다. 이미지는 원본 유지와 한국어 설명 보완 방식입니다.
|
||||||
|
|
||||||
## 2026-09-13 추가 적용: 화면 문구와 이미지 한국어 설명
|
## 2026-09-13 API 참고 화면 5개 추가 완료
|
||||||
|
|
||||||
- 사용자 선택: 사용량을 절약하기 위해 기존 이미지는 유지하고 한국어 설명을 보완합니다. 이미지 내부 글자를 모두 교체한다는 기존 목표를 이 방식으로 변경했습니다.
|
- 외부 ETAPI 명세: 경로 24개. 제목과 설명 154개 필드에 원문 중복을 제외한 번역 118개를 적용했습니다.
|
||||||
- phase7: 글자 둘러싸기와 관련 설정 및 코드 색상 설정 문구를 번역했습니다. 위치 정보 오류와 지도 새 노트 및 확대 비율과 AI 대화 기본 제목도 수정했습니다. 총 11개 치환 규칙을 적용했습니다.
|
- 내부 API 명세: 경로 37개. 제목과 설명 198개 필드에 원문 중복을 제외한 번역 166개를 적용했습니다.
|
||||||
- phase8: 래스터 이미지 286개를 OCR로 점검했습니다. 영문이 감지된 206개 모두가 본문에서 참조됨을 확인했습니다. 해당 도움말 92개에 이미지 순서별 한국어 설명과 주요 영문 메뉴의 한국어 뜻을 덧붙였습니다. GIF는 첫 프레임을 검사했습니다. OCR 결과는 모든 글자를 정확하게 판독했다는 의미가 아닙니다.
|
- 스크립트 참고 자료: 프런트엔드 API와 FNote 및 백엔드 API의 한국어 사본을 만들었습니다. 설명 문구와 반환값 및 매개변수 설명을 번역했습니다. 최종 변환된 텍스트 노드는 각각 170개와 179개 및 213개입니다. 식별자와 코드 형식은 유지했습니다.
|
||||||
- 메뉴 대응은 영어와 한국어 UI 사전을 대조해 생성했습니다. 대응 메뉴가 없는 이미지 25개에는 개별 기능 설명을 작성했습니다. 원본 이미지와 링크 및 이미지 경로를 보존했습니다.
|
- 기본 도움말 노트 3개의 webViewSrc를 한국어 사본으로 연결했습니다. 원문 링크와 연결된 다른 형식의 공식 문서 링크는 보존했습니다. 개인 노트는 수정하지 않았습니다.
|
||||||
- Trilium 도움말에 포함된 Grafana 대시보드 JSON의 제목과 설명 및 범례 60곳을 번역했습니다. 범례와 일치해야 하는 표시 재정의 조건도 함께 수정했습니다. 실제 Grafana 서비스는 수정하지 않았습니다.
|
- Swagger 화면의 인증 설정과 직접 실행 및 매개변수와 응답 등 조작 문구를 번역했습니다. 예제 오류 메시지 3개도 번역했습니다. ETAPI 예제 서버 주소는 브라우저에서 현재 서버를 사용할 수 있도록 /etapi로 지정했습니다.
|
||||||
- 운영 검증: phase7의 layout_commons.js SHA-256은 39f4a0f5854e52ad221f872a9a50671161a3de2a4835eda044d9db537e010b2a입니다. phase8의 수정 도움말 92개와 대시보드 JSON 1개의 HTTP 응답 해시가 모두 배포본과 일치했습니다. 브라우저에서 측정 지표 도움말의 한국어 이미지 설명 표시를 확인했습니다.
|
- 실제 화면 검증 중 기존 번들에서 Swagger 정적 파일이 빠져 문서가 비어 보이는 문제를 발견했습니다. 공식 npm swagger-ui-dist 5.21.0의 배포 무결성을 검증한 뒤 필요한 파일만 추가했습니다. LICENSE와 NOTICE를 보존했습니다. 번들 내부 정적 경로도 해당 위치로 연결했습니다.
|
||||||
- 현재 자산 버전: v0.95.0-ko-20260913-r7. 현재 앱 파일은 deployed에 있습니다. 도움말의 현재 내용은 phase3/doc_notes/en에 phase8/doc_notes/en을 덮어 적용한 구성입니다.
|
- 새 정적 파일의 읽기 권한을 컨테이너에 맞췄습니다. 초기 검증의 일반 문구 검사 조건은 문서별 실제 제목 검사로 수정했습니다. 최종 검증은 모두 통과했습니다.
|
||||||
- 백업: /www/dk_project/dk_app/trilium/backups/before-korean-phase7-20260913-172503
|
- 검증: API 호출 방식과 매개변수 및 스키마의 구조를 원본과 비교했습니다. 번역 대상 설명과 예제 메시지 및 문서용 서버 주소 외에는 일치합니다. 스크립트 문서의 미번역 일반 영문 문장 검사 결과는 0개입니다. 코드와 이름 및 URL은 이 검사에서 번역 대상으로 보지 않습니다.
|
||||||
- 백업: /www/dk_project/dk_app/trilium/backups/before-korean-phase8-20260913-173210
|
- 운영 검증: 정적 응답 8개 해시 일치. Swagger 경로 2개 정상. 기본 노트 연결 3개 일치. 브라우저에서 외부 API 검색 항목을 펼쳐 한국어 설명과 매개변수를 확인했습니다. 내부 API 목록과 프런트엔드 한국어 사본도 실제로 열어 확인했습니다. API 실행 요청으로 사용자 데이터를 생성하거나 삭제하지 않았습니다.
|
||||||
|
- 현재 자산 버전: v0.95.0-ko-20260913-r8
|
||||||
|
- 현재 main.cjs SHA-256: 5209c39355837fb21714c1b61d8569d3eee71f620a8e8c1a3755ccc38aa92616
|
||||||
|
- 최초 백업: /www/dk_project/dk_app/trilium/backups/before-korean-phase9-20260913-181647
|
||||||
|
- 최종 보완 전 백업: /www/dk_project/dk_app/trilium/backups/before-api-final-20260913-182417
|
||||||
|
|
||||||
### 미완료 범위
|
### 적용 범위와 유지한 원문
|
||||||
|
|
||||||
API 참고 웹 보기 5개가 남았습니다. 내부 주소 /etapi/docs 및 /api/docs와 외부 스크립트 API 문서 3개입니다. 이들 페이지의 본문 번역은 아직 완료하지 않았습니다. 도움말 173개 및 목록 제목 181개와 이번 이미지 설명 206개가 완료됐다는 수치를 전체 100%로 해석하지 않습니다. 이미지 설명 보완 선택은 외부 API 원문을 번역한 것으로 간주하는 허가가 아닙니다.
|
앞서 남겨 둔 API 참고 화면 5개는 이번에 모두 처리했습니다. 기존 이미지를 유지하고 한국어 설명을 추가한다는 사용자 선택을 따릅니다. 코드 문법과 함수·매개변수 이름 및 제품 이름과 URL은 원문을 유지합니다. 한국어 사본에서 다시 연결되는 외부 사이트 전체를 번역하거나 수정한 것은 아닙니다. 외부 스크립트 문서는 공식 연결 주소의 사본이므로 현재 운영 버전 0.95.0과 API 지원 범위가 다를 수 있음을 화면에 명시했습니다.
|
||||||
|
|
||||||
|
현재 도움말 구성은 phase3/doc_notes/en에 phase8/doc_notes/en을 덮고 phase9/doc_notes/en을 덮은 결과입니다. 현재 앱 파일은 deployed에 있습니다. 초기 빌드 산출물과 단계별 파일을 현재 운영본으로 오인하지 마세요.
|
||||||
|
|||||||
@@ -4,12 +4,12 @@
|
|||||||
"sha256": "52b083643858fc11a8a832e4ca068c58635fad41ad76972e821d1253d8fa72bd"
|
"sha256": "52b083643858fc11a8a832e4ca068c58635fad41ad76972e821d1253d8fa72bd"
|
||||||
},
|
},
|
||||||
"CHANGELOG.ko.md": {
|
"CHANGELOG.ko.md": {
|
||||||
"bytes": 14829,
|
"bytes": 18562,
|
||||||
"sha256": "2a3518913e4e93f498cfba1035f98c5b709081ac77478475dc7a711671f58bf0"
|
"sha256": "6ec8ac1a693ead639251010c60a4eb21cce357ff303898692409f5e666f5b4c6"
|
||||||
},
|
},
|
||||||
"PROGRESS.md": {
|
"PROGRESS.md": {
|
||||||
"bytes": 3374,
|
"bytes": 4295,
|
||||||
"sha256": "c0e70432c735fe4bed02a1734e683d1e3f1bd52df6c53fbf6580bfb62ea5ea43"
|
"sha256": "9529f468d9b709035f754ae83072857e289a3da9dc22f217d87dce457e504b59"
|
||||||
},
|
},
|
||||||
"README.md": {
|
"README.md": {
|
||||||
"bytes": 5545,
|
"bytes": 5545,
|
||||||
@@ -40,8 +40,8 @@
|
|||||||
"sha256": "39f4a0f5854e52ad221f872a9a50671161a3de2a4835eda044d9db537e010b2a"
|
"sha256": "39f4a0f5854e52ad221f872a9a50671161a3de2a4835eda044d9db537e010b2a"
|
||||||
},
|
},
|
||||||
"deployed/main.cjs": {
|
"deployed/main.cjs": {
|
||||||
"bytes": 9022693,
|
"bytes": 9031127,
|
||||||
"sha256": "7f4e4a2f8e03c44131b51b2942cf327d310a657c4fe2b2c35ee154f70688efe4"
|
"sha256": "5209c39355837fb21714c1b61d8569d3eee71f620a8e8c1a3755ccc38aa92616"
|
||||||
},
|
},
|
||||||
"deployed/mobile_layout.js": {
|
"deployed/mobile_layout.js": {
|
||||||
"bytes": 9771,
|
"bytes": 9771,
|
||||||
@@ -2391,6 +2391,90 @@
|
|||||||
"bytes": 28977,
|
"bytes": 28977,
|
||||||
"sha256": "b3ec0326b9fc9dbe2dc99cf27bfcfe25b94b66b40cf6273fcaafaaa1e519e212"
|
"sha256": "b3ec0326b9fc9dbe2dc99cf27bfcfe25b94b66b40cf6273fcaafaaa1e519e212"
|
||||||
},
|
},
|
||||||
|
"phase9/api-audit.json": {
|
||||||
|
"bytes": 149,
|
||||||
|
"sha256": "600bd80e97db08e4fb9c1001b6681e94a35410bd512a2bc195d7e03d4b2db722"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/User Guide/!!!meta.json": {
|
||||||
|
"bytes": 86516,
|
||||||
|
"sha256": "85320f7f273604cd1ef963ef85eadd0ad6cf1958743f5772abfd097d26e3d352"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/backend.html": {
|
||||||
|
"bytes": 209744,
|
||||||
|
"sha256": "6baa29f34b2857baf82a6cd59168ecb32a90c45ef28e16172b21e33c96b34883"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/etapi.json": {
|
||||||
|
"bytes": 52824,
|
||||||
|
"sha256": "021ea29d5c1b41d44cf3ef013d0e54affc08c6d39cda38dbb06bf9720fc09378"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/fnote.html": {
|
||||||
|
"bytes": 194278,
|
||||||
|
"sha256": "1c33101df41ac318b6e91a49b30cab41d6288cc5788f1741499058b15c8ac2cc"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/frontend.html": {
|
||||||
|
"bytes": 192150,
|
||||||
|
"sha256": "785d9b5e797dd3533ef976bd42872b127c297ed95eb73156fc0df7955f3ab3e5"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/internal.json": {
|
||||||
|
"bytes": 76005,
|
||||||
|
"sha256": "6539b5936651f8e560bcb4a8658110d610b66462fa5f0ad7fc22fd38e17fb727"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/swagger/LICENSE": {
|
||||||
|
"bytes": 11358,
|
||||||
|
"sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/swagger/NOTICE": {
|
||||||
|
"bytes": 55,
|
||||||
|
"sha256": "0d20d1adef18aee3f40dd258172155521ce702ac445cb5f7b7d60ed32dad2fb2"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/swagger/favicon-16x16.png": {
|
||||||
|
"bytes": 665,
|
||||||
|
"sha256": "af24ad604dd7b3bcda8f975ab973075f4a2f70a4087944a12f8ef8b63a3e07c2"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/swagger/favicon-32x32.png": {
|
||||||
|
"bytes": 628,
|
||||||
|
"sha256": "3ed612f41e050ca5e7000cad6f1cbe7e7da39f65fca99c02e99e6591056e5837"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/swagger/oauth2-redirect.html": {
|
||||||
|
"bytes": 2715,
|
||||||
|
"sha256": "397fd30a2499cd2c5f3411ade0ca7fbd786d5011639ca78a06824d580b83c122"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/swagger/package.json": {
|
||||||
|
"bytes": 559,
|
||||||
|
"sha256": "d9264a38e9af25561480d49a8f987fe31f14aecc5f6427d73a8f40a699905e5f"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/swagger/swagger-ui-bundle.js": {
|
||||||
|
"bytes": 1468326,
|
||||||
|
"sha256": "f557db538d8969dc0f35d6b441b3c7cc0be845d9dc0fcfbf66ea67053ae8933b"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/swagger/swagger-ui-standalone-preset.js": {
|
||||||
|
"bytes": 229223,
|
||||||
|
"sha256": "8710b6d90ece7113dd467500fa14ed33b5848b68b8695ad075f8d5c6c9af3b01"
|
||||||
|
},
|
||||||
|
"phase9/doc_notes/en/api-ko/swagger/swagger-ui.css": {
|
||||||
|
"bytes": 154986,
|
||||||
|
"sha256": "29e7a850fea3b1a1e641bff2ff9b3302f8c0063d435971246b592e189b808989"
|
||||||
|
},
|
||||||
|
"phase9/korean-phase9-pending.json": {
|
||||||
|
"bytes": 854,
|
||||||
|
"sha256": "ea9f4602a1508d9ec8474a85b4e5c274a791c20255d1fc3e49aa061b7e4b3217"
|
||||||
|
},
|
||||||
|
"phase9/main.cjs": {
|
||||||
|
"bytes": 9031127,
|
||||||
|
"sha256": "5209c39355837fb21714c1b61d8569d3eee71f620a8e8c1a3755ccc38aa92616"
|
||||||
|
},
|
||||||
|
"phase9/manifest.json": {
|
||||||
|
"bytes": 2301,
|
||||||
|
"sha256": "57e9fb68c6fcc71c47ce3cabb4463dc358cda36914a8b6d0ace03c35d3a0b2b3"
|
||||||
|
},
|
||||||
|
"phase9/script-audit.json": {
|
||||||
|
"bytes": 245,
|
||||||
|
"sha256": "1304484d070dbfa76b599ba42ca8efbc27a8acece13f680092ae91975b49ffd1"
|
||||||
|
},
|
||||||
|
"phase9/swagger-ko.js": {
|
||||||
|
"bytes": 3417,
|
||||||
|
"sha256": "4fbbaf68d0b6be052561a2f7e5dac5bd0fb08940258cdbf7c176a8509d6104fa"
|
||||||
|
},
|
||||||
"verify-snapshot.mjs": {
|
"verify-snapshot.mjs": {
|
||||||
"bytes": 1050,
|
"bytes": 1050,
|
||||||
"sha256": "944aa1e3c8f8fd835dc0121071bf25b93de03cb29f0c0b3bd41febd209acb764"
|
"sha256": "944aa1e3c8f8fd835dc0121071bf25b93de03cb29f0c0b3bd41febd209acb764"
|
||||||
@@ -2399,10 +2483,118 @@
|
|||||||
"bytes": 94177,
|
"bytes": 94177,
|
||||||
"sha256": "7ae942d705f547ea08fbcde83473c8378f8499b33467ea6d71d1a1594315dc95"
|
"sha256": "7ae942d705f547ea08fbcde83473c8378f8499b33467ea6d71d1a1594315dc95"
|
||||||
},
|
},
|
||||||
|
"work/trilium/api-etapi-ko.txt": {
|
||||||
|
"bytes": 7883,
|
||||||
|
"sha256": "18d78f1dfad82dc101f0e395ab9d5ce07e7b490d254116240f44f9785499767a"
|
||||||
|
},
|
||||||
|
"work/trilium/api-internal-ko.txt": {
|
||||||
|
"bytes": 7236,
|
||||||
|
"sha256": "627a37826f4d47863c3b94cb1318ce78403c8d12e15e5f6baa01f64f455b2e58"
|
||||||
|
},
|
||||||
|
"work/trilium/api-script-extra.json": {
|
||||||
|
"bytes": 5677,
|
||||||
|
"sha256": "47d51e50d4e773c6c8ae40a884a8be7a4c0cfd63a06fe9816f13b3c8f2a17610"
|
||||||
|
},
|
||||||
|
"work/trilium/api-script-ko.txt": {
|
||||||
|
"bytes": 13346,
|
||||||
|
"sha256": "6c1944c50aba33a017866157e95a6bd6b762973d7dc1ce8f0bdf781b88b0b6a0"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/backend.html": {
|
||||||
|
"bytes": 213397,
|
||||||
|
"sha256": "e24937b4783131d0feaded1caecbf43e567bcab6316c9162719996a230aec3ab"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/etapi-strings.json": {
|
||||||
|
"bytes": 7352,
|
||||||
|
"sha256": "61db2f4bbccab009affadb8e45b963616c6f5c14f8dc4bdcbc5c38c294689e93"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/etapi.json": {
|
||||||
|
"bytes": 30938,
|
||||||
|
"sha256": "377a9a65a5c3adc9de476acccef7567c65d5ce15ef6b1f2611ca0ccaab3c67c3"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/fnote.html": {
|
||||||
|
"bytes": 211698,
|
||||||
|
"sha256": "dd48ea85de50ba2dd59b9bc43b72c67e9e1c01bb2e3e17f5a979fcf3f94fce6a"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/frontend.html": {
|
||||||
|
"bytes": 205285,
|
||||||
|
"sha256": "239f3efe31ec3cf0b502c82e4fabe3920763d570b5bab32ecaefc882c4c22cec"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/internal-strings.json": {
|
||||||
|
"bytes": 7139,
|
||||||
|
"sha256": "8e39530053f050823aa3d5ad84967c5f9c7e01a96301e43637afa19b608a98a9"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/phase9-main-before-final.cjs": {
|
||||||
|
"bytes": 9029867,
|
||||||
|
"sha256": "4c89e24c0c1be1e02570f5af4e650d540951b1d4cf8e5da0a11b8c3eb969d578"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/phase9-main-before-swagger.cjs": {
|
||||||
|
"bytes": 9029852,
|
||||||
|
"sha256": "e59d7fa0bb270054310470e205d8e5731696fad212e983d88596d8ea5f90ea79"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/script-strings.json": {
|
||||||
|
"bytes": 12351,
|
||||||
|
"sha256": "933172eb3d2b26e3d66a5643fa329d6d7a1b9197ab519ef79cf7c2f4d89c8638"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/swagger-package-metadata.json": {
|
||||||
|
"bytes": 1950,
|
||||||
|
"sha256": "bcfa931f1a40fc5c0b83c4636d671aeb59116914c948a7e8ae8f537a41778303"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/swagger-package/package/LICENSE": {
|
||||||
|
"bytes": 11358,
|
||||||
|
"sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/swagger-package/package/NOTICE": {
|
||||||
|
"bytes": 55,
|
||||||
|
"sha256": "0d20d1adef18aee3f40dd258172155521ce702ac445cb5f7b7d60ed32dad2fb2"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/swagger-package/package/favicon-16x16.png": {
|
||||||
|
"bytes": 665,
|
||||||
|
"sha256": "af24ad604dd7b3bcda8f975ab973075f4a2f70a4087944a12f8ef8b63a3e07c2"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/swagger-package/package/favicon-32x32.png": {
|
||||||
|
"bytes": 628,
|
||||||
|
"sha256": "3ed612f41e050ca5e7000cad6f1cbe7e7da39f65fca99c02e99e6591056e5837"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/swagger-package/package/oauth2-redirect.html": {
|
||||||
|
"bytes": 2715,
|
||||||
|
"sha256": "397fd30a2499cd2c5f3411ade0ca7fbd786d5011639ca78a06824d580b83c122"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/swagger-package/package/package.json": {
|
||||||
|
"bytes": 559,
|
||||||
|
"sha256": "d9264a38e9af25561480d49a8f987fe31f14aecc5f6427d73a8f40a699905e5f"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/swagger-package/package/swagger-ui-bundle.js": {
|
||||||
|
"bytes": 1468326,
|
||||||
|
"sha256": "f557db538d8969dc0f35d6b441b3c7cc0be845d9dc0fcfbf66ea67053ae8933b"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/swagger-package/package/swagger-ui-standalone-preset.js": {
|
||||||
|
"bytes": 229223,
|
||||||
|
"sha256": "8710b6d90ece7113dd467500fa14ed33b5848b68b8695ad075f8d5c6c9af3b01"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/swagger-package/package/swagger-ui.css": {
|
||||||
|
"bytes": 154986,
|
||||||
|
"sha256": "29e7a850fea3b1a1e641bff2ff9b3302f8c0063d435971246b592e189b808989"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/swagger-ui-dist-5.21.0.tgz": {
|
||||||
|
"bytes": 3144963,
|
||||||
|
"sha256": "01192724129bdb72bcb53b3b14f6facd61f8c6f6cc02555e074d67b5f9ebcab2"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/trilium-etapi.openapi.yaml": {
|
||||||
|
"bytes": 47383,
|
||||||
|
"sha256": "ecc24beb2272de002b03a877c2fb3bb0fef743b0e61b90e897c7672b86d612d9"
|
||||||
|
},
|
||||||
|
"work/trilium/api-source/trilium-openapi.json": {
|
||||||
|
"bytes": 34419,
|
||||||
|
"sha256": "3c10265da58f9ee6c355426925f27673e25b1e535a4f45e07a03b99ef3dccf61"
|
||||||
|
},
|
||||||
"work/trilium/apply-cache-fix.py": {
|
"work/trilium/apply-cache-fix.py": {
|
||||||
"bytes": 1442,
|
"bytes": 1442,
|
||||||
"sha256": "0d510437287befabffb6489b34e7bbf38f9f73f4971096b39528a1ffcd8cb51a"
|
"sha256": "0d510437287befabffb6489b34e7bbf38f9f73f4971096b39528a1ffcd8cb51a"
|
||||||
},
|
},
|
||||||
|
"work/trilium/build-api-pages.py": {
|
||||||
|
"bytes": 5069,
|
||||||
|
"sha256": "9329f22a40ae671a7d50d1396f4fe344dda898cf254f315d9d9f6724377ce7bb"
|
||||||
|
},
|
||||||
"work/trilium/build-demo-pdf.py": {
|
"work/trilium/build-demo-pdf.py": {
|
||||||
"bytes": 2453,
|
"bytes": 2453,
|
||||||
"sha256": "677d540668585420d8951d7f6a3c3551abb0ff266724a09648bd16d4c3864ef7"
|
"sha256": "677d540668585420d8951d7f6a3c3551abb0ff266724a09648bd16d4c3864ef7"
|
||||||
@@ -2443,6 +2635,10 @@
|
|||||||
"bytes": 11511,
|
"bytes": 11511,
|
||||||
"sha256": "db3e968ef70b1c3add7bf715dd0e93756f79748b1849290ec75c6694b9f5e4d6"
|
"sha256": "db3e968ef70b1c3add7bf715dd0e93756f79748b1849290ec75c6694b9f5e4d6"
|
||||||
},
|
},
|
||||||
|
"work/trilium/build-phase9.mjs": {
|
||||||
|
"bytes": 10386,
|
||||||
|
"sha256": "a3d05c529c4fa46776c7a33c9f29bffe261aca4cc8da7f19884db0bf1e0ccf3d"
|
||||||
|
},
|
||||||
"work/trilium/build-server.mjs": {
|
"work/trilium/build-server.mjs": {
|
||||||
"bytes": 2786,
|
"bytes": 2786,
|
||||||
"sha256": "2c64311599b7465c6435c14929d756ba011afd828bff69bd8fd88017e69f5f60"
|
"sha256": "2c64311599b7465c6435c14929d756ba011afd828bff69bd8fd88017e69f5f60"
|
||||||
@@ -2507,6 +2703,10 @@
|
|||||||
"bytes": 1859,
|
"bytes": 1859,
|
||||||
"sha256": "a9ee042f54d8ee8a2eadbf9e4bddccde094e02646c9eaf4168f66350309fbca8"
|
"sha256": "a9ee042f54d8ee8a2eadbf9e4bddccde094e02646c9eaf4168f66350309fbca8"
|
||||||
},
|
},
|
||||||
|
"work/trilium/deploy-phase9.py": {
|
||||||
|
"bytes": 3232,
|
||||||
|
"sha256": "da478a277371a872f8164e16fa99e06e083223faaecd5929b421f7081d1b44c6"
|
||||||
|
},
|
||||||
"work/trilium/deploy-ui-phase2.py": {
|
"work/trilium/deploy-ui-phase2.py": {
|
||||||
"bytes": 3049,
|
"bytes": 3049,
|
||||||
"sha256": "db296e39897e1a6758435e44077466087b58233333b1541c3e3e3f4ade67e60d"
|
"sha256": "db296e39897e1a6758435e44077466087b58233333b1541c3e3e3f4ade67e60d"
|
||||||
@@ -2675,10 +2875,26 @@
|
|||||||
"bytes": 2,
|
"bytes": 2,
|
||||||
"sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945"
|
"sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945"
|
||||||
},
|
},
|
||||||
|
"work/trilium/extract-api-prose.py": {
|
||||||
|
"bytes": 1115,
|
||||||
|
"sha256": "1c0c04cdd8fffc7d134786f915bc84746664518cd8bcebc94bd0bf5e9d89b5ec"
|
||||||
|
},
|
||||||
|
"work/trilium/finalize-api.py": {
|
||||||
|
"bytes": 1835,
|
||||||
|
"sha256": "b674d005ab781e8ab279d4bbf0fd1074ed4adab5e175a0225be1ce1c35421da2"
|
||||||
|
},
|
||||||
|
"work/trilium/fix-api-swagger.py": {
|
||||||
|
"bytes": 1315,
|
||||||
|
"sha256": "4ba6ea036cecf8662c4df090387e3dc1ed3e6bc5d13cf1bfc10676b26a4b9689"
|
||||||
|
},
|
||||||
"work/trilium/help-image-ocr.json": {
|
"work/trilium/help-image-ocr.json": {
|
||||||
"bytes": 129349,
|
"bytes": 129349,
|
||||||
"sha256": "8a66a134484a3f4f9c3d08ff7b41c506f721b4d518086092ada86f53e68b05e5"
|
"sha256": "8a66a134484a3f4f9c3d08ff7b41c506f721b4d518086092ada86f53e68b05e5"
|
||||||
},
|
},
|
||||||
|
"work/trilium/inspect-api-attributes.py": {
|
||||||
|
"bytes": 425,
|
||||||
|
"sha256": "62745c112367ae84e4cdfdf7e29d0664fd51ff36940997b49b419b0a22756f9a"
|
||||||
|
},
|
||||||
"work/trilium/inspect-phase4.py": {
|
"work/trilium/inspect-phase4.py": {
|
||||||
"bytes": 1842,
|
"bytes": 1842,
|
||||||
"sha256": "3d50c3ff9728040ddb11d6147d14447c3a525bbd7b8c4d64af149c872ec05e41"
|
"sha256": "3d50c3ff9728040ddb11d6147d14447c3a525bbd7b8c4d64af149c872ec05e41"
|
||||||
@@ -5334,5 +5550,13 @@
|
|||||||
"work/trilium/validate-demo.mjs": {
|
"work/trilium/validate-demo.mjs": {
|
||||||
"bytes": 1668,
|
"bytes": 1668,
|
||||||
"sha256": "c33a2f015bbd5476d4697b366c9d0e3ececdb80f822cbd7ee1fbfd832326597c"
|
"sha256": "c33a2f015bbd5476d4697b366c9d0e3ececdb80f822cbd7ee1fbfd832326597c"
|
||||||
|
},
|
||||||
|
"work/trilium/verify-api-server.py": {
|
||||||
|
"bytes": 1713,
|
||||||
|
"sha256": "96f185f6c76b890fc2ec9e94f8ea0303a66d8263d6129df67c48ba12932854c5"
|
||||||
|
},
|
||||||
|
"work/trilium/verify-api.mjs": {
|
||||||
|
"bytes": 1091,
|
||||||
|
"sha256": "844803d1b32d69a6bd24f7676a26c94a534709e96634853e8e5e5547e7f2211e"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"internal": {
|
||||||
|
"fields": 198,
|
||||||
|
"unique": 166,
|
||||||
|
"paths": 37
|
||||||
|
},
|
||||||
|
"etapi": {
|
||||||
|
"fields": 154,
|
||||||
|
"unique": 118,
|
||||||
|
"paths": 24
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
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 it is too large
Load Diff
@@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
swagger-ui
|
||||||
|
Copyright 2020-2021 SmartBear Software Inc.
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 665 B |
Binary file not shown.
|
After Width: | Height: | Size: 628 B |
@@ -0,0 +1,79 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<title>Swagger UI: OAuth2 Redirect</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
'use strict';
|
||||||
|
function run () {
|
||||||
|
var oauth2 = window.opener.swaggerUIRedirectOauth2;
|
||||||
|
var sentState = oauth2.state;
|
||||||
|
var redirectUrl = oauth2.redirectUrl;
|
||||||
|
var isValid, qp, arr;
|
||||||
|
|
||||||
|
if (/code|token|error/.test(window.location.hash)) {
|
||||||
|
qp = window.location.hash.substring(1).replace('?', '&');
|
||||||
|
} else {
|
||||||
|
qp = location.search.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
arr = qp.split("&");
|
||||||
|
arr.forEach(function (v,i,_arr) { _arr[i] = '"' + v.replace('=', '":"') + '"';});
|
||||||
|
qp = qp ? JSON.parse('{' + arr.join() + '}',
|
||||||
|
function (key, value) {
|
||||||
|
return key === "" ? value : decodeURIComponent(value);
|
||||||
|
}
|
||||||
|
) : {};
|
||||||
|
|
||||||
|
isValid = qp.state === sentState;
|
||||||
|
|
||||||
|
if ((
|
||||||
|
oauth2.auth.schema.get("flow") === "accessCode" ||
|
||||||
|
oauth2.auth.schema.get("flow") === "authorizationCode" ||
|
||||||
|
oauth2.auth.schema.get("flow") === "authorization_code"
|
||||||
|
) && !oauth2.auth.code) {
|
||||||
|
if (!isValid) {
|
||||||
|
oauth2.errCb({
|
||||||
|
authId: oauth2.auth.name,
|
||||||
|
source: "auth",
|
||||||
|
level: "warning",
|
||||||
|
message: "Authorization may be unsafe, passed state was changed in server. The passed state wasn't returned from auth server."
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qp.code) {
|
||||||
|
delete oauth2.state;
|
||||||
|
oauth2.auth.code = qp.code;
|
||||||
|
oauth2.callback({auth: oauth2.auth, redirectUrl: redirectUrl});
|
||||||
|
} else {
|
||||||
|
let oauthErrorMsg;
|
||||||
|
if (qp.error) {
|
||||||
|
oauthErrorMsg = "["+qp.error+"]: " +
|
||||||
|
(qp.error_description ? qp.error_description+ ". " : "no accessCode received from the server. ") +
|
||||||
|
(qp.error_uri ? "More info: "+qp.error_uri : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
oauth2.errCb({
|
||||||
|
authId: oauth2.auth.name,
|
||||||
|
source: "auth",
|
||||||
|
level: "error",
|
||||||
|
message: oauthErrorMsg || "[Authorization failed]: no accessCode received from the server."
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid, redirectUrl: redirectUrl});
|
||||||
|
}
|
||||||
|
window.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (document.readyState !== 'loading') {
|
||||||
|
run();
|
||||||
|
} else {
|
||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
run();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "swagger-ui-dist",
|
||||||
|
"version": "5.21.0",
|
||||||
|
"main": "index.js",
|
||||||
|
"repository": "git@github.com:swagger-api/swagger-ui.git",
|
||||||
|
"contributors": [
|
||||||
|
"(in alphabetical order)",
|
||||||
|
"Anna Bodnia <anna.bodnia@gmail.com>",
|
||||||
|
"Buu Nguyen <buunguyen@gmail.com>",
|
||||||
|
"Josh Ponelat <jponelat@gmail.com>",
|
||||||
|
"Kyle Shockey <kyleshockey1@gmail.com>",
|
||||||
|
"Robert Barnwell <robert@robertismy.name>",
|
||||||
|
"Sahar Jafari <shr.jafari@gmail.com>"
|
||||||
|
],
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@scarf/scarf": "=1.4.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {}
|
||||||
|
}
|
||||||
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
@@ -0,0 +1,20 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"attributeId": "_help_Q2z6av6JZVWm_lwebViewSrc",
|
||||||
|
"noteId": "_help_Q2z6av6JZVWm",
|
||||||
|
"oldValue": "https://triliumnext.github.io/Notes/Script%20API/interfaces/Frontend_Script_API.Api.html",
|
||||||
|
"value": "/assets/v0.95.0-ko-20260913-r8/doc_notes/en/api-ko/frontend.html"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"attributeId": "_help_habiZ3HU8Kw8_lwebViewSrc",
|
||||||
|
"noteId": "_help_habiZ3HU8Kw8",
|
||||||
|
"oldValue": "https://triliumnext.github.io/Notes/Script%20API/classes/Frontend_Script_API.FNote.html",
|
||||||
|
"value": "/assets/v0.95.0-ko-20260913-r8/doc_notes/en/api-ko/fnote.html"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"attributeId": "_help_MEtfsqa5VwNi_lwebViewSrc",
|
||||||
|
"noteId": "_help_MEtfsqa5VwNi",
|
||||||
|
"oldValue": "https://triliumnext.github.io/Notes/Script%20API/interfaces/Backend_Script_API.Api.html",
|
||||||
|
"value": "/assets/v0.95.0-ko-20260913-r8/doc_notes/en/api-ko/backend.html"
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"previousMainSha256": "7f4e4a2f8e03c44131b51b2942cf327d310a657c4fe2b2c35ee154f70688efe4",
|
||||||
|
"previousMetaSha256": "b3eda2503c41a7ef2ff583fb50973fb50a280b5f03daa3bfe9b0008b2a0d27cc",
|
||||||
|
"files": {
|
||||||
|
"korean-phase9-pending.json": "ea9f4602a1508d9ec8474a85b4e5c274a791c20255d1fc3e49aa061b7e4b3217",
|
||||||
|
"main.cjs": "5209c39355837fb21714c1b61d8569d3eee71f620a8e8c1a3755ccc38aa92616",
|
||||||
|
"script-audit.json": "1304484d070dbfa76b599ba42ca8efbc27a8acece13f680092ae91975b49ffd1",
|
||||||
|
"swagger-ko.js": "4fbbaf68d0b6be052561a2f7e5dac5bd0fb08940258cdbf7c176a8509d6104fa",
|
||||||
|
"doc_notes/en/api-ko/backend.html": "6baa29f34b2857baf82a6cd59168ecb32a90c45ef28e16172b21e33c96b34883",
|
||||||
|
"doc_notes/en/api-ko/etapi.json": "021ea29d5c1b41d44cf3ef013d0e54affc08c6d39cda38dbb06bf9720fc09378",
|
||||||
|
"doc_notes/en/api-ko/fnote.html": "1c33101df41ac318b6e91a49b30cab41d6288cc5788f1741499058b15c8ac2cc",
|
||||||
|
"doc_notes/en/api-ko/frontend.html": "785d9b5e797dd3533ef976bd42872b127c297ed95eb73156fc0df7955f3ab3e5",
|
||||||
|
"doc_notes/en/api-ko/internal.json": "6539b5936651f8e560bcb4a8658110d610b66462fa5f0ad7fc22fd38e17fb727",
|
||||||
|
"doc_notes/en/User Guide/!!!meta.json": "85320f7f273604cd1ef963ef85eadd0ad6cf1958743f5772abfd097d26e3d352",
|
||||||
|
"doc_notes/en/api-ko/swagger/favicon-16x16.png": "af24ad604dd7b3bcda8f975ab973075f4a2f70a4087944a12f8ef8b63a3e07c2",
|
||||||
|
"doc_notes/en/api-ko/swagger/favicon-32x32.png": "3ed612f41e050ca5e7000cad6f1cbe7e7da39f65fca99c02e99e6591056e5837",
|
||||||
|
"doc_notes/en/api-ko/swagger/LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
|
||||||
|
"doc_notes/en/api-ko/swagger/NOTICE": "0d20d1adef18aee3f40dd258172155521ce702ac445cb5f7b7d60ed32dad2fb2",
|
||||||
|
"doc_notes/en/api-ko/swagger/oauth2-redirect.html": "397fd30a2499cd2c5f3411ade0ca7fbd786d5011639ca78a06824d580b83c122",
|
||||||
|
"doc_notes/en/api-ko/swagger/package.json": "d9264a38e9af25561480d49a8f987fe31f14aecc5f6427d73a8f40a699905e5f",
|
||||||
|
"doc_notes/en/api-ko/swagger/swagger-ui-bundle.js": "f557db538d8969dc0f35d6b441b3c7cc0be845d9dc0fcfbf66ea67053ae8933b",
|
||||||
|
"doc_notes/en/api-ko/swagger/swagger-ui-standalone-preset.js": "8710b6d90ece7113dd467500fa14ed33b5848b68b8695ad075f8d5c6c9af3b01",
|
||||||
|
"doc_notes/en/api-ko/swagger/swagger-ui.css": "29e7a850fea3b1a1e641bff2ff9b3302f8c0063d435971246b592e189b808989"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"frontend": {
|
||||||
|
"translatedTextNodes": 170,
|
||||||
|
"remainingProse": []
|
||||||
|
},
|
||||||
|
"fnote": {
|
||||||
|
"translatedTextNodes": 179,
|
||||||
|
"remainingProse": []
|
||||||
|
},
|
||||||
|
"backend": {
|
||||||
|
"translatedTextNodes": 213,
|
||||||
|
"remainingProse": []
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
(()=>{const dict={"Authorize":"인증 설정","Authorized":"인증됨","Authorization":"인증","Logout":"인증 해제","Close":"닫기","Cancel":"취소","Execute":"실행","Clear":"지우기","Try it out":"직접 실행","Parameters":"매개변수","No parameters":"매개변수 없음","Request body":"요청 본문","Responses":"응답","Server response":"서버 응답","Response body":"응답 본문","Response headers":"응답 헤더","Request URL":"요청 주소","Response content type":"응답 콘텐츠 유형","Example Value":"예시 값","Schema":"스키마","Schemas":"스키마 목록","Models":"모델 목록","Model":"모델","Servers":"서버","Available authorizations":"사용 가능한 인증 방식","Name":"이름","Description":"설명","Code":"상태 코드","Details":"상세 정보","Links":"링크","No links":"링크 없음","Value":"값","required":"필수","Required":"필수","Optional":"선택 사항","Example":"예시","Examples":"예시 목록","Download":"내려받기","Download file":"파일 내려받기","Explore":"열기","Filter by tag":"태그로 필터링","Select a definition":"명세 선택","Select a spec":"명세 선택","Username:":"사용자 이름:","Password:":"비밀번호:","Value:":"값:","Name:":"이름:","In:":"전달 위치:","Username":"사용자 이름","Password":"비밀번호","Default":"기본값","default":"기본값","No content":"내용 없음","Loading...":"불러오는 중…","Loading":"불러오는 중","Errors":"오류","Hide":"숨기기","Show":"표시","Expand operation":"항목 펼치기","Collapse operation":"항목 접기","Copy to clipboard":"클립보드에 복사","Copy":"복사","Copied":"복사됨","Send empty value":"빈 값 보내기","Edit Value":"값 편집","Reset":"초기화","Available values":"사용 가능한 값","No results found":"결과 없음","Failed to fetch":"요청 실패","Undocumented":"명세에 없는 응답","Examples:":"예시:","Default value":"기본값","Media type":"콘텐츠 유형","Media Type":"콘텐츠 유형","Controls":"설정할 대상:","header.":"헤더","* required":"* 필수","authorization button unlocked":"인증 설정 안 됨","authorization button locked":"인증 설정됨","List":"목록","Download API definition":"API 명세 내려받기"};function tr(s){let k=s.trim();if(k.endsWith(' - Website'))return s.replace(' - Website',' 웹사이트');if(k.startsWith('Send email to '))return s.replace('Send email to ','이메일 보내기: ');return Object.hasOwn(dict,k)?s.replace(k,dict[k]):s;}function update(){const root=document.querySelector('#swagger-ui');if(!root)return;const w=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);for(let n;n=w.nextNode();){if(n.parentElement.closest('pre,code,textarea,script,style,.parameter__name,.model-title,.opblock-summary-path')&&!['required','* required'].includes(n.nodeValue.trim()))continue;const s=tr(n.nodeValue);if(s!==n.nodeValue)n.nodeValue=s;}for(const el of root.querySelectorAll('[title],[aria-label],[placeholder]'))for(const a of ['title','aria-label','placeholder'])if(el.hasAttribute(a)){const s=el.getAttribute(a),v=tr(s);if(v!==s)el.setAttribute(a,v);}}let queued=false;new MutationObserver(()=>{if(queued)return;queued=true;requestAnimationFrame(()=>{queued=false;update();});}).observe(document.body,{childList:true,subtree:true,characterData:true});update();document.documentElement.lang='ko';})();
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
ETAPI
|
||||||
|
Trilium 외부 API
|
||||||
|
노트를 만들고 노트 트리에 배치합니다.
|
||||||
|
노트 생성 완료
|
||||||
|
예기치 않은 오류
|
||||||
|
노트 검색
|
||||||
|
https://triliumnext.github.io/Docs/Wiki/search.html 에 설명된 형식의 검색어
|
||||||
|
검색어로 전체 텍스트 검색. 정확히 일치할 필요는 없습니다.
|
||||||
|
정확히 일치하는 전체 텍스트 검색. 큰따옴표를 사용합니다.
|
||||||
|
검색어와 라벨 조건을 모두 만족하는 전체 텍스트 검색
|
||||||
|
빠른 검색 사용. 전체 텍스트 검색에서 본문은 확인하지 않습니다.
|
||||||
|
기본적으로 보관된 노트는 검색하지 않습니다. true로 설정하면 검색 결과에 포함합니다.
|
||||||
|
지정한 subtree 노트 ID의 하위 트리만 검색합니다. 기본값은 전체 트리입니다.
|
||||||
|
검색할 노트의 트리 깊이를 지정합니다.
|
||||||
|
기준 상위 노트에서 정확히 한 단계 아래인 직계 하위 노트. 기준을 지정하지 않으면 루트입니다.
|
||||||
|
기준 상위 노트에서 정확히 세 단계 아래. 기준을 지정하지 않으면 루트입니다.
|
||||||
|
기준 상위 노트에서 네 단계 미만인 깊이 1~3. 기준을 지정하지 않으면 루트입니다.
|
||||||
|
기준 상위 노트에서 두 단계보다 깊은 위치. 깊이 3부터 해당하며 기준을 지정하지 않으면 루트입니다.
|
||||||
|
검색 결과 정렬에 사용할 속성 또는 라벨 이름
|
||||||
|
정렬 방향. 오름차순 또는 내림차순입니다.
|
||||||
|
반환할 결과 수 제한
|
||||||
|
true로 설정하면 검색어 구문 분석에 관한 디버깅 정보를 응답에 포함합니다.
|
||||||
|
검색 응답
|
||||||
|
ID로 노트를 조회합니다.
|
||||||
|
노트 응답
|
||||||
|
noteId로 지정한 노트에 요청 본문의 변경 사항을 적용합니다.
|
||||||
|
노트 변경 완료
|
||||||
|
noteId로 지정한 노트 하나를 삭제합니다.
|
||||||
|
노트 삭제 완료
|
||||||
|
ID로 노트 본문을 조회합니다.
|
||||||
|
노트 본문 응답
|
||||||
|
ID로 지정한 노트의 본문을 변경합니다.
|
||||||
|
노트의 HTML 본문
|
||||||
|
노트 본문 변경 완료
|
||||||
|
지정한 하위 노트 트리를 ZIP 파일로 내보냅니다. 전체 문서를 내보내려면 noteId에 "root"를 사용합니다.
|
||||||
|
내보낸 ZIP 파일
|
||||||
|
지정한 노트로 ZIP 파일을 가져옵니다.
|
||||||
|
지정한 노트의 수정 이력을 만듭니다.
|
||||||
|
수정 이력 생성 완료
|
||||||
|
가지를 만들어 같은 노트를 트리의 다른 위치에도 배치합니다. 상위 노트와 하위 노트 사이에 가지가 이미 있으면 기존 가지의 prefix와 notePosition 및 isExpanded를 변경합니다.
|
||||||
|
기존 가지 변경 완료. 상위 노트와 하위 노트 사이에 가지가 이미 있었습니다.
|
||||||
|
가지 생성 완료
|
||||||
|
ID로 가지를 조회합니다.
|
||||||
|
가지 응답
|
||||||
|
branchId로 지정한 가지에 요청 본문의 변경 사항을 적용합니다. prefix와 notePosition만 변경할 수 있습니다. 다른 속성을 바꾸려면 기존 가지를 삭제하고 새로 만들어야 합니다.
|
||||||
|
가지 변경 완료
|
||||||
|
branchId로 지정한 가지를 삭제합니다. 해당 하위 노트의 마지막 가지라면 노트도 삭제합니다.
|
||||||
|
가지 삭제 완료
|
||||||
|
첨부 파일 생성
|
||||||
|
첨부 파일 생성 완료
|
||||||
|
ID로 첨부 파일을 조회합니다.
|
||||||
|
첨부 파일 응답
|
||||||
|
attachmentId로 지정한 첨부 파일에 요청 본문의 변경 사항을 적용합니다. role과 mime 및 title과 position만 변경할 수 있습니다.
|
||||||
|
속성 변경 완료
|
||||||
|
attachmentId로 지정한 첨부 파일을 삭제합니다.
|
||||||
|
첨부 파일 삭제 완료
|
||||||
|
ID로 첨부 파일 내용을 조회합니다.
|
||||||
|
첨부 파일 내용 응답
|
||||||
|
ID로 지정한 첨부 파일의 내용을 변경합니다.
|
||||||
|
첨부 파일의 HTML 내용
|
||||||
|
첨부 파일 내용 변경 완료
|
||||||
|
지정한 노트에 속성 생성
|
||||||
|
속성 생성 완료
|
||||||
|
ID로 속성을 조회합니다.
|
||||||
|
속성 응답
|
||||||
|
attributeId로 지정한 속성에 요청 본문의 변경 사항을 적용합니다. 라벨은 value와 position만 변경할 수 있고 관계는 position만 변경할 수 있습니다. 다른 속성을 바꾸려면 기존 속성을 삭제하고 새로 만들어야 합니다.
|
||||||
|
attributeId로 지정한 속성을 삭제합니다.
|
||||||
|
속성 삭제 완료
|
||||||
|
가지의 notePosition은 연결된 클라이언트에 자동으로 전달되지 않습니다. 변경한 순서를 즉시 반영하려면 notePosition을 설정한 뒤 이 기능을 호출하세요. 순서가 바뀐 가지의 parentNoteId를 전달해야 합니다.
|
||||||
|
연결된 모든 클라이언트에서 노트 순서를 비동기로 갱신합니다.
|
||||||
|
새 노트를 넣을 수집함 노트를 반환합니다. 날짜 사용 여부는 수집함이 #inbox 라벨로 지정된 고정 노트인지 일지의 날짜별 노트인지에 따라 달라집니다.
|
||||||
|
수집함 노트
|
||||||
|
지정한 날짜의 일별 노트를 반환합니다. 없으면 새로 만듭니다.
|
||||||
|
일별 노트
|
||||||
|
지정한 날짜의 주별 노트를 반환합니다. 없으면 새로 만듭니다.
|
||||||
|
주별 노트
|
||||||
|
월별 노트
|
||||||
|
연도별 노트
|
||||||
|
비밀번호로 ETAPI 토큰을 발급받습니다. 이후 ETAPI 호출에 사용합니다.
|
||||||
|
Trilium 서버 로그인이나 노트 보호에 사용하는 사용자 비밀번호
|
||||||
|
인증 토큰
|
||||||
|
짧은 시간에 요청이 너무 많아 클라이언트 IP가 차단됐습니다. 인증 실패가 원인일 수 있습니다. 잠시 후 다시 시도하세요.
|
||||||
|
ETAPI 토큰을 삭제하거나 비활성화하여 로그아웃합니다.
|
||||||
|
로그아웃 성공
|
||||||
|
실행 중인 Trilium 인스턴스 정보를 반환합니다.
|
||||||
|
앱 정보
|
||||||
|
예를 들어 backupName이 "now"이면 "backup-now.db" 파일에 백업합니다.
|
||||||
|
지정한 이름으로 데이터베이스를 백업합니다.
|
||||||
|
백업 생성 완료
|
||||||
|
HTTP 기본 인증에서 사용자 이름은 임의의 문자열을 사용하며 검사하지 않습니다. 예: trilium. 비밀번호 자리에는 발급받은 ETAPI 토큰을 넣습니다. Trilium 로그인 비밀번호는 사용할 수 없습니다. 설정의 ETAPI 항목에서 생성한 토큰을 사용하세요.
|
||||||
|
트리에서 상위 노트의 ID
|
||||||
|
노트 유형이 code 또는 file 또는 image일 때만 지정하면 됩니다.
|
||||||
|
상위 노트 안에서의 순서입니다. 일반적인 순서는 10 단위로 증가합니다. 맨 앞에 넣으려면 5를 사용할 수 있고 두 번째는 15를 사용할 수 있습니다. 맨 뒤에 넣으려면 1000000처럼 큰 값을 사용하세요.
|
||||||
|
prefix는 노트가 배치된 가지마다 따로 붙이는 제목 접두사입니다. 같은 노트를 두 곳에 배치하고 한쪽에서만 제목을 조금 다르게 표시하려면 접두사를 사용하세요.
|
||||||
|
노트를 폴더처럼 펼쳐 표시하려면 true로 설정합니다.
|
||||||
|
특정 noteId를 강제로 지정하려는 경우에만 입력하세요.
|
||||||
|
특정 branchId를 강제로 지정하려는 경우에만 입력하세요.
|
||||||
|
노트 생성 시각의 현지 타임스탬프입니다. 현재 시간대의 현재 시각이라는 기본값을 바꿀 때만 지정하세요.
|
||||||
|
노트 생성 시각의 UTC 타임스탬프입니다. 현재 시각이라는 기본값을 바꿀 때만 지정하세요.
|
||||||
|
본문 해시 역할을 하는 데이터 객체의 ID
|
||||||
|
가지는 노트를 트리에 배치하며 상위 노트와 하위 노트의 관계를 나타냅니다.
|
||||||
|
하위 노트 식별자
|
||||||
|
상위 노트 식별자
|
||||||
|
첨부 파일은 노트에 속하며 제목과 내용을 가집니다.
|
||||||
|
첨부 파일 소유자의 식별자. noteId 또는 revisionId입니다.
|
||||||
|
속성은 노트에 연결된 키와 값의 쌍이며 라벨과 관계로 나뉩니다.
|
||||||
|
&debug=true로 활성화한 검색어 구문 분석 디버깅 정보
|
||||||
|
Trilium 버전
|
||||||
|
데이터베이스 버전
|
||||||
|
동기화 프로토콜 버전
|
||||||
|
빌드 날짜
|
||||||
|
빌드에 사용한 Git 커밋
|
||||||
|
Trilium 파일을 저장하는 데이터 디렉토리
|
||||||
|
지원하는 Trilium 웹 클리퍼 프로토콜 버전
|
||||||
|
현재 UTC 날짜와 시각
|
||||||
|
HTTP 응답에 사용한 것과 같은 HTTP 상태 코드
|
||||||
|
고정된 문자열 상수
|
||||||
|
사람이 읽을 수 있는 오류 설명. 추가 정보가 포함될 수 있습니다.
|
||||||
@@ -0,0 +1,166 @@
|
|||||||
|
Trilium Notes 동기화 서버 API
|
||||||
|
Trilium Notes와 TriliumNext Notes에서 사용하는 내부 동기화 서버 API입니다.\n\n공식 지원 외부 API는 [ETAPI 안내](https://triliumnext.github.io/Docs/Wiki/etapi.html)를 참고하세요.\n\n이 문서에는 아직 모든 경로가 나와 있지 않습니다. 전체 목록은 [경로 제어 코드](https://github.com/TriliumNext/Notes/blob/v0.91.6/src/routes/routes.ts)를 확인하세요.
|
||||||
|
documentSecret 값 동기화
|
||||||
|
로그인의 첫 단계입니다.
|
||||||
|
작업 성공
|
||||||
|
사용 가능한 Anthropic 모델 조회
|
||||||
|
사용자 지정 Anthropic API 기본 주소. 생략할 수 있습니다.
|
||||||
|
사용 가능한 Anthropic 모델 목록
|
||||||
|
모델 목록 조회 오류
|
||||||
|
설치 정보 조회
|
||||||
|
서버 구현체
|
||||||
|
설치 정보
|
||||||
|
process.version 값
|
||||||
|
가지 삭제 (노트 복제본)
|
||||||
|
작업 그룹 식별자
|
||||||
|
노트를 즉시 지울지 여부
|
||||||
|
이 작업 그룹의 마지막 요청인지 여부
|
||||||
|
가지 삭제 성공
|
||||||
|
마지막 노트 복제본이 삭제됐는지 여부
|
||||||
|
주어진 노트 ID를 기준으로 비슷한 노트 찾기
|
||||||
|
임베딩 제공자 ID
|
||||||
|
임베딩 모델 ID
|
||||||
|
반환할 비슷한 노트의 최대 개수
|
||||||
|
유사도 기준값 (0.0~1.0)
|
||||||
|
비슷한 노트 목록
|
||||||
|
잘못된 요청 매개변수
|
||||||
|
노트를 찾을 수 없음
|
||||||
|
입력한 글과 비슷한 노트 검색
|
||||||
|
검색에 사용할 글
|
||||||
|
사용 가능한 임베딩 제공자 조회
|
||||||
|
사용 가능한 임베딩 제공자 목록
|
||||||
|
임베딩 제공자 설정 변경
|
||||||
|
변경할 제공자 ID
|
||||||
|
제공자 사용 여부
|
||||||
|
우선순위. 숫자가 작을수록 우선합니다.
|
||||||
|
제공자별 설정
|
||||||
|
제공자 변경 성공
|
||||||
|
잘못된 제공자 ID 또는 설정
|
||||||
|
모든 노트의 임베딩 다시 처리
|
||||||
|
다시 처리할 때 사용할 제공자 ID
|
||||||
|
다시 처리할 때 사용할 모델 ID
|
||||||
|
임베딩이 이미 있는 노트도 다시 처리할지 여부
|
||||||
|
다시 처리 시작
|
||||||
|
임베딩 처리 대기열 상태 조회
|
||||||
|
특정 처리 작업의 상태를 조회할 작업 ID. 생략할 수 있습니다.
|
||||||
|
대기열 상태 정보
|
||||||
|
진행률 (0~100)
|
||||||
|
임베딩 통계 조회
|
||||||
|
임베딩 통계
|
||||||
|
임베딩 생성에 실패한 노트 목록 조회
|
||||||
|
실패한 노트 목록
|
||||||
|
실패한 노트의 임베딩 생성 재시도
|
||||||
|
다시 시도할 노트 ID
|
||||||
|
사용할 제공자 ID. 생략하면 설정된 기본 제공자를 사용합니다.
|
||||||
|
사용할 모델 ID. 생략하면 제공자의 기본 모델을 사용합니다.
|
||||||
|
재시도 결과
|
||||||
|
잘못된 요청
|
||||||
|
실패한 모든 노트의 임베딩 생성 재시도
|
||||||
|
재시도 시작
|
||||||
|
벡터 저장소 색인 다시 만들기
|
||||||
|
다시 만들기 시작
|
||||||
|
벡터 색인 다시 만들기 상태 조회
|
||||||
|
특정 색인 작업의 상태를 조회할 작업 ID. 생략할 수 있습니다.
|
||||||
|
색인 다시 만들기 상태 정보
|
||||||
|
새 언어 모델 대화 생성
|
||||||
|
대화 제목
|
||||||
|
도우미의 동작 방식을 지정할 시스템 메시지
|
||||||
|
언어 모델의 무작위성 설정값 (0.0~1.0)
|
||||||
|
응답에서 생성할 최대 토큰 수
|
||||||
|
사용할 모델. 제공자에 따라 다릅니다.
|
||||||
|
사용할 언어 모델 제공자. 예: openai 또는 anthropic 또는 ollama
|
||||||
|
대화의 참고 자료로 사용할 노트 ID
|
||||||
|
대화 생성 성공
|
||||||
|
모든 대화 조회
|
||||||
|
대화 목록
|
||||||
|
특정 대화 조회
|
||||||
|
대화 상세 정보
|
||||||
|
대화를 찾을 수 없음
|
||||||
|
대화 삭제
|
||||||
|
대화 삭제 성공
|
||||||
|
대화 설정 변경
|
||||||
|
대화 노트 ID. 이전 이름은 sessionId입니다.
|
||||||
|
변경할 대화 제목
|
||||||
|
변경할 시스템 프롬프트
|
||||||
|
변경할 무작위성 설정값
|
||||||
|
변경할 최대 토큰 수
|
||||||
|
변경할 모델
|
||||||
|
변경할 제공자
|
||||||
|
참고 자료로 사용할 새 노트 ID
|
||||||
|
대화 변경 성공
|
||||||
|
언어 모델에 메시지를 보내고 응답 받기
|
||||||
|
언어 모델에 보낼 사용자 메시지
|
||||||
|
이 메시지에만 적용할 매개변수. 생략할 수 있습니다.
|
||||||
|
관련 노트를 참고 자료에 포함할지 여부
|
||||||
|
대화에 지정된 참고 노트를 사용할지 여부
|
||||||
|
언어 모델 응답
|
||||||
|
요청 처리 오류
|
||||||
|
언어 모델 지식 자료의 색인 상태 통계 조회
|
||||||
|
색인 통계 조회 성공
|
||||||
|
지식 자료 색인 작업 시작 또는 계속하기
|
||||||
|
모든 노트의 색인을 강제로 다시 만들지 여부
|
||||||
|
색인 작업 시작 성공
|
||||||
|
색인에 실패한 노트 목록 조회
|
||||||
|
색인 실패 목록 조회 성공
|
||||||
|
실패한 모든 노트의 색인 재시도
|
||||||
|
실패한 모든 색인 작업 재시도 시작 성공
|
||||||
|
이전에 실패한 특정 노트의 색인 재시도
|
||||||
|
색인 재시도 시작 성공
|
||||||
|
특정 노트를 언어 모델 지식 자료에 색인
|
||||||
|
노트 색인 성공
|
||||||
|
검색어와 비슷한 노트 찾기
|
||||||
|
비슷한 노트 검색 성공
|
||||||
|
지식 자료를 바탕으로 언어 모델 질문의 참고 자료 생성
|
||||||
|
참고 자료 생성 성공
|
||||||
|
WebSocket으로 언어 모델에 메시지를 보내고 응답을 순차 수신
|
||||||
|
메시지를 보낼 대화 노트 ID. 이전 이름은 sessionId입니다.
|
||||||
|
고급 참고 자료 추출 기능을 사용할지 여부
|
||||||
|
응답에 생각 과정을 표시할지 여부
|
||||||
|
순차 전송 시작 성공
|
||||||
|
documentSecret으로 로그인
|
||||||
|
`hash` 매개변수는 `documentSecret`과 `timestamp`를 사용한 HMAC으로 계산합니다.
|
||||||
|
HMAC 계산
|
||||||
|
동기화 버전 또는 문서 비밀 값 불일치
|
||||||
|
타임스탬프 불일치
|
||||||
|
노트 메타데이터 조회
|
||||||
|
노트 메타데이터
|
||||||
|
노트 삭제
|
||||||
|
노트 삭제 성공
|
||||||
|
노트 본문 조회
|
||||||
|
노트 본문
|
||||||
|
노트 메타데이터 조회 (시각 정보만)
|
||||||
|
사용 가능한 Ollama 모델 조회
|
||||||
|
사용자 지정 Ollama API 기본 주소. 생략할 수 있습니다.
|
||||||
|
사용 가능한 Ollama 모델 목록
|
||||||
|
사용 가능한 OpenAI 모델 조회
|
||||||
|
사용자 지정 OpenAI API 기본 주소. 생략할 수 있습니다.
|
||||||
|
사용 가능한 OpenAI 모델 목록
|
||||||
|
동기화 변경 사항 가져오기
|
||||||
|
로컬 인스턴스 ID
|
||||||
|
로컬에 있는 마지막 변경 ID
|
||||||
|
서버 로그에서 이 요청을 구분할 표시
|
||||||
|
동기화 변경 사항. 응답 크기는 약 1메가바이트로 제한됩니다.
|
||||||
|
`outstandingPullCount > 0`이면 다음 요청의 매개변수에 이 값을 넣어 계속 가져옵니다.
|
||||||
|
원격 서버가 아직 반환하지 않은 변경 사항 수
|
||||||
|
동기화 변경 사항 보내기
|
||||||
|
기본 사용법: `pageCount = 1`과 `pageIndex = 0`으로 설정하고 `requestId`는 생략합니다. 요청 본문에 엔터티 변경 사항을 넣습니다.
|
||||||
|
여러 페이지로 나눈 요청을 구분할 ID
|
||||||
|
변경 사항 처리 성공
|
||||||
|
트리 데이터 조회
|
||||||
|
트리 데이터를 이 노트와 하위 노트로 제한
|
||||||
|
노트와 가지 및 속성
|
||||||
|
비밀번호로 로그인
|
||||||
|
일부 API 호출에 필요한 Trilium 세션을 발급합니다. 사용자가 TOTP 인증을 설정한 경우에만 `totpToken`이 필요합니다.
|
||||||
|
비밀번호 또는 일회용 인증 번호 불일치
|
||||||
|
type이 "relation"이면 노트 ID입니다. 그 외에는 속성 내용입니다.
|
||||||
|
텍스트가 아니면 `null`입니다.
|
||||||
|
`{parentNoteId}_{noteId}`와 같습니다.
|
||||||
|
이 엔터티의 데이터베이스 테이블
|
||||||
|
`entity_changes` 테이블에서 참조하는 ID
|
||||||
|
인코딩한 엔터티 데이터. 데이터베이스의 각 열에 대응하는 속성이 들어 있는 객체입니다.
|
||||||
|
[참고 목록](https://github.com/TriliumNext/Notes/blob/v0.91.6/src/services/note_types.ts)
|
||||||
|
12자리 노트 ID. 특수 값은 "none"과 "root"입니다.
|
||||||
|
`new Date().toISOString().replace('T', ' ')`의 결과
|
||||||
|
`user:password` 형식의 사용자 이름과 비밀번호
|
||||||
|
인증
|
||||||
|
동기화
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"Frontend Script API":"프런트엔드 스크립트 API",
|
||||||
|
"Backend Script API":"백엔드 스크립트 API",
|
||||||
|
"jQuery element with the link (wrapped in":"링크를 담은 jQuery 요소. 감싸는 요소:",
|
||||||
|
"formatted string":"서식을 적용한 문자열",
|
||||||
|
"random string":"임의 문자열",
|
||||||
|
"promise resolving to true if the user confirmed":"사용자가 확인하면 true로 완료되는 Promise",
|
||||||
|
"promise resolving to the answer provided by the user":"사용자가 입력한 값으로 완료되는 Promise",
|
||||||
|
"returns active context (split)":"활성 문맥인 분할 화면을 반환합니다.",
|
||||||
|
"instance of CodeMirror":"CodeMirror 인스턴스",
|
||||||
|
"active note (loaded into center pane)":"가운데 창에 열린 활성 노트",
|
||||||
|
"returns a note path of active note or null if there isn't active note":"활성 노트의 경로를 반환합니다. 활성 노트가 없으면 null입니다.",
|
||||||
|
"instance of CKEditor":"CKEditor 인스턴스",
|
||||||
|
"returns active main context (first split in a tab, represents the tab as a whole)":"탭 전체를 대표하는 첫 번째 분할 화면인 활성 기본 문맥을 반환합니다.",
|
||||||
|
"returns all main contexts representing tabs":"각 탭을 대표하는 모든 기본 문맥을 반환합니다.",
|
||||||
|
"returns all note contexts (splits) in all tabs":"모든 탭의 노트 문맥인 분할 화면을 반환합니다.",
|
||||||
|
"return value of the executed function on the backend":"백엔드에서 실행한 함수의 반환값",
|
||||||
|
"a promise that resolves when the script has been run. Additionally, for front-end notes, the promise will contain the value that is returned by the script.":"스크립트 실행이 끝나면 완료되는 Promise입니다. 프런트엔드 노트라면 스크립트의 반환값도 포함합니다.",
|
||||||
|
"array of notePaths (each represented by array of noteIds constituting the particular note path)":"노트 경로 배열입니다. 각 경로는 해당 경로를 이루는 노트 ID 배열로 표현합니다.",
|
||||||
|
"attribute of the given type and name. If there are more such attributes, first is returned. Returns null if there's no such attribute belonging to this note.":"지정한 유형과 이름의 속성입니다. 여러 개면 첫 번째를 반환합니다. 해당 노트에 이런 속성이 없으면 null입니다.",
|
||||||
|
"all note's attributes, including inherited ones":"상속받은 속성을 포함한 노트의 모든 속성",
|
||||||
|
"attribute value of the given type and name or null if no such attribute exists.":"지정한 유형과 이름의 속성값입니다. 해당 속성이 없으면 null입니다.",
|
||||||
|
"array of noteIds constituting the particular note path":"해당 노트 경로를 이루는 노트 ID 배열",
|
||||||
|
"serialized note path (e.g. 'root/a1h315/js725h')":"직렬화한 노트 경로. 예: root/a1h315/js725h",
|
||||||
|
"label if it exists, null otherwise":"라벨이 있으면 해당 라벨을 반환하고 없으면 null을 반환합니다.",
|
||||||
|
"all note's labels (attributes with type label), including inherited ones":"상속받은 라벨을 포함한 노트의 모든 라벨 속성",
|
||||||
|
"label value if label exists, null otherwise":"라벨이 있으면 라벨 값을 반환하고 없으면 null을 반환합니다.",
|
||||||
|
"relation if it exists, null otherwise":"관계가 있으면 해당 관계를 반환하고 없으면 null을 반환합니다.",
|
||||||
|
"all note's relations (attributes with type relation), including inherited ones":"상속받은 관계를 포함한 노트의 모든 관계 속성",
|
||||||
|
"relation value if relation exists, null otherwise":"관계가 있으면 관계 값을 반환하고 없으면 null을 반환합니다.",
|
||||||
|
"target note of the relation or null (if target is empty or note was not found)":"관계의 대상 노트입니다. 대상이 비어 있거나 노트를 찾지 못하면 null입니다.",
|
||||||
|
"JS script environment - either":"JavaScript 실행 환경. 가능한 값:",
|
||||||
|
"true if note has an attribute with given type and name (including inherited)":"상속받은 속성을 포함해 지정한 유형과 이름의 속성이 있으면 true입니다.",
|
||||||
|
"true if label exists (including inherited)":"상속받은 라벨을 포함해 해당 라벨이 있으면 true입니다.",
|
||||||
|
"true if label exists (excluding inherited)":"상속받은 라벨을 제외하고 해당 라벨이 있으면 true입니다.",
|
||||||
|
"true if relation exists (excluding inherited)":"상속받은 관계를 제외하고 해당 관계가 있으면 true입니다.",
|
||||||
|
"true if relation exists (including inherited)":"상속받은 관계를 포함해 해당 관계가 있으면 true입니다.",
|
||||||
|
"boolean - true if there's no non-hidden path, note is not cloned to the visible tree":"숨겨지지 않은 경로가 없으면 true입니다. 즉 보이는 트리에 노트 복제본이 없다는 뜻입니다.",
|
||||||
|
"true if this note is HTML":"이 노트가 HTML이면 true입니다.",
|
||||||
|
"true if this note is JavaScript (code or file)":"이 노트가 JavaScript 코드 또는 파일이면 true입니다.",
|
||||||
|
"true if label exists (including inherited) and does not have":"상속받은 라벨을 포함해 라벨이 존재하면서 다음 값이 아니면 true입니다:",
|
||||||
|
"resolves once the backup is finished":"백업이 끝나면 완료됩니다.",
|
||||||
|
"object contains newly created entities note and branch":"새로 생성한 노트와 가지 엔터티가 들어 있는 객체",
|
||||||
|
"escaped string":"이스케이프 처리한 문자열",
|
||||||
|
"no return value is provided.":"반환값이 없습니다.",
|
||||||
|
"resolves once the callback is finished (callback is awaited)":"콜백이 끝날 때까지 기다린 뒤 완료됩니다.",
|
||||||
|
"result of func callback":"func 콜백의 결과",
|
||||||
|
"unescaped string":"이스케이프를 해제한 문자열"
|
||||||
|
}
|
||||||
@@ -0,0 +1,196 @@
|
|||||||
|
스크립트가 렌더링한 전체 내용을 담는 영역
|
||||||
|
예:
|
||||||
|
ctrl+shift+a
|
||||||
|
같은 바인딩을 여러 번 호출할 수 있다면 처리 함수의 네임스페이스를 지정하세요. 같은 ID의 처리 함수가 있으면 새 함수로 교체합니다.
|
||||||
|
지정한 노트를 가리키는 jQuery 링크 객체를 만듭니다.
|
||||||
|
(또는 noteId)
|
||||||
|
사용 중단 예정
|
||||||
|
대신 api.createLink()를 사용하세요.
|
||||||
|
현재 실행 중인 소스 코드가 작성된 노트입니다.
|
||||||
|
날짜 처리를 위한 day.js 라이브러리입니다. 참고:
|
||||||
|
https://day.js.org
|
||||||
|
라이브러리 사용 안내
|
||||||
|
참고
|
||||||
|
이 함수는 현지 시각을 반환합니다.
|
||||||
|
반환값
|
||||||
|
YYYY-MM-DD 형식의 날짜
|
||||||
|
바이트 단위
|
||||||
|
api.formatSize()를 사용하세요.
|
||||||
|
지정한 날짜의 일별 노트를 반환합니다. 없으면 자동으로 만듭니다.
|
||||||
|
월별 노트를 반환합니다. 없으면 자동으로 만듭니다.
|
||||||
|
지정한 날짜의 분기별 노트를 반환합니다. 없으면 자동으로 만듭니다.
|
||||||
|
오늘의 일별 노트를 반환합니다. 없으면 자동으로 만듭니다.
|
||||||
|
지정한 날짜가 속한 주의 첫날에 해당하는 일별 노트를 반환합니다. 없으면 자동으로 만듭니다.
|
||||||
|
지정한 날짜의 주별 노트를 반환합니다. 없으면 자동으로 만듭니다.
|
||||||
|
연도별 노트를 반환합니다. 없으면 자동으로 만듭니다.
|
||||||
|
메서드
|
||||||
|
이 실행을 시작하게 한 이벤트의 엔터티
|
||||||
|
노트를 보호하려면 true를 사용하고 보호를 해제하려면 false를 사용합니다.
|
||||||
|
하위 트리를 보호하려면 true를 사용하고 보호를 해제하려면 false를 사용합니다.
|
||||||
|
지정한 길이의 임의 문자열을 반환합니다. 암호학적으로 안전한 난수를 만드는 함수가 아닙니다.
|
||||||
|
도움말을 표시할 jQuery 객체
|
||||||
|
사용자에게 확인 대화상자를 표시합니다.
|
||||||
|
사용자에게 오류 알림을 잠깐 표시합니다.
|
||||||
|
사용자에게 정보 대화상자를 표시합니다.
|
||||||
|
사용자에게 정보 알림을 잠깐 표시합니다.
|
||||||
|
사용자에게 입력 대화상자를 표시합니다.
|
||||||
|
현재 스크립트 실행이 시작된 노트입니다. 이벤트의 진입점에 해당합니다.
|
||||||
|
명령을 실행합니다. 매우 낮은 수준의 API이므로 가능하면 다른 방법을 사용하세요.
|
||||||
|
이벤트를 발생시킵니다. 매우 낮은 수준의 API이므로 가능하면 다른 방법을 사용하세요.
|
||||||
|
Trilium은 백엔드와 프런트엔드로 나뉘어 실행됩니다. 스크립트가 백엔드에서 변경한 내용은 프런트엔드에 비동기로 동기화됩니다.
|
||||||
|
이 메서드는 다음 과정이 모두 끝나면 완료되는 Promise를 반환합니다. 백엔드에서
|
||||||
|
프런트엔드로의 동기화입니다. 새 노트를 만들었다면 프런트엔드에 동기화될 때까지 기다린 뒤 활성화하는 데 사용할 수 있습니다.
|
||||||
|
새로 만든 노트를 활성화합니다. this.activateNote()와 달리 프런트엔드 동기화 완료까지 확인합니다.
|
||||||
|
트리와 노트 상세 화면에서 노트를 활성화합니다.
|
||||||
|
실행 도구 모음에 새 실행 도구를 추가합니다. 같은 ID가 있으면 변경합니다.
|
||||||
|
이제 왼쪽 위 메뉴에서 실행 도구를 만들거나 변경할 수 있습니다. 메뉴 경로:
|
||||||
|
실행 도구 모음 설정. 특수한 용도에는 백엔드 API의 createOrUpdateLauncher()도 사용할 수 있습니다.
|
||||||
|
편집기의 커서 위치에 지정한 글을 추가합니다.
|
||||||
|
일반 텍스트만 사용할 수 있습니다. HTML은 지원하지 않습니다.
|
||||||
|
https://codemirror.net/doc/manual.html#api
|
||||||
|
https://ckeditor.com/docs/ckeditor5/latest/api/module_core_editor_editor-Editor.html
|
||||||
|
반환된 인스턴스의 사용 안내
|
||||||
|
노트 상세 화면을 담당하는 위젯에 접근합니다. 사용할 수 있는 메서드의 예:
|
||||||
|
및
|
||||||
|
실제 위젯 유형의 구현체에 접근하는 데 사용합니다.
|
||||||
|
지정한 DOM 요소를 소유하는 구성 요소를 반환합니다. DOM 트리에서 가장 가까운 상위 구성 요소입니다.
|
||||||
|
DOM 요소
|
||||||
|
인스턴스 이름은 개별 Trilium 실행 환경을 구분합니다. 특정 인스턴스에서만 작업을 실행해야 하는 스크립트에 유용합니다.
|
||||||
|
noteId로 노트를 반환합니다. 캐시에 없으면 불러옵니다.
|
||||||
|
노트 목록을 반환합니다. 캐시에 없는 노트는 불러옵니다.
|
||||||
|
createLink() 등으로 노트를 하나씩 가져오는 대신 여러 노트를 한꺼번에 캐시에 채울 때 자주 사용합니다.
|
||||||
|
노트를 찾지 못해도 오류를 보고하지 않음
|
||||||
|
지정한 메시지를 화면의 로그 창에 기록합니다.
|
||||||
|
새 분할 화면에서 노트를 엽니다.
|
||||||
|
새 분할 화면을 활성화하려면 true를 사용하고 현재 화면에 머무르려면 false를 사용합니다.
|
||||||
|
새 탭에서 노트를 엽니다.
|
||||||
|
새 탭을 활성화하려면 true를 사용하고 현재 탭에 머무르려면 false를 사용합니다.
|
||||||
|
매개변수로 지정한 노트를 포함하는 현재 열린 노트를 모두 새로 고칩니다.
|
||||||
|
포함된 노트의 noteId
|
||||||
|
백엔드의 내용을 바탕으로 프런트엔드 노트 트리 캐시를 갱신합니다.
|
||||||
|
지정한 익명 함수를 백엔드에서 실행합니다. 내부적으로 함수를 문자열로 직렬화한 뒤 AJAX로 전송합니다. 비동기 함수가 필요한 고급 용도에 사용합니다. 요청 단위의 자동 트랜잭션 관리는 적용되지 않으므로 api.transactional()로 트랜잭션을 직접 지정해야 합니다.
|
||||||
|
동기 함수라면 api.runOnBackend()를 사용하세요.
|
||||||
|
백엔드에서 실행할 동기 함수
|
||||||
|
백엔드로 보낼 익명 함수의 매개변수 목록
|
||||||
|
지정한 익명 함수를 백엔드에서 실행합니다. 내부적으로 함수를 문자열로 직렬화한 뒤 AJAX로 전송합니다. 트랜잭션 관리가 올바르게 작동하려면 동기 함수를 전달해야 합니다. 트랜잭션을 직접 관리할 수 있다면 api.runAsyncOnBackendWithManualTransactionHandling()을 사용할 수 있습니다.
|
||||||
|
속성과 속성값 등을 기준으로 검색할 수 있습니다. 예:
|
||||||
|
#dateModified =* MONTH AND #log
|
||||||
|
전체 검색 옵션 안내:
|
||||||
|
https://triliumnext.github.io/Docs/Wiki/search.html
|
||||||
|
현재 탭에서 이 노트의 하위 트리만 표시합니다. 참고:
|
||||||
|
https://triliumnext.github.io/Docs/Wiki/note-hoisting.html
|
||||||
|
집중해서 표시할 노트입니다. root를 지정하면 전체 트리 표시로 돌아갑니다.
|
||||||
|
노트는 Trilium의 핵심 데이터 단위입니다.
|
||||||
|
콘텐츠 유형. 예:
|
||||||
|
application/json
|
||||||
|
이 FNote를 프런트엔드 또는 백엔드 스크립트로 실행합니다.
|
||||||
|
발생 가능한 예외
|
||||||
|
실행할 수 없는 노트 유형이나 MIME 유형이면 Error가 발생합니다.
|
||||||
|
이 노트에 도달하는 모든 노트 경로를 반환합니다. 검색 노트가 포함된 경로는 순환이 생길 수 있어 제외합니다.
|
||||||
|
속성 유형. 예: label 또는 relation
|
||||||
|
속성 이름
|
||||||
|
필터링할 속성 유형
|
||||||
|
필터링할 속성 이름
|
||||||
|
가능한 노트 경로 중에서 다음 조건에 맞는 경로를 반환합니다:
|
||||||
|
가장 적절한 경로
|
||||||
|
대신 getParentBranches()를 사용하세요.
|
||||||
|
대신 getParentBranchIds()를 사용하세요.
|
||||||
|
라벨 이름
|
||||||
|
필터링할 라벨 이름
|
||||||
|
노트의 날짜 메타데이터를 제공합니다.
|
||||||
|
대신 getBlob()을 사용하세요.
|
||||||
|
관계 이름
|
||||||
|
필터링할 관계 이름
|
||||||
|
이 노트를 대상으로 하는 관계를 조회합니다.
|
||||||
|
아무 작업도 하지 않음
|
||||||
|
이 객체에는 다음 특성을 가진 고급 기능 객체가 들어 있습니다.
|
||||||
|
사용자가 영향을 판단해야 함
|
||||||
|
하위 호환성 보장 없음
|
||||||
|
고급 사용 사례를 위한 객체입니다.
|
||||||
|
백엔드의 메모리 내 객체 그래프에 접근합니다. 참고:
|
||||||
|
Becca
|
||||||
|
HTTP 요청을 위한 Axios 라이브러리입니다. 참고:
|
||||||
|
https://axios-http.com
|
||||||
|
대신 브라우저와 호환되는 기본 fetch()를 사용하세요.
|
||||||
|
HTML 분석과 처리를 위한 cheerio 라이브러리입니다. 참고:
|
||||||
|
https://cheerio.js.org
|
||||||
|
현재 스크립트가 실행 중인 노트입니다. 코드가 여러 노트로 나뉘어 있으면 처음 실행을 시작한 노트는 다음과 같습니다:
|
||||||
|
startNote
|
||||||
|
함수 호출을 통해 다른 노트인 currentNote로 실행 위치가 바뀔 수 있습니다. C 언어에서는 다음 개념과 비슷합니다:
|
||||||
|
FILE
|
||||||
|
현재 화면에서 활성화된 노트와 혼동하지 마세요.
|
||||||
|
날짜 처리를 위한 day.js 라이브러리입니다. 참고:
|
||||||
|
이 실행을 시작하게 한 이벤트의 엔터티
|
||||||
|
sql
|
||||||
|
스크립트 실행이 시작된 노트입니다. C 언어로 비유하면 현재 프로세스의 main() 함수가 들어 있는 파일에 해당합니다.
|
||||||
|
XML 분석을 위한 xml2js 라이브러리입니다. 참고:
|
||||||
|
https://github.com/Leonidas-from-XIV/node-xml2js
|
||||||
|
예를 들어 backupName에 다음 값을 지정하면:
|
||||||
|
now
|
||||||
|
백업은 다음 이름으로 저장됩니다:
|
||||||
|
backup-now.db
|
||||||
|
파일
|
||||||
|
JSON으로 직렬화할 수 있는 객체를 데이터 노트로 만듭니다. 생성되는 노트의 유형은 code이며 MIME 유형은 JSON입니다. 더 많은 옵션은 createNewNote()를 확인하세요.
|
||||||
|
이 상위 노트 아래에 새 노트 생성
|
||||||
|
노트에 JSON을 사용할지 여부
|
||||||
|
간단한 용도에는 비슷한 API인 createTextNote()를 사용하고 복잡한 요구에는 createNewNote()를 사용하세요.
|
||||||
|
실행 도구 모음에 새 실행 도구를 만듭니다. 같은 ID가 있으면 변경합니다.
|
||||||
|
사용할 Boxicons 아이콘 이름. 예:
|
||||||
|
bx-time
|
||||||
|
영문과 숫자로만 구성된 6자리 이상의 실행 도구 ID
|
||||||
|
true이면 다음 위치에 생성합니다:
|
||||||
|
표시할 실행 도구
|
||||||
|
그 외에는 다음 위치에 생성합니다:
|
||||||
|
사용 가능한 실행 도구
|
||||||
|
누르면 대상 노트나 스크립트를 활성화할 단축키. 예:
|
||||||
|
ctrl+e
|
||||||
|
해당 유형:
|
||||||
|
script
|
||||||
|
note
|
||||||
|
다음 중 하나
|
||||||
|
실행 도구를 누르면 targetNoteId로 지정한 노트로 이동합니다.
|
||||||
|
실행 도구를 누르면 scriptNoteId로 지정한 스크립트를 실행합니다.
|
||||||
|
customWidget
|
||||||
|
widgetNoteId로 지정한 사용자 지정 위젯으로 실행 도구를 표시합니다.
|
||||||
|
텍스트 노트를 만듭니다. 더 많은 옵션은 createNewNote()를 확인하세요.
|
||||||
|
노트와 상위 노트 사이에 가지가 있으면 삭제합니다. 없으면 아무 작업도 하지 않습니다.
|
||||||
|
노트와 상위 노트 사이에 가지가 없으면 만듭니다. 이미 있으면 그대로 둡니다. 새 가지 또는 기존 가지를 반환합니다.
|
||||||
|
노트와 상위 노트 사이에 가지를 새로 만들 때 지정할 접두사
|
||||||
|
html 또는 markdown
|
||||||
|
지정한 날짜의 일별 노트를 반환합니다. 없으면 만듭니다.
|
||||||
|
YYYY-MM-DD 형식
|
||||||
|
달력 루트 노트를 지정합니다. 일반적으로 비워 두어 기본 달력을 사용합니다.
|
||||||
|
지정한 날짜의 월별 노트를 반환합니다. 없으면 만듭니다.
|
||||||
|
YYYY-MM 형식
|
||||||
|
지정한 라벨 이름을 가진 노트들을 조회합니다.
|
||||||
|
값
|
||||||
|
속성값
|
||||||
|
지정한 라벨 이름을 가진 첫 번째 노트를 조회합니다.
|
||||||
|
지정한 날짜의 분기별 노트를 반환합니다. 없으면 만듭니다.
|
||||||
|
달력의 루트 노트를 반환합니다.
|
||||||
|
오늘의 일별 노트를 반환합니다. 없으면 만듭니다.
|
||||||
|
지정한 날짜가 속한 주의 첫날에 해당하는 노트를 반환합니다.
|
||||||
|
지정한 날짜의 주별 노트를 반환합니다. 없으면 만듭니다.
|
||||||
|
지정한 연도의 연도별 노트를 반환합니다. 없으면 만듭니다.
|
||||||
|
YYYY 형식
|
||||||
|
지정한 메시지를 Trilium 로그와 화면의 로그 창에 기록합니다.
|
||||||
|
문자열 기준
|
||||||
|
지정한 익명 함수를 프런트엔드에서 실행합니다. 내부적으로 함수를 문자열로 직렬화한 뒤 WebSocket으로 전송합니다. 서로 다른 탭 등 여러 프런트엔드가 연결돼 있으면 모든 인스턴스에서 실행합니다.
|
||||||
|
프런트엔드에서 실행할 스크립트
|
||||||
|
프런트엔드로 보낼 익명 함수의 매개변수 목록
|
||||||
|
동기화 중에는 데이터가 일시적으로 일관되지 않을 수 있습니다. 강한 일관성이 필요한 스크립트는 이 함수로 진행 중인 동기화가 끝나기를 기다리고 실행 중 새 동기화가 시작되지 않게 할 수 있습니다.
|
||||||
|
비동기 처리이므로 내부 콜백에는 자동 트랜잭션 처리가 적용되지 않습니다. 데이터베이스를 변경하려면 api.transactional(...)로 호출을 감싸야 합니다.
|
||||||
|
동기화가 실행되지 않는 동안 실행할 함수
|
||||||
|
참고:
|
||||||
|
전체 옵션 안내
|
||||||
|
noteId와 접두사로 노트를 찾아 지정한 parentNoteId 아래에 배치합니다. parentNoteId를 지정하지 않으면 가지를 삭제합니다.
|
||||||
|
toggleNoteInParent()와 비슷하지만 접두사로 가지를 찾는다는 차이가 있습니다.
|
||||||
|
동작을 혼동하기 쉬운 메서드이며 특수한 용도에만 사용합니다.
|
||||||
|
지정한 노트의 하위 노트를 정렬합니다.
|
||||||
|
title 또는 dateCreated 또는 dateModified 또는 라벨 이름. 참고:
|
||||||
|
https://triliumnext.github.io/Docs/Wiki/sorting.html
|
||||||
|
자세한 안내
|
||||||
|
값에 따라 노트와 상위 노트 사이의 가지를 만들거나 삭제합니다.
|
||||||
|
가지를 유지하려면 true를 사용하고 없애려면 false를 사용합니다.
|
||||||
|
트랜잭션 안에서 실행할 코드를 감쌉니다. 이미 트랜잭션이 있으면 해당 트랜잭션을 사용합니다.
|
||||||
|
이스케이프를 해제할 대상
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,120 @@
|
|||||||
|
[
|
||||||
|
"ETAPI",
|
||||||
|
"External Trilium API",
|
||||||
|
"Create a note and place it into the note tree",
|
||||||
|
"note created",
|
||||||
|
"unexpected error",
|
||||||
|
"Search notes",
|
||||||
|
"search query string as described in https://triliumnext.github.io/Docs/Wiki/search.html",
|
||||||
|
"Fulltext search for keywords (not exact match)",
|
||||||
|
"Fulltext search for exact match (notice the double quotes)",
|
||||||
|
"Fulltext search for keyword AND matching label",
|
||||||
|
"enable fast search (fulltext doesn't look into content)",
|
||||||
|
"search by default ignores archived notes. Set to 'true' to includes archived notes into search results.",
|
||||||
|
"search only in a subtree identified by the subtree noteId. By default whole tree is searched.",
|
||||||
|
"define how deep in the tree should the notes be searched",
|
||||||
|
"depth of exactly 1 (direct children) to the ancestor (root if not set)",
|
||||||
|
"depth of exactly 3 to the ancestor (root if not set)",
|
||||||
|
"depth less than 4 (so 1, 2, 3) to the ancestor (root if not set)",
|
||||||
|
"depth greater than 2 (so 3, 4, 5, 6...) to the ancestor (root if not set)",
|
||||||
|
"name of the property/label to order search results by",
|
||||||
|
"order direction, ascending or descending",
|
||||||
|
"limit the number of results you want to receive",
|
||||||
|
"set to true to get debug information in the response (search query parsing)",
|
||||||
|
"search response",
|
||||||
|
"Returns a note identified by its ID",
|
||||||
|
"note response",
|
||||||
|
"patch a note identified by the noteId with changes in the body",
|
||||||
|
"note updated",
|
||||||
|
"deletes a single note based on the noteId supplied",
|
||||||
|
"note deleted",
|
||||||
|
"Returns note content identified by its ID",
|
||||||
|
"note content response",
|
||||||
|
"Updates note content identified by its ID",
|
||||||
|
"html content of note",
|
||||||
|
"note content updated",
|
||||||
|
"Exports ZIP file export of a given note subtree. To export whole document, use \"root\" for noteId",
|
||||||
|
"export ZIP file",
|
||||||
|
"Imports ZIP file into a given note.",
|
||||||
|
"Create a note revision for the given note",
|
||||||
|
"revision has been created",
|
||||||
|
"Create a branch (clone a note to a different location in the tree). In case there is a branch between parent note and child note already, then this will update the existing branch with prefix, notePosition and isExpanded.\n",
|
||||||
|
"branch updated (branch between parent note and child note already existed)",
|
||||||
|
"branch created",
|
||||||
|
"Returns a branch identified by its ID",
|
||||||
|
"branch response",
|
||||||
|
"patch a branch identified by the branchId with changes in the body. Only prefix and notePosition can be updated. If you want to update other properties, you need to delete the old branch and create a new one.",
|
||||||
|
"branch updated",
|
||||||
|
"deletes a branch based on the branchId supplied. If this is the last branch of the (child) note, then the note is deleted as well.\n",
|
||||||
|
"branch deleted",
|
||||||
|
"create an attachment",
|
||||||
|
"attachment created",
|
||||||
|
"Returns an attachment identified by its ID",
|
||||||
|
"attachment response",
|
||||||
|
"patch an attachment identified by the attachmentId with changes in the body. Only role, mime, title, and position are patchable.",
|
||||||
|
"attribute updated",
|
||||||
|
"deletes an attachment based on the attachmentId supplied.",
|
||||||
|
"attachment deleted",
|
||||||
|
"Returns attachment content identified by its ID",
|
||||||
|
"attachment content response",
|
||||||
|
"Updates attachment content identified by its ID",
|
||||||
|
"html content of attachment",
|
||||||
|
"attachment content updated",
|
||||||
|
"create an attribute for a given note",
|
||||||
|
"attribute created",
|
||||||
|
"Returns an attribute identified by its ID",
|
||||||
|
"attribute response",
|
||||||
|
"patch an attribute identified by the attributeId with changes in the body. For labels, only value and position can be updated. For relations, only position can be updated. If you want to modify other properties, you need to delete the old attribute and create a new one.",
|
||||||
|
"deletes an attribute based on the attributeId supplied.",
|
||||||
|
"attribute deleted",
|
||||||
|
"notePositions in branches are not automatically pushed to connected clients and need a specific instruction. If you want your changes to be in effect immediately, call this service after setting branches' notePosition. Note that you need to supply \"parentNoteId\" of branch(es) with changed positions.\n",
|
||||||
|
"note ordering will be asynchronously updated in all connected clients",
|
||||||
|
"returns an \"inbox\" note, into which note can be created. Date will be used depending on whether the inbox is a fixed note (identified with #inbox label) or a day note in a journal.\n",
|
||||||
|
"inbox note",
|
||||||
|
"returns a day note for a given date. Gets created if doesn't exist.",
|
||||||
|
"day note",
|
||||||
|
"returns a week note for a given date. Gets created if doesn't exist.",
|
||||||
|
"week note",
|
||||||
|
"month note",
|
||||||
|
"year note",
|
||||||
|
"get an ETAPI token based on password for further use with ETAPI",
|
||||||
|
"user's password used to e.g. login to Trilium server and/or protect notes",
|
||||||
|
"auth token",
|
||||||
|
"Client IP has been blacklisted because too many requests (possibly failed authentications) were made within a short time frame, try again later",
|
||||||
|
"logout (delete/deactivate) an ETAPI token",
|
||||||
|
"logout successful",
|
||||||
|
"returns information about the running Trilium instance",
|
||||||
|
"app info",
|
||||||
|
"If the backupName is e.g. \"now\", then the backup will be written to \"backup-now.db\" file",
|
||||||
|
"Create a database backup under a given name",
|
||||||
|
"backup has been created",
|
||||||
|
"Basic Auth where username is arbitrary string (e.g. \"trilium\", not checked), username is the ETAPI token. To emphasize, do not use Trilium password here (won't work), only the generated ETAPI token (from Options -> ETAPI)\n",
|
||||||
|
"Note ID of the parent note in the tree",
|
||||||
|
"this needs to be specified only for note types 'code', 'file', 'image'.",
|
||||||
|
"Position of the note in the parent. Normal ordering is 10, 20, 30 ... So if you want to create a note on the first position, use e.g. 5, for second position 15, for last e.g. 1000000\n",
|
||||||
|
"Prefix is branch (placement) specific title prefix for the note. Let's say you have your note placed into two different places in the tree, but you want to change the title a bit in one of the placements. For this you can use prefix.\n",
|
||||||
|
"true if this note (as a folder) should appear expanded",
|
||||||
|
"DON'T specify unless you want to force a specific noteId",
|
||||||
|
"DON'T specify unless you want to force a specific branchId",
|
||||||
|
"Local timestap of the note creation. Specify only if you want to override the default (current datetime in the current timezone/offset).",
|
||||||
|
"UTC timestap of the note creation. Specify only if you want to override the default (current datetime).",
|
||||||
|
"ID of the blob object which effectively serves as a content hash",
|
||||||
|
"Branch places the note into the tree, it represents the relationship between a parent note and child note",
|
||||||
|
"identifies the child note",
|
||||||
|
"identifies the parent note",
|
||||||
|
"Attachment is owned by a note, has title and content",
|
||||||
|
"identifies the owner of the attachment, is either noteId or revisionId",
|
||||||
|
"Attribute (Label, Relation) is a key-value record attached to a note.",
|
||||||
|
"debugging info on parsing the search query enabled with &debug=true parameter",
|
||||||
|
"Trilium version",
|
||||||
|
"DB version",
|
||||||
|
"Sync protocol version",
|
||||||
|
"build date",
|
||||||
|
"git build revision",
|
||||||
|
"data directory where Trilium stores files",
|
||||||
|
"version of the supported Trilium Web Clipper protocol",
|
||||||
|
"current UTC date time",
|
||||||
|
"HTTP status, identical to the one given in HTTP response",
|
||||||
|
"stable string constant",
|
||||||
|
"Human readable error, potentially with more details,"
|
||||||
|
]
|
||||||
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
@@ -0,0 +1,168 @@
|
|||||||
|
[
|
||||||
|
"Trilium Notes - Sync server API",
|
||||||
|
"This is the internal sync server API used by Trilium Notes / TriliumNext Notes.\n\n_If you're looking for the officially supported External Trilium API, see [here](https://triliumnext.github.io/Docs/Wiki/etapi.html)._\n\nThis page does not yet list all routes. For a full list, see the [route controller](https://github.com/TriliumNext/Notes/blob/v0.91.6/src/routes/routes.ts).",
|
||||||
|
"Sync documentSecret value",
|
||||||
|
"First step to logging in.",
|
||||||
|
"Successful operation",
|
||||||
|
"List available models from Anthropic",
|
||||||
|
"Optional custom Anthropic API base URL",
|
||||||
|
"List of available Anthropic models",
|
||||||
|
"Error listing models",
|
||||||
|
"Get installation info",
|
||||||
|
"Server implementation",
|
||||||
|
"Installation info",
|
||||||
|
"value of process.version",
|
||||||
|
"Delete branch (note clone)",
|
||||||
|
"Task group identifier",
|
||||||
|
"Whether to erase the note immediately",
|
||||||
|
"Whether this is the last request of this task group",
|
||||||
|
"Branch successfully deleted",
|
||||||
|
"Whether the last note clone was deleted",
|
||||||
|
"Find similar notes based on a given note ID",
|
||||||
|
"Embedding provider ID",
|
||||||
|
"Embedding model ID",
|
||||||
|
"Maximum number of similar notes to return",
|
||||||
|
"Similarity threshold (0.0-1.0)",
|
||||||
|
"List of similar notes",
|
||||||
|
"Invalid request parameters",
|
||||||
|
"Note not found",
|
||||||
|
"Search for notes similar to provided text",
|
||||||
|
"Text to search with",
|
||||||
|
"Get available embedding providers",
|
||||||
|
"List of available embedding providers",
|
||||||
|
"Update embedding provider configuration",
|
||||||
|
"Provider ID to update",
|
||||||
|
"Whether provider is enabled",
|
||||||
|
"Priority order (lower is higher priority)",
|
||||||
|
"Provider-specific configuration",
|
||||||
|
"Provider updated successfully",
|
||||||
|
"Invalid provider ID or configuration",
|
||||||
|
"Reprocess embeddings for all notes",
|
||||||
|
"Provider ID to use for reprocessing",
|
||||||
|
"Model ID to use for reprocessing",
|
||||||
|
"Whether to reprocess notes that already have embeddings",
|
||||||
|
"Reprocessing started",
|
||||||
|
"Get status of the embedding processing queue",
|
||||||
|
"Optional job ID to get status for a specific processing job",
|
||||||
|
"Queue status information",
|
||||||
|
"Progress percentage (0-100)",
|
||||||
|
"Get embedding statistics",
|
||||||
|
"Embedding statistics",
|
||||||
|
"Get list of notes that failed embedding generation",
|
||||||
|
"List of failed notes",
|
||||||
|
"Retry generating embeddings for a failed note",
|
||||||
|
"Note ID to retry",
|
||||||
|
"Provider ID to use (defaults to configured default)",
|
||||||
|
"Model ID to use (defaults to provider default)",
|
||||||
|
"Retry result",
|
||||||
|
"Invalid request",
|
||||||
|
"Retry generating embeddings for all failed notes",
|
||||||
|
"Retry started",
|
||||||
|
"Rebuild the vector store index",
|
||||||
|
"Rebuild started",
|
||||||
|
"Get status of the vector index rebuild operation",
|
||||||
|
"Optional job ID to get status for a specific rebuild job",
|
||||||
|
"Rebuild status information",
|
||||||
|
"Create a new LLM chat session",
|
||||||
|
"Title for the chat session",
|
||||||
|
"System message to set the behavior of the assistant",
|
||||||
|
"Temperature parameter for the LLM (0.0-1.0)",
|
||||||
|
"Maximum tokens to generate in responses",
|
||||||
|
"Specific model to use (depends on provider)",
|
||||||
|
"LLM provider to use (e.g., 'openai', 'anthropic', 'ollama')",
|
||||||
|
"Note ID to use as context for the session",
|
||||||
|
"Successfully created session",
|
||||||
|
"List all chat sessions",
|
||||||
|
"List of chat sessions",
|
||||||
|
"Retrieve a specific chat session",
|
||||||
|
"Chat session details",
|
||||||
|
"Session not found",
|
||||||
|
"Delete a chat session",
|
||||||
|
"Session successfully deleted",
|
||||||
|
"Update a chat's settings",
|
||||||
|
"The ID of the chat note (formerly sessionId)",
|
||||||
|
"Updated title for the session",
|
||||||
|
"Updated system prompt",
|
||||||
|
"Updated temperature setting",
|
||||||
|
"Updated maximum tokens setting",
|
||||||
|
"Updated model selection",
|
||||||
|
"Updated provider selection",
|
||||||
|
"Updated note ID for context",
|
||||||
|
"Session successfully updated",
|
||||||
|
"Send a message to an LLM and get a response",
|
||||||
|
"The user message to send to the LLM",
|
||||||
|
"Optional parameters for this specific message",
|
||||||
|
"Whether to include relevant notes as context",
|
||||||
|
"Whether to use the session's context note",
|
||||||
|
"LLM response",
|
||||||
|
"Error processing request",
|
||||||
|
"Get stats about the LLM knowledge base indexing status",
|
||||||
|
"Index stats successfully retrieved",
|
||||||
|
"Start or continue indexing the knowledge base",
|
||||||
|
"Whether to force reindexing of all notes",
|
||||||
|
"Indexing started successfully",
|
||||||
|
"Get list of notes that failed to index",
|
||||||
|
"Failed indexes successfully retrieved",
|
||||||
|
"Retry indexing all failed notes",
|
||||||
|
"Retry of all failed indexes successfully initiated",
|
||||||
|
"Retry indexing a specific note that previously failed",
|
||||||
|
"Index retry successfully initiated",
|
||||||
|
"Index a specific note for LLM knowledge base",
|
||||||
|
"Note indexed successfully",
|
||||||
|
"Find notes similar to a query string",
|
||||||
|
"Similar notes found successfully",
|
||||||
|
"Generate context for an LLM query based on the knowledge base",
|
||||||
|
"Context generated successfully",
|
||||||
|
"Stream a message to an LLM via WebSocket",
|
||||||
|
"The ID of the chat note to stream messages to (formerly sessionId)",
|
||||||
|
"Whether to use advanced context extraction",
|
||||||
|
"Whether to show thinking process in the response",
|
||||||
|
"Streaming started successfully",
|
||||||
|
"Log in using documentSecret",
|
||||||
|
"The `hash` parameter is computed using a HMAC of the `documentSecret` and `timestamp`.",
|
||||||
|
"HMAC calculation",
|
||||||
|
"Sync version / document secret mismatch",
|
||||||
|
"Timestamp mismatch",
|
||||||
|
"Retrieve note metadata",
|
||||||
|
"Note metadata",
|
||||||
|
"Delete note",
|
||||||
|
"Note successfully deleted",
|
||||||
|
"Retrieve note content",
|
||||||
|
"Note content",
|
||||||
|
"Retrieve note metadata (limited to timestamps)",
|
||||||
|
"List available models from Ollama",
|
||||||
|
"Optional custom Ollama API base URL",
|
||||||
|
"List of available Ollama models",
|
||||||
|
"List available models from OpenAI",
|
||||||
|
"Optional custom OpenAI API base URL",
|
||||||
|
"List of available OpenAI models",
|
||||||
|
"Pull sync changes",
|
||||||
|
"Local instance ID",
|
||||||
|
"Last locally present change ID",
|
||||||
|
"Marker to identify this request in server log",
|
||||||
|
"Sync changes, limited to approximately one megabyte.",
|
||||||
|
"If `outstandingPullCount > 0`, pass this as parameter in your next request to continue.",
|
||||||
|
"Number of changes not yet returned by the remote.",
|
||||||
|
"Push sync changes",
|
||||||
|
"Basic usage: set `pageCount = 1`, `pageIndex = 0`, and omit `requestId`. Supply your entity changes in the request body.",
|
||||||
|
"ID to identify paginated requests",
|
||||||
|
"Changes processed successfully",
|
||||||
|
"Retrieve tree data",
|
||||||
|
"Limit tree data to this note and descendants",
|
||||||
|
"Notes, branches and attributes",
|
||||||
|
"Log in using password",
|
||||||
|
"This will give you a Trilium session, which is required for some other API endpoints. `totpToken` is only required if the user configured TOTP authentication.",
|
||||||
|
"Password / TOTP mismatch",
|
||||||
|
"If type = \"relation\", a note ID. Otherwise, the attribute content.",
|
||||||
|
"`null` if not text.",
|
||||||
|
"Equal to `{parentNoteId}_{noteId}`",
|
||||||
|
"Database table for this entity.",
|
||||||
|
"ID, referenced in `entity_changes` table.",
|
||||||
|
"Encoded entity data. Object has one property for each database column.",
|
||||||
|
"[Reference list](https://github.com/TriliumNext/Notes/blob/v0.91.6/src/services/note_types.ts)",
|
||||||
|
"12-character note ID. Special values: \"none\"`, `\"root\".",
|
||||||
|
"Result of `new Date().toISOString().replace('T', ' ')`",
|
||||||
|
"Username and password, formatted as `user:password`",
|
||||||
|
"Authentication",
|
||||||
|
"Synchronization"
|
||||||
|
]
|
||||||
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,198 @@
|
|||||||
|
[
|
||||||
|
"Container of all the rendered script content",
|
||||||
|
"e.g.",
|
||||||
|
"ctrl+shift+a",
|
||||||
|
"specify namespace of the handler for the cases where call for bind may be repeated.\nIf a handler with this ID exists, it's replaced by the new handler.",
|
||||||
|
"Create a note link (jQuery object) for given note.",
|
||||||
|
"(or noteId)",
|
||||||
|
"Deprecated",
|
||||||
|
"use api.createLink() instead",
|
||||||
|
"Note where the script is currently executing, i.e. the note where the currently executing source code is written.",
|
||||||
|
"day.js library for date manipulation.\nSee",
|
||||||
|
"https://day.js.org",
|
||||||
|
"for documentation",
|
||||||
|
"See",
|
||||||
|
"this is producing local time! *",
|
||||||
|
"Returns",
|
||||||
|
"date in YYYY-MM-DD format",
|
||||||
|
"in bytes",
|
||||||
|
"use api.formatSize()",
|
||||||
|
"Returns day note for a given date. If it doesn't exist, it is automatically created.",
|
||||||
|
"Returns month-note. If it doesn't exist, it is automatically created.",
|
||||||
|
"Returns quarter note for given date. If such a note doesn't exist, it is automatically created.",
|
||||||
|
"Returns date-note for today. If it doesn't exist, it is automatically created.",
|
||||||
|
"Returns day note for the first date of the week of the given date. If it doesn't exist, it is automatically created.",
|
||||||
|
"Returns week note for given date. If such a note doesn't exist, it is automatically created.",
|
||||||
|
"Returns year-note. If it doesn't exist, it is automatically created.",
|
||||||
|
"Method",
|
||||||
|
"Entity whose event triggered this execution.",
|
||||||
|
"true to protect note, false to unprotect",
|
||||||
|
"true to protect subtree, false to unprotect",
|
||||||
|
"Return randomly generated string of given length. This random string generation is NOT cryptographically secure.",
|
||||||
|
"jquery object on which to set up the tooltip",
|
||||||
|
"Show confirm dialog to the user.",
|
||||||
|
"Show an error toast message to the user.",
|
||||||
|
"Show an info dialog to the user.",
|
||||||
|
"Show an info toast message to the user.",
|
||||||
|
"Show prompt dialog to the user.",
|
||||||
|
"Note where the script started executing, i.e., the (event) entrypoint of the current script execution.",
|
||||||
|
"Trigger command. This is a very low-level API which should be avoided if possible.",
|
||||||
|
"Trigger event. This is a very low-level API which should be avoided if possible.",
|
||||||
|
"Trilium runs in a backend and frontend process, when something is changed on the backend from a script,\nfrontend will get asynchronously synchronized.",
|
||||||
|
"This method returns a promise which resolves once all the backend -",
|
||||||
|
"frontend synchronization is finished.\nTypical use case is when a new note has been created, we should wait until it is synced into frontend and only then activate it.",
|
||||||
|
"Activates newly created note. Compared to this.activateNote() also makes sure that frontend has been fully synced.",
|
||||||
|
"Activates note in the tree and in the note detail.",
|
||||||
|
"Adds a new launcher to the launchbar. If the launcher (id) already exists, it will be updated.",
|
||||||
|
"you can now create/modify launchers in the top-left Menu -",
|
||||||
|
"Configure Launchbar\nfor special needs there's also backend API's createOrUpdateLauncher()",
|
||||||
|
"Adds given text to the editor cursor",
|
||||||
|
"this must be clear text, HTML is not supported.",
|
||||||
|
"https://codemirror.net/doc/manual.html#api",
|
||||||
|
"https://ckeditor.com/docs/ckeditor5/latest/api/module_core_editor_editor-Editor.html",
|
||||||
|
"for documentation on the returned instance.",
|
||||||
|
"Get access to the widget handling note detail. Methods like",
|
||||||
|
"and",
|
||||||
|
"to get to the\nimplementation of actual widget type.",
|
||||||
|
"Returns component which owns the given DOM element (the nearest parent component in DOM tree)",
|
||||||
|
"DOM element",
|
||||||
|
"Instance name identifies particular Trilium instance. It can be useful for scripts\nif some action needs to happen on only one specific instance.",
|
||||||
|
"Returns note by given noteId. If note is missing from the cache, it's loaded.",
|
||||||
|
"Returns list of notes. If note is missing from the cache, it's loaded.",
|
||||||
|
"This is often used to bulk-fill the cache with notes which would have to be picked one by one\notherwise (by e.g. createLink())",
|
||||||
|
"don't report error if the note is not found",
|
||||||
|
"Log given message to the log pane in UI",
|
||||||
|
"Open a note in a new split.",
|
||||||
|
"set to true to activate the new split, false to stay on the current split",
|
||||||
|
"Open a note in a new tab.",
|
||||||
|
"set to true to activate the new tab, false to stay on the current tab",
|
||||||
|
"This will refresh all currently opened notes which have included note specified in the parameter",
|
||||||
|
"noteId of the included note",
|
||||||
|
"Update frontend tree (note) cache from the backend.",
|
||||||
|
"Executes given anonymous function on the backend.\nInternally this serializes the anonymous function into string and sends it to backend via AJAX.\nThis function is meant for advanced needs where an async function is necessary.\nIn this case, the automatic request-scoped transaction management is not applied,\nand you need to manually define transaction via api.transactional().",
|
||||||
|
"If you have a synchronous function, please use api.runOnBackend().",
|
||||||
|
"(synchronous) function to be executed on the backend",
|
||||||
|
"list of parameters to the anonymous function to be sent to backend",
|
||||||
|
"Executes given anonymous function on the backend.\nInternally this serializes the anonymous function into string and sends it to backend via AJAX.\nPlease make sure that the supplied function is synchronous. Only sync functions will work correctly\nwith transaction management. If you really know what you're doing, you can call api.runAsyncOnBackendWithManualTransactionHandling()",
|
||||||
|
"This is a powerful search method - you can search by attributes and their values, e.g.:",
|
||||||
|
"#dateModified =* MONTH AND #log",
|
||||||
|
". See full documentation for all options at:",
|
||||||
|
"https://triliumnext.github.io/Docs/Wiki/search.html",
|
||||||
|
"Hoist note in the current tab. See",
|
||||||
|
"https://triliumnext.github.io/Docs/Wiki/note-hoisting.html",
|
||||||
|
"set hoisted note. 'root' will effectively unhoist",
|
||||||
|
"Note is the main node and concept in Trilium.",
|
||||||
|
"content-type, e.g.",
|
||||||
|
"application/json",
|
||||||
|
"Executes this FNote as a front-end or back-end script.",
|
||||||
|
"Throws",
|
||||||
|
"an Error if the note has an incorrect note type or MIME for execution.",
|
||||||
|
"Gives all possible note paths leading to this note. Paths containing search note are ignored (could form cycles)",
|
||||||
|
"attribute type (label, relation, etc.)",
|
||||||
|
"attribute name",
|
||||||
|
"attribute type to filter",
|
||||||
|
"attribute name to filter",
|
||||||
|
"Returns the note path considered to be the",
|
||||||
|
"best",
|
||||||
|
"use getParentBranches() instead",
|
||||||
|
"use getParentBranchIds() instead",
|
||||||
|
"label name",
|
||||||
|
"label name to filter",
|
||||||
|
"Provides note's date metadata.",
|
||||||
|
"use getBlob() instead",
|
||||||
|
"relation name",
|
||||||
|
"relation name to filter",
|
||||||
|
"Get relations which target this note",
|
||||||
|
"NOOP",
|
||||||
|
"This object contains",
|
||||||
|
"at your risk",
|
||||||
|
"no BC guarantees",
|
||||||
|
"objects for advanced use cases.",
|
||||||
|
"provides access to the backend in-memory object graph, see",
|
||||||
|
"Becca",
|
||||||
|
"Axios library for HTTP requests. See",
|
||||||
|
"https://axios-http.com",
|
||||||
|
"use native (browser compatible) fetch() instead",
|
||||||
|
"cheerio library for HTML parsing and manipulation. See",
|
||||||
|
"https://cheerio.js.org",
|
||||||
|
"Note where the script is currently executing. This comes into play when your script is spread in multiple code\nnotes, the script starts in",
|
||||||
|
"startNote",
|
||||||
|
", but then through function calls may jump into another note (currentNote).\nA similar concept in C would be",
|
||||||
|
"FILE",
|
||||||
|
"Don't mix this up with the concept of active note.",
|
||||||
|
"day.js library for date manipulation. See",
|
||||||
|
"Entity whose event triggered this execution",
|
||||||
|
"sql",
|
||||||
|
"Note where the script started executing (entrypoint).\nAs an analogy, in C this would be the file which contains the main() function of the current process.",
|
||||||
|
"xml2js library for XML parsing. See",
|
||||||
|
"https://github.com/Leonidas-from-XIV/node-xml2js",
|
||||||
|
"If the backupName is e.g.",
|
||||||
|
"now",
|
||||||
|
", then the backup will be written to",
|
||||||
|
"backup-now.db",
|
||||||
|
"file",
|
||||||
|
"Create data note - data in this context means object serializable to JSON. Created note will be of type 'code' and\nJSON MIME type. See also createNewNote() for more options.",
|
||||||
|
"create new note under this parent",
|
||||||
|
"should the note be JSON",
|
||||||
|
"please use createTextNote() with similar API for simpler use cases or createNewNote() for more complex needs",
|
||||||
|
"Creates a new launcher to the launchbar. If the launcher (id) already exists, it will be updated.",
|
||||||
|
"name of the boxicon to be used (e.g.",
|
||||||
|
"bx-time",
|
||||||
|
"id of the launcher, only alphanumeric at least 6 characters long",
|
||||||
|
"if true, will be created in the",
|
||||||
|
"Visible launchers",
|
||||||
|
", otherwise in",
|
||||||
|
"Available launchers",
|
||||||
|
"will activate the target note/script upon pressing, e.g.",
|
||||||
|
"ctrl+e",
|
||||||
|
"for type",
|
||||||
|
"script",
|
||||||
|
"note",
|
||||||
|
"one of",
|
||||||
|
"- activating the launcher will navigate to the target note (specified in targetNoteId param)",
|
||||||
|
"- activating the launcher will execute the script (specified in scriptNoteId param)",
|
||||||
|
"customWidget",
|
||||||
|
"- the launcher will be rendered with a custom widget (specified in widgetNoteId param)",
|
||||||
|
"Create text note. See also createNewNote() for more options.",
|
||||||
|
"If there's a branch between note and parent note, remove it. Otherwise, do nothing.",
|
||||||
|
"If there's no branch between note and parent note, create one. Otherwise, do nothing. Returns the new or existing branch.",
|
||||||
|
"if branch is created between note and parent note, set this prefix",
|
||||||
|
"either 'html' or 'markdown'",
|
||||||
|
"Returns day note for given date. If such note doesn't exist, it is created.",
|
||||||
|
"in YYYY-MM-DD format",
|
||||||
|
"specify calendar root note, normally leave empty to use the default calendar",
|
||||||
|
"Returns month note for given date. If such a note doesn't exist, it is created.",
|
||||||
|
"in YYYY-MM format",
|
||||||
|
"Retrieves notes with given label name",
|
||||||
|
"value",
|
||||||
|
"attribute value",
|
||||||
|
"Retrieves first note with given label name",
|
||||||
|
"Returns quarter note for given date. If such a note doesn't exist, it is created.",
|
||||||
|
"Returns root note of the calendar.",
|
||||||
|
"Returns today's day note. If such note doesn't exist, it is created.",
|
||||||
|
"Returns note for the first date of the week of the given date.",
|
||||||
|
"Returns week note for given date. If such a note doesn't exist, it is created.",
|
||||||
|
"Returns year note for given year. If such a note doesn't exist, it is created.",
|
||||||
|
"in YYYY format",
|
||||||
|
"Log given message to trilium logs and log pane in UI",
|
||||||
|
"of the string",
|
||||||
|
"Executes given anonymous function on the frontend(s).\nInternally, this serializes the anonymous function into string and sends it to frontend(s) via WebSocket.\nNote that there can be multiple connected frontend instances (e.g. in different tabs). In such case, all\ninstances execute the given function.",
|
||||||
|
"script to be executed on the frontend",
|
||||||
|
"list of parameters to the anonymous function to be sent to frontend",
|
||||||
|
"Sync process can make data intermittently inconsistent. Scripts which require strong data consistency\ncan use this function to wait for a possible sync process to finish and prevent new sync process from starting\nwhile it is running.",
|
||||||
|
"Because this is an async process, the inner callback doesn't have automatic transaction handling, so in case\nyou need to make some DB changes, you need to surround your call with api.transactional(...)",
|
||||||
|
"function to be executed while sync process is not running",
|
||||||
|
". See",
|
||||||
|
"for full documentation for all options",
|
||||||
|
"This method finds note by its noteId and prefix and either sets it to the given parentNoteId\nor removes the branch (if parentNoteId is not given).",
|
||||||
|
"This method looks similar to toggleNoteInParent() but differs because we're looking up branch by prefix.",
|
||||||
|
"this method is pretty confusing and serves specialized purpose only",
|
||||||
|
"Sort child notes of a given note.",
|
||||||
|
"'title', 'dateCreated', 'dateModified' or a label name\nSee",
|
||||||
|
"https://triliumnext.github.io/Docs/Wiki/sorting.html",
|
||||||
|
"for details.",
|
||||||
|
"Based on the value, either create or remove branch between note and parent note.",
|
||||||
|
"true if we want the branch to exist, false if we want it gone",
|
||||||
|
"This functions wraps code which is supposed to be running in transaction. If transaction already\nexists, then we'll use that transaction.",
|
||||||
|
"to unescape"
|
||||||
|
]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"bugs":{"url":"https://github.com/swagger-api/swagger-ui/issues"},"dist":{"shasum":"aed230fe6e294c9470217e67697d601e3bb8eb9d","tarball":"https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.21.0.tgz","fileCount":24,"integrity":"sha512-E0K3AB6HvQd8yQNSMR7eE5bk+323AUxjtCz/4ZNKiahOlPhPJxqn3UPIGs00cyY/dhrTDJ61L7C/a8u6zhGrZg==","signatures":[{"sig":"MEUCIQDXIQqBFZmdQVVV8fbD1WyoS9nG07X9ySnnkFSF4Kqe6gIgNRc0nVyHxcj2jS7KrFY3N82R529M5Jvaq4V8TBgecLI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11415132},"main":"index.js","name":"swagger-ui-dist","gitHead":"fceaec605072fbc717a04895bd19814d9a1c8e6d","license":"Apache-2.0","_npmUser":{"name":"swagger-api","email":"apiteam@swagger.io"},"homepage":"https://github.com/swagger-api/swagger-ui#readme","repository":{"url":"git+ssh://git@github.com/swagger-api/swagger-ui.git","type":"git"},"_npmVersion":"9.6.7","description":"[](http://badge.fury.io/js/swagger-ui-dist)","directories":{},"maintainers":[{"name":"swagger-admin","email":"apiteam@swagger.io"},{"name":"ponelat","email":"jponelat@gmail.com"},{"name":"swagger-api","email":"apiteam@swagger.io"},{"name":"kyleshockey","email":"kyleshockey@gmail.com"}],"_nodeVersion":"18.17.1","contributors":[{"url":"in alphabetical order"},{"name":"Anna Bodnia","email":"anna.bodnia@gmail.com"},{"name":"Buu Nguyen","email":"buunguyen@gmail.com"},{"name":"Josh Ponelat","email":"jponelat@gmail.com"},{"name":"Kyle Shockey","email":"kyleshockey1@gmail.com"},{"name":"Robert Barnwell","email":"robert@robertismy.name"},{"name":"Sahar Jafari","email":"shr.jafari@gmail.com"}],"dependencies":{"@scarf/scarf":"=1.4.0"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/swagger-ui-dist_5.21.0_1744573302493_0.018087980981981833","host":"s3://npm-registry-packages-npm-production"},"_id":"swagger-ui-dist@5.21.0","version":"5.21.0"}
|
||||||
@@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
swagger-ui
|
||||||
|
Copyright 2020-2021 SmartBear Software Inc.
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 665 B |
Binary file not shown.
|
After Width: | Height: | Size: 628 B |
+79
@@ -0,0 +1,79 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<title>Swagger UI: OAuth2 Redirect</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
'use strict';
|
||||||
|
function run () {
|
||||||
|
var oauth2 = window.opener.swaggerUIRedirectOauth2;
|
||||||
|
var sentState = oauth2.state;
|
||||||
|
var redirectUrl = oauth2.redirectUrl;
|
||||||
|
var isValid, qp, arr;
|
||||||
|
|
||||||
|
if (/code|token|error/.test(window.location.hash)) {
|
||||||
|
qp = window.location.hash.substring(1).replace('?', '&');
|
||||||
|
} else {
|
||||||
|
qp = location.search.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
arr = qp.split("&");
|
||||||
|
arr.forEach(function (v,i,_arr) { _arr[i] = '"' + v.replace('=', '":"') + '"';});
|
||||||
|
qp = qp ? JSON.parse('{' + arr.join() + '}',
|
||||||
|
function (key, value) {
|
||||||
|
return key === "" ? value : decodeURIComponent(value);
|
||||||
|
}
|
||||||
|
) : {};
|
||||||
|
|
||||||
|
isValid = qp.state === sentState;
|
||||||
|
|
||||||
|
if ((
|
||||||
|
oauth2.auth.schema.get("flow") === "accessCode" ||
|
||||||
|
oauth2.auth.schema.get("flow") === "authorizationCode" ||
|
||||||
|
oauth2.auth.schema.get("flow") === "authorization_code"
|
||||||
|
) && !oauth2.auth.code) {
|
||||||
|
if (!isValid) {
|
||||||
|
oauth2.errCb({
|
||||||
|
authId: oauth2.auth.name,
|
||||||
|
source: "auth",
|
||||||
|
level: "warning",
|
||||||
|
message: "Authorization may be unsafe, passed state was changed in server. The passed state wasn't returned from auth server."
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qp.code) {
|
||||||
|
delete oauth2.state;
|
||||||
|
oauth2.auth.code = qp.code;
|
||||||
|
oauth2.callback({auth: oauth2.auth, redirectUrl: redirectUrl});
|
||||||
|
} else {
|
||||||
|
let oauthErrorMsg;
|
||||||
|
if (qp.error) {
|
||||||
|
oauthErrorMsg = "["+qp.error+"]: " +
|
||||||
|
(qp.error_description ? qp.error_description+ ". " : "no accessCode received from the server. ") +
|
||||||
|
(qp.error_uri ? "More info: "+qp.error_uri : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
oauth2.errCb({
|
||||||
|
authId: oauth2.auth.name,
|
||||||
|
source: "auth",
|
||||||
|
level: "error",
|
||||||
|
message: oauthErrorMsg || "[Authorization failed]: no accessCode received from the server."
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid, redirectUrl: redirectUrl});
|
||||||
|
}
|
||||||
|
window.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (document.readyState !== 'loading') {
|
||||||
|
run();
|
||||||
|
} else {
|
||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
run();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "swagger-ui-dist",
|
||||||
|
"version": "5.21.0",
|
||||||
|
"main": "index.js",
|
||||||
|
"repository": "git@github.com:swagger-api/swagger-ui.git",
|
||||||
|
"contributors": [
|
||||||
|
"(in alphabetical order)",
|
||||||
|
"Anna Bodnia <anna.bodnia@gmail.com>",
|
||||||
|
"Buu Nguyen <buunguyen@gmail.com>",
|
||||||
|
"Josh Ponelat <jponelat@gmail.com>",
|
||||||
|
"Kyle Shockey <kyleshockey1@gmail.com>",
|
||||||
|
"Robert Barnwell <robert@robertismy.name>",
|
||||||
|
"Sahar Jafari <shr.jafari@gmail.com>"
|
||||||
|
],
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@scarf/scarf": "=1.4.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {}
|
||||||
|
}
|
||||||
+2
File diff suppressed because one or more lines are too long
+2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,57 @@
|
|||||||
|
from html.parser import HTMLParser
|
||||||
|
from pathlib import Path
|
||||||
|
from urllib.parse import urljoin
|
||||||
|
import json,html,re
|
||||||
|
b=Path('work/trilium');src=b/'api-source';out=b/'phase9/doc_notes/en/api-ko';out.mkdir(parents=True,exist_ok=True)
|
||||||
|
original=json.loads((src/'script-strings.json').read_text(encoding='utf-8'));translated=(b/'api-script-ko.txt').read_text(encoding='utf-8').splitlines();assert len(original)==len(translated)
|
||||||
|
mapping=dict(zip(original,translated));ui={'Index':'목차','Properties':'속성','Methods':'메서드','Constructors':'생성자','Constructor':'생성자','Parameters':'매개변수','Returns':'반환값','Type declaration':'형식 선언','Type Parameters':'형식 매개변수','Inherited from':'상속한 항목','Overrides':'재정의한 항목','Defined in':'정의 위치','Optional':'선택 사항','Readonly':'읽기 전용','Protected':'보호됨','Private':'비공개','Static':'정적','Permalink':'고유 링크','Interface':'인터페이스','Class':'클래스','Hierarchy':'상속 구조','Implements':'구현','Accessors':'접근자','Default':'기본값'}
|
||||||
|
mapping.update(json.loads((b/'api-script-extra.json').read_text(encoding='utf-8')))
|
||||||
|
urls={'frontend':'https://triliumnext.github.io/Notes/Script%20API/interfaces/Frontend_Script_API.Api.html','fnote':'https://triliumnext.github.io/Notes/Script%20API/classes/Frontend_Script_API.FNote.html','backend':'https://triliumnext.github.io/Notes/Script%20API/interfaces/Backend_Script_API.Api.html'}
|
||||||
|
titles={'frontend':'프런트엔드 스크립트 API','fnote':'프런트엔드 노트 객체 FNote','backend':'백엔드 스크립트 API'}
|
||||||
|
class Page(HTMLParser):
|
||||||
|
def __init__(self,url):super().__init__(convert_charrefs=False);self.url=url;self.depth=0;self.parts=[];self.tags=[];self.count=0;self.untranslated=[]
|
||||||
|
def handle_starttag(self,t,attrs):
|
||||||
|
a=dict(attrs)
|
||||||
|
if not self.depth:
|
||||||
|
if t=='div' and a.get('class')=='col-content':self.depth=1
|
||||||
|
else:return
|
||||||
|
else:
|
||||||
|
if t=='div':self.depth+=1
|
||||||
|
self.tags.append(t) if t not in ['br','hr','wbr','img','input','meta','link','use'] else None
|
||||||
|
if t=='a' and 'href'in a and not a['href'].startswith('#'):
|
||||||
|
absolute=urljoin(self.url,a['href']);a['href']=absolute
|
||||||
|
for n,u in urls.items():
|
||||||
|
if absolute.split('#')[0]==u:a['href']=n+'.html'+('#'+absolute.split('#',1)[1] if '#'in absolute else '')
|
||||||
|
for k in ['title','aria-label']:
|
||||||
|
if k in a:a[k]=ui.get(a[k],a[k])
|
||||||
|
self.parts.append('<'+t+''.join(' '+k+'="'+html.escape(v or '',quote=True)+'"' for k,v in a.items())+'>')
|
||||||
|
def handle_startendtag(self,t,a):
|
||||||
|
self.handle_starttag(t,a)
|
||||||
|
if t not in ['br','hr','wbr','img','input','meta','link','use']:self.handle_endtag(t)
|
||||||
|
def handle_endtag(self,t):
|
||||||
|
if not self.depth:return
|
||||||
|
self.parts.append('</'+t+'>')
|
||||||
|
if t=='div':self.depth-=1
|
||||||
|
for i in range(len(self.tags)-1,-1,-1):
|
||||||
|
if self.tags[i]==t:self.tags=self.tags[:i];break
|
||||||
|
def handle_data(self,s):
|
||||||
|
if not self.depth:return
|
||||||
|
k=s.strip();v=s
|
||||||
|
if not any(t in ['pre','code'] for t in self.tags):
|
||||||
|
if k in mapping:v=s.replace(k,mapping[k]);self.count+=1
|
||||||
|
elif k in ui:v=s.replace(k,ui[k])
|
||||||
|
elif re.match(r'^(Interface|Class|Defined in|Inherited from|Overrides|Returns)\b',k):
|
||||||
|
for a,c in ui.items():v=v.replace(a,c)
|
||||||
|
elif re.search(r'[a-zA-Z]{2,}\s+[a-zA-Z]{2,}',k):self.untranslated.append(k)
|
||||||
|
self.parts.append(html.escape(v,quote=False))
|
||||||
|
def handle_entityref(self,n):
|
||||||
|
if self.depth:self.parts.append('&'+n+';')
|
||||||
|
def handle_charref(self,n):
|
||||||
|
if self.depth:self.parts.append('&#'+n+';')
|
||||||
|
style='body{font:16px/1.7 system-ui,sans-serif;max-width:1050px;margin:24px auto;padding:0 22px;color:#24292f}a{color:#075fbd}pre,.tsd-signature{background:#f3f5f7;padding:12px;overflow:auto}code{font-family:monospace}.tsd-kind-icon{width:18px;height:18px}section{margin:20px 0}h2{border-bottom:1px solid #ddd}h3{margin-top:30px}ul{padding-left:24px}.tsd-anchor-icon{display:none}nav{background:#eef6ff;padding:12px}details{margin:12px 0}svg{display:none}'
|
||||||
|
report={}
|
||||||
|
for n,url in urls.items():
|
||||||
|
p=Page(url);p.feed((src/(n+'.html')).read_text(encoding='utf-8'));assert p.count>0
|
||||||
|
page='<!doctype html><html lang="ko"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>'+titles[n]+'</title><style>'+style+'</style><body><h1>'+titles[n]+'</h1><nav><a href="frontend.html">프런트엔드 API</a> · <a href="fnote.html">노트 객체</a> · <a href="backend.html">백엔드 API</a></nav><p>연결된 공식 문서의 한국어 사본입니다. 함수 이름과 코드 문법은 원문을 유지했습니다. 외부 문서는 운영 버전과 다를 수 있으므로 지원 여부를 확인하세요. <a href="'+url+'" target="_blank" rel="noopener">공식 원문 보기</a></p>'+''.join(p.parts)+'</body></html>'
|
||||||
|
(out/(n+'.html')).write_text(page,encoding='utf-8');report[n]={'translatedTextNodes':p.count,'remainingProse':list(dict.fromkeys(p.untranslated))}
|
||||||
|
(b/'phase9/script-audit.json').write_text(json.dumps(report,ensure_ascii=False,indent=2),encoding='utf-8');print(json.dumps(report,ensure_ascii=False))
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import fs from 'node:fs';import crypto from 'node:crypto';import path from 'node:path';
|
||||||
|
const b='work/trilium',out=b+'/phase9',hash=s=>crypto.createHash('sha256').update(s).digest('hex');
|
||||||
|
const apiDir=out+'/doc_notes/en/api-ko';fs.mkdirSync(apiDir,{recursive:true});
|
||||||
|
const dist=JSON.parse(fs.readFileSync(b+'/api-source/swagger-package-metadata.json')).dist;
|
||||||
|
if('sha512-'+crypto.createHash('sha512').update(fs.readFileSync(b+'/api-source/swagger-ui-dist-5.21.0.tgz')).digest('base64')!==dist.integrity)throw Error('Swagger integrity mismatch');
|
||||||
|
fs.mkdirSync(apiDir+'/swagger',{recursive:true});
|
||||||
|
for(const n of ['swagger-ui-bundle.js','swagger-ui-standalone-preset.js','swagger-ui.css','oauth2-redirect.html','favicon-16x16.png','favicon-32x32.png','LICENSE','NOTICE','package.json'])fs.copyFileSync(b+'/api-source/swagger-package/package/'+n,apiDir+'/swagger/'+n);
|
||||||
|
const reports={};
|
||||||
|
for(const[name,file]of [['internal','trilium-openapi.json'],['etapi','etapi.json']]){
|
||||||
|
const source=JSON.parse(fs.readFileSync(b+'/api-source/'+file));
|
||||||
|
const strings=JSON.parse(fs.readFileSync(b+'/api-source/'+name+'-strings.json'));
|
||||||
|
const ko=fs.readFileSync(b+'/api-'+name+'-ko.txt','utf8').trimEnd().split(/\r?\n/).map(s=>s.replaceAll('\\n','\n'));
|
||||||
|
if(strings.length!==ko.length)throw Error('Translation count '+name);
|
||||||
|
const map=new Map(strings.map((s,i)=>[s,ko[i]]));let count=0;
|
||||||
|
function walk(o){for(const[k,v]of Object.entries(o)){if(['summary','description','title'].includes(k)&&typeof v==='string'){if(!map.has(v))throw Error(v);o[k]=map.get(v);count++;}else if(v&&typeof v==='object')walk(v);}}
|
||||||
|
walk(source);
|
||||||
|
const examples={"Note 'evnnmvHTCgIn' is protected and cannot be modified through ETAPI":"노트 'evnnmvHTCgIn'은 보호되어 있어 ETAPI로 변경할 수 없습니다.","Non-matching sync versions, local is version ${server syncVersion}, remote is ${requested syncVersion}. It is recommended to run same version of Trilium on both sides of sync":"동기화 버전이 다릅니다. 로컬 버전은 ${server syncVersion}이며 원격 버전은 ${requested syncVersion}입니다. 양쪽에서 같은 Trilium 버전을 사용하는 것이 좋습니다.","Auth request time is out of sync, please check that both client and server have correct time. The difference between clocks has to be smaller than 5 minutes":"인증 요청 시각이 맞지 않습니다. 클라이언트와 서버의 시각이 올바른지 확인하세요. 두 시계의 차이는 5분 미만이어야 합니다.","TriliumNext issue tracker":"TriliumNext 문제 신고"};
|
||||||
|
function extra(o){for(const[k,v]of Object.entries(o))if(typeof v==='string'&&Object.hasOwn(examples,v))o[k]=examples[v];else if(v&&typeof v==='object')extra(v);}extra(source);
|
||||||
|
if(name==='etapi')source.servers=[{url:'/etapi',description:'현재 Trilium 서버'}];
|
||||||
|
fs.writeFileSync(apiDir+'/'+name+'.json',JSON.stringify(source,null,2));reports[name]={fields:count,unique:map.size,paths:Object.keys(source.paths).length};
|
||||||
|
}
|
||||||
|
const uiMap={'Authorize':'인증 설정','Authorized':'인증됨','Authorization':'인증','Logout':'인증 해제','Close':'닫기','Cancel':'취소','Execute':'실행','Clear':'지우기','Try it out':'직접 실행','Parameters':'매개변수','No parameters':'매개변수 없음','Request body':'요청 본문','Responses':'응답','Server response':'서버 응답','Response body':'응답 본문','Response headers':'응답 헤더','Request URL':'요청 주소','Response content type':'응답 콘텐츠 유형','Example Value':'예시 값','Schema':'스키마','Schemas':'스키마 목록','Models':'모델 목록','Model':'모델','Servers':'서버','Available authorizations':'사용 가능한 인증 방식','Name':'이름','Description':'설명','Code':'상태 코드','Details':'상세 정보','Links':'링크','No links':'링크 없음','Value':'값','required':'필수','Required':'필수','Optional':'선택 사항','Example':'예시','Examples':'예시 목록','Download':'내려받기','Download file':'파일 내려받기','Explore':'열기','Filter by tag':'태그로 필터링','Select a definition':'명세 선택','Select a spec':'명세 선택','Username:':'사용자 이름:','Password:':'비밀번호:','Value:':'값:','Name:':'이름:','In:':'전달 위치:','Username':'사용자 이름','Password':'비밀번호','Default':'기본값','default':'기본값','No content':'내용 없음','Loading...':'불러오는 중…','Loading':'불러오는 중','Errors':'오류','Hide':'숨기기','Show':'표시','Expand operation':'항목 펼치기','Collapse operation':'항목 접기','Copy to clipboard':'클립보드에 복사','Copy':'복사','Copied':'복사됨','Send empty value':'빈 값 보내기','Edit Value':'값 편집','Reset':'초기화','Available values':'사용 가능한 값','No results found':'결과 없음','Failed to fetch':'요청 실패','Undocumented':'명세에 없는 응답'};
|
||||||
|
Object.assign(uiMap,{'Examples:':'예시:','Default value':'기본값','Media type':'콘텐츠 유형','Media Type':'콘텐츠 유형','Controls':'설정할 대상:','header.':'헤더','* required':'* 필수','authorization button unlocked':'인증 설정 안 됨','authorization button locked':'인증 설정됨','List':'목록','Download API definition':'API 명세 내려받기'});
|
||||||
|
const ui=`(()=>{const dict=${JSON.stringify(uiMap)};function tr(s){let k=s.trim();if(k.endsWith(' - Website'))return s.replace(' - Website',' 웹사이트');if(k.startsWith('Send email to '))return s.replace('Send email to ','이메일 보내기: ');return Object.hasOwn(dict,k)?s.replace(k,dict[k]):s;}function update(){const root=document.querySelector('#swagger-ui');if(!root)return;const w=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);for(let n;n=w.nextNode();){if(n.parentElement.closest('pre,code,textarea,script,style,.parameter__name,.model-title,.opblock-summary-path')&&!['required','* required'].includes(n.nodeValue.trim()))continue;const s=tr(n.nodeValue);if(s!==n.nodeValue)n.nodeValue=s;}for(const el of root.querySelectorAll('[title],[aria-label],[placeholder]'))for(const a of ['title','aria-label','placeholder'])if(el.hasAttribute(a)){const s=el.getAttribute(a),v=tr(s);if(v!==s)el.setAttribute(a,v);}}let queued=false;new MutationObserver(()=>{if(queued)return;queued=true;requestAnimationFrame(()=>{queued=false;update();});}).observe(document.body,{childList:true,subtree:true,characterData:true});update();document.documentElement.lang='ko';})();`;
|
||||||
|
fs.writeFileSync(out+'/swagger-ko.js',ui);
|
||||||
|
const ids=[['_help_Q2z6av6JZVWm','frontend','https://triliumnext.github.io/Notes/Script%20API/interfaces/Frontend_Script_API.Api.html'],['_help_habiZ3HU8Kw8','fnote','https://triliumnext.github.io/Notes/Script%20API/classes/Frontend_Script_API.FNote.html'],['_help_MEtfsqa5VwNi','backend','https://triliumnext.github.io/Notes/Script%20API/interfaces/Backend_Script_API.Api.html']];
|
||||||
|
const attrs=ids.map(([id,name,old])=>({attributeId:id+'_lwebViewSrc',noteId:id,oldValue:old,value:'/assets/v0.95.0-ko-20260913-r8/doc_notes/en/api-ko/'+name+'.html'}));
|
||||||
|
fs.writeFileSync(out+'/korean-phase9-pending.json',JSON.stringify(attrs,null,2));
|
||||||
|
const metaPath='doc_notes/en/User Guide/!!!meta.json';let meta=JSON.parse(fs.readFileSync(b+'/phase3/'+metaPath));
|
||||||
|
function wm(items){for(const n of items){let item=attrs.find(x=>x.noteId===n.id);if(item)for(const a of n.attributes)if(a.name==='webViewSrc')a.value=item.value;wm(n.children||[]);}}wm(meta);
|
||||||
|
fs.mkdirSync(path.dirname(out+'/'+metaPath),{recursive:true});fs.writeFileSync(out+'/'+metaPath,JSON.stringify(meta,null,2));
|
||||||
|
let main=fs.readFileSync(b+'/phase8/main.cjs','utf8');const oldmain=main;
|
||||||
|
function replace(a,c){if(main.split(a).length!==2)throw Error('Patch point '+a);main=main.replace(a,c);}
|
||||||
|
replace('jg=`assets/v${CR.version}-ko-20260913-r7`','jg=`assets/v${CR.version}-ko-20260913-r8`');
|
||||||
|
replace('var Y7s=function(){if(typeof D8e<"u"&&D8e.exports)return require("path").resolve(__dirname);','var Y7s=function(){if(typeof D8e<"u"&&D8e.exports)return "/usr/src/app/assets/doc_notes/en/api-ko/swagger";');
|
||||||
|
const old='function WEt(e){let t=eun.load((0,$Et.readFileSync)((0,GEt.join)(wp,"etapi.openapi.yaml"),"utf8")),r=JSON.parse((0,$Et.readFileSync)((0,GEt.join)(wp,"openapi.json"),"utf-8"));';
|
||||||
|
replace(old,'function WEt(e){let t=JSON.parse(require("fs").readFileSync("/usr/src/app/assets/doc_notes/en/api-ko/etapi.json","utf8")),r=JSON.parse(require("fs").readFileSync("/usr/src/app/assets/doc_notes/en/api-ko/internal.json","utf8"));');
|
||||||
|
replace('customSiteTitle:"TriliumNext ETAPI Documentation"','customSiteTitle:"TriliumNext 외부 API 참고 자료",customJsStr:'+JSON.stringify(ui));
|
||||||
|
replace('customSiteTitle:"TriliumNext Internal API Documentation"','customSiteTitle:"TriliumNext 내부 API 참고 자료",customJsStr:'+JSON.stringify(ui));
|
||||||
|
replace('W7s=Qon.default.join(wp,"etapi.openapi.yaml")','W7s=Qon.default.join(wp,"doc_notes/en/api-ko/etapi.json")');
|
||||||
|
replace('triliumApplyKoreanPdf()})','triliumApplyKoreanPdf();triliumApplyKoreanApiLinks()})');
|
||||||
|
const hook=`\nfunction triliumApplyKoreanApiLinks(){const fs=require('fs'),file='/home/node/trilium-data/korean-phase9-pending.json';if(!fs.existsSync(file))return;const rows=JSON.parse(fs.readFileSync(file,'utf8'));if(rows.length!==3)throw Error('Invalid API link plan');de.transactional(()=>{for(const r of rows){if(!['_help_Q2z6av6JZVWm','_help_habiZ3HU8Kw8','_help_MEtfsqa5VwNi'].includes(r.noteId))throw Error('API note outside scope');const a=J.getAttributeOrThrow(r.attributeId);if(a.isDeleted||a.noteId!==r.noteId||a.name!=='webViewSrc'||(a.value!==r.oldValue&&a.value!==r.value))throw Error('API link conflict');}for(const r of rows){const a=J.getAttributeOrThrow(r.attributeId);if(a.value!==r.value){a.value=r.value;a.save();}}});fs.renameSync(file,file+'.applied-'+Date.now());console.log('KOREAN_API_LINKS 3');}\n`;
|
||||||
|
fs.writeFileSync(out+'/main.cjs',hook+main);
|
||||||
|
const files=Object.fromEntries(fs.readdirSync(out,{recursive:true}).filter(n=>fs.statSync(out+'/'+n).isFile()&&!['manifest.json','api-audit.json'].includes(n)).map(n=>[n.replaceAll('\\','/'),hash(fs.readFileSync(out+'/'+n))]));
|
||||||
|
fs.writeFileSync(out+'/manifest.json',JSON.stringify({previousMainSha256:hash(oldmain),previousMetaSha256:hash(fs.readFileSync(b+'/phase3/'+metaPath)),files},null,2));
|
||||||
|
fs.writeFileSync(out+'/api-audit.json',JSON.stringify(reports,null,2));console.log(reports);
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
import pathlib,subprocess,datetime,shutil,time,urllib.request,urllib.parse,hashlib,json,sqlite3
|
||||||
|
base=pathlib.Path('/www/dk_project/dk_app/trilium');release=pathlib.Path('/tmp/trilium-korean-phase9');m=json.loads((release/'manifest.json').read_text());digest=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
|
||||||
|
meta='doc_notes/en/User Guide/!!!meta.json';pending=base/'data/korean-phase9-pending.json'
|
||||||
|
assert digest(base/'patched/main.cjs')==m['previousMainSha256']
|
||||||
|
assert digest(base/'i18n_ko'/meta)==m['previousMetaSha256']
|
||||||
|
assert not pending.exists();assert not (base/'i18n_ko/doc_notes/en/api-ko').exists()
|
||||||
|
for rel,h in m['files'].items():assert digest(release/rel)==h,rel
|
||||||
|
backup=base/'backups'/('before-korean-phase9-'+datetime.datetime.now().strftime('%Y%m%d-%H%M%S'));backup.mkdir(parents=True,mode=0o700)
|
||||||
|
shutil.copy2(base/'patched/main.cjs',backup/'main.cjs');shutil.copy2(base/'i18n_ko'/meta,backup/'meta.json')
|
||||||
|
db=sqlite3.connect('file:'+str(base/'data/document.db')+'?mode=ro',uri=True)
|
||||||
|
with sqlite3.connect(str(backup/'document.db')) as dest:db.backup(dest)
|
||||||
|
db.close()
|
||||||
|
for rel in m['files']:
|
||||||
|
if rel.startswith('doc_notes/'):
|
||||||
|
dest=base/'i18n_ko'/rel;dest.parent.mkdir(parents=True,exist_ok=True);dest.write_bytes((release/rel).read_bytes())
|
||||||
|
shutil.copy2(release/'korean-phase9-pending.json',pending)
|
||||||
|
(base/'patched/main.cjs').write_bytes((release/'main.cjs').read_bytes())
|
||||||
|
try:
|
||||||
|
subprocess.run(['docker','restart','trilium'],check=True)
|
||||||
|
for i in range(40):
|
||||||
|
try:
|
||||||
|
with urllib.request.urlopen('http://127.0.0.1:18082/api/health-check',timeout=2) as r:assert r.status==200
|
||||||
|
if pending.exists():raise RuntimeError('Migration pending')
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
if i==39:raise
|
||||||
|
time.sleep(1)
|
||||||
|
checked=0
|
||||||
|
for rel,h in m['files'].items():
|
||||||
|
if not rel.startswith('doc_notes/'):continue
|
||||||
|
with urllib.request.urlopen('http://127.0.0.1:18082/assets/v0.95.0-ko-20260913-r8/'+urllib.parse.quote(rel),timeout=5) as r:assert hashlib.sha256(r.read()).hexdigest()==h,rel
|
||||||
|
checked+=1
|
||||||
|
for route,needle in [('/etapi/docs/','외부 API 참고 자료'),('/api/docs/','내부 API 참고 자료')]:
|
||||||
|
with urllib.request.urlopen('http://127.0.0.1:18082'+route,timeout=5) as r:assert needle in r.read().decode()
|
||||||
|
for route,source in [('/etapi/docs/swagger-ui-init.js','etapi.json'),('/api/docs/swagger-ui-init.js','internal.json')]:
|
||||||
|
with urllib.request.urlopen('http://127.0.0.1:18082'+route,timeout=5) as r:text=r.read().decode()
|
||||||
|
expected=json.loads((release/'doc_notes/en/api-ko'/source).read_text())['info']['description'];assert json.dumps(expected,ensure_ascii=False)[1:-1] in text,route
|
||||||
|
db=sqlite3.connect('file:'+str(base/'data/document.db')+'?mode=ro',uri=True)
|
||||||
|
for row in json.loads((release/'korean-phase9-pending.json').read_text()):assert db.execute('SELECT value FROM attributes WHERE attributeId=?',(row['attributeId'],)).fetchone()[0]==row['value']
|
||||||
|
db.close()
|
||||||
|
result={'status':'verified','backup':str(backup),'servedFiles':checked,'swaggerPages':2,'scriptLinks':3,'assetVersion':'v0.95.0-ko-20260913-r8'}
|
||||||
|
(base/'i18n_ko/phase9-result.json').write_text(json.dumps(result,indent=2));print(json.dumps(result))
|
||||||
|
except Exception:
|
||||||
|
print('Verification failed; full backup preserved at '+str(backup));raise
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
from html.parser import HTMLParser
|
||||||
|
from pathlib import Path
|
||||||
|
import json,re
|
||||||
|
base=Path('work/trilium/api-source')
|
||||||
|
class Extract(HTMLParser):
|
||||||
|
def __init__(self):super().__init__(convert_charrefs=False);self.stack=[];self.texts=[]
|
||||||
|
def handle_starttag(self,tag,attrs):
|
||||||
|
if tag not in ['area','base','br','col','embed','hr','img','input','link','meta','param','source','track','wbr']:self.stack.append((tag,dict(attrs)))
|
||||||
|
def handle_endtag(self,tag):
|
||||||
|
for i in range(len(self.stack)-1,-1,-1):
|
||||||
|
if self.stack[i][0]==tag:self.stack=self.stack[:i];break
|
||||||
|
def handle_data(self,data):
|
||||||
|
if any(t in ['script','style','code','pre'] for t,a in self.stack):return
|
||||||
|
if any('tsd-comment' in a.get('class','') for t,a in self.stack) and re.search('[A-Za-z]',data) and data.strip():self.texts.append(data.strip())
|
||||||
|
texts=[]
|
||||||
|
for name in ['frontend','fnote','backend']:
|
||||||
|
p=Extract();p.feed((base/(name+'.html')).read_text());texts.extend(p.texts)
|
||||||
|
unique=list(dict.fromkeys(texts));(base/'script-strings.json').write_text(json.dumps(unique,ensure_ascii=False,indent=2));print('\n'.join(str(i)+' '+v for i,v in enumerate(unique)))
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import pathlib,hashlib,shutil,subprocess,time,urllib.request,json,datetime
|
||||||
|
b=pathlib.Path('/www/dk_project/dk_app/trilium');s=pathlib.Path('/tmp/trilium-api-final');h=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
|
||||||
|
assert h(b/'patched/main.cjs')==h(s/'before.cjs')
|
||||||
|
backup=b/'backups'/('before-api-final-'+datetime.datetime.now().strftime('%Y%m%d-%H%M%S'));backup.mkdir(mode=0o700)
|
||||||
|
for n,target in [('main.cjs','patched/main.cjs'),('etapi.json','i18n_ko/doc_notes/en/api-ko/etapi.json'),('internal.json','i18n_ko/doc_notes/en/api-ko/internal.json')]:shutil.copy2(b/target,backup/n);(b/target).write_bytes((s/n).read_bytes())
|
||||||
|
subprocess.run(['docker','restart','trilium'],check=True)
|
||||||
|
for i in range(40):
|
||||||
|
try:
|
||||||
|
with urllib.request.urlopen('http://127.0.0.1:18082/etapi/docs/swagger-ui-bundle.js',timeout=3) as r:assert hashlib.sha256(r.read()).hexdigest()==h(b/'i18n_ko/doc_notes/en/api-ko/swagger/swagger-ui-bundle.js')
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
if i==39:raise
|
||||||
|
time.sleep(1)
|
||||||
|
checks=[]
|
||||||
|
for rel in ['etapi.json','internal.json','frontend.html','fnote.html','backend.html']:
|
||||||
|
with urllib.request.urlopen('http://127.0.0.1:18082/assets/v0.95.0-ko-20260913-r8/doc_notes/en/api-ko/'+rel,timeout=5) as r:assert hashlib.sha256(r.read()).hexdigest()==h(b/'i18n_ko/doc_notes/en/api-ko'/rel)
|
||||||
|
checks.append(rel)
|
||||||
|
for route in ['etapi','api']:
|
||||||
|
with urllib.request.urlopen('http://127.0.0.1:18082/'+route+'/docs/',timeout=5) as r:assert '참고 자료' in r.read().decode()
|
||||||
|
with urllib.request.urlopen('http://127.0.0.1:18082/'+route+'/docs/swagger-ui-init.js',timeout=5) as r:assert '설명' in r.read().decode()
|
||||||
|
result={'status':'verified','backup':str(backup),'pages':checks,'swaggerVersion':'5.21.0','mainSha256':h(b/'patched/main.cjs')};(b/'i18n_ko/phase9-final-result.json').write_text(json.dumps(result));print(json.dumps(result))
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import pathlib,hashlib,shutil,subprocess,time,urllib.request,json,datetime
|
||||||
|
base=pathlib.Path('/www/dk_project/dk_app/trilium');src=pathlib.Path('/tmp/trilium-korean-phase9-fix');h=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
|
||||||
|
assert h(base/'patched/main.cjs')==h(src/'before.cjs')
|
||||||
|
backup=base/'backups'/('before-api-swagger-fix-'+datetime.datetime.now().strftime('%Y%m%d-%H%M%S'));backup.mkdir(mode=0o700);shutil.copy2(base/'patched/main.cjs',backup/'main.cjs')
|
||||||
|
shutil.copytree(src/'swagger',base/'i18n_ko/doc_notes/en/api-ko/swagger',dirs_exist_ok=False)
|
||||||
|
(base/'i18n_ko/doc_notes/en/api-ko/swagger').chmod(0o755)
|
||||||
|
for p in (base/'i18n_ko/doc_notes/en/api-ko/swagger').iterdir():p.chmod(0o644)
|
||||||
|
(base/'patched/main.cjs').write_bytes((src/'main.cjs').read_bytes());subprocess.run(['docker','restart','trilium'],check=True)
|
||||||
|
for i in range(40):
|
||||||
|
try:
|
||||||
|
with urllib.request.urlopen('http://127.0.0.1:18082/etapi/docs/swagger-ui-bundle.js',timeout=3) as r:assert hashlib.sha256(r.read()).hexdigest()==h(src/'swagger/swagger-ui-bundle.js')
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
if i==39:raise
|
||||||
|
time.sleep(1)
|
||||||
|
result={'status':'verified','backup':str(backup),'swaggerVersion':'5.21.0','mainSha256':h(base/'patched/main.cjs')};(base/'i18n_ko/phase9-swagger-result.json').write_text(json.dumps(result));print(json.dumps(result))
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
import sqlite3,json
|
||||||
|
db=sqlite3.connect('file:/www/dk_project/dk_app/trilium/data/document.db?mode=ro',uri=True);db.row_factory=sqlite3.Row
|
||||||
|
ids=['_help_Q2z6av6JZVWm','_help_habiZ3HU8Kw8','_help_MEtfsqa5VwNi']
|
||||||
|
rows=[dict(r) for n in ids for r in db.execute("SELECT attributeId,noteId,name,value FROM attributes WHERE noteId=? AND name='webViewSrc' AND isDeleted=0",(n,))]
|
||||||
|
assert len(rows)==3
|
||||||
|
print(json.dumps(rows));db.close()
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import pathlib,urllib.request,hashlib,json,sqlite3
|
||||||
|
b=pathlib.Path('/www/dk_project/dk_app/trilium');s=pathlib.Path('/tmp/trilium-api-final');h=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
|
||||||
|
assert h(b/'patched/main.cjs')==h(s/'main.cjs')
|
||||||
|
for rel in ['etapi.json','internal.json','frontend.html','fnote.html','backend.html','swagger/swagger-ui-bundle.js','swagger/swagger-ui-standalone-preset.js','swagger/swagger-ui.css']:
|
||||||
|
with urllib.request.urlopen('http://127.0.0.1:18082/assets/v0.95.0-ko-20260913-r8/doc_notes/en/api-ko/'+rel,timeout=5) as r:assert hashlib.sha256(r.read()).hexdigest()==h(b/'i18n_ko/doc_notes/en/api-ko'/rel),rel
|
||||||
|
for route,needle in [('etapi','Trilium 외부 API'),('api','Trilium Notes 동기화 서버 API')]:
|
||||||
|
with urllib.request.urlopen('http://127.0.0.1:18082/'+route+'/docs/swagger-ui-init.js',timeout=5) as r:assert needle in r.read().decode(),route
|
||||||
|
with urllib.request.urlopen('http://127.0.0.1:18082/'+route+'/docs/swagger-ui-bundle.js',timeout=5) as r:assert hashlib.sha256(r.read()).hexdigest()==h(b/'i18n_ko/doc_notes/en/api-ko/swagger/swagger-ui-bundle.js')
|
||||||
|
db=sqlite3.connect('file:'+str(b/'data/document.db')+'?mode=ro',uri=True)
|
||||||
|
for row in json.loads(pathlib.Path('/tmp/trilium-korean-phase9/korean-phase9-pending.json').read_text()):assert db.execute('SELECT value FROM attributes WHERE attributeId=?',(row['attributeId'],)).fetchone()[0]==row['value']
|
||||||
|
db.close()
|
||||||
|
result={'status':'verified','apiReferencePages':5,'staticResponses':8,'swaggerRoutes':2,'noteLinks':3,'mainSha256':h(b/'patched/main.cjs'),'backup':str(sorted((b/'backups').glob('before-api-final-*'))[-1])}
|
||||||
|
(b/'i18n_ko/phase9-final-result.json').write_text(json.dumps(result));print(json.dumps(result))
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import fs from 'node:fs';import assert from 'node:assert/strict';
|
||||||
|
const b='work/trilium',out=b+'/phase9';
|
||||||
|
for(const[name,file]of [['internal','trilium-openapi.json'],['etapi','etapi.json']]){
|
||||||
|
const before=JSON.parse(fs.readFileSync(b+'/api-source/'+file)),after=JSON.parse(fs.readFileSync(out+'/doc_notes/en/api-ko/'+name+'.json'));
|
||||||
|
function check(a,c,p=''){assert.equal(typeof a,typeof c,p);if(a&&typeof a==='object'){assert.deepEqual(Object.keys(a),Object.keys(c),p);for(const k of Object.keys(a)){if(['summary','description','title'].includes(k)&&typeof a[k]==='string')continue;if(p===''&&k==='servers'&&name==='etapi')continue;if(p==='.info.contact'&&k==='name')continue;if(p.endsWith('.properties.message')&&k==='example')continue;check(a[k],c[k],p+'.'+k);}}else assert.equal(a,c,p);}check(before,after);
|
||||||
|
}
|
||||||
|
const report=JSON.parse(fs.readFileSync(out+'/script-audit.json'));assert(Object.values(report).every(x=>!x.remainingProse.length));
|
||||||
|
console.log('API methods, parameters, schemas, examples and identifiers preserved except documented display-message and server-URL changes.');
|
||||||
Reference in New Issue
Block a user