Skip to content

Commit

Permalink
Merge branch 'roam-js' into roam-js-vim-colemak
Browse files Browse the repository at this point in the history
  • Loading branch information
Stvad committed Jun 27, 2024
2 parents ac8c76b + 9d02098 commit c3cdc4e
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 5 deletions.
10 changes: 6 additions & 4 deletions src/ts/core/features/inc-dec-value.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {RoamDate} from '../roam/date'
import {Roam} from '../roam/roam'
import {RoamNode, Selection} from '../roam/roam-node'

const createModifier = (change: number) => (num: number) => num + change
export const createModifier = (change: number) => (num: number) => num + change

export const config: Feature = {
id: 'incDec',
Expand Down Expand Up @@ -62,7 +62,7 @@ const nameInsideBrackets = (text: string, cursor: number): string =>

const nameIsDate = (pageName: string): boolean => pageName.match(RoamDate.regex) !== null

const modifyDate = (date: Date, modifier: (input: number) => number): Date => {
export const modifyDate = (date: Date, modifier: (input: number) => number): Date => {
const newDate = new Date(date)
newDate.setDate(modifier(date.getDate()))
return newDate
Expand Down Expand Up @@ -92,9 +92,11 @@ export const modify = (modifier: (input: number) => number) => {
const numberStr = left + right
const numberStartedAt = node.text.substring(0, cursor)?.match(/[0-9]*$/)?.index!

let number = modifier(parseInt(numberStr))
const newNumber = modifier(parseInt(numberStr, 10))
newValue =
node.text.substring(0, numberStartedAt) + number + node.text.substring(numberStartedAt + numberStr.length)
node.text.substring(0, numberStartedAt) +
newNumber +
node.text.substring(numberStartedAt + numberStr.length)
} else if (datesInContent && datesInContent.length === 1) {
// e.g. Lor|em ipsum [[January 3rd, 2020]] 123
newValue = node.text.replace(
Expand Down
66 changes: 66 additions & 0 deletions src/ts/core/features/vim-mode/commands/edit-commands.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
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'
import {RoamDate} from 'src/core/roam/date'
import {createModifier, modifyDate} from 'src/core/features/inc-dec-value'

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 toggleDone = () => {
const uid = selectedUid()
const originalText = getBlockText(uid)
let newText = originalText
if (originalText.startsWith('{{[[DONE]]}} ')) {
newText = originalText.replace('{{[[DONE]]}} ', '')
} else if (originalText.startsWith('{{[[TODO]]}} ')) {
newText = originalText.replace('{{[[TODO]]}} ', '{{[[DONE]]}} ')
} else {
newText = '{{[[DONE]]}} ' + originalText
}

RoamDb.updateBlockText(uid, newText)
}

const modifyBlockDate = (modifier: (input: number) => number) => {
const uid = selectedUid()
const originalText = getBlockText(uid)

const datesInContent = originalText.match(RoamDate.regex)
if (!datesInContent || datesInContent.length !== 1) return

RoamDb.updateBlockText(
uid,
originalText.replace(
datesInContent[0],
RoamDate.formatPage(modifyDate(RoamDate.parseFromReference(datesInContent[0]), modifier))
)
)
}

export const EditCommands = [
nmap('cmd+enter', 'Toggle done', toggleDone),
...SRSSignals.map(it =>
nmap(`ctrl+shift+${it}`, `Reschedule Current Note (${SRSSignal[it]})`, () => rescheduleSelectedNote(it))
),
nmap('ctrl+alt+up', 'Increment Date', () => modifyBlockDate(createModifier(1))),
nmap('ctrl+alt+down', 'Decrement Date', () => modifyBlockDate(createModifier(-1))),
]
2 changes: 2 additions & 0 deletions src/ts/core/features/vim-mode/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -28,6 +29,7 @@ export const config: Feature = {
...VisualCommands,
...BlockManipulationCommands,
...HintCommands,
...EditCommands,
],
}

Expand Down
2 changes: 1 addition & 1 deletion src/ts/core/roam/block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
5 changes: 5 additions & 0 deletions src/ts/core/roam/roam-db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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]]'
Expand Down

0 comments on commit c3cdc4e

Please sign in to comment.