* initial commit Signed-off-by: Jess Frazelle <github@jessfraz.com> tsc passing Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> working Signed-off-by: Jess Frazelle <github@jessfraz.com> fixups Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> * cleanups Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * udpates Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * cleanup Signed-off-by: Jess Frazelle <github@jessfraz.com> * cleanup Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com>
56 lines
1.4 KiB
TypeScript
56 lines
1.4 KiB
TypeScript
import { Text } from '@codemirror/state'
|
|
import { Marked } from '@ts-stack/markdown'
|
|
|
|
import type * as LSP from 'vscode-languageserver-protocol'
|
|
|
|
// takes a function and executes it after the wait time, if the function is called again before the wait time is up, the timer is reset
|
|
export function deferExecution<T>(func: (args: T) => any, wait: number) {
|
|
let timeout: ReturnType<typeof setTimeout> | null
|
|
let latestArgs: T
|
|
|
|
function later() {
|
|
timeout = null
|
|
func(latestArgs)
|
|
}
|
|
|
|
function deferred(args: T) {
|
|
latestArgs = args
|
|
if (timeout) {
|
|
clearTimeout(timeout)
|
|
}
|
|
timeout = setTimeout(later, wait)
|
|
}
|
|
|
|
return deferred
|
|
}
|
|
|
|
export function posToOffset(
|
|
doc: Text,
|
|
pos: { line: number; character: number }
|
|
): number | undefined {
|
|
if (pos.line >= doc.lines) return
|
|
const offset = doc.line(pos.line + 1).from + pos.character
|
|
if (offset > doc.length) return
|
|
return offset
|
|
}
|
|
|
|
export function offsetToPos(doc: Text, offset: number) {
|
|
const line = doc.lineAt(offset)
|
|
return {
|
|
line: line.number - 1,
|
|
character: offset - line.from,
|
|
}
|
|
}
|
|
|
|
export function formatMarkdownContents(
|
|
contents: LSP.MarkupContent | LSP.MarkedString | LSP.MarkedString[]
|
|
): string {
|
|
if (Array.isArray(contents)) {
|
|
return contents.map((c) => formatMarkdownContents(c) + '\n\n').join('')
|
|
} else if (typeof contents === 'string') {
|
|
return Marked.parse(contents)
|
|
} else {
|
|
return Marked.parse(contents.value)
|
|
}
|
|
}
|