Merge branch 'main' into renovate/electron-39.x
Some checks are pending
Checks / main (push) Waiting to run
2
.github/actions/build-server/action.yml
vendored
@ -12,7 +12,7 @@ runs:
|
|||||||
- name: Set up node & dependencies
|
- name: Set up node & dependencies
|
||||||
uses: actions/setup-node@v6
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 24
|
||||||
cache: "pnpm"
|
cache: "pnpm"
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
75
.github/workflows/deploy-docs.yml
vendored
@ -1,6 +1,4 @@
|
|||||||
# GitHub Actions workflow for deploying MkDocs documentation to Cloudflare Pages
|
name: Deploy Documentation
|
||||||
# This workflow builds and deploys your MkDocs site when changes are pushed to main
|
|
||||||
name: Deploy MkDocs Documentation
|
|
||||||
|
|
||||||
on:
|
on:
|
||||||
# Trigger on push to main branch
|
# Trigger on push to main branch
|
||||||
@ -11,11 +9,8 @@ on:
|
|||||||
# Only run when docs files change
|
# Only run when docs files change
|
||||||
paths:
|
paths:
|
||||||
- 'docs/**'
|
- 'docs/**'
|
||||||
- 'README.md' # README is synced to docs/index.md
|
- 'apps/edit-docs/**'
|
||||||
- 'mkdocs.yml'
|
- 'packages/share-theme/**'
|
||||||
- 'requirements-docs.txt'
|
|
||||||
- '.github/workflows/deploy-docs.yml'
|
|
||||||
- 'scripts/fix-mkdocs-structure.ts'
|
|
||||||
|
|
||||||
# Allow manual triggering from Actions tab
|
# Allow manual triggering from Actions tab
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -27,15 +22,12 @@ on:
|
|||||||
- master
|
- master
|
||||||
paths:
|
paths:
|
||||||
- 'docs/**'
|
- 'docs/**'
|
||||||
- 'README.md' # README is synced to docs/index.md
|
- 'apps/edit-docs/**'
|
||||||
- 'mkdocs.yml'
|
- 'packages/share-theme/**'
|
||||||
- 'requirements-docs.txt'
|
|
||||||
- '.github/workflows/deploy-docs.yml'
|
|
||||||
- 'scripts/fix-mkdocs-structure.ts'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-and-deploy:
|
build-and-deploy:
|
||||||
name: Build and Deploy MkDocs
|
name: Build and Deploy Documentation
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
|
|
||||||
@ -49,72 +41,25 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v5
|
||||||
with:
|
|
||||||
fetch-depth: 0 # Fetch all history for git info and mkdocs-git-revision-date plugin
|
|
||||||
|
|
||||||
- name: Setup Python
|
|
||||||
uses: actions/setup-python@v6
|
|
||||||
with:
|
|
||||||
python-version: '3.14'
|
|
||||||
cache: 'pip'
|
|
||||||
cache-dependency-path: 'requirements-docs.txt'
|
|
||||||
|
|
||||||
- name: Install MkDocs and Dependencies
|
|
||||||
run: |
|
|
||||||
pip install --upgrade pip
|
|
||||||
pip install -r requirements-docs.txt
|
|
||||||
env:
|
|
||||||
PIP_DISABLE_PIP_VERSION_CHECK: 1
|
|
||||||
|
|
||||||
# Setup pnpm before fixing docs structure
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
# Setup Node.js with pnpm
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v6
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: '22'
|
node-version: '24'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
# Install Node.js dependencies for the TypeScript script
|
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: |
|
run: pnpm install --frozen-lockfile
|
||||||
pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Fix Documentation Structure
|
- name: Trigger build of documentation
|
||||||
run: |
|
run: pnpm docs:build
|
||||||
# Fix duplicate navigation entries by moving overview pages to index.md
|
|
||||||
pnpm run chore:fix-mkdocs-structure
|
|
||||||
|
|
||||||
- name: Build MkDocs Site
|
|
||||||
run: |
|
|
||||||
# Build with strict mode but allow expected warnings
|
|
||||||
mkdocs build --verbose || {
|
|
||||||
EXIT_CODE=$?
|
|
||||||
# Check if the only issue is expected warnings
|
|
||||||
if mkdocs build 2>&1 | grep -E "WARNING.*(README|not found)" && \
|
|
||||||
[ $(mkdocs build 2>&1 | grep -c "ERROR") -eq 0 ]; then
|
|
||||||
echo "✅ Build succeeded with expected warnings"
|
|
||||||
mkdocs build --verbose
|
|
||||||
else
|
|
||||||
echo "❌ Build failed with unexpected errors"
|
|
||||||
exit $EXIT_CODE
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
- name: Fix HTML Links
|
|
||||||
run: |
|
|
||||||
# Remove .md extensions from links in generated HTML
|
|
||||||
pnpm tsx ./scripts/fix-html-links.ts site
|
|
||||||
|
|
||||||
- name: Validate Built Site
|
- name: Validate Built Site
|
||||||
run: |
|
run: |
|
||||||
# Basic validation that important files exist
|
|
||||||
test -f site/index.html || (echo "ERROR: site/index.html not found" && exit 1)
|
test -f site/index.html || (echo "ERROR: site/index.html not found" && exit 1)
|
||||||
test -f site/sitemap.xml || (echo "ERROR: site/sitemap.xml not found" && exit 1)
|
|
||||||
test -d site/assets || (echo "ERROR: site/assets directory not found" && exit 1)
|
|
||||||
echo "✅ Site validation passed"
|
|
||||||
|
|
||||||
- name: Deploy
|
- name: Deploy
|
||||||
uses: ./.github/actions/deploy-to-cloudflare-pages
|
uses: ./.github/actions/deploy-to-cloudflare-pages
|
||||||
|
|||||||
2
.github/workflows/dev.yml
vendored
@ -30,7 +30,7 @@ jobs:
|
|||||||
- name: Set up node & dependencies
|
- name: Set up node & dependencies
|
||||||
uses: actions/setup-node@v6
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 24
|
||||||
cache: "pnpm"
|
cache: "pnpm"
|
||||||
- run: pnpm install --frozen-lockfile
|
- run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
|||||||
8
.github/workflows/main-docker.yml
vendored
@ -46,7 +46,7 @@ jobs:
|
|||||||
- name: Set up node & dependencies
|
- name: Set up node & dependencies
|
||||||
uses: actions/setup-node@v6
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 24
|
||||||
cache: "pnpm"
|
cache: "pnpm"
|
||||||
|
|
||||||
- name: Install npm dependencies
|
- name: Install npm dependencies
|
||||||
@ -116,10 +116,10 @@ jobs:
|
|||||||
- dockerfile: Dockerfile
|
- dockerfile: Dockerfile
|
||||||
platform: linux/arm64
|
platform: linux/arm64
|
||||||
image: ubuntu-24.04-arm
|
image: ubuntu-24.04-arm
|
||||||
- dockerfile: Dockerfile
|
- dockerfile: Dockerfile.legacy
|
||||||
platform: linux/arm/v7
|
platform: linux/arm/v7
|
||||||
image: ubuntu-24.04-arm
|
image: ubuntu-24.04-arm
|
||||||
- dockerfile: Dockerfile
|
- dockerfile: Dockerfile.legacy
|
||||||
platform: linux/arm/v8
|
platform: linux/arm/v8
|
||||||
image: ubuntu-24.04-arm
|
image: ubuntu-24.04-arm
|
||||||
runs-on: ${{ matrix.image }}
|
runs-on: ${{ matrix.image }}
|
||||||
@ -146,7 +146,7 @@ jobs:
|
|||||||
- name: Set up node & dependencies
|
- name: Set up node & dependencies
|
||||||
uses: actions/setup-node@v6
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 24
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
|||||||
2
.github/workflows/nightly.yml
vendored
@ -52,7 +52,7 @@ jobs:
|
|||||||
- name: Set up node & dependencies
|
- name: Set up node & dependencies
|
||||||
uses: actions/setup-node@v6
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 24
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
|||||||
2
.github/workflows/playwright.yml
vendored
@ -24,7 +24,7 @@ jobs:
|
|||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v4
|
||||||
- uses: actions/setup-node@v6
|
- uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 24
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
|||||||
2
.github/workflows/release.yml
vendored
@ -50,7 +50,7 @@ jobs:
|
|||||||
- name: Set up node & dependencies
|
- name: Set up node & dependencies
|
||||||
uses: actions/setup-node@v6
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 24
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
|||||||
2
.github/workflows/website.yml
vendored
@ -30,7 +30,7 @@ jobs:
|
|||||||
- name: Set up node & dependencies
|
- name: Set up node & dependencies
|
||||||
uses: actions/setup-node@v6
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 24
|
||||||
cache: "pnpm"
|
cache: "pnpm"
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
|||||||
@ -37,8 +37,8 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@playwright/test": "1.56.1",
|
"@playwright/test": "1.56.1",
|
||||||
"@stylistic/eslint-plugin": "5.5.0",
|
"@stylistic/eslint-plugin": "5.5.0",
|
||||||
"@types/express": "5.0.4",
|
"@types/express": "5.0.5",
|
||||||
"@types/node": "22.18.12",
|
"@types/node": "24.9.1",
|
||||||
"@types/yargs": "17.0.34",
|
"@types/yargs": "17.0.34",
|
||||||
"@vitest/coverage-v8": "3.2.4",
|
"@vitest/coverage-v8": "3.2.4",
|
||||||
"eslint": "9.38.0",
|
"eslint": "9.38.0",
|
||||||
|
|||||||
@ -54,12 +54,12 @@
|
|||||||
"leaflet-gpx": "2.2.0",
|
"leaflet-gpx": "2.2.0",
|
||||||
"mark.js": "8.11.1",
|
"mark.js": "8.11.1",
|
||||||
"marked": "16.4.1",
|
"marked": "16.4.1",
|
||||||
"mermaid": "11.12.0",
|
"mermaid": "11.12.1",
|
||||||
"mind-elixir": "5.3.4",
|
"mind-elixir": "5.3.4",
|
||||||
"normalize.css": "8.0.1",
|
"normalize.css": "8.0.1",
|
||||||
"panzoom": "9.4.3",
|
"panzoom": "9.4.3",
|
||||||
"preact": "10.27.2",
|
"preact": "10.27.2",
|
||||||
"react-i18next": "16.2.0",
|
"react-i18next": "16.2.1",
|
||||||
"reveal.js": "5.2.1",
|
"reveal.js": "5.2.1",
|
||||||
"svg-pan-zoom": "3.6.2",
|
"svg-pan-zoom": "3.6.2",
|
||||||
"tabulator-tables": "6.3.1",
|
"tabulator-tables": "6.3.1",
|
||||||
|
|||||||
@ -218,12 +218,12 @@ export type CommandMappings = {
|
|||||||
/** Works only in the electron context menu. */
|
/** Works only in the electron context menu. */
|
||||||
replaceMisspelling: CommandData;
|
replaceMisspelling: CommandData;
|
||||||
|
|
||||||
importMarkdownInline: CommandData;
|
|
||||||
showPasswordNotSet: CommandData;
|
showPasswordNotSet: CommandData;
|
||||||
showProtectedSessionPasswordDialog: CommandData;
|
showProtectedSessionPasswordDialog: CommandData;
|
||||||
showUploadAttachmentsDialog: CommandData & { noteId: string };
|
showUploadAttachmentsDialog: CommandData & { noteId: string };
|
||||||
showIncludeNoteDialog: CommandData & { textTypeWidget: EditableTextTypeWidget };
|
showIncludeNoteDialog: CommandData & { textTypeWidget: EditableTextTypeWidget };
|
||||||
showAddLinkDialog: CommandData & { textTypeWidget: EditableTextTypeWidget, text: string };
|
showAddLinkDialog: CommandData & { textTypeWidget: EditableTextTypeWidget, text: string };
|
||||||
|
showPasteMarkdownDialog: CommandData & { textTypeWidget: EditableTextTypeWidget };
|
||||||
closeProtectedSessionPasswordDialog: CommandData;
|
closeProtectedSessionPasswordDialog: CommandData;
|
||||||
copyImageReferenceToClipboard: CommandData;
|
copyImageReferenceToClipboard: CommandData;
|
||||||
copyImageToClipboard: CommandData;
|
copyImageToClipboard: CommandData;
|
||||||
@ -270,6 +270,7 @@ export type CommandMappings = {
|
|||||||
closeThisNoteSplit: CommandData;
|
closeThisNoteSplit: CommandData;
|
||||||
moveThisNoteSplit: CommandData & { isMovingLeft: boolean };
|
moveThisNoteSplit: CommandData & { isMovingLeft: boolean };
|
||||||
jumpToNote: CommandData;
|
jumpToNote: CommandData;
|
||||||
|
openTodayNote: CommandData;
|
||||||
commandPalette: CommandData;
|
commandPalette: CommandData;
|
||||||
|
|
||||||
// Keyboard shortcuts
|
// Keyboard shortcuts
|
||||||
|
|||||||
@ -159,6 +159,16 @@ export default class Entrypoints extends Component {
|
|||||||
this.openInWindowCommand({ notePath: "", hoistedNoteId: "root" });
|
this.openInWindowCommand({ notePath: "", hoistedNoteId: "root" });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async openTodayNoteCommand() {
|
||||||
|
const todayNote = await dateNoteService.getTodayNote();
|
||||||
|
if (!todayNote) {
|
||||||
|
console.warn("Missing today note.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await appContext.tabManager.openInSameTab(todayNote.noteId);
|
||||||
|
}
|
||||||
|
|
||||||
async runActiveNoteCommand() {
|
async runActiveNoteCommand() {
|
||||||
const noteContext = appContext.tabManager.getActiveContext();
|
const noteContext = appContext.tabManager.getActiveContext();
|
||||||
if (!noteContext) {
|
if (!noteContext) {
|
||||||
|
|||||||
@ -417,7 +417,7 @@ export default class FNote {
|
|||||||
return notePaths;
|
return notePaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
getSortedNotePathRecords(hoistedNoteId = "root"): NotePathRecord[] {
|
getSortedNotePathRecords(hoistedNoteId = "root", activeNotePath: string | null = null): NotePathRecord[] {
|
||||||
const isHoistedRoot = hoistedNoteId === "root";
|
const isHoistedRoot = hoistedNoteId === "root";
|
||||||
|
|
||||||
const notePaths: NotePathRecord[] = this.getAllNotePaths().map((path) => ({
|
const notePaths: NotePathRecord[] = this.getAllNotePaths().map((path) => ({
|
||||||
@ -428,7 +428,23 @@ export default class FNote {
|
|||||||
isHidden: path.includes("_hidden")
|
isHidden: path.includes("_hidden")
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
// Calculate the length of the prefix match between two arrays
|
||||||
|
const prefixMatchLength = (path: string[], target: string[]) => {
|
||||||
|
const diffIndex = path.findIndex((seg, i) => seg !== target[i]);
|
||||||
|
return diffIndex === -1 ? Math.min(path.length, target.length) : diffIndex;
|
||||||
|
};
|
||||||
|
|
||||||
notePaths.sort((a, b) => {
|
notePaths.sort((a, b) => {
|
||||||
|
if (activeNotePath) {
|
||||||
|
const activeSegments = activeNotePath.split('/');
|
||||||
|
const aOverlap = prefixMatchLength(a.notePath, activeSegments);
|
||||||
|
const bOverlap = prefixMatchLength(b.notePath, activeSegments);
|
||||||
|
// Paths with more matching prefix segments are prioritized
|
||||||
|
// when the match count is equal, other criteria are used for sorting
|
||||||
|
if (bOverlap !== aOverlap) {
|
||||||
|
return bOverlap - aOverlap;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (a.isInHoistedSubTree !== b.isInHoistedSubTree) {
|
if (a.isInHoistedSubTree !== b.isInHoistedSubTree) {
|
||||||
return a.isInHoistedSubTree ? -1 : 1;
|
return a.isInHoistedSubTree ? -1 : 1;
|
||||||
} else if (a.isArchived !== b.isArchived) {
|
} else if (a.isArchived !== b.isArchived) {
|
||||||
@ -449,10 +465,11 @@ export default class FNote {
|
|||||||
* Returns the note path considered to be the "best"
|
* Returns the note path considered to be the "best"
|
||||||
*
|
*
|
||||||
* @param {string} [hoistedNoteId='root']
|
* @param {string} [hoistedNoteId='root']
|
||||||
|
* @param {string|null} [activeNotePath=null]
|
||||||
* @return {string[]} array of noteIds constituting the particular note path
|
* @return {string[]} array of noteIds constituting the particular note path
|
||||||
*/
|
*/
|
||||||
getBestNotePath(hoistedNoteId = "root") {
|
getBestNotePath(hoistedNoteId = "root", activeNotePath: string | null = null) {
|
||||||
return this.getSortedNotePathRecords(hoistedNoteId)[0]?.notePath;
|
return this.getSortedNotePathRecords(hoistedNoteId, activeNotePath)[0]?.notePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -20,9 +20,6 @@ function setupGlobs() {
|
|||||||
window.glob.froca = froca;
|
window.glob.froca = froca;
|
||||||
window.glob.treeCache = froca; // compatibility for CKEditor builds for a while
|
window.glob.treeCache = froca; // compatibility for CKEditor builds for a while
|
||||||
|
|
||||||
// for CKEditor integration (button on block toolbar)
|
|
||||||
window.glob.importMarkdownInline = async () => appContext.triggerCommand("importMarkdownInline");
|
|
||||||
|
|
||||||
window.onerror = function (msg, url, lineNo, columnNo, error) {
|
window.onerror = function (msg, url, lineNo, columnNo, error) {
|
||||||
const string = String(msg).toLowerCase();
|
const string = String(msg).toLowerCase();
|
||||||
|
|
||||||
|
|||||||
@ -26,21 +26,12 @@ async function resolveNotePathToSegments(notePath: string, hoistedNoteId = "root
|
|||||||
}
|
}
|
||||||
|
|
||||||
const path = notePath.split("/").reverse();
|
const path = notePath.split("/").reverse();
|
||||||
|
|
||||||
if (!path.includes("root")) {
|
|
||||||
path.push("root");
|
|
||||||
}
|
|
||||||
|
|
||||||
const effectivePathSegments: string[] = [];
|
const effectivePathSegments: string[] = [];
|
||||||
let childNoteId: string | null = null;
|
let childNoteId: string | null = null;
|
||||||
let i = 0;
|
let i = 0;
|
||||||
|
|
||||||
while (true) {
|
for (let i = 0; i < path.length; i++) {
|
||||||
if (i >= path.length) {
|
const parentNoteId = path[i];
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
const parentNoteId = path[i++];
|
|
||||||
|
|
||||||
if (childNoteId !== null) {
|
if (childNoteId !== null) {
|
||||||
const child = await froca.getNote(childNoteId, !logErrors);
|
const child = await froca.getNote(childNoteId, !logErrors);
|
||||||
@ -65,7 +56,7 @@ async function resolveNotePathToSegments(notePath: string, hoistedNoteId = "root
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!parents.some((p) => p.noteId === parentNoteId)) {
|
if (!parents.some(p => p.noteId === parentNoteId) || (i === path.length - 1 && parentNoteId !== 'root')) {
|
||||||
if (logErrors) {
|
if (logErrors) {
|
||||||
const parent = froca.getNoteFromCache(parentNoteId);
|
const parent = froca.getNoteFromCache(parentNoteId);
|
||||||
|
|
||||||
@ -77,7 +68,8 @@ async function resolveNotePathToSegments(notePath: string, hoistedNoteId = "root
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const bestNotePath = child.getBestNotePath(hoistedNoteId);
|
const activeNotePath = appContext.tabManager.getActiveContextNotePath();
|
||||||
|
const bestNotePath = child.getBestNotePath(hoistedNoteId, activeNotePath);
|
||||||
|
|
||||||
if (bestNotePath) {
|
if (bestNotePath) {
|
||||||
const pathToRoot = bestNotePath.reverse().slice(1);
|
const pathToRoot = bestNotePath.reverse().slice(1);
|
||||||
@ -108,7 +100,9 @@ async function resolveNotePathToSegments(notePath: string, hoistedNoteId = "root
|
|||||||
if (!note) {
|
if (!note) {
|
||||||
throw new Error(`Unable to find note: ${notePath}.`);
|
throw new Error(`Unable to find note: ${notePath}.`);
|
||||||
}
|
}
|
||||||
const bestNotePath = note.getBestNotePath(hoistedNoteId);
|
|
||||||
|
const activeNotePath = appContext.tabManager.getActiveContextNotePath();
|
||||||
|
const bestNotePath = note.getBestNotePath(hoistedNoteId, activeNotePath);
|
||||||
|
|
||||||
if (!bestNotePath) {
|
if (!bestNotePath) {
|
||||||
throw new Error(`Did not find any path segments for '${note.toString()}', hoisted note '${hoistedNoteId}'`);
|
throw new Error(`Did not find any path segments for '${note.toString()}', hoisted note '${hoistedNoteId}'`);
|
||||||
|
|||||||
@ -11,7 +11,11 @@ export function reloadFrontendApp(reason?: string) {
|
|||||||
logInfo(`Frontend app reload: ${reason}`);
|
logInfo(`Frontend app reload: ${reason}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isElectron()) {
|
||||||
|
dynamicRequire("@electron/remote").BrowserWindow.getFocusedWindow()?.reload();
|
||||||
|
} else {
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function restartDesktopApp() {
|
export function restartDesktopApp() {
|
||||||
|
|||||||
@ -1,84 +0,0 @@
|
|||||||
import "normalize.css";
|
|
||||||
import "boxicons/css/boxicons.min.css";
|
|
||||||
import "@triliumnext/ckeditor5/src/theme/ck-content.css";
|
|
||||||
import "@triliumnext/share-theme/styles/index.css";
|
|
||||||
import "@triliumnext/share-theme/scripts/index.js";
|
|
||||||
|
|
||||||
async function ensureJQuery() {
|
|
||||||
const $ = (await import("jquery")).default;
|
|
||||||
(window as any).$ = $;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function applyMath() {
|
|
||||||
const anyMathBlock = document.querySelector("#content .math-tex");
|
|
||||||
if (!anyMathBlock) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const renderMathInElement = (await import("./services/math.js")).renderMathInElement;
|
|
||||||
renderMathInElement(document.getElementById("content"));
|
|
||||||
}
|
|
||||||
|
|
||||||
async function formatCodeBlocks() {
|
|
||||||
const anyCodeBlock = document.querySelector("#content pre");
|
|
||||||
if (!anyCodeBlock) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await ensureJQuery();
|
|
||||||
const { formatCodeBlocks } = await import("./services/syntax_highlight.js");
|
|
||||||
await formatCodeBlocks($("#content"));
|
|
||||||
}
|
|
||||||
|
|
||||||
async function setupTextNote() {
|
|
||||||
formatCodeBlocks();
|
|
||||||
applyMath();
|
|
||||||
|
|
||||||
const setupMermaid = (await import("./share/mermaid.js")).default;
|
|
||||||
setupMermaid();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch note with given ID from backend
|
|
||||||
*
|
|
||||||
* @param noteId of the given note to be fetched. If false, fetches current note.
|
|
||||||
*/
|
|
||||||
async function fetchNote(noteId: string | null = null) {
|
|
||||||
if (!noteId) {
|
|
||||||
noteId = document.body.getAttribute("data-note-id");
|
|
||||||
}
|
|
||||||
|
|
||||||
const resp = await fetch(`api/notes/${noteId}`);
|
|
||||||
|
|
||||||
return await resp.json();
|
|
||||||
}
|
|
||||||
|
|
||||||
document.addEventListener(
|
|
||||||
"DOMContentLoaded",
|
|
||||||
() => {
|
|
||||||
const noteType = determineNoteType();
|
|
||||||
|
|
||||||
if (noteType === "text") {
|
|
||||||
setupTextNote();
|
|
||||||
}
|
|
||||||
|
|
||||||
const toggleMenuButton = document.getElementById("toggleMenuButton");
|
|
||||||
const layout = document.getElementById("layout");
|
|
||||||
|
|
||||||
if (toggleMenuButton && layout) {
|
|
||||||
toggleMenuButton.addEventListener("click", () => layout.classList.toggle("showMenu"));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
false
|
|
||||||
);
|
|
||||||
|
|
||||||
function determineNoteType() {
|
|
||||||
const bodyClass = document.body.className;
|
|
||||||
const match = bodyClass.match(/type-([^\s]+)/);
|
|
||||||
return match ? match[1] : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// workaround to prevent webpack from removing "fetchNote" as dead code:
|
|
||||||
// add fetchNote as property to the window object
|
|
||||||
Object.defineProperty(window, "fetchNote", {
|
|
||||||
value: fetchNote
|
|
||||||
});
|
|
||||||
@ -2034,9 +2034,9 @@ body.zen #right-pane,
|
|||||||
body.zen #mobile-sidebar-wrapper,
|
body.zen #mobile-sidebar-wrapper,
|
||||||
body.zen .tab-row-container,
|
body.zen .tab-row-container,
|
||||||
body.zen .tab-row-widget,
|
body.zen .tab-row-widget,
|
||||||
body.zen .ribbon-container:not(:has(.classic-toolbar-widget.visible)),
|
body.zen .ribbon-container:not(:has(.classic-toolbar-widget)),
|
||||||
body.zen .ribbon-container:has(.classic-toolbar-widget.visible) .ribbon-top-row,
|
body.zen .ribbon-container:has(.classic-toolbar-widget) .ribbon-top-row,
|
||||||
body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget.visible)),
|
body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget)),
|
||||||
body.zen .note-icon-widget,
|
body.zen .note-icon-widget,
|
||||||
body.zen .title-row .icon-action,
|
body.zen .title-row .icon-action,
|
||||||
body.zen .floating-buttons-children > *:not(.bx-edit-alt),
|
body.zen .floating-buttons-children > *:not(.bx-edit-alt),
|
||||||
|
|||||||
@ -51,7 +51,7 @@
|
|||||||
"bulk_actions_executed": "批量操作已成功执行。",
|
"bulk_actions_executed": "批量操作已成功执行。",
|
||||||
"none_yet": "暂无操作 ... 通过点击上方的可用操作添加一个操作。",
|
"none_yet": "暂无操作 ... 通过点击上方的可用操作添加一个操作。",
|
||||||
"labels": "标签",
|
"labels": "标签",
|
||||||
"relations": "关联关系",
|
"relations": "关系",
|
||||||
"notes": "笔记",
|
"notes": "笔记",
|
||||||
"other": "其它"
|
"other": "其它"
|
||||||
},
|
},
|
||||||
@ -104,7 +104,8 @@
|
|||||||
"export_status": "导出状态",
|
"export_status": "导出状态",
|
||||||
"export_in_progress": "导出进行中:{{progressCount}}",
|
"export_in_progress": "导出进行中:{{progressCount}}",
|
||||||
"export_finished_successfully": "导出成功完成。",
|
"export_finished_successfully": "导出成功完成。",
|
||||||
"format_pdf": "PDF - 用于打印或共享目的。"
|
"format_pdf": "PDF - 用于打印或共享目的。",
|
||||||
|
"share-format": "HTML 网页发布——采用与共享笔记相同的主题,但可发布为静态网站。"
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"noteNavigation": "笔记导航",
|
"noteNavigation": "笔记导航",
|
||||||
@ -184,7 +185,8 @@
|
|||||||
},
|
},
|
||||||
"import-status": "导入状态",
|
"import-status": "导入状态",
|
||||||
"in-progress": "导入进行中:{{progress}}",
|
"in-progress": "导入进行中:{{progress}}",
|
||||||
"successful": "导入成功完成。"
|
"successful": "导入成功完成。",
|
||||||
|
"importZipRecommendation": "导入 ZIP 文件时,笔记层级将反映压缩文件内的子目录结构。"
|
||||||
},
|
},
|
||||||
"include_note": {
|
"include_note": {
|
||||||
"dialog_title": "包含笔记",
|
"dialog_title": "包含笔记",
|
||||||
@ -259,7 +261,6 @@
|
|||||||
"delete_all_revisions": "删除此笔记的所有修订版本",
|
"delete_all_revisions": "删除此笔记的所有修订版本",
|
||||||
"delete_all_button": "删除所有修订版本",
|
"delete_all_button": "删除所有修订版本",
|
||||||
"help_title": "关于笔记修订版本的帮助",
|
"help_title": "关于笔记修订版本的帮助",
|
||||||
"revision_last_edited": "此修订版本上次编辑于 {{date}}",
|
|
||||||
"confirm_delete_all": "您是否要删除此笔记的所有修订版本?",
|
"confirm_delete_all": "您是否要删除此笔记的所有修订版本?",
|
||||||
"no_revisions": "此笔记暂无修订版本...",
|
"no_revisions": "此笔记暂无修订版本...",
|
||||||
"restore_button": "恢复",
|
"restore_button": "恢复",
|
||||||
@ -1558,7 +1559,9 @@
|
|||||||
"window-on-top": "保持此窗口置顶"
|
"window-on-top": "保持此窗口置顶"
|
||||||
},
|
},
|
||||||
"note_detail": {
|
"note_detail": {
|
||||||
"could_not_find_typewidget": "找不到类型为 '{{type}}' 的 typeWidget"
|
"could_not_find_typewidget": "找不到类型为 '{{type}}' 的 typeWidget",
|
||||||
|
"printing": "正在打印…",
|
||||||
|
"printing_pdf": "正在导出为PDF…"
|
||||||
},
|
},
|
||||||
"note_title": {
|
"note_title": {
|
||||||
"placeholder": "请输入笔记标题..."
|
"placeholder": "请输入笔记标题..."
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
"homepage": "Startseite:",
|
"homepage": "Startseite:",
|
||||||
"app_version": "App-Version:",
|
"app_version": "App-Version:",
|
||||||
"db_version": "DB-Version:",
|
"db_version": "DB-Version:",
|
||||||
"sync_version": "Synch-version:",
|
"sync_version": "Sync-Version:",
|
||||||
"build_date": "Build-Datum:",
|
"build_date": "Build-Datum:",
|
||||||
"build_revision": "Build-Revision:",
|
"build_revision": "Build-Revision:",
|
||||||
"data_directory": "Datenverzeichnis:"
|
"data_directory": "Datenverzeichnis:"
|
||||||
@ -104,7 +104,8 @@
|
|||||||
"export_status": "Exportstatus",
|
"export_status": "Exportstatus",
|
||||||
"export_in_progress": "Export läuft: {{progressCount}}",
|
"export_in_progress": "Export läuft: {{progressCount}}",
|
||||||
"export_finished_successfully": "Der Export wurde erfolgreich abgeschlossen.",
|
"export_finished_successfully": "Der Export wurde erfolgreich abgeschlossen.",
|
||||||
"format_pdf": "PDF - für Ausdrucke oder Teilen."
|
"format_pdf": "PDF - für Ausdrucke oder Teilen.",
|
||||||
|
"share-format": "HTML für die Web-Veröffentlichung – verwendet dasselbe Theme wie bei freigegebenen Notizen, kann jedoch als statische Website veröffentlicht werden."
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"noteNavigation": "Notiz Navigation",
|
"noteNavigation": "Notiz Navigation",
|
||||||
@ -260,7 +261,6 @@
|
|||||||
"delete_all_revisions": "Lösche alle Revisionen dieser Notiz",
|
"delete_all_revisions": "Lösche alle Revisionen dieser Notiz",
|
||||||
"delete_all_button": "Alle Revisionen löschen",
|
"delete_all_button": "Alle Revisionen löschen",
|
||||||
"help_title": "Hilfe zu Notizrevisionen",
|
"help_title": "Hilfe zu Notizrevisionen",
|
||||||
"revision_last_edited": "Diese Revision wurde zuletzt am {{date}} bearbeitet",
|
|
||||||
"confirm_delete_all": "Möchtest du alle Revisionen dieser Notiz löschen?",
|
"confirm_delete_all": "Möchtest du alle Revisionen dieser Notiz löschen?",
|
||||||
"no_revisions": "Für diese Notiz gibt es noch keine Revisionen...",
|
"no_revisions": "Für diese Notiz gibt es noch keine Revisionen...",
|
||||||
"confirm_restore": "Möchtest du diese Revision wiederherstellen? Dadurch werden der aktuelle Titel und Inhalt der Notiz mit dieser Revision überschrieben.",
|
"confirm_restore": "Möchtest du diese Revision wiederherstellen? Dadurch werden der aktuelle Titel und Inhalt der Notiz mit dieser Revision überschrieben.",
|
||||||
@ -991,7 +991,7 @@
|
|||||||
"enter_password_instruction": "Um die geschützte Notiz anzuzeigen, musst du dein Passwort eingeben:",
|
"enter_password_instruction": "Um die geschützte Notiz anzuzeigen, musst du dein Passwort eingeben:",
|
||||||
"start_session_button": "Starte eine geschützte Sitzung <kbd>Eingabetaste</kbd>",
|
"start_session_button": "Starte eine geschützte Sitzung <kbd>Eingabetaste</kbd>",
|
||||||
"started": "Geschützte Sitzung gestartet.",
|
"started": "Geschützte Sitzung gestartet.",
|
||||||
"wrong_password": "Passwort flasch.",
|
"wrong_password": "Passwort falsch.",
|
||||||
"protecting-finished-successfully": "Geschützt erfolgreich beendet.",
|
"protecting-finished-successfully": "Geschützt erfolgreich beendet.",
|
||||||
"unprotecting-finished-successfully": "Ungeschützt erfolgreich beendet.",
|
"unprotecting-finished-successfully": "Ungeschützt erfolgreich beendet.",
|
||||||
"protecting-in-progress": "Schützen läuft: {{count}}",
|
"protecting-in-progress": "Schützen läuft: {{count}}",
|
||||||
|
|||||||
@ -104,7 +104,8 @@
|
|||||||
"export_status": "Export status",
|
"export_status": "Export status",
|
||||||
"export_in_progress": "Export in progress: {{progressCount}}",
|
"export_in_progress": "Export in progress: {{progressCount}}",
|
||||||
"export_finished_successfully": "Export finished successfully.",
|
"export_finished_successfully": "Export finished successfully.",
|
||||||
"format_pdf": "PDF - for printing or sharing purposes."
|
"format_pdf": "PDF - for printing or sharing purposes.",
|
||||||
|
"share-format": "HTML for web publishing - uses the same theme that is used shared notes, but can be published as a static website."
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"title": "Cheatsheet",
|
"title": "Cheatsheet",
|
||||||
@ -260,7 +261,6 @@
|
|||||||
"delete_all_revisions": "Delete all revisions of this note",
|
"delete_all_revisions": "Delete all revisions of this note",
|
||||||
"delete_all_button": "Delete all revisions",
|
"delete_all_button": "Delete all revisions",
|
||||||
"help_title": "Help on Note Revisions",
|
"help_title": "Help on Note Revisions",
|
||||||
"revision_last_edited": "This revision was last edited on {{date}}",
|
|
||||||
"confirm_delete_all": "Do you want to delete all revisions of this note?",
|
"confirm_delete_all": "Do you want to delete all revisions of this note?",
|
||||||
"no_revisions": "No revisions for this note yet...",
|
"no_revisions": "No revisions for this note yet...",
|
||||||
"restore_button": "Restore",
|
"restore_button": "Restore",
|
||||||
|
|||||||
@ -104,7 +104,8 @@
|
|||||||
"export_status": "Estado de exportación",
|
"export_status": "Estado de exportación",
|
||||||
"export_in_progress": "Exportación en curso: {{progressCount}}",
|
"export_in_progress": "Exportación en curso: {{progressCount}}",
|
||||||
"export_finished_successfully": "La exportación finalizó exitosamente.",
|
"export_finished_successfully": "La exportación finalizó exitosamente.",
|
||||||
"format_pdf": "PDF - para propósitos de impresión o compartición."
|
"format_pdf": "PDF - para propósitos de impresión o compartición.",
|
||||||
|
"share-format": "HTML para publicación web: utiliza el mismo tema que se utiliza en las notas compartidas, pero se puede publicar como un sitio web estático."
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"noteNavigation": "Navegación de notas",
|
"noteNavigation": "Navegación de notas",
|
||||||
@ -184,7 +185,8 @@
|
|||||||
},
|
},
|
||||||
"import-status": "Estado de importación",
|
"import-status": "Estado de importación",
|
||||||
"in-progress": "Importación en progreso: {{progress}}",
|
"in-progress": "Importación en progreso: {{progress}}",
|
||||||
"successful": "Importación finalizada exitosamente."
|
"successful": "Importación finalizada exitosamente.",
|
||||||
|
"importZipRecommendation": "Al importar un archivo ZIP, la jerarquía de notas reflejará la estructura de subdirectorios dentro del archivo comprimido."
|
||||||
},
|
},
|
||||||
"include_note": {
|
"include_note": {
|
||||||
"dialog_title": "Incluir nota",
|
"dialog_title": "Incluir nota",
|
||||||
@ -259,7 +261,6 @@
|
|||||||
"delete_all_revisions": "Eliminar todas las revisiones de esta nota",
|
"delete_all_revisions": "Eliminar todas las revisiones de esta nota",
|
||||||
"delete_all_button": "Eliminar todas las revisiones",
|
"delete_all_button": "Eliminar todas las revisiones",
|
||||||
"help_title": "Ayuda sobre revisiones de notas",
|
"help_title": "Ayuda sobre revisiones de notas",
|
||||||
"revision_last_edited": "Esta revisión se editó por última vez en {{date}}",
|
|
||||||
"confirm_delete_all": "¿Quiere eliminar todas las revisiones de esta nota?",
|
"confirm_delete_all": "¿Quiere eliminar todas las revisiones de esta nota?",
|
||||||
"no_revisions": "Aún no hay revisiones para esta nota...",
|
"no_revisions": "Aún no hay revisiones para esta nota...",
|
||||||
"restore_button": "Restaurar",
|
"restore_button": "Restaurar",
|
||||||
@ -1715,7 +1716,9 @@
|
|||||||
"window-on-top": "Mantener esta ventana en la parte superior"
|
"window-on-top": "Mantener esta ventana en la parte superior"
|
||||||
},
|
},
|
||||||
"note_detail": {
|
"note_detail": {
|
||||||
"could_not_find_typewidget": "No se pudo encontrar typeWidget para el tipo '{{type}}'"
|
"could_not_find_typewidget": "No se pudo encontrar typeWidget para el tipo '{{type}}'",
|
||||||
|
"printing": "Impresión en curso...",
|
||||||
|
"printing_pdf": "Exportando a PDF en curso.."
|
||||||
},
|
},
|
||||||
"note_title": {
|
"note_title": {
|
||||||
"placeholder": "escriba el título de la nota aquí..."
|
"placeholder": "escriba el título de la nota aquí..."
|
||||||
|
|||||||
@ -260,7 +260,6 @@
|
|||||||
"delete_all_revisions": "Supprimer toutes les versions de cette note",
|
"delete_all_revisions": "Supprimer toutes les versions de cette note",
|
||||||
"delete_all_button": "Supprimer toutes les versions",
|
"delete_all_button": "Supprimer toutes les versions",
|
||||||
"help_title": "Aide sur les versions de notes",
|
"help_title": "Aide sur les versions de notes",
|
||||||
"revision_last_edited": "Cette version a été modifiée pour la dernière fois le {{date}}",
|
|
||||||
"confirm_delete_all": "Voulez-vous supprimer toutes les versions de cette note ?",
|
"confirm_delete_all": "Voulez-vous supprimer toutes les versions de cette note ?",
|
||||||
"no_revisions": "Aucune version pour cette note pour l'instant...",
|
"no_revisions": "Aucune version pour cette note pour l'instant...",
|
||||||
"confirm_restore": "Voulez-vous restaurer cette version ? Le titre et le contenu actuels de la note seront écrasés par cette version.",
|
"confirm_restore": "Voulez-vous restaurer cette version ? Le titre et le contenu actuels de la note seront écrasés par cette version.",
|
||||||
|
|||||||
5
apps/client/src/translations/hi/translation.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"about": {
|
||||||
|
"title": "ट्रिलियम नोट्स के बारें में"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -867,7 +867,6 @@
|
|||||||
"delete_all_revisions": "Elimina tutte le revisioni di questa nota",
|
"delete_all_revisions": "Elimina tutte le revisioni di questa nota",
|
||||||
"delete_all_button": "Elimina tutte le revisioni",
|
"delete_all_button": "Elimina tutte le revisioni",
|
||||||
"help_title": "Aiuto sulle revisioni delle note",
|
"help_title": "Aiuto sulle revisioni delle note",
|
||||||
"revision_last_edited": "Questa revisione è stata modificata l'ultima volta il {{date}}",
|
|
||||||
"confirm_delete_all": "Vuoi eliminare tutte le revisioni di questa nota?",
|
"confirm_delete_all": "Vuoi eliminare tutte le revisioni di questa nota?",
|
||||||
"no_revisions": "Ancora nessuna revisione per questa nota...",
|
"no_revisions": "Ancora nessuna revisione per questa nota...",
|
||||||
"restore_button": "Ripristina",
|
"restore_button": "Ripristina",
|
||||||
|
|||||||
@ -254,7 +254,8 @@
|
|||||||
"export_status": "エクスポート状況",
|
"export_status": "エクスポート状況",
|
||||||
"export_in_progress": "エクスポート処理中: {{progressCount}}",
|
"export_in_progress": "エクスポート処理中: {{progressCount}}",
|
||||||
"export_finished_successfully": "エクスポートが正常に完了しました。",
|
"export_finished_successfully": "エクスポートが正常に完了しました。",
|
||||||
"format_pdf": "PDF - 印刷または共有目的に。"
|
"format_pdf": "PDF - 印刷または共有目的に。",
|
||||||
|
"share-format": "Web 公開用の HTML - 共有ノートで使用されるのと同じテーマを使用しますが、静的 Web サイトとして公開できます。"
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"title": "チートシート",
|
"title": "チートシート",
|
||||||
@ -610,7 +611,6 @@
|
|||||||
"delete_all_revisions": "このノートの変更履歴をすべて削除",
|
"delete_all_revisions": "このノートの変更履歴をすべて削除",
|
||||||
"delete_all_button": "変更履歴をすべて削除",
|
"delete_all_button": "変更履歴をすべて削除",
|
||||||
"help_title": "変更履歴のヘルプ",
|
"help_title": "変更履歴のヘルプ",
|
||||||
"revision_last_edited": "この変更は{{date}}に行われました",
|
|
||||||
"confirm_delete_all": "このノートのすべての変更履歴を削除しますか?",
|
"confirm_delete_all": "このノートのすべての変更履歴を削除しますか?",
|
||||||
"no_revisions": "このノートに変更履歴はまだありません...",
|
"no_revisions": "このノートに変更履歴はまだありません...",
|
||||||
"restore_button": "復元",
|
"restore_button": "復元",
|
||||||
|
|||||||
1
apps/client/src/translations/mr/translation.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
@ -912,7 +912,6 @@
|
|||||||
"delete_all_revisions": "Usuń wszystkie wersje tej notatki",
|
"delete_all_revisions": "Usuń wszystkie wersje tej notatki",
|
||||||
"delete_all_button": "Usuń wszystkie wersje",
|
"delete_all_button": "Usuń wszystkie wersje",
|
||||||
"help_title": "Pomoc dotycząca wersji notatki",
|
"help_title": "Pomoc dotycząca wersji notatki",
|
||||||
"revision_last_edited": "Ta wersja była ostatnio edytowana {{date}}",
|
|
||||||
"confirm_delete_all": "Czy chcesz usunąć wszystkie wersje tej notatki?",
|
"confirm_delete_all": "Czy chcesz usunąć wszystkie wersje tej notatki?",
|
||||||
"no_revisions": "Brak wersji dla tej notatki...",
|
"no_revisions": "Brak wersji dla tej notatki...",
|
||||||
"restore_button": "Przywróć",
|
"restore_button": "Przywróć",
|
||||||
|
|||||||
@ -259,7 +259,6 @@
|
|||||||
"delete_all_revisions": "Apagar todas as versões desta nota",
|
"delete_all_revisions": "Apagar todas as versões desta nota",
|
||||||
"delete_all_button": "Apagar todas as versões",
|
"delete_all_button": "Apagar todas as versões",
|
||||||
"help_title": "Ajuda sobre as versões da nota",
|
"help_title": "Ajuda sobre as versões da nota",
|
||||||
"revision_last_edited": "Esta versão foi editada pela última vez em {{date}}",
|
|
||||||
"confirm_delete_all": "Quer apagar todas as versões desta nota?",
|
"confirm_delete_all": "Quer apagar todas as versões desta nota?",
|
||||||
"no_revisions": "Ainda não há versões para esta nota...",
|
"no_revisions": "Ainda não há versões para esta nota...",
|
||||||
"restore_button": "Recuperar",
|
"restore_button": "Recuperar",
|
||||||
|
|||||||
@ -415,7 +415,6 @@
|
|||||||
"delete_all_revisions": "Excluir todas as versões desta nota",
|
"delete_all_revisions": "Excluir todas as versões desta nota",
|
||||||
"delete_all_button": "Excluir todas as versões",
|
"delete_all_button": "Excluir todas as versões",
|
||||||
"help_title": "Ajuda sobre as versões da nota",
|
"help_title": "Ajuda sobre as versões da nota",
|
||||||
"revision_last_edited": "Esta versão foi editada pela última vez em {{date}}",
|
|
||||||
"confirm_delete_all": "Você quer excluir todas as versões desta nota?",
|
"confirm_delete_all": "Você quer excluir todas as versões desta nota?",
|
||||||
"no_revisions": "Ainda não há versões para esta nota...",
|
"no_revisions": "Ainda não há versões para esta nota...",
|
||||||
"restore_button": "Recuperar",
|
"restore_button": "Recuperar",
|
||||||
|
|||||||
@ -1090,7 +1090,6 @@
|
|||||||
"preview_not_available": "Nu este disponibilă o previzualizare pentru acest tip de notiță.",
|
"preview_not_available": "Nu este disponibilă o previzualizare pentru acest tip de notiță.",
|
||||||
"restore_button": "Restaurează",
|
"restore_button": "Restaurează",
|
||||||
"revision_deleted": "Revizia notiței a fost ștearsă.",
|
"revision_deleted": "Revizia notiței a fost ștearsă.",
|
||||||
"revision_last_edited": "Revizia a fost ultima oară modificată pe {{date}}",
|
|
||||||
"revision_restored": "Revizia notiței a fost restaurată.",
|
"revision_restored": "Revizia notiței a fost restaurată.",
|
||||||
"revisions_deleted": "Notița reviziei a fost ștearsă.",
|
"revisions_deleted": "Notița reviziei a fost ștearsă.",
|
||||||
"maximum_revisions": "Numărul maxim de revizii pentru notița curentă: {{number}}.",
|
"maximum_revisions": "Numărul maxim de revizii pentru notița curentă: {{number}}.",
|
||||||
|
|||||||
@ -366,7 +366,6 @@
|
|||||||
"delete_all_button": "Удалить все версии",
|
"delete_all_button": "Удалить все версии",
|
||||||
"help_title": "Помощь по версиям заметок",
|
"help_title": "Помощь по версиям заметок",
|
||||||
"confirm_delete_all": "Вы хотите удалить все версии этой заметки?",
|
"confirm_delete_all": "Вы хотите удалить все версии этой заметки?",
|
||||||
"revision_last_edited": "Эта версия последний раз редактировалась {{date}}",
|
|
||||||
"confirm_restore": "Хотите восстановить эту версию? Текущее название и содержание заметки будут перезаписаны этой версией.",
|
"confirm_restore": "Хотите восстановить эту версию? Текущее название и содержание заметки будут перезаписаны этой версией.",
|
||||||
"confirm_delete": "Вы хотите удалить эту версию?",
|
"confirm_delete": "Вы хотите удалить эту версию?",
|
||||||
"revisions_deleted": "Версии заметки были удалены.",
|
"revisions_deleted": "Версии заметки были удалены.",
|
||||||
|
|||||||
@ -256,7 +256,6 @@
|
|||||||
"delete_all_revisions": "Obriši sve revizije ove beleške",
|
"delete_all_revisions": "Obriši sve revizije ove beleške",
|
||||||
"delete_all_button": "Obriši sve revizije",
|
"delete_all_button": "Obriši sve revizije",
|
||||||
"help_title": "Pomoć za Revizije beleški",
|
"help_title": "Pomoć za Revizije beleški",
|
||||||
"revision_last_edited": "Ova revizija je poslednji put izmenjena {{date}}",
|
|
||||||
"confirm_delete_all": "Da li želite da obrišete sve revizije ove beleške?",
|
"confirm_delete_all": "Da li želite da obrišete sve revizije ove beleške?",
|
||||||
"no_revisions": "Još uvek nema revizija za ovu belešku...",
|
"no_revisions": "Još uvek nema revizija za ovu belešku...",
|
||||||
"restore_button": "Vrati",
|
"restore_button": "Vrati",
|
||||||
|
|||||||
@ -104,7 +104,8 @@
|
|||||||
"export_in_progress": "正在匯出:{{progressCount}}",
|
"export_in_progress": "正在匯出:{{progressCount}}",
|
||||||
"export_finished_successfully": "成功匯出。",
|
"export_finished_successfully": "成功匯出。",
|
||||||
"format_html": "HTML - 推薦,因為它保留了所有格式",
|
"format_html": "HTML - 推薦,因為它保留了所有格式",
|
||||||
"format_pdf": "PDF - 用於列印或與他人分享。"
|
"format_pdf": "PDF - 用於列印或與他人分享。",
|
||||||
|
"share-format": "HTML 網頁發佈——使用與共享筆記相同的佈景主題,但可發佈為靜態網站。"
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"noteNavigation": "筆記導航",
|
"noteNavigation": "筆記導航",
|
||||||
@ -260,7 +261,6 @@
|
|||||||
"delete_all_revisions": "刪除此筆記的所有歷史版本",
|
"delete_all_revisions": "刪除此筆記的所有歷史版本",
|
||||||
"delete_all_button": "刪除所有歷史版本",
|
"delete_all_button": "刪除所有歷史版本",
|
||||||
"help_title": "關於筆記歷史版本的說明",
|
"help_title": "關於筆記歷史版本的說明",
|
||||||
"revision_last_edited": "此歷史版本上次於 {{date}} 編輯",
|
|
||||||
"confirm_delete_all": "您是否要刪除此筆記的所有歷史版本?",
|
"confirm_delete_all": "您是否要刪除此筆記的所有歷史版本?",
|
||||||
"no_revisions": "此筆記暫無歷史版本…",
|
"no_revisions": "此筆記暫無歷史版本…",
|
||||||
"confirm_restore": "您是否要還原此歷史版本?這將使用此歷史版本覆寫筆記的目前標題和內容。",
|
"confirm_restore": "您是否要還原此歷史版本?這將使用此歷史版本覆寫筆記的目前標題和內容。",
|
||||||
|
|||||||
@ -309,7 +309,6 @@
|
|||||||
"delete_all_revisions": "Видалити всі версії цієї нотатки",
|
"delete_all_revisions": "Видалити всі версії цієї нотатки",
|
||||||
"delete_all_button": "Видалити всі версії",
|
"delete_all_button": "Видалити всі версії",
|
||||||
"help_title": "Довідка щодо Версій нотаток",
|
"help_title": "Довідка щодо Версій нотаток",
|
||||||
"revision_last_edited": "Цю версію востаннє редагували {{date}}",
|
|
||||||
"confirm_delete_all": "Ви хочете видалити всі версії цієї нотатки?",
|
"confirm_delete_all": "Ви хочете видалити всі версії цієї нотатки?",
|
||||||
"no_revisions": "Поки що немає версій цієї нотатки...",
|
"no_revisions": "Поки що немає версій цієї нотатки...",
|
||||||
"restore_button": "Відновити",
|
"restore_button": "Відновити",
|
||||||
|
|||||||
1
apps/client/src/types.d.ts
vendored
@ -26,7 +26,6 @@ interface CustomGlobals {
|
|||||||
appContext: AppContext;
|
appContext: AppContext;
|
||||||
froca: Froca;
|
froca: Froca;
|
||||||
treeCache: Froca;
|
treeCache: Froca;
|
||||||
importMarkdownInline: () => Promise<unknown>;
|
|
||||||
SEARCH_HELP_TEXT: string;
|
SEARCH_HELP_TEXT: string;
|
||||||
activeDialog: JQuery<HTMLElement> | null;
|
activeDialog: JQuery<HTMLElement> | null;
|
||||||
componentId: string;
|
componentId: string;
|
||||||
|
|||||||
@ -79,6 +79,7 @@ export default function ExportDialog() {
|
|||||||
values={[
|
values={[
|
||||||
{ value: "html", label: t("export.format_html_zip") },
|
{ value: "html", label: t("export.format_html_zip") },
|
||||||
{ value: "markdown", label: t("export.format_markdown") },
|
{ value: "markdown", label: t("export.format_markdown") },
|
||||||
|
{ value: "share", label: t("export.share-format") },
|
||||||
{ value: "opml", label: t("export.format_opml") }
|
{ value: "opml", label: t("export.format_opml") }
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import utils from "../../services/utils";
|
|||||||
import Modal from "../react/Modal";
|
import Modal from "../react/Modal";
|
||||||
import Button from "../react/Button";
|
import Button from "../react/Button";
|
||||||
import { useTriliumEvent } from "../react/hooks";
|
import { useTriliumEvent } from "../react/hooks";
|
||||||
|
import EditableTextTypeWidget from "../type_widgets/editable_text";
|
||||||
|
|
||||||
interface RenderMarkdownResponse {
|
interface RenderMarkdownResponse {
|
||||||
htmlContent: string;
|
htmlContent: string;
|
||||||
@ -14,39 +15,34 @@ interface RenderMarkdownResponse {
|
|||||||
|
|
||||||
export default function MarkdownImportDialog() {
|
export default function MarkdownImportDialog() {
|
||||||
const markdownImportTextArea = useRef<HTMLTextAreaElement>(null);
|
const markdownImportTextArea = useRef<HTMLTextAreaElement>(null);
|
||||||
|
const [textTypeWidget, setTextTypeWidget] = useState<EditableTextTypeWidget>();
|
||||||
const [ text, setText ] = useState("");
|
const [ text, setText ] = useState("");
|
||||||
const [ shown, setShown ] = useState(false);
|
const [ shown, setShown ] = useState(false);
|
||||||
|
|
||||||
const triggerImport = useCallback(() => {
|
useTriliumEvent("showPasteMarkdownDialog", ({ textTypeWidget }) => {
|
||||||
if (appContext.tabManager.getActiveContextNoteType() !== "text") {
|
setTextTypeWidget(textTypeWidget);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (utils.isElectron()) {
|
if (utils.isElectron()) {
|
||||||
const { clipboard } = utils.dynamicRequire("electron");
|
const { clipboard } = utils.dynamicRequire("electron");
|
||||||
const text = clipboard.readText();
|
const text = clipboard.readText();
|
||||||
|
|
||||||
convertMarkdownToHtml(text);
|
convertMarkdownToHtml(text, textTypeWidget);
|
||||||
} else {
|
} else {
|
||||||
setShown(true);
|
setShown(true);
|
||||||
}
|
}
|
||||||
}, []);
|
});
|
||||||
|
|
||||||
useTriliumEvent("importMarkdownInline", triggerImport);
|
|
||||||
useTriliumEvent("pasteMarkdownIntoText", triggerImport);
|
|
||||||
|
|
||||||
async function sendForm() {
|
|
||||||
await convertMarkdownToHtml(text);
|
|
||||||
setText("");
|
|
||||||
setShown(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal
|
<Modal
|
||||||
className="markdown-import-dialog" title={t("markdown_import.dialog_title")} size="lg"
|
className="markdown-import-dialog" title={t("markdown_import.dialog_title")} size="lg"
|
||||||
footer={<Button className="markdown-import-button" text={t("markdown_import.import_button")} onClick={sendForm} keyboardShortcut="Ctrl+Space" />}
|
footer={<Button className="markdown-import-button" text={t("markdown_import.import_button")} onClick={() => setShown(false)} keyboardShortcut="Ctrl+Enter" />}
|
||||||
onShown={() => markdownImportTextArea.current?.focus()}
|
onShown={() => markdownImportTextArea.current?.focus()}
|
||||||
onHidden={() => setShown(false) }
|
onHidden={async () => {
|
||||||
|
if (textTypeWidget) {
|
||||||
|
await convertMarkdownToHtml(text, textTypeWidget);
|
||||||
|
}
|
||||||
|
setShown(false);
|
||||||
|
setText("");
|
||||||
|
}}
|
||||||
show={shown}
|
show={shown}
|
||||||
>
|
>
|
||||||
<p>{t("markdown_import.modal_body_text")}</p>
|
<p>{t("markdown_import.modal_body_text")}</p>
|
||||||
@ -56,26 +52,17 @@ export default function MarkdownImportDialog() {
|
|||||||
onKeyDown={(e) => {
|
onKeyDown={(e) => {
|
||||||
if (e.key === "Enter" && e.ctrlKey) {
|
if (e.key === "Enter" && e.ctrlKey) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
sendForm();
|
setShown(false);
|
||||||
}
|
}
|
||||||
}}></textarea>
|
}}></textarea>
|
||||||
</Modal>
|
</Modal>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function convertMarkdownToHtml(markdownContent: string) {
|
async function convertMarkdownToHtml(markdownContent: string, textTypeWidget: EditableTextTypeWidget) {
|
||||||
const { htmlContent } = await server.post<RenderMarkdownResponse>("other/render-markdown", { markdownContent });
|
const { htmlContent } = await server.post<RenderMarkdownResponse>("other/render-markdown", { markdownContent });
|
||||||
|
|
||||||
const textEditor = await appContext.tabManager.getActiveContext()?.getTextEditor();
|
await textTypeWidget.addHtmlToEditor(htmlContent);
|
||||||
if (!textEditor) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const viewFragment = textEditor.data.processor.toView(htmlContent);
|
|
||||||
const modelFragment = textEditor.data.toModel(viewFragment);
|
|
||||||
|
|
||||||
textEditor.model.insertContent(modelFragment, textEditor.model.document.selection);
|
|
||||||
textEditor.editing.view.focus();
|
|
||||||
|
|
||||||
toast.showMessage(t("markdown_import.import_success"));
|
toast.showMessage(t("markdown_import.import_success"));
|
||||||
}
|
}
|
||||||
@ -140,11 +140,10 @@ function RevisionsList({ revisions, onSelect, currentRevision }: { revisions: Re
|
|||||||
<FormList onSelect={onSelect} fullHeight>
|
<FormList onSelect={onSelect} fullHeight>
|
||||||
{revisions.map((item) =>
|
{revisions.map((item) =>
|
||||||
<FormListItem
|
<FormListItem
|
||||||
title={t("revisions.revision_last_edited", { date: item.dateLastEdited })}
|
|
||||||
value={item.revisionId}
|
value={item.revisionId}
|
||||||
active={currentRevision && item.revisionId === currentRevision.revisionId}
|
active={currentRevision && item.revisionId === currentRevision.revisionId}
|
||||||
>
|
>
|
||||||
{item.dateLastEdited && item.dateLastEdited.substr(0, 16)} ({item.contentLength && utils.formatSize(item.contentLength)})
|
{item.dateCreated && item.dateCreated.substr(0, 16)} ({item.contentLength && utils.formatSize(item.contentLength)})
|
||||||
</FormListItem>
|
</FormListItem>
|
||||||
)}
|
)}
|
||||||
</FormList>);
|
</FormList>);
|
||||||
|
|||||||
@ -264,7 +264,6 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
inset-inline-end: 5px;
|
inset-inline-end: 5px;
|
||||||
bottom: 5px;
|
bottom: 5px;
|
||||||
z-index: 1000;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.style-resolver {
|
.style-resolver {
|
||||||
|
|||||||
@ -329,6 +329,30 @@ export default class EditableTextTypeWidget extends AbstractTextTypeWidget {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async addHtmlToEditor(html: string) {
|
||||||
|
await this.initialized;
|
||||||
|
|
||||||
|
const editor = this.watchdog.editor;
|
||||||
|
if (!editor) return;
|
||||||
|
|
||||||
|
editor.model.change((writer) => {
|
||||||
|
const viewFragment = editor.data.processor.toView(html);
|
||||||
|
const modelFragment = editor.data.toModel(viewFragment);
|
||||||
|
const insertPosition = editor.model.document.selection.getLastPosition();
|
||||||
|
|
||||||
|
if (insertPosition) {
|
||||||
|
const range = editor.model.insertContent(modelFragment, insertPosition);
|
||||||
|
|
||||||
|
if (range) {
|
||||||
|
writer.setSelection(range.end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.editing.view.focus();
|
||||||
|
}
|
||||||
|
|
||||||
addTextToActiveEditorEvent({ text }: EventData<"addTextToActiveEditor">) {
|
addTextToActiveEditorEvent({ text }: EventData<"addTextToActiveEditor">) {
|
||||||
if (!this.isActive()) {
|
if (!this.isActive()) {
|
||||||
return;
|
return;
|
||||||
@ -385,6 +409,10 @@ export default class EditableTextTypeWidget extends AbstractTextTypeWidget {
|
|||||||
this.triggerCommand("showAddLinkDialog", { textTypeWidget: this, text: selectedText });
|
this.triggerCommand("showAddLinkDialog", { textTypeWidget: this, text: selectedText });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pasteMarkdownIntoTextCommand() {
|
||||||
|
this.triggerCommand("showPasteMarkdownDialog", { textTypeWidget: this });
|
||||||
|
}
|
||||||
|
|
||||||
getSelectedText() {
|
getSelectedText() {
|
||||||
const range = this.watchdog.editor?.model.document.selection.getFirstRange();
|
const range = this.watchdog.editor?.model.document.selection.getFirstRange();
|
||||||
let text = "";
|
let text = "";
|
||||||
|
|||||||
@ -74,7 +74,6 @@ export default defineConfig(() => ({
|
|||||||
mobile: join(__dirname, "src", "mobile.ts"),
|
mobile: join(__dirname, "src", "mobile.ts"),
|
||||||
login: join(__dirname, "src", "login.ts"),
|
login: join(__dirname, "src", "login.ts"),
|
||||||
setup: join(__dirname, "src", "setup.ts"),
|
setup: join(__dirname, "src", "setup.ts"),
|
||||||
share: join(__dirname, "src", "share.ts"),
|
|
||||||
set_password: join(__dirname, "src", "set_password.ts"),
|
set_password: join(__dirname, "src", "set_password.ts"),
|
||||||
runtime: join(__dirname, "src", "runtime.ts"),
|
runtime: join(__dirname, "src", "runtime.ts"),
|
||||||
print: join(__dirname, "src", "print.tsx")
|
print: join(__dirname, "src", "print.tsx")
|
||||||
@ -84,7 +83,8 @@ export default defineConfig(() => ({
|
|||||||
chunkFileNames: "src/[name].js",
|
chunkFileNames: "src/[name].js",
|
||||||
assetFileNames: "src/[name].[ext]",
|
assetFileNames: "src/[name].[ext]",
|
||||||
manualChunks: {
|
manualChunks: {
|
||||||
"ckeditor5": [ "@triliumnext/ckeditor5" ]
|
"ckeditor5": [ "@triliumnext/ckeditor5" ],
|
||||||
|
"boxicons": [ "../../node_modules/boxicons/css/boxicons.min.css" ]
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
onwarn(warning, rollupWarn) {
|
onwarn(warning, rollupWarn) {
|
||||||
|
|||||||
@ -11,6 +11,7 @@ async function main() {
|
|||||||
// Copy assets.
|
// Copy assets.
|
||||||
build.copy("src/assets", "assets/");
|
build.copy("src/assets", "assets/");
|
||||||
build.copy("/apps/server/src/assets", "assets/");
|
build.copy("/apps/server/src/assets", "assets/");
|
||||||
|
build.triggerBuildAndCopyTo("packages/share-theme", "share-theme/assets/");
|
||||||
build.copy("/packages/share-theme/src/templates", "share-theme/templates/");
|
build.copy("/packages/share-theme/src/templates", "share-theme/templates/");
|
||||||
|
|
||||||
// Copy node modules dependencies
|
// Copy node modules dependencies
|
||||||
|
|||||||
109
apps/edit-docs/src/build-docs.ts
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
process.env.TRILIUM_INTEGRATION_TEST = "memory-no-store";
|
||||||
|
process.env.TRILIUM_RESOURCE_DIR = "../server/src";
|
||||||
|
process.env.NODE_ENV = "development";
|
||||||
|
|
||||||
|
import cls from "@triliumnext/server/src/services/cls.js";
|
||||||
|
import { dirname, join, resolve } from "path";
|
||||||
|
import fs, { copyFile } from "fs/promises";
|
||||||
|
import fsExtra, { createWriteStream, type WriteStream } from "fs-extra";
|
||||||
|
import archiver from "archiver";
|
||||||
|
|
||||||
|
const DOCS_ROOT = "../../../docs";
|
||||||
|
const OUTPUT_DIR = "../../site";
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const i18n = await import("@triliumnext/server/src/services/i18n.js");
|
||||||
|
await i18n.initializeTranslations();
|
||||||
|
|
||||||
|
const sqlInit = (await import("../../server/src/services/sql_init.js")).default;
|
||||||
|
await sqlInit.createInitialDatabase(true);
|
||||||
|
|
||||||
|
const note = await importData(join(__dirname, DOCS_ROOT, "User Guide"));
|
||||||
|
|
||||||
|
// Export
|
||||||
|
const zipFilePath = "output.zip";
|
||||||
|
try {
|
||||||
|
const { exportToZip } = (await import("@triliumnext/server/src/services/export/zip.js")).default;
|
||||||
|
const branch = note.getParentBranches()[0];
|
||||||
|
const taskContext = new (await import("@triliumnext/server/src/services/task_context.js")).default(
|
||||||
|
"no-progress-reporting",
|
||||||
|
"export",
|
||||||
|
null
|
||||||
|
);
|
||||||
|
const fileOutputStream = createWriteStream(zipFilePath);
|
||||||
|
await exportToZip(taskContext, branch, "share", fileOutputStream);
|
||||||
|
await waitForStreamToFinish(fileOutputStream);
|
||||||
|
await extractZip(zipFilePath, OUTPUT_DIR);
|
||||||
|
} finally {
|
||||||
|
if (await fsExtra.exists(zipFilePath)) {
|
||||||
|
await fsExtra.rm(zipFilePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy favicon.
|
||||||
|
await copyFile("../../apps/website/src/assets/favicon.ico", join(OUTPUT_DIR, "favicon.ico"));
|
||||||
|
|
||||||
|
console.log("Documentation built successfully!");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function importData(path: string) {
|
||||||
|
const buffer = await createImportZip(path);
|
||||||
|
const importService = (await import("@triliumnext/server/src/services/import/zip.js")).default;
|
||||||
|
const TaskContext = (await import("@triliumnext/server/src/services/task_context.js")).default;
|
||||||
|
const context = new TaskContext("no-progress-reporting", "importNotes", null);
|
||||||
|
const becca = (await import("@triliumnext/server/src/becca/becca.js")).default;
|
||||||
|
|
||||||
|
const rootNote = becca.getRoot();
|
||||||
|
if (!rootNote) {
|
||||||
|
throw new Error("Missing root note for import.");
|
||||||
|
}
|
||||||
|
return await importService.importZip(context, buffer, rootNote, {
|
||||||
|
preserveIds: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function createImportZip(path: string) {
|
||||||
|
const inputFile = "input.zip";
|
||||||
|
const archive = archiver("zip", {
|
||||||
|
zlib: { level: 0 }
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("Archive path is ", resolve(path))
|
||||||
|
archive.directory(path, "/");
|
||||||
|
|
||||||
|
const outputStream = fsExtra.createWriteStream(inputFile);
|
||||||
|
archive.pipe(outputStream);
|
||||||
|
archive.finalize();
|
||||||
|
await waitForStreamToFinish(outputStream);
|
||||||
|
|
||||||
|
try {
|
||||||
|
return await fsExtra.readFile(inputFile);
|
||||||
|
} finally {
|
||||||
|
await fsExtra.rm(inputFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function waitForStreamToFinish(stream: WriteStream) {
|
||||||
|
return new Promise<void>((res, rej) => {
|
||||||
|
stream.on("finish", () => res());
|
||||||
|
stream.on("error", (err) => rej(err));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function extractZip(zipFilePath: string, outputPath: string, ignoredFiles?: Set<string>) {
|
||||||
|
const { readZipFile, readContent } = (await import("@triliumnext/server/src/services/import/zip.js"));
|
||||||
|
await readZipFile(await fs.readFile(zipFilePath), async (zip, entry) => {
|
||||||
|
// We ignore directories since they can appear out of order anyway.
|
||||||
|
if (!entry.fileName.endsWith("/") && !ignoredFiles?.has(entry.fileName)) {
|
||||||
|
const destPath = join(outputPath, entry.fileName);
|
||||||
|
const fileContent = await readContent(zip, entry);
|
||||||
|
|
||||||
|
await fsExtra.mkdirs(dirname(destPath));
|
||||||
|
await fs.writeFile(destPath, fileContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
zip.readEntry();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
cls.init(main);
|
||||||
@ -6,7 +6,7 @@ import { initializeTranslations } from "@triliumnext/server/src/services/i18n.js
|
|||||||
import debounce from "@triliumnext/client/src/services/debounce.js";
|
import debounce from "@triliumnext/client/src/services/debounce.js";
|
||||||
import { extractZip, importData, initializeDatabase, startElectron } from "./utils.js";
|
import { extractZip, importData, initializeDatabase, startElectron } from "./utils.js";
|
||||||
import cls from "@triliumnext/server/src/services/cls.js";
|
import cls from "@triliumnext/server/src/services/cls.js";
|
||||||
import type { AdvancedExportOptions } from "@triliumnext/server/src/services/export/zip.js";
|
import type { AdvancedExportOptions, ExportFormat } from "@triliumnext/server/src/services/export/zip/abstract_provider.js";
|
||||||
import { parseNoteMetaFile } from "@triliumnext/server/src/services/in_app_help.js";
|
import { parseNoteMetaFile } from "@triliumnext/server/src/services/in_app_help.js";
|
||||||
import type NoteMeta from "@triliumnext/server/src/services/meta/note_meta.js";
|
import type NoteMeta from "@triliumnext/server/src/services/meta/note_meta.js";
|
||||||
|
|
||||||
@ -75,7 +75,7 @@ async function setOptions() {
|
|||||||
optionsService.setOption("compressImages", "false");
|
optionsService.setOption("compressImages", "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
async function exportData(noteId: string, format: "html" | "markdown", outputPath: string, ignoredFiles?: Set<string>) {
|
async function exportData(noteId: string, format: ExportFormat, outputPath: string, ignoredFiles?: Set<string>) {
|
||||||
const zipFilePath = "output.zip";
|
const zipFilePath = "output.zip";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
FROM node:22.21.0-bullseye-slim AS builder
|
FROM node:24.10.0-bullseye-slim AS builder
|
||||||
RUN corepack enable
|
RUN corepack enable
|
||||||
|
|
||||||
# Install native dependencies since we might be building cross-platform.
|
# Install native dependencies since we might be building cross-platform.
|
||||||
@ -7,7 +7,7 @@ COPY ./docker/package.json ./docker/pnpm-workspace.yaml /usr/src/app/
|
|||||||
# We have to use --no-frozen-lockfile due to CKEditor patches
|
# We have to use --no-frozen-lockfile due to CKEditor patches
|
||||||
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
|
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
|
||||||
|
|
||||||
FROM node:22.21.0-bullseye-slim
|
FROM node:24.10.0-bullseye-slim
|
||||||
# Install only runtime dependencies
|
# Install only runtime dependencies
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y --no-install-recommends \
|
apt-get install -y --no-install-recommends \
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
FROM node:22.21.0-alpine AS builder
|
FROM node:24.10.0-alpine AS builder
|
||||||
RUN corepack enable
|
RUN corepack enable
|
||||||
|
|
||||||
# Install native dependencies since we might be building cross-platform.
|
# Install native dependencies since we might be building cross-platform.
|
||||||
@ -7,7 +7,7 @@ COPY ./docker/package.json ./docker/pnpm-workspace.yaml /usr/src/app/
|
|||||||
# We have to use --no-frozen-lockfile due to CKEditor patches
|
# We have to use --no-frozen-lockfile due to CKEditor patches
|
||||||
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
|
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
|
||||||
|
|
||||||
FROM node:22.21.0-alpine
|
FROM node:24.10.0-alpine
|
||||||
# Install runtime dependencies
|
# Install runtime dependencies
|
||||||
RUN apk add --no-cache su-exec shadow
|
RUN apk add --no-cache su-exec shadow
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
FROM node:22.21.0-alpine AS builder
|
FROM node:24.10.0-alpine AS builder
|
||||||
RUN corepack enable
|
RUN corepack enable
|
||||||
|
|
||||||
# Install native dependencies since we might be building cross-platform.
|
# Install native dependencies since we might be building cross-platform.
|
||||||
@ -7,7 +7,7 @@ COPY ./docker/package.json ./docker/pnpm-workspace.yaml /usr/src/app/
|
|||||||
# We have to use --no-frozen-lockfile due to CKEditor patches
|
# We have to use --no-frozen-lockfile due to CKEditor patches
|
||||||
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
|
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
|
||||||
|
|
||||||
FROM node:22.21.0-alpine
|
FROM node:24.10.0-alpine
|
||||||
# Create a non-root user with configurable UID/GID
|
# Create a non-root user with configurable UID/GID
|
||||||
ARG USER=trilium
|
ARG USER=trilium
|
||||||
ARG UID=1001
|
ARG UID=1001
|
||||||
|
|||||||
28
apps/server/Dockerfile.legacy
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
FROM node:22.21.0-bullseye-slim AS builder
|
||||||
|
RUN corepack enable
|
||||||
|
|
||||||
|
# Install native dependencies since we might be building cross-platform.
|
||||||
|
WORKDIR /usr/src/app/build
|
||||||
|
COPY ./docker/package.json ./docker/pnpm-workspace.yaml /usr/src/app/
|
||||||
|
# We have to use --no-frozen-lockfile due to CKEditor patches
|
||||||
|
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
|
||||||
|
|
||||||
|
FROM node:22.21.0-bullseye-slim
|
||||||
|
# Install only runtime dependencies
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y --no-install-recommends \
|
||||||
|
gosu && \
|
||||||
|
rm -rf \
|
||||||
|
/var/lib/apt/lists/* \
|
||||||
|
/var/cache/apt/*
|
||||||
|
|
||||||
|
WORKDIR /usr/src/app
|
||||||
|
COPY ./dist /usr/src/app
|
||||||
|
RUN rm -rf /usr/src/app/node_modules/better-sqlite3
|
||||||
|
COPY --from=builder /usr/src/app/node_modules/better-sqlite3 /usr/src/app/node_modules/better-sqlite3
|
||||||
|
COPY ./start-docker.sh /usr/src/app
|
||||||
|
|
||||||
|
# Configure container
|
||||||
|
EXPOSE 8080
|
||||||
|
CMD [ "sh", "./start-docker.sh" ]
|
||||||
|
HEALTHCHECK --start-period=10s CMD exec gosu node node /usr/src/app/docker_healthcheck.cjs
|
||||||
@ -1,4 +1,4 @@
|
|||||||
FROM node:22.21.0-bullseye-slim AS builder
|
FROM node:24.10.0-bullseye-slim AS builder
|
||||||
RUN corepack enable
|
RUN corepack enable
|
||||||
|
|
||||||
# Install native dependencies since we might be building cross-platform.
|
# Install native dependencies since we might be building cross-platform.
|
||||||
@ -7,7 +7,7 @@ COPY ./docker/package.json ./docker/pnpm-workspace.yaml /usr/src/app/
|
|||||||
# We have to use --no-frozen-lockfile due to CKEditor patches
|
# We have to use --no-frozen-lockfile due to CKEditor patches
|
||||||
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
|
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
|
||||||
|
|
||||||
FROM node:22.21.0-bullseye-slim
|
FROM node:24.10.0-bullseye-slim
|
||||||
# Create a non-root user with configurable UID/GID
|
# Create a non-root user with configurable UID/GID
|
||||||
ARG USER=trilium
|
ARG USER=trilium
|
||||||
ARG UID=1001
|
ARG UID=1001
|
||||||
|
|||||||
@ -26,6 +26,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"better-sqlite3": "12.4.1",
|
"better-sqlite3": "12.4.1",
|
||||||
|
"html-to-text": "9.0.5",
|
||||||
"node-html-parser": "7.0.1"
|
"node-html-parser": "7.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@ -35,8 +36,9 @@
|
|||||||
"@preact/preset-vite": "2.10.2",
|
"@preact/preset-vite": "2.10.2",
|
||||||
"@triliumnext/commons": "workspace:*",
|
"@triliumnext/commons": "workspace:*",
|
||||||
"@triliumnext/express-partial-content": "workspace:*",
|
"@triliumnext/express-partial-content": "workspace:*",
|
||||||
|
"@triliumnext/highlightjs": "workspace:*",
|
||||||
"@triliumnext/turndown-plugin-gfm": "workspace:*",
|
"@triliumnext/turndown-plugin-gfm": "workspace:*",
|
||||||
"@types/archiver": "6.0.4",
|
"@types/archiver": "7.0.0",
|
||||||
"@types/better-sqlite3": "7.6.13",
|
"@types/better-sqlite3": "7.6.13",
|
||||||
"@types/cls-hooked": "4.3.9",
|
"@types/cls-hooked": "4.3.9",
|
||||||
"@types/compression": "1.8.1",
|
"@types/compression": "1.8.1",
|
||||||
@ -56,7 +58,7 @@
|
|||||||
"@types/sanitize-html": "2.16.0",
|
"@types/sanitize-html": "2.16.0",
|
||||||
"@types/sax": "1.2.7",
|
"@types/sax": "1.2.7",
|
||||||
"@types/serve-favicon": "2.5.7",
|
"@types/serve-favicon": "2.5.7",
|
||||||
"@types/serve-static": "1.15.10",
|
"@types/serve-static": "2.2.0",
|
||||||
"@types/stream-throttle": "0.1.4",
|
"@types/stream-throttle": "0.1.4",
|
||||||
"@types/supertest": "6.0.3",
|
"@types/supertest": "6.0.3",
|
||||||
"@types/swagger-ui-express": "4.1.8",
|
"@types/swagger-ui-express": "4.1.8",
|
||||||
@ -66,7 +68,7 @@
|
|||||||
"@types/xml2js": "0.4.14",
|
"@types/xml2js": "0.4.14",
|
||||||
"archiver": "7.0.1",
|
"archiver": "7.0.1",
|
||||||
"async-mutex": "0.5.0",
|
"async-mutex": "0.5.0",
|
||||||
"axios": "1.12.2",
|
"axios": "1.13.0",
|
||||||
"bindings": "1.5.0",
|
"bindings": "1.5.0",
|
||||||
"bootstrap": "5.3.8",
|
"bootstrap": "5.3.8",
|
||||||
"chardet": "2.1.0",
|
"chardet": "2.1.0",
|
||||||
|
|||||||
@ -7,6 +7,7 @@ async function main() {
|
|||||||
|
|
||||||
// Copy assets
|
// Copy assets
|
||||||
build.copy("src/assets", "assets/");
|
build.copy("src/assets", "assets/");
|
||||||
|
build.triggerBuildAndCopyTo("packages/share-theme", "share-theme/assets/");
|
||||||
build.copy("/packages/share-theme/src/templates", "share-theme/templates/");
|
build.copy("/packages/share-theme/src/templates", "share-theme/templates/");
|
||||||
|
|
||||||
// Copy node modules dependencies
|
// Copy node modules dependencies
|
||||||
|
|||||||
2
apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json
generated
vendored
|
Before Width: | Height: | Size: 168 KiB After Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 172 KiB |
|
Before Width: | Height: | Size: 167 KiB After Width: | Height: | Size: 167 KiB |
|
Before Width: | Height: | Size: 237 KiB After Width: | Height: | Size: 237 KiB |
|
Before Width: | Height: | Size: 202 KiB After Width: | Height: | Size: 202 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 191 KiB After Width: | Height: | Size: 191 KiB |
@ -1,6 +1,6 @@
|
|||||||
<figure class="image image_resized" style="width:63.68%;">
|
<figure class="image image_resized" style="width:63.68%;">
|
||||||
<img style="aspect-ratio:1363/1364;" src="Introduction_image.png" width="1363"
|
<img style="aspect-ratio:1363/1364;" src="AI_image.png"
|
||||||
height="1364">
|
width="1363" height="1364">
|
||||||
<figcaption>An example chat with an LLM</figcaption>
|
<figcaption>An example chat with an LLM</figcaption>
|
||||||
</figure>
|
</figure>
|
||||||
<p>The AI / LLM features within Trilium Notes are designed to allow you to
|
<p>The AI / LLM features within Trilium Notes are designed to allow you to
|
||||||
@ -11,13 +11,13 @@
|
|||||||
<p>The quickest way to get started is to navigate to the “AI/LLM” settings:</p>
|
<p>The quickest way to get started is to navigate to the “AI/LLM” settings:</p>
|
||||||
<figure
|
<figure
|
||||||
class="image image_resized" style="width:74.04%;">
|
class="image image_resized" style="width:74.04%;">
|
||||||
<img style="aspect-ratio:1916/1906;" src="5_Introduction_image.png" width="1916"
|
<img style="aspect-ratio:1916/1906;" src="5_AI_image.png"
|
||||||
height="1906">
|
width="1916" height="1906">
|
||||||
</figure>
|
</figure>
|
||||||
<p>Enable the feature:</p>
|
<p>Enable the feature:</p>
|
||||||
<figure class="image image_resized" style="width:82.82%;">
|
<figure class="image image_resized" style="width:82.82%;">
|
||||||
<img style="aspect-ratio:1911/997;" src="1_Introduction_image.png" width="1911"
|
<img style="aspect-ratio:1911/997;" src="1_AI_image.png"
|
||||||
height="997">
|
width="1911" height="997">
|
||||||
</figure>
|
</figure>
|
||||||
|
|
||||||
<h2>Embeddings</h2>
|
<h2>Embeddings</h2>
|
||||||
@ -43,30 +43,30 @@ class="image image_resized" style="width:74.04%;">
|
|||||||
We will then hit the “refresh” button to have it fetch our models:</p>
|
We will then hit the “refresh” button to have it fetch our models:</p>
|
||||||
<figure
|
<figure
|
||||||
class="image image_resized" style="width:82.28%;">
|
class="image image_resized" style="width:82.28%;">
|
||||||
<img style="aspect-ratio:1912/1075;" src="4_Introduction_image.png" width="1912"
|
<img style="aspect-ratio:1912/1075;" src="4_AI_image.png"
|
||||||
height="1075">
|
width="1912" height="1075">
|
||||||
</figure>
|
</figure>
|
||||||
<p>When selecting the dropdown for the “Embedding Model”, embedding models
|
<p>When selecting the dropdown for the “Embedding Model”, embedding models
|
||||||
should be at the top of the list, separated by regular chat models with
|
should be at the top of the list, separated by regular chat models with
|
||||||
a horizontal line, as seen below:</p>
|
a horizontal line, as seen below:</p>
|
||||||
<figure class="image image_resized"
|
<figure class="image image_resized"
|
||||||
style="width:61.73%;">
|
style="width:61.73%;">
|
||||||
<img style="aspect-ratio:1232/959;" src="8_Introduction_image.png" width="1232"
|
<img style="aspect-ratio:1232/959;" src="8_AI_image.png"
|
||||||
height="959">
|
width="1232" height="959">
|
||||||
</figure>
|
</figure>
|
||||||
<p>After selecting an embedding model, embeddings should automatically begin
|
<p>After selecting an embedding model, embeddings should automatically begin
|
||||||
to be generated by checking the embedding statistics at the top of the
|
to be generated by checking the embedding statistics at the top of the
|
||||||
“AI/LLM” settings panel:</p>
|
“AI/LLM” settings panel:</p>
|
||||||
<figure class="image image_resized" style="width:67.06%;">
|
<figure class="image image_resized" style="width:67.06%;">
|
||||||
<img style="aspect-ratio:1333/499;" src="7_Introduction_image.png" width="1333"
|
<img style="aspect-ratio:1333/499;" src="7_AI_image.png"
|
||||||
height="499">
|
width="1333" height="499">
|
||||||
</figure>
|
</figure>
|
||||||
<p>If you don't see any embeddings being created, you will want to scroll
|
<p>If you don't see any embeddings being created, you will want to scroll
|
||||||
to the bottom of the settings, and hit “Recreate All Embeddings”:</p>
|
to the bottom of the settings, and hit “Recreate All Embeddings”:</p>
|
||||||
<figure
|
<figure
|
||||||
class="image image_resized" style="width:65.69%;">
|
class="image image_resized" style="width:65.69%;">
|
||||||
<img style="aspect-ratio:1337/1490;" src="3_Introduction_image.png" width="1337"
|
<img style="aspect-ratio:1337/1490;" src="3_AI_image.png"
|
||||||
height="1490">
|
width="1337" height="1490">
|
||||||
</figure>
|
</figure>
|
||||||
<p>Creating the embeddings will take some time, and will be regenerated when
|
<p>Creating the embeddings will take some time, and will be regenerated when
|
||||||
a Note is created, updated, or deleted (removed).</p>
|
a Note is created, updated, or deleted (removed).</p>
|
||||||
@ -139,8 +139,8 @@ class="image image_resized" style="width:74.04%;">
|
|||||||
<p>When Tools are executed within your Chat, you'll see output like the following:</p>
|
<p>When Tools are executed within your Chat, you'll see output like the following:</p>
|
||||||
<figure
|
<figure
|
||||||
class="image image_resized" style="width:66.88%;">
|
class="image image_resized" style="width:66.88%;">
|
||||||
<img style="aspect-ratio:1372/1591;" src="6_Introduction_image.png" width="1372"
|
<img style="aspect-ratio:1372/1591;" src="6_AI_image.png"
|
||||||
height="1591">
|
width="1372" height="1591">
|
||||||
</figure>
|
</figure>
|
||||||
<p>You don't need to tell the LLM to execute a certain tool, it should “smartly”
|
<p>You don't need to tell the LLM to execute a certain tool, it should “smartly”
|
||||||
call tools and automatically execute them as needed.</p>
|
call tools and automatically execute them as needed.</p>
|
||||||
@ -149,13 +149,13 @@ class="image image_resized" style="width:74.04%;">
|
|||||||
use the “Chat with Notes” button, where you can go ahead and start chatting!:</p>
|
use the “Chat with Notes” button, where you can go ahead and start chatting!:</p>
|
||||||
<figure
|
<figure
|
||||||
class="image image_resized" style="width:60.77%;">
|
class="image image_resized" style="width:60.77%;">
|
||||||
<img style="aspect-ratio:1378/539;" src="2_Introduction_image.png" width="1378"
|
<img style="aspect-ratio:1378/539;" src="2_AI_image.png"
|
||||||
height="539">
|
width="1378" height="539">
|
||||||
</figure>
|
</figure>
|
||||||
<p>If you don't see the “Chat with Notes” button on your side launchbar,
|
<p>If you don't see the “Chat with Notes” button on your side launchbar,
|
||||||
you might need to move it from the “Available Launchers” section to the
|
you might need to move it from the “Available Launchers” section to the
|
||||||
“Visible Launchers” section:</p>
|
“Visible Launchers” section:</p>
|
||||||
<figure class="image image_resized" style="width:69.81%;">
|
<figure class="image image_resized" style="width:69.81%;">
|
||||||
<img style="aspect-ratio:1765/1287;" src="9_Introduction_image.png" width="1765"
|
<img style="aspect-ratio:1765/1287;" src="9_AI_image.png"
|
||||||
height="1287">
|
width="1765" height="1287">
|
||||||
</figure>
|
</figure>
|
||||||
|
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 186 KiB |
@ -11,12 +11,12 @@
|
|||||||
<p>To set your preferred chat model, you'll want to enter the provider's
|
<p>To set your preferred chat model, you'll want to enter the provider's
|
||||||
name here:</p>
|
name here:</p>
|
||||||
<figure class="image image_resized" style="width:88.38%;">
|
<figure class="image image_resized" style="width:88.38%;">
|
||||||
<img style="aspect-ratio:1884/1267;" src="AI Provider Information_im.png"
|
<img style="aspect-ratio:1884/1267;" src="Providers_image.png"
|
||||||
width="1884" height="1267">
|
width="1884" height="1267">
|
||||||
</figure>
|
</figure>
|
||||||
<p>And to set your preferred embedding provider:</p>
|
<p>And to set your preferred embedding provider:</p>
|
||||||
<figure class="image image_resized"
|
<figure class="image image_resized"
|
||||||
style="width:93.47%;">
|
style="width:93.47%;">
|
||||||
<img style="aspect-ratio:1907/1002;" src="1_AI Provider Information_im.png"
|
<img style="aspect-ratio:1907/1002;" src="1_Providers_image.png"
|
||||||
width="1907" height="1002">
|
width="1907" height="1002">
|
||||||
</figure>
|
</figure>
|
||||||
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 270 KiB After Width: | Height: | Size: 270 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
@ -9,8 +9,8 @@ class="image image_resized" style="width:50.49%;">
|
|||||||
width="785" height="498">
|
width="785" height="498">
|
||||||
</figure>
|
</figure>
|
||||||
<figure class="image image_resized" style="width:40.54%;">
|
<figure class="image image_resized" style="width:40.54%;">
|
||||||
<img style="aspect-ratio:467/100;" src="Installing Ollama_image.png" width="467"
|
<img style="aspect-ratio:467/100;" src="Installing Ollama_image.png"
|
||||||
height="100">
|
width="467" height="100">
|
||||||
</figure>
|
</figure>
|
||||||
<figure class="image image_resized" style="width:55.73%;">
|
<figure class="image image_resized" style="width:55.73%;">
|
||||||
<img style="aspect-ratio:1296/1011;" src="1_Installing Ollama_image.png"
|
<img style="aspect-ratio:1296/1011;" src="1_Installing Ollama_image.png"
|
||||||
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 198 KiB |
|
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 175 KiB |
@ -10,9 +10,9 @@
|
|||||||
and arbitrary tags - whenever you change tag attribute in the task note,
|
and arbitrary tags - whenever you change tag attribute in the task note,
|
||||||
this task is then automatically moved to appropriate location.</p>
|
this task is then automatically moved to appropriate location.</p>
|
||||||
<p>Task Manager also integrates with <a href="#root/_help_l0tKav7yLHGF">day notes</a> -
|
<p>Task Manager also integrates with <a href="#root/_help_l0tKav7yLHGF">day notes</a> -
|
||||||
notes are <a href="#root/_help_IakOLONlIfGI">cloned</a> into day note to
|
notes are <a href="#root/_help_IakOLONlIfGI">cloned</a> into day note to both todoDate
|
||||||
both todoDate note and doneDate note (with <a href="#root/_help_kBrnXNG3Hplm">prefix</a> of
|
note and doneDate note (with <a href="#root/_help_kBrnXNG3Hplm">prefix</a> of either
|
||||||
either "TODO" or "DONE").</p>
|
"TODO" or "DONE").</p>
|
||||||
<h2>Implementation</h2>
|
<h2>Implementation</h2>
|
||||||
<p>New tasks are created in the TODO note which has <code>~child:template</code>
|
<p>New tasks are created in the TODO note which has <code>~child:template</code>
|
||||||
<a
|
<a
|
||||||
@ -22,9 +22,9 @@
|
|||||||
<p>Task template defines several <a href="#root/_help_OFXdgB2nNk1F">promoted attributes</a> -
|
<p>Task template defines several <a href="#root/_help_OFXdgB2nNk1F">promoted attributes</a> -
|
||||||
todoDate, doneDate, tags, location. Importantly it also defines <code>~runOnAttributeChange</code> relation
|
todoDate, doneDate, tags, location. Importantly it also defines <code>~runOnAttributeChange</code> relation
|
||||||
- <a href="#root/_help_GPERMystNGTB">event</a> handler which is run on attribute
|
- <a href="#root/_help_GPERMystNGTB">event</a> handler which is run on attribute
|
||||||
change. This <a href="#root/_help_CdNpE2pqjmI6">script</a> handles when e.g.
|
change. This <a href="#root/_help_CdNpE2pqjmI6">script</a> handles when e.g. we
|
||||||
we fill out the doneDate attribute - meaning the task is done and should
|
fill out the doneDate attribute - meaning the task is done and should be
|
||||||
be moved to "Done" note and removed from TODO, locations and tags.</p>
|
moved to "Done" note and removed from TODO, locations and tags.</p>
|
||||||
<h3>New task button</h3>
|
<h3>New task button</h3>
|
||||||
<p>There's also "button" note which contains simple script which adds a button
|
<p>There's also "button" note which contains simple script which adds a button
|
||||||
to create new note (task) in the TODO note.</p><pre><code class="language-text-x-trilium-auto">api.addButtonToToolbar({
|
to create new note (task) in the TODO note.</p><pre><code class="language-text-x-trilium-auto">api.addButtonToToolbar({
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<figure class="image">
|
<figure class="image">
|
||||||
<img style="aspect-ratio:1071/146;" src="Attributes_image.png" width="1071"
|
<img style="aspect-ratio:1071/146;" src="Attributes_image.png"
|
||||||
height="146">
|
width="1071" height="146">
|
||||||
</figure>
|
</figure>
|
||||||
<p>In Trilium, attributes are key-value pairs assigned to notes, providing
|
<p>In Trilium, attributes are key-value pairs assigned to notes, providing
|
||||||
additional metadata or functionality. There are two primary types of attributes:</p>
|
additional metadata or functionality. There are two primary types of attributes:</p>
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<p>Inheritance refers to the process of having a <a href="#root/_help_HI6GBBIduIgv">label</a> or
|
<p>Inheritance refers to the process of having a <a href="#root/_help_HI6GBBIduIgv">label</a> or
|
||||||
a <a href="#root/_help_Cq5X6iKQop6R">relation</a> shared across multiple
|
a <a href="#root/_help_Cq5X6iKQop6R">relation</a> shared across multiple notes,
|
||||||
notes, generally in parent-child relations (or anywhere if using templates).</p>
|
generally in parent-child relations (or anywhere if using templates).</p>
|
||||||
<h2>Standard Inheritance</h2>
|
<h2>Standard Inheritance</h2>
|
||||||
<p>In Trilium, attributes can be automatically inherited by child notes if
|
<p>In Trilium, attributes can be automatically inherited by child notes if
|
||||||
they have the <code>isInheritable</code> flag set to <code>true</code>. This
|
they have the <code>isInheritable</code> flag set to <code>true</code>. This
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<p>A label is an <a href="#root/_help_zEY4DaJG4YT5">attribute</a> of a note
|
<p>A label is an <a href="#root/_help_zEY4DaJG4YT5">attribute</a> of a note which
|
||||||
which has a name and optionally a value.</p>
|
has a name and optionally a value.</p>
|
||||||
<h2>Common use cases</h2>
|
<h2>Common use cases</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>Metadata for personal use</strong>: Assign labels with optional
|
<li><strong>Metadata for personal use</strong>: Assign labels with optional
|
||||||
@ -81,8 +81,7 @@
|
|||||||
<td><code>calendarRoot</code>
|
<td><code>calendarRoot</code>
|
||||||
</td>
|
</td>
|
||||||
<td>Marks the note which should be used as root for <a class="reference-link"
|
<td>Marks the note which should be used as root for <a class="reference-link"
|
||||||
href="#root/_help_l0tKav7yLHGF">Day Notes</a>. Only one should be marked
|
href="#root/_help_l0tKav7yLHGF">Day Notes</a>. Only one should be marked as such.</td>
|
||||||
as such.</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>archived</code>
|
<td><code>archived</code>
|
||||||
@ -154,8 +153,8 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td><code>autoReadOnlyDisabled</code>
|
<td><code>autoReadOnlyDisabled</code>
|
||||||
</td>
|
</td>
|
||||||
<td>Disables automatic <a href="#root/_help_CoFPLs3dRlXc">read-only mode</a> for
|
<td>Disables automatic <a href="#root/_help_CoFPLs3dRlXc">read-only mode</a> for the
|
||||||
the given note.</td>
|
given note.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>appCss</code>
|
<td><code>appCss</code>
|
||||||
@ -177,8 +176,7 @@
|
|||||||
<td>Set to <code>next</code>, <code>next-light</code>, or <code>next-dark</code> to
|
<td>Set to <code>next</code>, <code>next-light</code>, or <code>next-dark</code> to
|
||||||
use the corresponding TriliumNext theme (auto, light or dark) as the base
|
use the corresponding TriliumNext theme (auto, light or dark) as the base
|
||||||
for a custom theme, instead of the legacy one. See <a class="reference-link"
|
for a custom theme, instead of the legacy one. See <a class="reference-link"
|
||||||
href="#root/_help_WFGzWeUK6arS">Customize the Next theme</a> for more
|
href="#root/_help_WFGzWeUK6arS">Customize the Next theme</a> for more information.</td>
|
||||||
information.</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>cssClass</code>
|
<td><code>cssClass</code>
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<p>A relation is similar to a <a href="#root/_help_HI6GBBIduIgv">label</a>,
|
<p>A relation is similar to a <a href="#root/_help_HI6GBBIduIgv">label</a>, but
|
||||||
but instead of having a text value it refers to another note.</p>
|
instead of having a text value it refers to another note.</p>
|
||||||
<h2>Common use cases</h2>
|
<h2>Common use cases</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>Metadata Relationships for personal use</strong>: For example,
|
<li><strong>Metadata Relationships for personal use</strong>: For example,
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<figure class="image">
|
<figure class="image">
|
||||||
<img style="aspect-ratio:1425/654;" src="Bulk Actions_image.png" width="1425"
|
<img style="aspect-ratio:1425/654;" src="Bulk Actions_image.png"
|
||||||
height="654">
|
width="1425" height="654">
|
||||||
</figure>
|
</figure>
|
||||||
<p>The <em>Bulk Actions</em> dialog makes it easy to apply changes to multiple
|
<p>The <em>Bulk Actions</em> dialog makes it easy to apply changes to multiple
|
||||||
notes at once, ranging from simple actions such as adding or removing a
|
notes at once, ranging from simple actions such as adding or removing a
|
||||||
@ -8,8 +8,8 @@
|
|||||||
<h2>Interaction</h2>
|
<h2>Interaction</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>The first step is to select the notes in the <a class="reference-link"
|
<li>The first step is to select the notes in the <a class="reference-link"
|
||||||
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>. It's possible to apply bulk
|
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>. It's possible to apply bulk actions
|
||||||
actions to:
|
to:
|
||||||
<ul>
|
<ul>
|
||||||
<li>A single note (and potentially its child notes) simply by clicking on
|
<li>A single note (and potentially its child notes) simply by clicking on
|
||||||
it (with a left click or a right click).</li>
|
it (with a left click or a right click).</li>
|
||||||
@ -53,17 +53,17 @@
|
|||||||
</li>
|
</li>
|
||||||
<li><strong>Update label value</strong>
|
<li><strong>Update label value</strong>
|
||||||
<ul>
|
<ul>
|
||||||
<li>For each note, if it has a <a href="#root/_help_HI6GBBIduIgv">label</a> of
|
<li>For each note, if it has a <a href="#root/_help_HI6GBBIduIgv">label</a> of the
|
||||||
the given name, it will change its value to the specified one. Leave <em>New value</em> field
|
given name, it will change its value to the specified one. Leave <em>New value</em> field
|
||||||
empty to create a label without a value.</li>
|
empty to create a label without a value.</li>
|
||||||
<li>Notes without the label will not be affected.</li>
|
<li>Notes without the label will not be affected.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><em><strong>Rename label</strong></em>
|
<li><em><strong>Rename label</strong></em>
|
||||||
<ul>
|
<ul>
|
||||||
<li>For each note, if it has a <a href="#root/_help_HI6GBBIduIgv">label</a> of
|
<li>For each note, if it has a <a href="#root/_help_HI6GBBIduIgv">label</a> of the
|
||||||
the given name, it will be renamed/replaced with a label of the new name.
|
given name, it will be renamed/replaced with a label of the new name. The
|
||||||
The value of the label (if present) will be kept intact.</li>
|
value of the label (if present) will be kept intact.</li>
|
||||||
<li>Notes without the label will not be affected.</li>
|
<li>Notes without the label will not be affected.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
<p>A Trilium instance represents a server. If <a class="reference-link"
|
<p>A Trilium instance represents a server. If <a class="reference-link"
|
||||||
href="#root/_help_cbkrhQjrkKrh">Synchronization</a> is set up, since
|
href="#root/_help_cbkrhQjrkKrh">Synchronization</a> is set up, since multiple
|
||||||
multiple servers are involved (the one from the desktop client and the
|
servers are involved (the one from the desktop client and the one the synchronisation
|
||||||
one the synchronisation is set up with), sometimes it can be useful to
|
is set up with), sometimes it can be useful to distinguish the instance
|
||||||
distinguish the instance you are running on.</p>
|
you are running on.</p>
|
||||||
<h2>Setting the instance name</h2>
|
<h2>Setting the instance name</h2>
|
||||||
<p>To set up a name for the instance, modify the <code>config.ini</code>:</p><pre><code class="language-text-x-trilium-auto">[General]
|
<p>To set up a name for the instance, modify the <code>config.ini</code>:</p><pre><code class="language-text-x-trilium-auto">[General]
|
||||||
instanceName=Hello</code></pre>
|
instanceName=Hello</code></pre>
|
||||||
|
|||||||
@ -23,5 +23,5 @@
|
|||||||
<p>If you do not need to preserve any configurations that might be stored
|
<p>If you do not need to preserve any configurations that might be stored
|
||||||
in the <code>config.ini</code> file, you can just delete all of the <a href="#root/_help_tAassRL4RSQL">data directory's</a> contents
|
in the <code>config.ini</code> file, you can just delete all of the <a href="#root/_help_tAassRL4RSQL">data directory's</a> contents
|
||||||
to fully restore the application to its original state. You can also review
|
to fully restore the application to its original state. You can also review
|
||||||
the <a href="#root/_help_Gzjqa934BdH4">configuration</a> file to provide
|
the <a href="#root/_help_Gzjqa934BdH4">configuration</a> file to provide all <code>config.ini</code> values
|
||||||
all <code>config.ini</code> values as environment variables instead.</p>
|
as environment variables instead.</p>
|
||||||
@ -1,6 +1,6 @@
|
|||||||
<figure class="image image-style-align-right">
|
<figure class="image image-style-align-right">
|
||||||
<img style="aspect-ratio:263/445;" src="Hidden Notes_image.png" width="263"
|
<img style="aspect-ratio:263/445;" src="Hidden Notes_image.png"
|
||||||
height="445">
|
width="263" height="445">
|
||||||
</figure>
|
</figure>
|
||||||
<p>For easy extensibility, a lot of features in Trilium make use of actual
|
<p>For easy extensibility, a lot of features in Trilium make use of actual
|
||||||
notes to store information as opposed to having them stored in a separate
|
notes to store information as opposed to having them stored in a separate
|
||||||
@ -8,14 +8,13 @@
|
|||||||
href="#root/_help_zEY4DaJG4YT5">Attributes</a>, <a class="reference-link"
|
href="#root/_help_zEY4DaJG4YT5">Attributes</a>, <a class="reference-link"
|
||||||
href="#root/_help_Cq5X6iKQop6R">Relations</a> or even <a class="reference-link"
|
href="#root/_help_Cq5X6iKQop6R">Relations</a> or even <a class="reference-link"
|
||||||
href="#root/_help_eIg8jdvaoNNd">Search</a> and <a class="reference-link"
|
href="#root/_help_eIg8jdvaoNNd">Search</a> and <a class="reference-link"
|
||||||
href="#root/_help_QEAPj01N5f7w">Links</a> to be able to operate on
|
href="#root/_help_QEAPj01N5f7w">Links</a> to be able to operate on them.</p>
|
||||||
them.</p>
|
|
||||||
<p>As the name suggests, these notes are hidden to the user by default to
|
<p>As the name suggests, these notes are hidden to the user by default to
|
||||||
prevent cluttering the note tree and to prevent them from being accidentally
|
prevent cluttering the note tree and to prevent them from being accidentally
|
||||||
deleted.</p>
|
deleted.</p>
|
||||||
<p>The hidden notes are stored in the user's <a class="reference-link"
|
<p>The hidden notes are stored in the user's <a class="reference-link"
|
||||||
href="#root/_help_wX4HbRucYSDD">Database</a> just like normal notes,
|
href="#root/_help_wX4HbRucYSDD">Database</a> just like normal notes, but
|
||||||
but they have a unique <a class="reference-link" href="#root/_help_m1lbrzyKDaRB">Note ID</a> which
|
they have a unique <a class="reference-link" href="#root/_help_m1lbrzyKDaRB">Note ID</a> which
|
||||||
allows them to be distinguished from the normal ones.</p>
|
allows them to be distinguished from the normal ones.</p>
|
||||||
<h2>Accessing the hidden note tree</h2>
|
<h2>Accessing the hidden note tree</h2>
|
||||||
<p>From the <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a>,
|
<p>From the <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a>,
|
||||||
@ -51,8 +50,8 @@ class="ck-table-resized">
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<p>When SQL queries or commands are executed in the <a class="reference-link"
|
<p>When SQL queries or commands are executed in the <a class="reference-link"
|
||||||
href="#root/_help_YKWqdJhzi2VY">SQL Console</a>, they are stored here,
|
href="#root/_help_YKWqdJhzi2VY">SQL Console</a>, they are stored here, grouped
|
||||||
grouped by month. Only the query is stored and not the results.</p>
|
by month. Only the query is stored and not the results.</p>
|
||||||
<p>This section can be accessed without going to the hidden tree by simply
|
<p>This section can be accessed without going to the hidden tree by simply
|
||||||
going to the <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a> and
|
going to the <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a> and
|
||||||
selecting Advanced → Open SQL Console History.</p>
|
selecting Advanced → Open SQL Console History.</p>
|
||||||
@ -65,9 +64,8 @@ class="ck-table-resized">
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<p>Whenever a search is executed from the full <a class="reference-link"
|
<p>Whenever a search is executed from the full <a class="reference-link"
|
||||||
href="#root/_help_eIg8jdvaoNNd">Search</a>, the query will be stored here,
|
href="#root/_help_eIg8jdvaoNNd">Search</a>, the query will be stored here, grouped
|
||||||
grouped by month. Only the search parameters are stored and not the results
|
by month. Only the search parameters are stored and not the results themselves.</p>
|
||||||
themselves.</p>
|
|
||||||
<p>This section can be accessed without going to the hidden tree by simply
|
<p>This section can be accessed without going to the hidden tree by simply
|
||||||
going to the <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a> and
|
going to the <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a> and
|
||||||
selecting Advanced → Open Search History.</p>
|
selecting Advanced → Open Search History.</p>
|
||||||
|
|||||||
12
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Metrics.html
generated
vendored
@ -82,18 +82,18 @@ trilium_notes_total 1234 1701432000
|
|||||||
</ul>
|
</ul>
|
||||||
<h2><strong>Grafana Dashboard</strong></h2>
|
<h2><strong>Grafana Dashboard</strong></h2>
|
||||||
<figure class="image">
|
<figure class="image">
|
||||||
<img style="aspect-ratio:2594/1568;" src="1_Metrics_image.png" width="2594"
|
<img style="aspect-ratio:2594/1568;" src="1_Metrics_image.png"
|
||||||
height="1568">
|
width="2594" height="1568">
|
||||||
</figure>
|
</figure>
|
||||||
<p>You can also use the Grafana Dashboard that has been created for TriliumNext
|
<p>You can also use the Grafana Dashboard that has been created for TriliumNext
|
||||||
- just take the JSON from <a class="reference-link" href="#root/_help_bOP3TB56fL1V">grafana-dashboard.json</a> and
|
- just take the JSON from <a class="reference-link" href="#root/_help_bOP3TB56fL1V">grafana-dashboard.json</a> and
|
||||||
then import the dashboard, following these screenshots:</p>
|
then import the dashboard, following these screenshots:</p>
|
||||||
<figure class="image">
|
<figure class="image">
|
||||||
<img style="aspect-ratio:1881/282;" src="2_Metrics_image.png" width="1881"
|
<img style="aspect-ratio:1881/282;" src="2_Metrics_image.png"
|
||||||
height="282">
|
width="1881" height="282">
|
||||||
</figure>
|
</figure>
|
||||||
<p>Then paste the JSON, and hit load:</p>
|
<p>Then paste the JSON, and hit load:</p>
|
||||||
<figure class="image">
|
<figure class="image">
|
||||||
<img style="aspect-ratio:1055/830;" src="Metrics_image.png" width="1055"
|
<img style="aspect-ratio:1055/830;" src="Metrics_image.png"
|
||||||
height="830">
|
width="1055" height="830">
|
||||||
</figure>
|
</figure>
|
||||||
@ -6,7 +6,16 @@
|
|||||||
<li>Note Map, which shows the hierarchical tree structure.</li>
|
<li>Note Map, which shows the hierarchical tree structure.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h2>Link Map</h2>
|
<h2>Link Map</h2>
|
||||||
<p>Shows <a href="#root/_help_zEY4DaJG4YT5">relations</a> between notes:</p>
|
<p>The Link map is a visualization of links and <a class="reference-link"
|
||||||
|
href="#root/_help_Cq5X6iKQop6R">Relations</a> incoming to and outgoing from
|
||||||
|
a particular note.</p>
|
||||||
|
<p>The map indicates the following types of relations:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a class="reference-link" href="#root/_help_hrZ1D00cLbal">Internal (reference) links</a> between
|
||||||
|
notes.</li>
|
||||||
|
<li><a class="reference-link" href="#root/_help_Cq5X6iKQop6R">Relations</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
<p>
|
<p>
|
||||||
<img src="1_Note Map (Link map, Tree m.png">
|
<img src="1_Note Map (Link map, Tree m.png">
|
||||||
</p>
|
</p>
|
||||||
@ -21,8 +30,8 @@
|
|||||||
in full screen. See <a href="#root/_help_bdUJEHsAPYQR">Note Map</a> for
|
in full screen. See <a href="#root/_help_bdUJEHsAPYQR">Note Map</a> for
|
||||||
more information.</p>
|
more information.</p>
|
||||||
<h2>See also</h2>
|
<h2>See also</h2>
|
||||||
<p><a href="#root/_help_iRwzGnHPzonm">Relation map</a> is a similar concept,
|
<p><a href="#root/_help_iRwzGnHPzonm">Relation map</a> is a similar concept, with
|
||||||
with some differences:</p>
|
some differences:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>note map is automatically generated while relation map must be created
|
<li>note map is automatically generated while relation map must be created
|
||||||
manually</li>
|
manually</li>
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li><a class="reference-link" href="#root/_help_iPIMuisry3hd">Text</a> notes are
|
<li><a class="reference-link" href="#root/_help_iPIMuisry3hd">Text</a> notes are
|
||||||
represented internally as HTML, using the <a class="reference-link"
|
represented internally as HTML, using the <a class="reference-link"
|
||||||
href="#root/_help_MI26XDLSAlCD">CKEditor</a> representation. Note
|
href="#root/_help_MI26XDLSAlCD">CKEditor</a> representation. Note that due
|
||||||
that due to the custom plugins, some HTML elements are specific to Trilium
|
to the custom plugins, some HTML elements are specific to Trilium only,
|
||||||
only, for example the admonitions.</li>
|
for example the admonitions.</li>
|
||||||
<li><a class="reference-link" href="#root/_help_6f9hih2hXXZk">Code</a> notes are
|
<li><a class="reference-link" href="#root/_help_6f9hih2hXXZk">Code</a> notes are
|
||||||
plain text and are represented internally as-is.</li>
|
plain text and are represented internally as-is.</li>
|
||||||
<li><a class="reference-link" href="#root/_help_81SGnPGMk7Xc">Geo Map</a> notes
|
<li><a class="reference-link" href="#root/_help_81SGnPGMk7Xc">Geo Map</a> notes
|
||||||
@ -22,10 +22,10 @@
|
|||||||
</ul>
|
</ul>
|
||||||
<p>Note that some information is also stored as <a class="reference-link"
|
<p>Note that some information is also stored as <a class="reference-link"
|
||||||
href="#root/_help_0vhv7lsOLy82">Attachments</a>. For example <a class="reference-link"
|
href="#root/_help_0vhv7lsOLy82">Attachments</a>. For example <a class="reference-link"
|
||||||
href="#root/_help_grjYqerjn243">Canvas</a> notes use the attachments
|
href="#root/_help_grjYqerjn243">Canvas</a> notes use the attachments feature
|
||||||
feature to store the custom libraries, and alongside with <a class="reference-link"
|
to store the custom libraries, and alongside with <a class="reference-link"
|
||||||
href="#root/_help_gBbsAeiuUxI5">Mind Map</a> and other similar note
|
href="#root/_help_gBbsAeiuUxI5">Mind Map</a> and other similar note types
|
||||||
types it stores an SVG representation of the content for use in other features
|
it stores an SVG representation of the content for use in other features
|
||||||
such as including in other notes, shared notes, etc.</p>
|
such as including in other notes, shared notes, etc.</p>
|
||||||
<p>Here's part of the HTML representation of this note, as it's stored in
|
<p>Here's part of the HTML representation of this note, as it's stored in
|
||||||
the database (but prettified).</p><pre><code class="language-text-x-trilium-auto"><h2>
|
the database (but prettified).</p><pre><code class="language-text-x-trilium-auto"><h2>
|
||||||
|
|||||||
144
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Sharing.html
generated
vendored
@ -3,8 +3,8 @@
|
|||||||
from your Trilium notes, making it accessible to others online.</p>
|
from your Trilium notes, making it accessible to others online.</p>
|
||||||
<figure
|
<figure
|
||||||
class="image">
|
class="image">
|
||||||
<img style="aspect-ratio:1144/660;" src="Sharing_image.png" width="1144"
|
<img style="aspect-ratio:1144/660;" src="Sharing_image.png"
|
||||||
height="660">
|
width="1144" height="660">
|
||||||
</figure>
|
</figure>
|
||||||
|
|
||||||
<h2>Features, interaction and limitations</h2>
|
<h2>Features, interaction and limitations</h2>
|
||||||
@ -149,7 +149,7 @@ class="image">
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th><a class="reference-link" href="#root/_help_81SGnPGMk7Xc">Geo Map View</a>
|
<th><a class="reference-link" href="#root/_help_81SGnPGMk7Xc">Geo Map</a>
|
||||||
</th>
|
</th>
|
||||||
<td>Not supported.</td>
|
<td>Not supported.</td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
@ -177,8 +177,8 @@ class="image">
|
|||||||
<p>Some of these limitations may be addressed in future updates.</p>
|
<p>Some of these limitations may be addressed in future updates.</p>
|
||||||
<h2>Prerequisites</h2>
|
<h2>Prerequisites</h2>
|
||||||
<p>To use the sharing feature, you must have a <a class="reference-link"
|
<p>To use the sharing feature, you must have a <a class="reference-link"
|
||||||
href="#root/_help_WOcw2SLH6tbX">Server Installation</a> of Trilium.
|
href="#root/_help_WOcw2SLH6tbX">Server Installation</a> of Trilium. This
|
||||||
This is necessary because the notes will be hosted from the server.</p>
|
is necessary because the notes will be hosted from the server.</p>
|
||||||
<h2>Sharing a note</h2>
|
<h2>Sharing a note</h2>
|
||||||
<ol>
|
<ol>
|
||||||
<li>
|
<li>
|
||||||
@ -186,7 +186,8 @@ class="image">
|
|||||||
within the note's interface. Once sharing is enabled, an URL will appear,
|
within the note's interface. Once sharing is enabled, an URL will appear,
|
||||||
which you can click to access the shared note.</p>
|
which you can click to access the shared note.</p>
|
||||||
<p>
|
<p>
|
||||||
<img src="Sharing_share-single-note.png" alt="Share Note">
|
<img src="Sharing_share-single-note.png"
|
||||||
|
alt="Share Note">
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
@ -207,9 +208,19 @@ class="image">
|
|||||||
This allows you to manage and navigate through all the notes you have made
|
This allows you to manage and navigate through all the notes you have made
|
||||||
public.</p>
|
public.</p>
|
||||||
<h2>Security considerations</h2>
|
<h2>Security considerations</h2>
|
||||||
<p>Shared notes are published on the open internet and can be accessed by
|
<ul>
|
||||||
anyone with the URL. The URL's randomness does not provide security, so
|
<li>Shared notes are published on the open internet and can be accessed by
|
||||||
it is crucial not to share sensitive information through this feature.</p>
|
anyone with the URL unless the notes are password-protected.</li>
|
||||||
|
<li>The URL's randomness does not provide security, so it is crucial not to
|
||||||
|
share sensitive information through this feature.</li>
|
||||||
|
<li>Trilium takes precautions to protect your publicly shared instance from
|
||||||
|
leaking information for non-shared notes, including opening a separate
|
||||||
|
read-only connection to the <a class="reference-link" href="#root/_help_wX4HbRucYSDD">Database</a>.
|
||||||
|
Depending on your threat model, it might make more sense to use
|
||||||
|
<a
|
||||||
|
class="reference-link" href="#root/_help_ycBFjKrrwE9p">Exporting HTML for web publishing</a> and use battle-tested web servers
|
||||||
|
such as Nginx or Apache to serve static content.</li>
|
||||||
|
</ul>
|
||||||
<h3>Password protection</h3>
|
<h3>Password protection</h3>
|
||||||
<p>To protect shared notes with a username and password, you can use the <code>#shareCredentials</code> attribute.
|
<p>To protect shared notes with a username and password, you can use the <code>#shareCredentials</code> attribute.
|
||||||
Add this label to the note with the format <code>#shareCredentials="username:password"</code>.
|
Add this label to the note with the format <code>#shareCredentials="username:password"</code>.
|
||||||
@ -220,10 +231,10 @@ class="image">
|
|||||||
it using your own CSS:</p>
|
it using your own CSS:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>Custom CSS</strong>: Link a CSS <a class="reference-link"
|
<li><strong>Custom CSS</strong>: Link a CSS <a class="reference-link"
|
||||||
href="#root/_help_6f9hih2hXXZk">Code</a> note to the shared page by
|
href="#root/_help_6f9hih2hXXZk">Code</a> note to the shared page by adding
|
||||||
adding a <code>~shareCss</code> relation to the note. If you want this style
|
a <code>~shareCss</code> relation to the note. If you want this style to
|
||||||
to apply to the entire subtree, make the label inheritable. You can hide
|
apply to the entire subtree, make the label inheritable. You can hide the
|
||||||
the CSS code note from the tree navigation by adding the <code>#shareHiddenFromTree</code> label.</li>
|
CSS code note from the tree navigation by adding the <code>#shareHiddenFromTree</code> label.</li>
|
||||||
<li><strong>Omitting Default CSS</strong>: For extensive styling changes,
|
<li><strong>Omitting Default CSS</strong>: For extensive styling changes,
|
||||||
use the <code>#shareOmitDefaultCss</code> label to avoid conflicts with Trilium's
|
use the <code>#shareOmitDefaultCss</code> label to avoid conflicts with Trilium's
|
||||||
<a
|
<a
|
||||||
@ -279,6 +290,15 @@ for (const attr of parentNote.attributes) {
|
|||||||
<li>Using slashes (<code>/</code>) within aliases to create subpaths is not
|
<li>Using slashes (<code>/</code>) within aliases to create subpaths is not
|
||||||
supported.</li>
|
supported.</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
<aside class="admonition tip">
|
||||||
|
<ul>
|
||||||
|
<li>To easily identify pages that don't have a share alias, run a
|
||||||
|
<a
|
||||||
|
class="reference-link" href="#root/_help_eIg8jdvaoNNd">Search</a> with <code>#!shareAlias</code>.</li>
|
||||||
|
<li>To be able to enter the share alias faster, consider using <a class="reference-link"
|
||||||
|
href="#root/_help_OFXdgB2nNk1F">Promoted Attributes</a> (for example <code>#label:shareAlias(inheritable)="promoted,alias=Slug,single,text"</code>).</li>
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
<h3>Setting a custom favicon</h3>
|
<h3>Setting a custom favicon</h3>
|
||||||
<p>To customize the favicon for your shared pages, create a relation <code>~shareFavicon</code> pointing
|
<p>To customize the favicon for your shared pages, create a relation <code>~shareFavicon</code> pointing
|
||||||
to a file note containing the favicon (e.g., in <code>.ico</code> format).</p>
|
to a file note containing the favicon (e.g., in <code>.ico</code> format).</p>
|
||||||
@ -299,7 +319,11 @@ for (const attr of parentNote.attributes) {
|
|||||||
When viewed, the list of shared roots will be displayed at the bottom of
|
When viewed, the list of shared roots will be displayed at the bottom of
|
||||||
the note.</p>
|
the note.</p>
|
||||||
<h2>Attribute reference</h2>
|
<h2>Attribute reference</h2>
|
||||||
<table>
|
<table class="ck-table-resized">
|
||||||
|
<colgroup>
|
||||||
|
<col style="width:18.38%;">
|
||||||
|
<col style="width:81.62%;">
|
||||||
|
</colgroup>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Attribute</th>
|
<th>Attribute</th>
|
||||||
@ -308,40 +332,40 @@ for (const attr of parentNote.attributes) {
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>shareHiddenFromTree</code>
|
<td><code>#shareHiddenFromTree</code>
|
||||||
</td>
|
</td>
|
||||||
<td>this note is hidden from left navigation tree, but still accessible with
|
<td>this note is hidden from left navigation tree, but still accessible with
|
||||||
its URL</td>
|
its URL</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>shareExternalLink</code>
|
<td><code>#shareExternalLink</code>
|
||||||
</td>
|
</td>
|
||||||
<td>note will act as a link to an external website in the share tree</td>
|
<td>note will act as a link to an external website in the share tree</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>shareAlias</code>
|
<td><code>#shareAlias</code>
|
||||||
</td>
|
</td>
|
||||||
<td>define an alias using which the note will be available under <code>https://your_trilium_host/share/[your_alias]</code>
|
<td>define an alias using which the note will be available under <code>https://your_trilium_host/share/[your_alias]</code>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>shareOmitDefaultCss</code>
|
<td><code>#shareOmitDefaultCss</code>
|
||||||
</td>
|
</td>
|
||||||
<td>default share page CSS will be omitted. Use when you make extensive styling
|
<td>default share page CSS will be omitted. Use when you make extensive styling
|
||||||
changes.</td>
|
changes.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>shareRoot</code>
|
<td><code>#shareRoot</code>
|
||||||
</td>
|
</td>
|
||||||
<td>marks note which is served on /share root.</td>
|
<td>marks note which is served on /share root.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>shareDescription</code>
|
<td><code>#shareDescription</code>
|
||||||
</td>
|
</td>
|
||||||
<td>define text to be added to the HTML meta tag for description</td>
|
<td>define text to be added to the HTML meta tag for description</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>shareRaw</code>
|
<td><code>#shareRaw</code>
|
||||||
</td>
|
</td>
|
||||||
<td>Note will be served in its raw format, without HTML wrapper. See also
|
<td>Note will be served in its raw format, without HTML wrapper. See also
|
||||||
<a
|
<a
|
||||||
@ -349,7 +373,7 @@ for (const attr of parentNote.attributes) {
|
|||||||
without setting an attribute.</td>
|
without setting an attribute.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>shareDisallowRobotIndexing</code>
|
<td><code>#shareDisallowRobotIndexing</code>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<p>Indicates to web crawlers that the page should not be indexed of this
|
<p>Indicates to web crawlers that the page should not be indexed of this
|
||||||
@ -361,19 +385,19 @@ for (const attr of parentNote.attributes) {
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>shareCredentials</code>
|
<td><code>#shareCredentials</code>
|
||||||
</td>
|
</td>
|
||||||
<td>require credentials to access this shared note. Value is expected to be
|
<td>require credentials to access this shared note. Value is expected to be
|
||||||
in format <code>username:password</code>. Don't forget to make this inheritable
|
in format <code>username:password</code>. Don't forget to make this inheritable
|
||||||
to apply to child-notes/images.</td>
|
to apply to child-notes/images.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>shareIndex</code>
|
<td><code>#shareIndex</code>
|
||||||
</td>
|
</td>
|
||||||
<td>Note with this label will list all roots of shared notes.</td>
|
<td>Note with this label will list all roots of shared notes.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><code>shareHtmlLocation</code>
|
<td><code>#shareHtmlLocation</code>
|
||||||
</td>
|
</td>
|
||||||
<td>defines where custom HTML injected via <code>~shareHtml</code> relation
|
<td>defines where custom HTML injected via <code>~shareHtml</code> relation
|
||||||
should be placed. Applied to the HTML snippet note itself. Format: <code>location:position</code> where
|
should be placed. Applied to the HTML snippet note itself. Format: <code>location:position</code> where
|
||||||
@ -383,6 +407,76 @@ for (const attr of parentNote.attributes) {
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
<h3>Customizing logo</h3>
|
||||||
|
<p>It's possible to adjust the logo which is displayed on the top-left of
|
||||||
|
the left pane.</p>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Attribute</th>
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td><code>~shareLogo</code>
|
||||||
|
</td>
|
||||||
|
<td>Relation set to an image to use as logo. The image must be part of the
|
||||||
|
share tree (it can be hidden if needed).</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>#shareLogoWidth</code>
|
||||||
|
</td>
|
||||||
|
<td>The width (in pixels, without unit) to set for the logo. Default is <code>53</code>.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>#shareLogoHeight</code>
|
||||||
|
</td>
|
||||||
|
<td>The height (in pixels, without unit) to set for the logo. Default is <code>40</code>.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>#shareRootLink</code>
|
||||||
|
</td>
|
||||||
|
<td>URL to navigate to when the logo is pressed.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h3>Customizing OpenGraph</h3>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Attribute</th>
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td><code>#shareOpenGraphColor</code>
|
||||||
|
</td>
|
||||||
|
<td>This adjusts the <code>theme-color</code> meta-property.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>#shareOpenGraphURL</code>
|
||||||
|
</td>
|
||||||
|
<td>This adjusts the <code>og:url</code> and <code>twitter:url</code> meta-properties.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>#shareOpenGraphDomain</code>
|
||||||
|
</td>
|
||||||
|
<td>Adjusts the <code>twitter:domain</code> meta-property.</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>#shareOpenGraphImage</code>
|
||||||
|
<br><code>~shareOpenGraphImage</code>
|
||||||
|
</td>
|
||||||
|
<td>Can be either a label, case in which the value is passed on as-is, or
|
||||||
|
it can be a relation to an image <a class="reference-link" href="#root/_help_W8vYD3Q1zjCR">File</a>.
|
||||||
|
This controls the <code>og:image</code> meta-property.</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
<h2>Credits</h2>
|
<h2>Credits</h2>
|
||||||
<p>Since v0.95.0, a new theme was introduced (and enabled by default) which
|
<p>Since v0.95.0, a new theme was introduced (and enabled by default) which
|
||||||
greatly improves the visual aspect of the Share feature, as well as its
|
greatly improves the visual aspect of the Share feature, as well as its
|
||||||
|
|||||||
58
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Sharing/Exporting HTML for web publish.html
generated
vendored
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
<p>As described in <a class="reference-link" href="#root/_help_R9pX4DGra2Vt">Sharing</a>,
|
||||||
|
Trilium can act as a public server in which the shared notes are displayed
|
||||||
|
in read-only mode. While this can work in most cases, it's generally not
|
||||||
|
meant for high-traffic websites and since it's running on a Node.js server
|
||||||
|
it can be potentially exploited.</p>
|
||||||
|
<p>Another alternative is to generate static HTML files (just like other
|
||||||
|
static site generators such as <a href="https://www.mkdocs.org/">MkDocs</a>).
|
||||||
|
Since the normal HTML ZIP export does not contain any styling or additional
|
||||||
|
functionality, Trilium provides a way to export the same layout and style
|
||||||
|
as the <a class="reference-link" href="#root/_help_R9pX4DGra2Vt">Sharing</a> function
|
||||||
|
into static HTML files.</p>
|
||||||
|
<p>Apart from the enhanced security, these HTML files are also easy to deploy
|
||||||
|
on “serverless” deployments such as GitHub Pages or CloudFlare Pages and
|
||||||
|
cache very easily.</p>
|
||||||
|
<aside class="admonition tip">
|
||||||
|
<p>Trilium's documentation, available at <a href="https://docs.triliumnotes.org/">docs.triliumnotes.org</a> is
|
||||||
|
built using this function of exporting to static HTML files which are then
|
||||||
|
deployed automatically to CloudFlare Pages.</p>
|
||||||
|
<p>The process is <a href="https://github.com/TriliumNext/Trilium/blob/main/apps/edit-docs/src/build-docs.ts">automated</a> by
|
||||||
|
importing the Markdown documentation and exporting it via a script to the
|
||||||
|
static web format.</p>
|
||||||
|
</aside>
|
||||||
|
<h2>Differences from normal sharing</h2>
|
||||||
|
<p>Apart from normal <a class="reference-link" href="#root/_help_R9pX4DGra2Vt">Sharing</a>,
|
||||||
|
exporting to static HTML files comes with a few subtle differences:</p>
|
||||||
|
<ul>
|
||||||
|
<li>The URL structure is different. Where in normal sharing it's something
|
||||||
|
along the way of <code>example.com/share/noteid</code>, the notes follow
|
||||||
|
an hierarchical structure, such as <code>docs.triliumnotes.org/user-guide/concepts/navigation/tree-concepts</code>.</li>
|
||||||
|
<li>The <code>favicon.ico</code> is not handled automatically, it needs to be
|
||||||
|
manually added on the server after the export is generated.</li>
|
||||||
|
<li>The “Last updated” for notes is not available.</li>
|
||||||
|
<li>The search functionality works slightly different since the normal one
|
||||||
|
requires an active API to work. In the static export, search still works
|
||||||
|
but uses a different mechanism so results might be different.</li>
|
||||||
|
</ul>
|
||||||
|
<h2>Differences from normal .zip export</h2>
|
||||||
|
<ul>
|
||||||
|
<li>The name of the files/URLs will prefer <code>shareAlias</code> to allow
|
||||||
|
for clean URLs.</li>
|
||||||
|
<li>The export requires a functional web server as the pages will not render
|
||||||
|
properly if accessed locally via a web browser due to the use of module
|
||||||
|
scripts.</li>
|
||||||
|
</ul>
|
||||||
|
<h2>Testing locally</h2>
|
||||||
|
<p>As mentioned previously, the exported static pages require a website to
|
||||||
|
function. In order to test locally, a web server needs to be used.</p>
|
||||||
|
<p>One example is to use the Node.js-based <a href="https://www.npmjs.com/package/http-server"><code>http-server</code></a> which
|
||||||
|
can be installed via:</p><pre><code class="language-text-x-trilium-auto">npm i -g http-server</code></pre>
|
||||||
|
<p>Once installed simply:</p>
|
||||||
|
<ol>
|
||||||
|
<li>Extract the exported .zip file.</li>
|
||||||
|
<li>Inside the extracted directory, run <code>http-server</code>.</li>
|
||||||
|
<li>Access the indicated address (e.g. <a href="http://localhost:8080">http://localhost:8080</a>).</li>
|
||||||
|
</ol>
|
||||||
|
<h2>Automation</h2>
|
||||||
|
<p><a class="reference-link" href="#root/_help_pgxEVkzLl1OP">ETAPI (REST API)</a> could
|
||||||
|
potentially be used to automate an export on a scheduled task.</p>
|
||||||
18
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Sharing/Reverse proxy configuration.html
generated
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<p>It might be desirable to only expose the share functionality of Trilium
|
||||||
|
to the Internet, and keep the application accessible only within a local
|
||||||
|
network or via VPN.</p>
|
||||||
|
<p>To do so, a reverse proxy is required.</p>
|
||||||
|
<h2>Caddy</h2><pre><code class="language-text-x-trilium-auto">http://domain.com {
|
||||||
|
reverse_proxy /share http://localhost:8080/share
|
||||||
|
}</code></pre>
|
||||||
|
<p>This is for newer versions where the share functionality is isolated,
|
||||||
|
for older versions it's required to also include <code>/assets</code>.<sup><a href="#fn2b8mg20aol8">[1]</a></sup>
|
||||||
|
</p>
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
|
<p><sup><strong><a href="#fnref2b8mg20aol8">^</a></strong></sup>
|
||||||
|
</p>
|
||||||
|
<p><a href="https://github.com/orgs/TriliumNext/discussions/7341#discussioncomment-14679897">https://github.com/orgs/TriliumNext/discussions/7341#discussioncomment-14679897</a>
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
@ -39,7 +39,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li><a href="#root/_help_QEAPj01N5f7w">Reference links</a>
|
<li><a href="#root/_help_QEAPj01N5f7w">Reference links</a>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#root/_help_NwBbFdNZ9h7O">Admonitions</a>, we ended up creating
|
<li><a href="#root/_help_NwBbFdNZ9h7O">Admonitions</a>, we ended up creating our
|
||||||
our own plugin but <a href="https://github.com/aarkue/ckeditor5-admonition">aarkue/ckeditor5-admonition</a> was
|
own plugin but <a href="https://github.com/aarkue/ckeditor5-admonition">aarkue/ckeditor5-admonition</a> was
|
||||||
a good inspiration (including the toolbar icon).</li>
|
a good inspiration (including the toolbar icon).</li>
|
||||||
</ul>
|
</ul>
|
||||||
@ -1,5 +1,5 @@
|
|||||||
<p><a href="https://excalidraw.com/">Excalidraw</a> is the technology behind
|
<p><a href="https://excalidraw.com/">Excalidraw</a> is the technology behind
|
||||||
the <a href="#root/_help_grjYqerjn243">Canvas</a> notes. The
|
the <a href="#root/_help_grjYqerjn243">Canvas</a> notes. The source
|
||||||
source code of the library is available on <a href="https://github.com/excalidraw/excalidraw">GitHub</a>.</p>
|
code of the library is available on <a href="https://github.com/excalidraw/excalidraw">GitHub</a>.</p>
|
||||||
<p>We are using an unmodified version of it, so it shares the same <a href="https://github.com/excalidraw/excalidraw/issues">issues</a> as
|
<p>We are using an unmodified version of it, so it shares the same <a href="https://github.com/excalidraw/excalidraw/issues">issues</a> as
|
||||||
the original.</p>
|
the original.</p>
|
||||||
11
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Templates.html
generated
vendored
@ -3,10 +3,10 @@
|
|||||||
main effects:</p>
|
main effects:</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li><strong>Attribute Inheritance</strong>: All attributes from the template
|
<li><strong>Attribute Inheritance</strong>: All attributes from the template
|
||||||
note are <a href="#root/_help_bwZpz2ajCEwO">inherited</a> by the instance
|
note are <a href="#root/_help_bwZpz2ajCEwO">inherited</a> by the instance notes.
|
||||||
notes. Even attributes with <code>#isInheritable=false</code> are inherited
|
Even attributes with <code>#isInheritable=false</code> are inherited by the
|
||||||
by the instance notes, although only inheritable attributes are further
|
instance notes, although only inheritable attributes are further inherited
|
||||||
inherited by the children of the instance notes.</li>
|
by the children of the instance notes.</li>
|
||||||
<li><strong>Content Duplication</strong>: The content of the template note
|
<li><strong>Content Duplication</strong>: The content of the template note
|
||||||
is copied to the instance note, provided the instance note is empty at
|
is copied to the instance note, provided the instance note is empty at
|
||||||
the time of template assignment.</li>
|
the time of template assignment.</li>
|
||||||
@ -32,7 +32,8 @@
|
|||||||
all attributes from the template are inherited.</p>
|
all attributes from the template are inherited.</p>
|
||||||
<p>To create an instance note through the UI:</p>
|
<p>To create an instance note through the UI:</p>
|
||||||
<p>
|
<p>
|
||||||
<img src="Templates_template-create-.png" alt="show child note templates">
|
<img src="Templates_template-create-.png"
|
||||||
|
alt="show child note templates">
|
||||||
</p>
|
</p>
|
||||||
<p>For the template to appear in the menu, the template note must have the <code>#template</code> label.
|
<p>For the template to appear in the menu, the template note must have the <code>#template</code> label.
|
||||||
Do not confuse this with the <code>~template</code> relation, which links
|
Do not confuse this with the <code>~template</code> relation, which links
|
||||||
|
|||||||
30
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Import & Export.html
generated
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<p>Trilium natively supports the following formats for both import and export.</p>
|
||||||
|
<ul>
|
||||||
|
<li>HTML:
|
||||||
|
<ul>
|
||||||
|
<li>This is the main format used by Trilium, where standard tags are used
|
||||||
|
to represent basic formatting and layout (e.g. <code><strong></code>, <code><table></code>, <code><pre></code>).</li>
|
||||||
|
<li>Note that HTML is not a standardized format so some more specific features
|
||||||
|
such as admonitions or <a class="reference-link" href="#root/_help_hrZ1D00cLbal">Internal (reference) links</a> might
|
||||||
|
not be supported by other applications.</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a class="reference-link" href="#root/_help_Oau6X9rCuegd">Markdown</a>
|
||||||
|
<ul>
|
||||||
|
<li>Most of the formatting is preserved, see <a class="reference-link"
|
||||||
|
href="#root/_help_rJ9grSgoExl9">Supported syntax</a>.</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>OPML (Outliner Interchange Format)
|
||||||
|
<ul>
|
||||||
|
<li>Supports both OPML v1.0 for plain text and v2.0 with HTML support.</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<p>To import from other applications, see the dedicated pages:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a class="reference-link" href="#root/_help_syuSEKf2rUGr">Evernote</a>
|
||||||
|
</li>
|
||||||
|
<li><a class="reference-link" href="#root/_help_GnhlmrATVqcH">OneNote</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
@ -1,6 +1,6 @@
|
|||||||
<figure class="image image-style-align-center">
|
<figure class="image image-style-align-center">
|
||||||
<img style="aspect-ratio:991/403;" src="1_Jump to_image.png" width="991"
|
<img style="aspect-ratio:991/403;" src="1_Jump to_image.png"
|
||||||
height="403">
|
width="991" height="403">
|
||||||
</figure>
|
</figure>
|
||||||
|
|
||||||
<h2>Jump to Note</h2>
|
<h2>Jump to Note</h2>
|
||||||
@ -34,8 +34,8 @@
|
|||||||
<p>Alternatively you can click on the "time" icon on the right.</p>
|
<p>Alternatively you can click on the "time" icon on the right.</p>
|
||||||
<h2>Command Palette</h2>
|
<h2>Command Palette</h2>
|
||||||
<figure class="image image-style-align-center">
|
<figure class="image image-style-align-center">
|
||||||
<img style="aspect-ratio:982/524;" src="Jump to_image.png" width="982"
|
<img style="aspect-ratio:982/524;" src="Jump to_image.png"
|
||||||
height="524">
|
width="982" height="524">
|
||||||
</figure>
|
</figure>
|
||||||
<p>The command palette is a feature which allows easy execution of various
|
<p>The command palette is a feature which allows easy execution of various
|
||||||
commands that can be found throughout the application, such as from menus
|
commands that can be found throughout the application, such as from menus
|
||||||
|
|||||||
@ -5,7 +5,6 @@
|
|||||||
<img src="Note Hoisting_note-hoistin.gif">
|
<img src="Note Hoisting_note-hoistin.gif">
|
||||||
</p>
|
</p>
|
||||||
<p>In addition to showing only this subtree, this also narrows both full
|
<p>In addition to showing only this subtree, this also narrows both full
|
||||||
text search and <a href="#root/_help_MMiBEQljMQh2">“jump to note”</a> to
|
text search and <a href="#root/_help_MMiBEQljMQh2">“jump to note”</a> to just notes
|
||||||
just notes present in hoisted subtree.</p>
|
present in hoisted subtree.</p>
|
||||||
<p>See also <a href="#root/_help_9sRHySam5fXb">Workspace</a> which extends
|
<p>See also <a href="#root/_help_9sRHySam5fXb">Workspace</a> which extends this feature.</p>
|
||||||
this feature.</p>
|
|
||||||
@ -1,16 +1,16 @@
|
|||||||
<figure class="image image-style-align-center">
|
<figure class="image image-style-align-center">
|
||||||
<img style="aspect-ratio:659/256;" src="Quick search_image.png" width="659"
|
<img style="aspect-ratio:659/256;" src="Quick search_image.png"
|
||||||
height="256">
|
width="659" height="256">
|
||||||
</figure>
|
</figure>
|
||||||
<p>The <em>Quick search</em> function does a full-text search (that is, it
|
<p>The <em>Quick search</em> function does a full-text search (that is, it
|
||||||
searches through the content of notes and not just the title of a note)
|
searches through the content of notes and not just the title of a note)
|
||||||
and displays the result in an easy-to-access manner.</p>
|
and displays the result in an easy-to-access manner.</p>
|
||||||
<p>The alternative to the quick search is the <a class="reference-link"
|
<p>The alternative to the quick search is the <a class="reference-link"
|
||||||
href="#root/_help_eIg8jdvaoNNd">Search</a> function, which opens in
|
href="#root/_help_eIg8jdvaoNNd">Search</a> function, which opens in a dedicated
|
||||||
a dedicated tab and has support for advanced queries.</p>
|
tab and has support for advanced queries.</p>
|
||||||
<p>For even faster navigation, it's possible to use <a class="reference-link"
|
<p>For even faster navigation, it's possible to use <a class="reference-link"
|
||||||
href="#root/_help_F1r9QtzQLZqm">Jump to...</a> which will only search
|
href="#root/_help_F1r9QtzQLZqm">Jump to...</a> which will only search through
|
||||||
through the note titles instead of the content.</p>
|
the note titles instead of the content.</p>
|
||||||
<h2>Layout</h2>
|
<h2>Layout</h2>
|
||||||
<p>Based on the <a class="reference-link" href="#root/_help_x0JgW8UqGXvq">Vertical and horizontal layout</a>,
|
<p>Based on the <a class="reference-link" href="#root/_help_x0JgW8UqGXvq">Vertical and horizontal layout</a>,
|
||||||
the quick search is placed:</p>
|
the quick search is placed:</p>
|
||||||
@ -18,8 +18,8 @@
|
|||||||
<li>On the vertical layout, it is displayed right above the <a class="reference-link"
|
<li>On the vertical layout, it is displayed right above the <a class="reference-link"
|
||||||
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</li>
|
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</li>
|
||||||
<li>On the horizontal layout, it is displayed in the <a class="reference-link"
|
<li>On the horizontal layout, it is displayed in the <a class="reference-link"
|
||||||
href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>, where it can be positioned
|
href="#root/_help_xYmIYSP6wE3F">Launch Bar</a>, where it can be positioned just
|
||||||
just like any other icon.</li>
|
like any other icon.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<h2>Search Features</h2>
|
<h2>Search Features</h2>
|
||||||
<p>Quick search includes the following features:</p>
|
<p>Quick search includes the following features:</p>
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<figure class="image image_resized" style="width:100%;">
|
<figure class="image image_resized" style="width:100%;">
|
||||||
<img style="aspect-ratio:898/93;" src="Search in note_image.png" width="898"
|
<img style="aspect-ratio:898/93;" src="Search in note_image.png"
|
||||||
height="93">
|
width="898" height="93">
|
||||||
</figure>
|
</figure>
|
||||||
<p>Local search allows you to search within the currently displayed note. </p>
|
<p>Local search allows you to search within the currently displayed note. </p>
|
||||||
<h2>Alternatives</h2>
|
<h2>Alternatives</h2>
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
<figure class="image">
|
<figure class="image">
|
||||||
<img style="aspect-ratio:987/725;" src="Search_image.png" width="987"
|
<img style="aspect-ratio:987/725;" src="Search_image.png"
|
||||||
height="725">
|
width="987" height="725">
|
||||||
</figure>
|
</figure>
|
||||||
<p>Note search enables you to find notes by searching for text in the title,
|
<p>Note search enables you to find notes by searching for text in the title,
|
||||||
content, or <a href="#root/_help_zEY4DaJG4YT5">attributes</a> of the notes.
|
content, or <a href="#root/_help_zEY4DaJG4YT5">attributes</a> of the notes. You
|
||||||
You also have the option to save your searches, which will create a special
|
also have the option to save your searches, which will create a special
|
||||||
search note which is visible on your navigation tree and contains the search
|
search note which is visible on your navigation tree and contains the search
|
||||||
results as sub-items.</p>
|
results as sub-items.</p>
|
||||||
<h2>Accessing the search</h2>
|
<h2>Accessing the search</h2>
|
||||||
@ -107,8 +107,8 @@
|
|||||||
action multiple times (i.e. in order to be able to apply multiple labels
|
action multiple times (i.e. in order to be able to apply multiple labels
|
||||||
to notes).</li>
|
to notes).</li>
|
||||||
<li>The actions given are the same as the ones in <a class="reference-link"
|
<li>The actions given are the same as the ones in <a class="reference-link"
|
||||||
href="#root/_help_ivYnonVFBxbQ">Bulk Actions</a>, which is an alternative
|
href="#root/_help_ivYnonVFBxbQ">Bulk Actions</a>, which is an alternative for
|
||||||
for operating directly with notes within the <a class="reference-link"
|
operating directly with notes within the <a class="reference-link"
|
||||||
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</li>
|
href="#root/_help_oPVyFC7WL2Lp">Note Tree</a>.</li>
|
||||||
<li>After defining the actions, first press <em>Search</em> to check the matched
|
<li>After defining the actions, first press <em>Search</em> to check the matched
|
||||||
notes and then press <em>Search & Execute actions</em> to trigger the
|
notes and then press <em>Search & Execute actions</em> to trigger the
|
||||||
|
|||||||