diff --git a/src/ts/core/features/vim-mode/commands/edit-commands.ts b/src/ts/core/features/vim-mode/commands/edit-commands.ts new file mode 100644 index 0000000..0d0aa07 --- /dev/null +++ b/src/ts/core/features/vim-mode/commands/edit-commands.ts @@ -0,0 +1,37 @@ +import {nmap} from 'src/core/features/vim-mode/vim' +import {RoamBlock} from 'src/core/features/vim-mode/roam/roam-block' +import {SRSSignal, SRSSignals} from 'src/core/srs/scheduler' +import {AnkiScheduler} from 'src/core/srs/AnkiScheduler' +import {SM2Node} from 'src/core/srs/SM2Node' +import {RoamDb} from 'src/core/roam/roam-db' +import {getBlockUid} from 'src/core/roam/block' + +const getBlockText = (uid: string): string => { + const block = RoamDb.getBlockByUid(uid) + return block[':block/string'] +} + +function selectedUid() { + const htmlId = RoamBlock.selected().id + return getBlockUid(htmlId) +} + +const rescheduleSelectedNote = (signal: SRSSignal) => { + console.log('rescheduleSelectedNote', signal) + const uid = selectedUid() + const originalText = getBlockText(uid) + RoamDb.updateBlockText(uid, new AnkiScheduler().schedule(new SM2Node(originalText), signal).text) +} + +const markDone = () => { + const uid = selectedUid() + const originalText = getBlockText(uid) + RoamDb.updateBlockText(uid, '{{[[DONE]]}} ' + originalText) +} + +export const EditCommands = [ + nmap('cmd+enter', 'Mark done', markDone), + ...SRSSignals.map(it => + nmap(`ctrl+shift+${it}`, `Reschedule Current Note (${SRSSignal[it]})`, () => rescheduleSelectedNote(it)) + ), +] diff --git a/src/ts/core/features/vim-mode/index.ts b/src/ts/core/features/vim-mode/index.ts index f6c1df7..26d1bda 100644 --- a/src/ts/core/features/vim-mode/index.ts +++ b/src/ts/core/features/vim-mode/index.ts @@ -11,6 +11,7 @@ import {BlockManipulationCommands} from 'src/core/features/vim-mode/commands/blo import {RoamBlock} from 'src/core/features/vim-mode/roam/roam-block' import {HintCommands} from 'src/core/features/vim-mode/commands/hint-commands' import {Browser} from 'src/core/common/browser' +import {EditCommands} from 'src/core/features/vim-mode/commands/edit-commands' export const config: Feature = { id: 'block_navigation_mode', @@ -28,6 +29,7 @@ export const config: Feature = { ...VisualCommands, ...BlockManipulationCommands, ...HintCommands, + ...EditCommands, ], } diff --git a/src/ts/core/roam/block.ts b/src/ts/core/roam/block.ts index 53bc985..7efdc70 100644 --- a/src/ts/core/roam/block.ts +++ b/src/ts/core/roam/block.ts @@ -17,4 +17,4 @@ export const copyBlockReference = (htmlBlockId: string | undefined) => { // An empirical observation: const UID_LENGTH = 9 // Uid is the id Roam uses, blockId is the id of the html element -const getBlockUid = (htmlBlockId: string): string => htmlBlockId.substr(htmlBlockId?.length - UID_LENGTH) +export const getBlockUid = (htmlBlockId: string): string => htmlBlockId.substr(htmlBlockId?.length - UID_LENGTH) diff --git a/src/ts/core/roam/roam-db.ts b/src/ts/core/roam/roam-db.ts index 907265a..d30988a 100644 --- a/src/ts/core/roam/roam-db.ts +++ b/src/ts/core/roam/roam-db.ts @@ -34,6 +34,11 @@ export const RoamDb = { return this.queryFirst('[:find ?e :in $ ?a :where [?e :block/uid ?a]]', uid) }, + updateBlockText(uid: string, newText: string) { + // @ts-ignore + runInPageContext((...args: any[]) => window.roamAlphaAPI.updateBlock(...args), {block: {uid, string: newText}}) + }, + getAllPages(): RoamPage[] { return this.query( '[:find ?uid ?title :where [?page :node/title ?title] [?page :block/uid ?uid]]'