[cm6] indent figure modal generated code (#13213)

* [cm6] indent figure modal generated code

* fix: prettier

* fix indenting issues

* add licence on top

* fix cypress tests

GitOrigin-RevId: 8f74be537f19c2a29de3c742a9bbabe43b1ce40d
This commit is contained in:
Domagoj Kriskovic 2023-05-31 10:04:27 +02:00 committed by Copybot
parent adfe7abaaf
commit a05c201652
4 changed files with 63 additions and 15 deletions

View file

@ -21,6 +21,7 @@ import {
import { ensureEmptyLine } from '../../extensions/toolbar/commands'
import { useTranslation } from 'react-i18next'
import useEventListener from '../../../../shared/hooks/use-event-listener'
import { prepareLines } from '../../utils/prepare-lines'
export const FigureModal = memo(function FigureModal() {
return (
@ -138,8 +139,8 @@ const FigureModalContent = () => {
dispatch({ error: String(error) })
return
}
const labelCommand = includeLabel ? '\n\\label{fig:enter-label}' : ''
const captionCommand = includeCaption ? '\n\\caption{Enter Caption}' : ''
const labelCommand = includeLabel ? '\\label{fig:enter-label}' : ''
const captionCommand = includeCaption ? '\\caption{Enter Caption}' : ''
if (figure) {
// Updating existing figure
@ -150,14 +151,19 @@ const FigureModalContent = () => {
// We should insert a caption
changes.push({
from: figure.graphicsCommand.to,
insert: captionCommand,
insert: prepareLines(
['', captionCommand],
view.state,
figure.graphicsCommand.to
),
})
}
if (!hadLabelBefore && includeLabel) {
const from = figure.caption?.to ?? figure.graphicsCommand.to
// We should insert a label
changes.push({
from: figure.caption?.to ?? figure.graphicsCommand.to,
insert: labelCommand,
from,
insert: prepareLines(['', labelCommand], view.state, from),
})
}
if (hadCaptionBefore && !includeCaption) {
@ -203,11 +209,19 @@ const FigureModalContent = () => {
const { pos, suffix } = ensureEmptyLine(view.state, range)
const widthArgument =
width !== undefined ? `[width=${width}\\linewidth]` : ''
const graphicxCommand = `\\includegraphics${widthArgument}{${path}}`
const changes: ChangeSpec = view.state.changes({
insert: `\\begin{figure}\n\\centering\n${graphicxCommand}${captionCommand}${labelCommand}${
labelCommand || captionCommand ? '\n' : '' // Add an extra newline if we've added a caption or label
}\\end{figure}${suffix}`,
insert: prepareLines(
[
'\\begin{figure}',
'\t\\centering',
`\t\\includegraphics${widthArgument}{${path}}`,
`\t${captionCommand}` || null,
`\t${labelCommand}` || null,
`\\end{figure}${suffix}`,
],
view.state,
pos
),
from: pos,
})

View file

@ -33,7 +33,8 @@ export const ensureEmptyLine = (state: EditorState, range: SelectionRange) => {
let suffix = ''
const line = state.doc.lineAt(pos)
if (line.length) {
if (line.text.trim().length) {
pos = Math.min(line.to + 1, state.doc.length)
const nextLine = state.doc.lineAt(pos)

View file

@ -0,0 +1,33 @@
/**
* Adapted from CodeMirror 6 (@codemirror/autocomplete), licensed under the MIT license:
* https://github.com/codemirror/autocomplete/blob/08f63add9f470a032d3802a4599caa86c75de5cb/src/snippet.ts#L29-L45
*/
import { indentUnit } from '@codemirror/language'
import { EditorState } from '@codemirror/state'
// apply correct indentation to passed lines
export function prepareLines(
lines: (string | null)[],
state: EditorState,
pos: number
) {
const text = []
const lineStart = [pos]
const lineObj = state.doc.lineAt(pos)
const baseIndent = /^\s*/.exec(lineObj.text)![0]
for (let line of lines) {
if (line === null) continue
if (text.length) {
let indent = baseIndent
const tabs = /^\t*/.exec(line)![0].length
for (let i = 0; i < tabs; i++) indent += state.facet(indentUnit)
lineStart.push(pos + indent.length - tabs)
line = indent + line.slice(tabs)
}
text.push(line)
pos += line.length + 1
}
return text.join('\n')
}