feat: Initial clean release of CHM
一些检查失败了
automerge / automerge (push) Has been cancelled
react-native-android-build-apk / AssembleRelease (push) Has been cancelled
Build macOS M1 / Main (push) Has been cancelled
Joplin Continuous Integration / Main (macos-15-intel) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / Main (ubuntu-22.04-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-11-vs2026-arm) (push) Has been cancelled
Joplin Continuous Integration / Main (windows-2025) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04) (push) Has been cancelled
Joplin Continuous Integration / ServerDockerImage (ubuntu-22.04-arm) (push) Has been cancelled
Joplin UI tests / Main (ubuntu-22.04) (push) Has been cancelled
Joplin UI tests / Main (windows-2025) (push) Has been cancelled
Joplin UI tests / Mobile (push) Has been cancelled
Close stale issues / ProcessStaleIssues (push) Has been cancelled

这个提交包含在:
chen
2026-11-04 11:29:39 +08:00
当前提交 301194963b
共有 8663 个文件被更改,包括 1962691 次插入 和 0 次删除

查看文件

@@ -0,0 +1,19 @@
import { CommandRuntime, CommandDeclaration } from '@joplin/lib/services/CommandService';
import { _ } from '@joplin/lib/locale';
import { FocusElementOptions } from '../../../commands/focusElement';
import { WindowCommandDependencies } from '../utils/types';
export const declaration: CommandDeclaration = {
name: 'focusElementNoteBody',
label: () => _('Note body'),
parentLabel: () => _('Focus'),
};
export const runtime = (comp: WindowCommandDependencies): CommandRuntime => {
return {
execute: async (_context: unknown, options?: FocusElementOptions) => {
void comp.editorRef.current.execCommand({ name: 'editor.focus', value: options });
},
enabledCondition: 'oneNoteSelected',
};
};

查看文件

@@ -0,0 +1,20 @@
import { CommandRuntime, CommandDeclaration } from '@joplin/lib/services/CommandService';
import { _ } from '@joplin/lib/locale';
import { focus } from '@joplin/lib/utils/focusHandler';
import { RefObject } from 'react';
export const declaration: CommandDeclaration = {
name: 'focusElementNoteTitle',
label: () => _('Note title'),
parentLabel: () => _('Focus'),
};
export const runtime = (comp: { titleInputRef: RefObject<HTMLInputElement> }): CommandRuntime => {
return {
execute: async () => {
if (!comp.titleInputRef.current) return;
focus('focusElementNoteTitle', comp.titleInputRef.current);
},
enabledCondition: 'oneNoteSelected',
};
};

查看文件

@@ -0,0 +1,22 @@
import { CommandRuntime, CommandDeclaration } from '@joplin/lib/services/CommandService';
import { _ } from '@joplin/lib/locale';
import { FocusElementOptions } from '../../../commands/focusElement';
import { WindowCommandDependencies } from '../utils/types';
export const declaration: CommandDeclaration = {
name: 'focusElementNoteViewer',
label: () => _('Note viewer'),
parentLabel: () => _('Focus'),
};
export const runtime = (dependencies: WindowCommandDependencies): CommandRuntime => {
return {
execute: async (_context: unknown, options?: FocusElementOptions) => {
await dependencies.editorRef.current.execCommand({
name: 'viewer.focus',
value: options,
});
},
enabledCondition: 'markdownEditorVisible',
};
};

查看文件

@@ -0,0 +1,36 @@
import { CommandRuntime, CommandDeclaration } from '@joplin/lib/services/CommandService';
import { _ } from '@joplin/lib/locale';
import { focus } from '@joplin/lib/utils/focusHandler';
import { WindowCommandDependencies } from '../utils/types';
export const declaration: CommandDeclaration = {
name: 'focusElementToolbar',
label: () => _('Toolbar'),
parentLabel: () => _('Focus'),
};
export const runtime = (dependencies: WindowCommandDependencies): CommandRuntime => {
return {
execute: async () => {
if (!dependencies || !dependencies.containerRef || !dependencies.containerRef.current) return;
const firstButtonOnRTEToolbar = dependencies.containerRef.current.querySelector(
'.tox-toolbar__group button',
);
if (firstButtonOnRTEToolbar) {
focus('focusElementToolbar', firstButtonOnRTEToolbar);
return;
}
const firstButtonOnMarkdownToolbar = dependencies.containerRef.current.querySelector(
'#CodeMirrorToolbar .button:not(.disabled)',
);
if (firstButtonOnMarkdownToolbar) {
focus('focusElementToolbar', firstButtonOnMarkdownToolbar);
}
},
};
};

查看文件

@@ -0,0 +1,23 @@
// AUTO-GENERATED using `gulp buildScriptIndexes`
import * as focusElementNoteBody from './focusElementNoteBody';
import * as focusElementNoteTitle from './focusElementNoteTitle';
import * as focusElementNoteViewer from './focusElementNoteViewer';
import * as focusElementToolbar from './focusElementToolbar';
import * as pasteAsMarkdown from './pasteAsMarkdown';
import * as pasteAsText from './pasteAsText';
import * as showLocalSearch from './showLocalSearch';
import * as showRevisions from './showRevisions';
const index: any[] = [
focusElementNoteBody,
focusElementNoteTitle,
focusElementNoteViewer,
focusElementToolbar,
pasteAsMarkdown,
pasteAsText,
showLocalSearch,
showRevisions,
];
export default index;
// AUTO-GENERATED using `gulp buildScriptIndexes`

查看文件

@@ -0,0 +1,43 @@
import { CommandRuntime, CommandDeclaration } from '@joplin/lib/services/CommandService';
import { _ } from '@joplin/lib/locale';
import HtmlToMd from '@joplin/lib/HtmlToMd';
import cleanMarkdownNbsp from '../utils/cleanMarkdownNbsp';
import { processImagesInPastedHtml } from '../utils/resourceHandling';
import { WindowCommandDependencies } from '../utils/types';
import { clipboard } from 'electron';
export const declaration: CommandDeclaration = {
name: 'pasteAsMarkdown',
label: () => _('Paste as Markdown'),
};
let htmlToMd_: HtmlToMd | null = null;
const htmlToMd = () => {
if (!htmlToMd_) {
htmlToMd_ = new HtmlToMd();
}
return htmlToMd_;
};
export const runtime = (comp: WindowCommandDependencies): CommandRuntime => {
return {
execute: async () => {
let html = clipboard.readHTML();
if (html) {
// Download images and convert them to Joplin resources
html = await processImagesInPastedHtml(html, { useInternalUrls: true });
const markdown = cleanMarkdownNbsp(htmlToMd().parse(html, { tightLists: true, collapseMultipleBlankLines: true }));
void comp.editorRef.current.execCommand({ name: 'insertText', value: markdown });
} else {
// Fall back to plain text if no HTML is available
const text = clipboard.readText();
if (text) {
void comp.editorRef.current.execCommand({ name: 'insertText', value: text });
}
}
},
enabledCondition: 'oneNoteSelected && markdownEditorVisible',
};
};

查看文件

@@ -0,0 +1,17 @@
import { CommandRuntime, CommandDeclaration } from '@joplin/lib/services/CommandService';
import { _ } from '@joplin/lib/locale';
import { WindowCommandDependencies } from '../utils/types';
export const declaration: CommandDeclaration = {
name: 'pasteAsText',
label: () => _('Paste as text'),
};
export const runtime = (comp: WindowCommandDependencies): CommandRuntime => {
return {
execute: async () => {
void comp.editorRef.current.execCommand({ name: 'pasteAsText' });
},
enabledCondition: 'oneNoteSelected && richTextEditorVisible',
};
};

查看文件

@@ -0,0 +1,26 @@
import { CommandRuntime, CommandDeclaration } from '@joplin/lib/services/CommandService';
import { _ } from '@joplin/lib/locale';
import { focus } from '@joplin/lib/utils/focusHandler';
import { WindowCommandDependencies } from '../utils/types';
export const declaration: CommandDeclaration = {
name: 'showLocalSearch',
label: () => _('Search in current note'),
};
export const runtime = (comp: WindowCommandDependencies): CommandRuntime => {
return {
execute: async () => {
if (comp.editorRef.current && await comp.editorRef.current.supportsCommand('search')) {
void comp.editorRef.current.execCommand({ name: 'search' });
} else {
if (comp.noteSearchBarRef.current) {
focus('showLocalSearch', comp.noteSearchBarRef.current);
} else {
comp.setShowLocalSearch(true);
}
}
},
enabledCondition: 'oneNoteSelected',
};
};

查看文件

@@ -0,0 +1,21 @@
import { CommandRuntime, CommandDeclaration } from '@joplin/lib/services/CommandService';
export const declaration: CommandDeclaration = {
name: 'showRevisions',
};
interface ShowRevisionsDependencies {
setShowRevisions: (show: boolean)=> void;
isInFocusedDocument: ()=> boolean;
}
export const runtime = (comp: ShowRevisionsDependencies): CommandRuntime => {
return {
execute: async () => {
comp.setShowRevisions(true);
},
getPriority: () => {
return comp.isInFocusedDocument() ? 1 : 0;
},
};
};