markdown-flow-ui 0.1.129 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/index.cjs8.js +1 -1
- package/dist/_virtual/index.cjs9.js +1 -1
- package/dist/_virtual/index.es8.js +2 -2
- package/dist/_virtual/index.es9.js +2 -2
- package/dist/components/ContentRender/ContentRender.cjs.js +2 -2
- package/dist/components/ContentRender/ContentRender.cjs.js.map +1 -1
- package/dist/components/ContentRender/ContentRender.d.ts +4 -0
- package/dist/components/ContentRender/ContentRender.es.js +217 -211
- package/dist/components/ContentRender/ContentRender.es.js.map +1 -1
- package/dist/components/ContentRender/ContentRender.stories.d.ts +1 -0
- package/dist/components/ContentRender/IframeSandbox.cjs.js +4 -4
- package/dist/components/ContentRender/IframeSandbox.cjs.js.map +1 -1
- package/dist/components/ContentRender/IframeSandbox.d.ts +3 -0
- package/dist/components/ContentRender/IframeSandbox.es.js +210 -196
- package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
- package/dist/components/ContentRender/MarkdownFlowInput.cjs.js +1 -1
- package/dist/components/ContentRender/MarkdownFlowInput.cjs.js.map +1 -1
- package/dist/components/ContentRender/MarkdownFlowInput.d.ts +3 -0
- package/dist/components/ContentRender/MarkdownFlowInput.es.js +35 -32
- package/dist/components/ContentRender/MarkdownFlowInput.es.js.map +1 -1
- package/dist/components/ContentRender/MarkdownFlowInput.stories.d.ts +6 -0
- package/dist/components/ContentRender/SandboxApp.cjs.js +2 -2
- package/dist/components/ContentRender/SandboxApp.cjs.js.map +1 -1
- package/dist/components/ContentRender/SandboxApp.d.ts +3 -0
- package/dist/components/ContentRender/SandboxApp.es.js +117 -104
- package/dist/components/ContentRender/SandboxApp.es.js.map +1 -1
- package/dist/components/ContentRender/blackboard-vendor.cjs.js +1 -1
- package/dist/components/ContentRender/blackboard-vendor.cjs.js.map +1 -1
- package/dist/components/ContentRender/blackboard-vendor.es.js +14 -9
- package/dist/components/ContentRender/blackboard-vendor.es.js.map +1 -1
- package/dist/components/ContentRender/cjkFontFamily.cjs.js +2 -0
- package/dist/components/ContentRender/cjkFontFamily.cjs.js.map +1 -0
- package/dist/components/ContentRender/cjkFontFamily.d.ts +5 -0
- package/dist/components/ContentRender/cjkFontFamily.es.js +45 -0
- package/dist/components/ContentRender/cjkFontFamily.es.js.map +1 -0
- package/dist/components/ContentRender/cjkFontFamily.test.d.ts +1 -0
- package/dist/components/ContentRender/contentRenderI18n.cjs.js +2 -0
- package/dist/components/ContentRender/contentRenderI18n.cjs.js.map +1 -0
- package/dist/components/ContentRender/contentRenderI18n.d.ts +15 -0
- package/dist/components/ContentRender/contentRenderI18n.es.js +59 -0
- package/dist/components/ContentRender/contentRenderI18n.es.js.map +1 -0
- package/dist/components/ContentRender/index.cjs.js +1 -1
- package/dist/components/ContentRender/index.d.ts +1 -0
- package/dist/components/ContentRender/index.es.js +1 -0
- package/dist/components/ContentRender/index.es.js.map +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.cjs.js +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.cjs.js.map +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.d.ts +3 -1
- package/dist/components/ContentRender/plugins/CustomVariable.es.js +131 -124
- package/dist/components/ContentRender/plugins/CustomVariable.es.js.map +1 -1
- package/dist/components/ContentRender/plugins/MermaidChart.cjs.js +1 -1
- package/dist/components/ContentRender/plugins/MermaidChart.cjs.js.map +1 -1
- package/dist/components/ContentRender/plugins/MermaidChart.es.js +19 -18
- package/dist/components/ContentRender/plugins/MermaidChart.es.js.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs.js +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs.js.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.d.ts +3 -0
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js +18 -15
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.stories.d.ts +6 -0
- package/dist/components/MarkdownFlow/ScrollableMarkdownFlow.d.ts +1 -0
- package/dist/components/MarkdownFlow/index.cjs.js +1 -1
- package/dist/components/MarkdownFlow/index.es.js +1 -0
- package/dist/components/MarkdownFlow/index.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.js +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.d.ts +2 -2
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +23 -22
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.stories.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.cjs.js +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.cjs.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.d.ts +0 -2
- package/dist/components/MarkdownFlowEditor/editorI18n.es.js +12 -24
- package/dist/components/MarkdownFlowEditor/editorI18n.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/index.d.ts +1 -1
- package/dist/components/Slide/Player.cjs.js +1 -1
- package/dist/components/Slide/Player.cjs.js.map +1 -1
- package/dist/components/Slide/Player.d.ts +14 -30
- package/dist/components/Slide/Player.es.js +395 -383
- package/dist/components/Slide/Player.es.js.map +1 -1
- package/dist/components/Slide/Slide.cjs.js +1 -1
- package/dist/components/Slide/Slide.cjs.js.map +1 -1
- package/dist/components/Slide/Slide.d.ts +22 -4
- package/dist/components/Slide/Slide.es.js +701 -659
- package/dist/components/Slide/Slide.es.js.map +1 -1
- package/dist/components/Slide/Slide.stories.d.ts +19 -20
- package/dist/components/Slide/constants.d.ts +0 -24
- package/dist/components/Slide/index.d.ts +2 -1
- package/dist/components/Slide/slideI18n.cjs.js +2 -0
- package/dist/components/Slide/slideI18n.cjs.js.map +1 -0
- package/dist/components/Slide/slideI18n.d.ts +44 -0
- package/dist/components/Slide/slideI18n.es.js +158 -0
- package/dist/components/Slide/slideI18n.es.js.map +1 -0
- package/dist/components/Slide/slideI18n.test.d.ts +1 -0
- package/dist/components/Slide/utils/playerVisibility.cjs.js +2 -0
- package/dist/components/Slide/utils/playerVisibility.cjs.js.map +1 -0
- package/dist/components/Slide/utils/playerVisibility.d.ts +10 -0
- package/dist/components/Slide/utils/playerVisibility.es.js +11 -0
- package/dist/components/Slide/utils/playerVisibility.es.js.map +1 -0
- package/dist/components/Slide/utils/playerVisibility.test.d.ts +1 -0
- package/dist/components/index.d.ts +2 -1
- package/dist/editor.d.ts +3 -2
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +14 -13
- package/dist/index.es.js.map +1 -1
- package/dist/lib/locale.cjs.js +2 -0
- package/dist/lib/locale.cjs.js.map +1 -0
- package/dist/lib/locale.d.ts +4 -0
- package/dist/lib/locale.es.js +19 -0
- package/dist/lib/locale.es.js.map +1 -0
- package/dist/lib/localeTextMap.cjs.js +2 -0
- package/dist/lib/localeTextMap.cjs.js.map +1 -0
- package/dist/lib/localeTextMap.d.ts +4 -0
- package/dist/lib/localeTextMap.es.js +5 -0
- package/dist/lib/localeTextMap.es.js.map +1 -0
- package/dist/markdown-flow-ui-lib.css +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
- package/dist/node_modules/classnames/index.cjs.js +1 -1
- package/dist/node_modules/classnames/index.es.js +1 -1
- package/dist/renderer.cjs.js +1 -1
- package/dist/renderer.d.ts +1 -0
- package/dist/renderer.es.js +15 -14
- package/dist/renderer.es.js.map +1 -1
- package/dist/slide.d.ts +1 -0
- package/package.json +1 -1
- package/dist/components/Slide/constants.cjs.js +0 -2
- package/dist/components/Slide/constants.cjs.js.map +0 -1
- package/dist/components/Slide/constants.es.js +0 -28
- package/dist/components/Slide/constants.es.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownFlowEditor.cjs.js","sources":["../../../src/components/MarkdownFlowEditor/MarkdownFlowEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from \"react\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\nimport { EditorView, ViewUpdate } from \"@codemirror/view\";\nimport { markdown } from \"@codemirror/lang-markdown\";\nimport {\n syntaxHighlighting,\n defaultHighlightStyle,\n} from \"@codemirror/language\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport CustomDialog from \"./components/CustomDialog\";\nimport CustomPopover from \"./components/CustomPopover\";\nimport EditorToolbar from \"./components/EditorToolbar\";\nimport VariableSearchDropdown from \"./components/VariableSearchDropdown\";\nimport EditorContext from \"./editor-context\";\nimport ImageInject from \"./components/ImageInject\";\nimport VideoInject from \"./components/VideoInject\";\nimport VariableSelect from \"./components/VariableSelect\";\nimport {\n SelectedOption,\n IEditorContext,\n Variable,\n SelectContentInfo,\n PopoverPosition,\n EditorAction,\n EditorApi,\n} from \"./types\";\nimport \"./markdownFlowEditor.css\";\n\nimport {\n createSlashCommands,\n parseContentInfo,\n getImageContentToInsert,\n getVideoContentToInsert,\n extractVariableNames,\n createVariableExpressionRegexp,\n} from \"./utils\";\nimport ImgPlaceholder from \"./plugins/ImgPlaceholder\";\nimport VideoPlaceholder from \"./plugins/VideoPlaceholder\";\nimport VariablePlaceholder from \"./plugins/VariablePlaceholder\";\nimport SyntaxHighlighter from \"./plugins/SyntaxHighlighter\";\n// import createFixedTextPlaceholder from \"./plugins/FixedTextPlaceholder\";\n// import DividerPlaceholder from \"./plugins/DividerPlaceholder\";\nimport { initReactI18next, useTranslation } from \"react-i18next\";\nimport i18next from \"i18next\";\nimport { UploadProps } from \"./uploadTypes\";\nimport {\n DEFAULT_EDITOR_LOCALE,\n editorLocaleResources,\n EditorLocale,\n getEditorLocaleMessages,\n normalizeEditorLocale,\n} from \"./editorI18n\";\n\nif (!i18next.isInitialized) {\n i18next.use(initReactI18next).init({\n resources: editorLocaleResources,\n lng: DEFAULT_EDITOR_LOCALE,\n fallbackLng: DEFAULT_EDITOR_LOCALE,\n interpolation: { escapeValue: false },\n });\n} else {\n Object.entries(editorLocaleResources).forEach(([lng, resource]) => {\n i18next.addResourceBundle(\n lng,\n \"translation\",\n resource.translation,\n true,\n true\n );\n });\n}\n\nexport enum EditMode {\n CodeEdit = \"codeEdit\",\n QuickEdit = \"quickEdit\",\n}\n\ntype EditorProps = {\n content?: string;\n editMode?: EditMode;\n variables?: Variable[];\n systemVariables?: Variable[];\n onChange?: (value: string) => void;\n onBlur?: () => void;\n locale?: EditorLocale;\n uploadProps?: UploadProps;\n disabled?: boolean;\n toolbarActionsRight?: EditorAction[];\n onReady?: (api: EditorApi) => void;\n};\n\nconst EMPTY_VARIABLES: Variable[] = [];\n\n// Detect whether cursor is still inside a {{variable}} expression\nconst isCursorInsideVariableExpression = (\n content: string,\n cursorPosition: number\n) => {\n if (!content || cursorPosition < 0) {\n return false;\n }\n const regexp = createVariableExpressionRegexp();\n let match: RegExpExecArray | null;\n\n while ((match = regexp.exec(content)) !== null) {\n const matchStart = match.index ?? 0;\n const matchEnd = matchStart + match[0].length;\n const innerStart = matchStart + 2;\n const innerEnd = matchEnd - 2;\n if (cursorPosition >= innerStart && cursorPosition <= innerEnd) {\n return true;\n }\n if (regexp.lastIndex === match.index) {\n regexp.lastIndex++;\n }\n }\n\n return false;\n};\n\nconst buildVariableTemplate = (variableName = \"\") => `{{${variableName}}}`;\n\nconst Editor: React.FC<EditorProps> = ({\n content = \"\",\n editMode = EditMode.CodeEdit,\n variables: initialVariables,\n systemVariables: initialSystemVariables,\n onChange,\n onBlur,\n locale = DEFAULT_EDITOR_LOCALE,\n uploadProps,\n disabled = false,\n toolbarActionsRight,\n onReady,\n}) => {\n const { t, i18n } = useTranslation();\n const resolvedLocale = normalizeEditorLocale(locale || i18n.language);\n\n useEffect(() => {\n if (i18n.language !== resolvedLocale) {\n i18n.changeLanguage(resolvedLocale);\n }\n }, [i18n, resolvedLocale]);\n\n const currentStrings = getEditorLocaleMessages(resolvedLocale);\n const toolbarLabels = useMemo(\n () => ({\n image: t(\"toolbarInsertImage\", {\n defaultValue: \"Insert image\",\n }),\n video: t(\"toolbarInsertVideo\", {\n defaultValue: \"Insert video\",\n }),\n variable: t(\"slashVariable\", {\n defaultValue: \"Variable\",\n }),\n addVariable: t(\"toolbarInsertNewVariable\", {\n defaultValue: \"Insert new variable\",\n }),\n search: t(\"toolbarInsertExistingVariable\", {\n defaultValue: \"Insert existing variable\",\n }),\n confirmOutput: t(\"toolbarConfirmOutput\", {\n defaultValue: \"Confirm output\",\n }),\n insertLink: t(\"toolbarInsertLink\", {\n defaultValue: \"Insert link\",\n }),\n insertButton: t(\"toolbarInsertButton\", {\n defaultValue: \"Insert button\",\n }),\n insertSingleChoice: t(\"toolbarInsertSingleChoice\", {\n defaultValue: \"Insert single choice\",\n }),\n insertMultiChoice: t(\"toolbarInsertMultiChoice\", {\n defaultValue: \"Insert multi choice\",\n }),\n insertInput: t(\"toolbarInsertInput\", {\n defaultValue: \"Insert input\",\n }),\n singleChoiceOption1: t(\"toolbarChoiceOption1\", {\n defaultValue: \"Option 1\",\n }),\n singleChoiceOption2: t(\"toolbarChoiceOption2\", {\n defaultValue: \"Option 2\",\n }),\n inputPlaceholder: t(\"toolbarInputPlaceholder\", {\n defaultValue: \"Please enter\",\n }),\n }),\n [t]\n );\n const variableSearchLabels = useMemo(\n () => ({\n searchPlaceholder: t(\"variableSearchPlaceholder\", {\n defaultValue: \"Search variable\",\n }),\n systemLabel: t(\"variableSectionSystem\", \"System Variables\"),\n customLabel: t(\"variableSectionCustom\", \"Custom Variables\"),\n emptyLabel: t(\"variableNotFound\", \"No variables found\"),\n }),\n [t]\n );\n const placeholderText =\n editMode === EditMode.QuickEdit\n ? t(\"placeholderQuickEdit\", {\n defaultValue: t(\"placeholderCodeEdit\", {\n defaultValue: t(\"placeholder\"),\n }),\n })\n : t(\"placeholderCodeEdit\", { defaultValue: t(\"placeholder\") });\n // Normalize variables to avoid duplicating system variables in the custom list\n const normalizedSystemVariables = useMemo(() => {\n const seen = new Set<string>();\n return (initialSystemVariables ?? EMPTY_VARIABLES).filter((variable) => {\n const normalized =\n typeof variable?.name === \"string\" ? variable.name.toLowerCase() : \"\";\n if (!normalized || seen.has(normalized)) {\n return false;\n }\n seen.add(normalized);\n return true;\n });\n }, [initialSystemVariables]);\n\n const normalizedCustomVariables = useMemo(() => {\n const systemNameSet = new Set(\n normalizedSystemVariables.map((variable) => variable.name.toLowerCase())\n );\n const seen = new Set<string>();\n return (initialVariables ?? EMPTY_VARIABLES).filter((variable) => {\n const normalized =\n typeof variable?.name === \"string\" ? variable.name.toLowerCase() : \"\";\n if (\n !normalized ||\n systemNameSet.has(normalized) ||\n seen.has(normalized)\n ) {\n return false;\n }\n seen.add(normalized);\n return true;\n });\n }, [initialVariables, normalizedSystemVariables]);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n const [popoverPosition, setPopoverPosition] =\n useState<PopoverPosition | null>(null);\n const [variables, setVariables] = useState<Variable[]>(\n normalizedCustomVariables\n );\n const [systemVariables, setSystemVariables] = useState<Variable[]>(\n normalizedSystemVariables\n );\n\n useEffect(() => {\n setVariables(normalizedCustomVariables);\n }, [normalizedCustomVariables]);\n\n useEffect(() => {\n setSystemVariables(normalizedSystemVariables);\n }, [normalizedSystemVariables]);\n\n const [selectedOption, setSelectedOption] = useState<SelectedOption>(\n SelectedOption.Empty\n );\n const [selectContentInfo, setSelectContentInfo] =\n useState<SelectContentInfo | null>();\n const editorViewRef = useRef<EditorView | null>(null);\n const pendingVariableContentRef = useRef<string | null>(null);\n const variableSearchAnchorRef = useRef<HTMLButtonElement | null>(null);\n const [variableSearchOpen, setVariableSearchOpen] = useState(false);\n const closeVariableSearch = useCallback(() => {\n setVariableSearchOpen(false);\n variableSearchAnchorRef.current = null;\n }, []);\n const handleVariableSearchToggle = useCallback(\n (button: HTMLButtonElement) => {\n if (disabled) {\n return;\n }\n if (variableSearchOpen && variableSearchAnchorRef.current === button) {\n closeVariableSearch();\n return;\n }\n variableSearchAnchorRef.current = button;\n setVariableSearchOpen(true);\n },\n [closeVariableSearch, disabled, variableSearchOpen]\n );\n\n const editorContextValue: IEditorContext = {\n selectedOption,\n setSelectedOption,\n dialogOpen,\n setDialogOpen,\n popoverOpen,\n setPopoverOpen,\n popoverPosition,\n setPopoverPosition,\n };\n\n useEffect(() => {\n if (!disabled) {\n return;\n }\n setDialogOpen(false);\n setPopoverOpen(false);\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n setPopoverPosition(null);\n closeVariableSearch();\n }, [\n closeVariableSearch,\n disabled,\n setDialogOpen,\n setPopoverOpen,\n setPopoverPosition,\n setSelectedOption,\n setSelectContentInfo,\n ]);\n\n const addVariablesFromContent = useCallback(\n (text: string) => {\n if (editMode !== EditMode.QuickEdit || !text) {\n return;\n }\n\n const names = extractVariableNames(text);\n if (!names.length) {\n return;\n }\n\n const systemNameSet = new Set(\n systemVariables.map((variable) => variable.name.toLowerCase())\n );\n\n setVariables((prev) => {\n const existingNames = new Set(\n prev.map((variable) => variable.name.toLowerCase())\n );\n const addedNames = new Set<string>();\n const newVariables: Variable[] = [];\n\n names.forEach((rawName) => {\n const normalized = rawName.toLowerCase();\n if (\n !rawName ||\n systemNameSet.has(normalized) ||\n existingNames.has(normalized) ||\n addedNames.has(normalized)\n ) {\n return;\n }\n newVariables.push({ name: rawName });\n addedNames.add(normalized);\n });\n\n if (!newVariables.length) {\n return prev;\n }\n\n return [...newVariables, ...prev];\n });\n },\n [editMode, systemVariables]\n );\n\n useEffect(() => {\n addVariablesFromContent(content);\n }, [content, addVariablesFromContent]);\n\n // const insertFixedText = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const selectedText = state.sliceDoc(selection.from, selection.to);\n // const startTag = \"===\";\n // const endTag = \"===\";\n // const insertContent = `${startTag}${selectedText ?? \"\"}${endTag}`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + startTag.length + (selectedText?.length ?? 0),\n // },\n // });\n // view.focus();\n // }, []);\n\n // const insertDivider = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const insertContent = `\\n\\n---\\n\\n`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + insertContent.length,\n // },\n // });\n // view.focus();\n // }, []);\n\n const onSelectedOption = useCallback(\n (option: SelectedOption) => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n // if (option === SelectedOption.FixedText) {\n // insertFixedText();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n // if (option === SelectedOption.Divider) {\n // insertDivider();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n setSelectedOption(option);\n\n if (option === SelectedOption.Variable) {\n if (editorViewRef.current) {\n const { state } = editorViewRef.current;\n const pos = state.selection.main.from;\n const coords = editorViewRef.current.coordsAtPos(pos);\n if (coords) {\n setPopoverPosition({\n x: coords.left,\n y: coords.bottom,\n });\n }\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [closeVariableSearch, disabled]\n );\n\n const insertText = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) return;\n\n const { state, dispatch } = editorViewRef.current;\n const from = state.selection.main.from;\n\n dispatch({\n changes: { from, insert: text },\n selection: { anchor: from + text.length },\n });\n },\n [editorViewRef, disabled]\n );\n\n const replaceSelection = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const { state, dispatch } = editorViewRef.current;\n const selection = state.selection.main;\n dispatch({\n changes: { from: selection.from, to: selection.to, insert: text },\n selection: { anchor: selection.from + text.length },\n });\n },\n [disabled]\n );\n\n const focusEditor = useCallback(() => {\n editorViewRef.current?.focus();\n }, []);\n\n const getContent = useCallback(() => {\n return editorViewRef.current?.state.doc.toString() ?? \"\";\n }, []);\n\n const setContent = useCallback(\n (text: string) => {\n if (disabled) {\n return;\n }\n if (!editorViewRef.current) {\n onChange?.(text);\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n dispatch({\n changes: { from: 0, to: state.doc.length, insert: text },\n selection: { anchor: text.length },\n });\n },\n [disabled, onChange]\n );\n\n const deleteSelectedContent = useCallback(() => {\n if (disabled) {\n return;\n }\n if (\n !selectContentInfo ||\n !editorViewRef.current ||\n selectContentInfo.from === -1\n )\n return;\n\n const { from, to } = selectContentInfo;\n const { dispatch } = editorViewRef.current;\n\n dispatch({\n changes: { from, to, insert: \"\" },\n });\n }, [selectContentInfo, editorViewRef, disabled]);\n\n const insertVariableContent = useCallback(\n (\n variableName: string,\n range?: { from: number; to: number },\n placeCursorAtEnd = false\n ) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = range ?? state.selection.main;\n const template = buildVariableTemplate(variableName);\n const cursorOffset = placeCursorAtEnd\n ? template.length\n : 2 + variableName.length; // 2 braces before variable content\n\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + cursorOffset,\n },\n });\n view.focus();\n },\n [disabled]\n );\n\n const insertVariableTemplate = useCallback(() => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n insertVariableContent(\"\");\n }, [closeVariableSearch, disabled, insertVariableContent]);\n\n const insertConfirmOutputMarker = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"======\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 3,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertLinkTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"[]()\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 1,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertButtonTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"?[]\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 2,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertSingleChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{}} ${optionLabel1} | ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertMultiChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{}} ${optionLabel1} || ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertInputFieldTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const placeholder = toolbarLabels.inputPlaceholder ?? \"请输入\";\n const template = `?[%{{}}...${placeholder}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [disabled, toolbarLabels.inputPlaceholder]);\n\n const handleSelectImage = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n }: {\n resourceUrl?: string;\n resourceTitle?: string;\n scalePercent?: number;\n }) => {\n if (!resourceUrl || disabled) return;\n const textToInsert = getImageContentToInsert({\n resourceUrl,\n resourceTitle,\n scalePercent,\n });\n if (selectContentInfo?.type === SelectedOption.Image) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVideo = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n }: {\n resourceUrl: string;\n resourceTitle: string;\n }) => {\n if (disabled) {\n return;\n }\n const textToInsert = getVideoContentToInsert(resourceUrl, resourceTitle);\n if (selectContentInfo?.type === SelectedOption.Video) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVariable = useCallback(\n (variable: Variable) => {\n if (disabled) {\n return;\n }\n const selectionRange =\n selectContentInfo?.type === SelectedOption.Variable\n ? { from: selectContentInfo.from, to: selectContentInfo.to }\n : undefined;\n insertVariableContent(variable.name, selectionRange, true);\n setPopoverOpen(false);\n closeVariableSearch();\n },\n [disabled, insertVariableContent, selectContentInfo, closeVariableSearch]\n );\n\n const slashCommandsExtension = useCallback(() => {\n return autocompletion({\n override: [\n createSlashCommands(onSelectedOption, {\n // divider: currentStrings.slashDivider,\n // fixedText: currentStrings.slashFixedText,\n image: currentStrings.slashImage,\n video: currentStrings.slashVideo,\n variable: currentStrings.slashVariable,\n }),\n ],\n });\n }, [\n // currentStrings.slashDivider,\n // currentStrings.slashFixedText,\n currentStrings.slashImage,\n currentStrings.slashVideo,\n currentStrings.slashVariable,\n onSelectedOption,\n ]);\n\n // const fixedTextPlaceholderExtension = useMemo(\n // () =>\n // createFixedTextPlaceholder(\n // currentStrings.fixedTextPlaceholder ?? \"添加固定文本\",\n // currentStrings.fixedTextTooltip ??\n // currentStrings.slashFixedText ??\n // \"固定文本\"\n // ),\n // [\n // currentStrings.fixedTextPlaceholder,\n // currentStrings.fixedTextTooltip,\n // currentStrings.slashFixedText,\n // ]\n // );\n\n const handleEditorUpdate = useCallback(\n (update: ViewUpdate) => {\n editorViewRef.current = update.view;\n if (\n editMode === EditMode.QuickEdit &&\n pendingVariableContentRef.current &&\n update.selectionSet\n ) {\n const cursorPosition = update.state.selection.main.head;\n const docText = update.state.doc.toString();\n const stillInside = isCursorInsideVariableExpression(\n docText,\n cursorPosition\n );\n if (!stillInside) {\n addVariablesFromContent(docText);\n pendingVariableContentRef.current = null;\n }\n }\n },\n [addVariablesFromContent, editMode]\n );\n\n const handleTagClick = useCallback(\n (event: any) => {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n const { type, from, to, dataset, target } = event.detail;\n const value = parseContentInfo(type, dataset);\n setSelectContentInfo({\n type,\n value,\n from,\n to,\n });\n setSelectedOption(type);\n\n if (type === SelectedOption.Variable) {\n if (target) {\n const rect = target.getBoundingClientRect();\n setPopoverPosition({\n x: rect.left,\n y: rect.bottom,\n });\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [disabled]\n );\n\n useEffect(() => {\n if (!dialogOpen) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [dialogOpen]);\n\n useEffect(() => {\n if (!popoverOpen && selectedOption === SelectedOption.Variable) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [popoverOpen, selectedOption]);\n\n useEffect(() => {\n const handleWrap = (e: any) => {\n if (e.detail.view === editorViewRef.current) {\n handleTagClick(e);\n }\n };\n window.addEventListener(\"globalTagClick\", handleWrap);\n return () => {\n window.removeEventListener(\"globalTagClick\", handleWrap);\n };\n }, [handleTagClick]);\n\n const editorExtensions = useMemo(() => {\n const extensions = [\n EditorView.lineWrapping,\n markdown(),\n syntaxHighlighting(defaultHighlightStyle),\n SyntaxHighlighter,\n ];\n\n if (!disabled) {\n extensions.push(slashCommandsExtension());\n }\n\n if (editMode === EditMode.QuickEdit) {\n extensions.push(\n ImgPlaceholder,\n VideoPlaceholder,\n VariablePlaceholder\n // fixedTextPlaceholderExtension,\n // DividerPlaceholder,\n );\n }\n\n extensions.push(\n EditorView.updateListener.of((update) => {\n handleEditorUpdate(update);\n })\n );\n\n return extensions;\n }, [disabled, editMode, slashCommandsExtension, handleEditorUpdate]);\n\n const handleContentChange = useCallback(\n (value: string) => {\n if (disabled) {\n return;\n }\n const cursorPosition =\n editorViewRef.current?.state.selection.main.head ?? -1;\n const skipAddition = isCursorInsideVariableExpression(\n value,\n cursorPosition\n );\n if (skipAddition) {\n pendingVariableContentRef.current = value;\n } else {\n pendingVariableContentRef.current = null;\n addVariablesFromContent(value);\n }\n onChange?.(value);\n },\n [addVariablesFromContent, onChange, disabled]\n );\n\n const isVariableSearchOpen = !disabled && variableSearchOpen;\n const editorApi = useMemo(\n () => ({\n insertTextAtCursor: insertText,\n replaceSelection,\n focus: focusEditor,\n getContent,\n setContent,\n }),\n [focusEditor, getContent, insertText, replaceSelection, setContent]\n );\n\n const handleToolbarActionClick = useCallback(\n (action: EditorAction) => {\n if (disabled || \"render\" in action) {\n return;\n }\n action.onClick?.(editorApi);\n },\n [disabled, editorApi]\n );\n\n const toolbarRightSlot = useMemo(() => {\n if (!toolbarActionsRight?.length) {\n return null;\n }\n return (\n <div className=\"markdown-flow-editor-toolbar-right\">\n {toolbarActionsRight.map((action) => {\n if (\"render\" in action) {\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {action.render(editorApi)}\n </div>\n );\n }\n const ariaLabel = action.label || action.tooltip || undefined;\n const button = (\n <button\n type=\"button\"\n key={action.key}\n disabled={disabled || action.disabled}\n onClick={() => handleToolbarActionClick(action)}\n className=\"markdown-flow-editor-toolbar-right-button\"\n aria-label={ariaLabel}\n title={action.label || action.tooltip}\n >\n {action.icon ? (\n <span className=\"toolbar-right-icon\">{action.icon}</span>\n ) : null}\n {action.label ? (\n <span className=\"toolbar-right-label\">{action.label}</span>\n ) : null}\n </button>\n );\n const wrapped = action.tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"top\">{action.tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n button\n );\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {wrapped}\n </div>\n );\n })}\n </div>\n );\n }, [disabled, editorApi, handleToolbarActionClick, toolbarActionsRight]);\n\n useEffect(() => {\n onReady?.(editorApi);\n }, [editorApi]);\n\n return (\n <div\n className=\"markdown-flow-editor\"\n data-disabled={disabled ? \"true\" : undefined}\n aria-disabled={disabled}\n >\n <EditorToolbar\n disabled={disabled}\n labels={toolbarLabels}\n onSelect={onSelectedOption}\n onInsertVariablePlaceholder={insertVariableTemplate}\n onVariableSearchToggle={handleVariableSearchToggle}\n onVariableSearchClose={closeVariableSearch}\n onInsertConfirmOutput={insertConfirmOutputMarker}\n onInsertLink={insertLinkTemplate}\n onInsertButton={insertButtonTemplate}\n onInsertSingleChoice={insertSingleChoiceTemplate}\n onInsertMultiChoice={insertMultiChoiceTemplate}\n onInsertInputField={insertInputFieldTemplate}\n variableSearchActive={isVariableSearchOpen}\n rightSlot={toolbarRightSlot}\n />\n <VariableSearchDropdown\n open={isVariableSearchOpen}\n anchorElement={variableSearchAnchorRef.current}\n onClose={closeVariableSearch}\n onSelect={handleSelectVariable}\n variables={variables}\n systemVariables={systemVariables}\n labels={variableSearchLabels}\n />\n <div className=\"markdown-flow-editor-body relative overflow-auto\">\n <EditorContext.Provider value={editorContextValue}>\n <CodeMirror\n extensions={editorExtensions}\n basicSetup={{\n lineNumbers: false,\n syntaxHighlighting: true,\n highlightActiveLine: true,\n highlightActiveLineGutter: true,\n foldGutter: false,\n }}\n className=\"rounded-md\"\n placeholder={placeholderText}\n value={content}\n theme=\"light\"\n minHeight=\"2rem\"\n editable={!disabled}\n onChange={handleContentChange}\n onBlur={onBlur}\n />\n {!disabled && (\n <CustomDialog\n labels={{\n title:\n selectedOption === SelectedOption.Image\n ? t(\"dialogTitleImage\")\n : selectedOption === SelectedOption.Video\n ? t(\"dialogTitleVideo\")\n : selectedOption === SelectedOption.Variable\n ? t(\"dialogTitleVariable\")\n : t(\"dialogTitle\"),\n }}\n >\n {selectedOption === SelectedOption.Image && (\n <ImageInject\n value={selectContentInfo?.value}\n onSelect={handleSelectImage}\n uploadProps={uploadProps}\n />\n )}\n {selectedOption === SelectedOption.Video && (\n <VideoInject\n value={selectContentInfo?.value}\n onSelect={handleSelectVideo}\n />\n )}\n </CustomDialog>\n )}\n\n {!disabled && (\n <CustomPopover>\n <VariableSelect\n variables={variables}\n systemVariables={systemVariables}\n selectedName={selectContentInfo?.value?.variableName}\n onSelect={handleSelectVariable}\n onAddVariable={(variable) => {\n setVariables((prev) => {\n const normalized = variable.name.toLowerCase();\n const exists = prev.some(\n (item) => item.name.toLowerCase() === normalized\n );\n if (exists) {\n return prev;\n }\n return [variable, ...prev];\n });\n }}\n />\n </CustomPopover>\n )}\n </EditorContext.Provider>\n </div>\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["i18next","editorLocaleResources","lng","resource","initReactI18next","DEFAULT_EDITOR_LOCALE","EMPTY_VARIABLES","isCursorInsideVariableExpression","content","cursorPosition","regexp","createVariableExpressionRegexp","match","matchStart","matchEnd","innerStart","innerEnd","buildVariableTemplate","variableName","Editor","editMode","initialVariables","initialSystemVariables","onChange","onBlur","locale","uploadProps","disabled","toolbarActionsRight","onReady","t","i18n","useTranslation","resolvedLocale","normalizeEditorLocale","useEffect","currentStrings","getEditorLocaleMessages","toolbarLabels","useMemo","variableSearchLabels","placeholderText","normalizedSystemVariables","seen","variable","normalized","normalizedCustomVariables","systemNameSet","dialogOpen","setDialogOpen","useState","popoverOpen","setPopoverOpen","popoverPosition","setPopoverPosition","variables","setVariables","systemVariables","setSystemVariables","selectedOption","setSelectedOption","SelectedOption","selectContentInfo","setSelectContentInfo","editorViewRef","useRef","pendingVariableContentRef","variableSearchAnchorRef","variableSearchOpen","setVariableSearchOpen","closeVariableSearch","useCallback","handleVariableSearchToggle","button","editorContextValue","addVariablesFromContent","text","names","extractVariableNames","prev","existingNames","addedNames","newVariables","rawName","onSelectedOption","option","state","pos","coords","insertText","dispatch","from","replaceSelection","selection","focusEditor","getContent","setContent","view","deleteSelectedContent","to","insertVariableContent","range","placeCursorAtEnd","template","cursorOffset","insertVariableTemplate","insertConfirmOutputMarker","insertLinkTemplate","insertButtonTemplate","insertSingleChoiceTemplate","optionLabel1","optionLabel2","insertMultiChoiceTemplate","insertInputFieldTemplate","handleSelectImage","resourceUrl","resourceTitle","scalePercent","textToInsert","getImageContentToInsert","handleSelectVideo","getVideoContentToInsert","handleSelectVariable","selectionRange","slashCommandsExtension","autocompletion","createSlashCommands","handleEditorUpdate","update","docText","handleTagClick","event","type","dataset","target","value","parseContentInfo","rect","handleWrap","e","editorExtensions","extensions","EditorView","markdown","syntaxHighlighting","defaultHighlightStyle","SyntaxHighlighter","ImgPlaceholder","VideoPlaceholder","VariablePlaceholder","handleContentChange","isVariableSearchOpen","editorApi","handleToolbarActionClick","action","toolbarRightSlot","jsx","ariaLabel","jsxs","wrapped","Tooltip","TooltipTrigger","TooltipContent","EditorToolbar","VariableSearchDropdown","EditorContext","CodeMirror","CustomDialog","ImageInject","VideoInject","CustomPopover","VariableSelect","item"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarkdownFlowEditor.cjs.js","sources":["../../../src/components/MarkdownFlowEditor/MarkdownFlowEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from \"react\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\nimport { EditorView, ViewUpdate } from \"@codemirror/view\";\nimport { markdown } from \"@codemirror/lang-markdown\";\nimport {\n syntaxHighlighting,\n defaultHighlightStyle,\n} from \"@codemirror/language\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport CustomDialog from \"./components/CustomDialog\";\nimport CustomPopover from \"./components/CustomPopover\";\nimport EditorToolbar from \"./components/EditorToolbar\";\nimport VariableSearchDropdown from \"./components/VariableSearchDropdown\";\nimport EditorContext from \"./editor-context\";\nimport ImageInject from \"./components/ImageInject\";\nimport VideoInject from \"./components/VideoInject\";\nimport VariableSelect from \"./components/VariableSelect\";\nimport {\n SelectedOption,\n IEditorContext,\n Variable,\n SelectContentInfo,\n PopoverPosition,\n EditorAction,\n EditorApi,\n} from \"./types\";\nimport \"./markdownFlowEditor.css\";\n\nimport {\n createSlashCommands,\n parseContentInfo,\n getImageContentToInsert,\n getVideoContentToInsert,\n extractVariableNames,\n createVariableExpressionRegexp,\n} from \"./utils\";\nimport ImgPlaceholder from \"./plugins/ImgPlaceholder\";\nimport VideoPlaceholder from \"./plugins/VideoPlaceholder\";\nimport VariablePlaceholder from \"./plugins/VariablePlaceholder\";\nimport SyntaxHighlighter from \"./plugins/SyntaxHighlighter\";\n// import createFixedTextPlaceholder from \"./plugins/FixedTextPlaceholder\";\n// import DividerPlaceholder from \"./plugins/DividerPlaceholder\";\nimport { initReactI18next, useTranslation } from \"react-i18next\";\nimport i18next from \"i18next\";\nimport { UploadProps } from \"./uploadTypes\";\nimport {\n DEFAULT_EDITOR_LOCALE,\n editorLocaleResources,\n getEditorLocaleMessages,\n} from \"./editorI18n\";\nimport {\n normalizeMarkdownFlowLocale,\n type MarkdownFlowLocale,\n} from \"../../lib/locale\";\n\nif (!i18next.isInitialized) {\n i18next.use(initReactI18next).init({\n resources: editorLocaleResources,\n lng: DEFAULT_EDITOR_LOCALE,\n fallbackLng: DEFAULT_EDITOR_LOCALE,\n interpolation: { escapeValue: false },\n });\n} else {\n Object.entries(editorLocaleResources).forEach(([lng, resource]) => {\n i18next.addResourceBundle(\n lng,\n \"translation\",\n resource.translation,\n true,\n true\n );\n });\n}\n\nexport enum EditMode {\n CodeEdit = \"codeEdit\",\n QuickEdit = \"quickEdit\",\n}\n\ntype EditorProps = {\n content?: string;\n editMode?: EditMode;\n variables?: Variable[];\n systemVariables?: Variable[];\n onChange?: (value: string) => void;\n onBlur?: () => void;\n locale?: MarkdownFlowLocale;\n uploadProps?: UploadProps;\n disabled?: boolean;\n toolbarActionsRight?: EditorAction[];\n onReady?: (api: EditorApi) => void;\n};\n\nconst EMPTY_VARIABLES: Variable[] = [];\n\n// Detect whether cursor is still inside a {{variable}} expression\nconst isCursorInsideVariableExpression = (\n content: string,\n cursorPosition: number\n) => {\n if (!content || cursorPosition < 0) {\n return false;\n }\n const regexp = createVariableExpressionRegexp();\n let match: RegExpExecArray | null;\n\n while ((match = regexp.exec(content)) !== null) {\n const matchStart = match.index ?? 0;\n const matchEnd = matchStart + match[0].length;\n const innerStart = matchStart + 2;\n const innerEnd = matchEnd - 2;\n if (cursorPosition >= innerStart && cursorPosition <= innerEnd) {\n return true;\n }\n if (regexp.lastIndex === match.index) {\n regexp.lastIndex++;\n }\n }\n\n return false;\n};\n\nconst buildVariableTemplate = (variableName = \"\") => `{{${variableName}}}`;\n\nconst Editor: React.FC<EditorProps> = ({\n content = \"\",\n editMode = EditMode.CodeEdit,\n variables: initialVariables,\n systemVariables: initialSystemVariables,\n onChange,\n onBlur,\n locale = DEFAULT_EDITOR_LOCALE,\n uploadProps,\n disabled = false,\n toolbarActionsRight,\n onReady,\n}) => {\n const { t, i18n } = useTranslation();\n const resolvedLocale = normalizeMarkdownFlowLocale(locale || i18n.language);\n\n useEffect(() => {\n if (i18n.language !== resolvedLocale) {\n i18n.changeLanguage(resolvedLocale);\n }\n }, [i18n, resolvedLocale]);\n\n const currentStrings = getEditorLocaleMessages(resolvedLocale);\n const toolbarLabels = useMemo(\n () => ({\n image: t(\"toolbarInsertImage\", {\n defaultValue: \"Insert image\",\n }),\n video: t(\"toolbarInsertVideo\", {\n defaultValue: \"Insert video\",\n }),\n variable: t(\"slashVariable\", {\n defaultValue: \"Variable\",\n }),\n addVariable: t(\"toolbarInsertNewVariable\", {\n defaultValue: \"Insert new variable\",\n }),\n search: t(\"toolbarInsertExistingVariable\", {\n defaultValue: \"Insert existing variable\",\n }),\n confirmOutput: t(\"toolbarConfirmOutput\", {\n defaultValue: \"Confirm output\",\n }),\n insertLink: t(\"toolbarInsertLink\", {\n defaultValue: \"Insert link\",\n }),\n insertButton: t(\"toolbarInsertButton\", {\n defaultValue: \"Insert button\",\n }),\n insertSingleChoice: t(\"toolbarInsertSingleChoice\", {\n defaultValue: \"Insert single choice\",\n }),\n insertMultiChoice: t(\"toolbarInsertMultiChoice\", {\n defaultValue: \"Insert multi choice\",\n }),\n insertInput: t(\"toolbarInsertInput\", {\n defaultValue: \"Insert input\",\n }),\n singleChoiceOption1: t(\"toolbarChoiceOption1\", {\n defaultValue: \"Option 1\",\n }),\n singleChoiceOption2: t(\"toolbarChoiceOption2\", {\n defaultValue: \"Option 2\",\n }),\n inputPlaceholder: t(\"toolbarInputPlaceholder\", {\n defaultValue: \"Please enter\",\n }),\n }),\n [t]\n );\n const variableSearchLabels = useMemo(\n () => ({\n searchPlaceholder: t(\"variableSearchPlaceholder\", {\n defaultValue: \"Search variable\",\n }),\n systemLabel: t(\"variableSectionSystem\", \"System Variables\"),\n customLabel: t(\"variableSectionCustom\", \"Custom Variables\"),\n emptyLabel: t(\"variableNotFound\", \"No variables found\"),\n }),\n [t]\n );\n const placeholderText =\n editMode === EditMode.QuickEdit\n ? t(\"placeholderQuickEdit\", {\n defaultValue: t(\"placeholderCodeEdit\", {\n defaultValue: t(\"placeholder\"),\n }),\n })\n : t(\"placeholderCodeEdit\", { defaultValue: t(\"placeholder\") });\n // Normalize variables to avoid duplicating system variables in the custom list\n const normalizedSystemVariables = useMemo(() => {\n const seen = new Set<string>();\n return (initialSystemVariables ?? EMPTY_VARIABLES).filter((variable) => {\n const normalized =\n typeof variable?.name === \"string\" ? variable.name.toLowerCase() : \"\";\n if (!normalized || seen.has(normalized)) {\n return false;\n }\n seen.add(normalized);\n return true;\n });\n }, [initialSystemVariables]);\n\n const normalizedCustomVariables = useMemo(() => {\n const systemNameSet = new Set(\n normalizedSystemVariables.map((variable) => variable.name.toLowerCase())\n );\n const seen = new Set<string>();\n return (initialVariables ?? EMPTY_VARIABLES).filter((variable) => {\n const normalized =\n typeof variable?.name === \"string\" ? variable.name.toLowerCase() : \"\";\n if (\n !normalized ||\n systemNameSet.has(normalized) ||\n seen.has(normalized)\n ) {\n return false;\n }\n seen.add(normalized);\n return true;\n });\n }, [initialVariables, normalizedSystemVariables]);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n const [popoverPosition, setPopoverPosition] =\n useState<PopoverPosition | null>(null);\n const [variables, setVariables] = useState<Variable[]>(\n normalizedCustomVariables\n );\n const [systemVariables, setSystemVariables] = useState<Variable[]>(\n normalizedSystemVariables\n );\n\n useEffect(() => {\n setVariables(normalizedCustomVariables);\n }, [normalizedCustomVariables]);\n\n useEffect(() => {\n setSystemVariables(normalizedSystemVariables);\n }, [normalizedSystemVariables]);\n\n const [selectedOption, setSelectedOption] = useState<SelectedOption>(\n SelectedOption.Empty\n );\n const [selectContentInfo, setSelectContentInfo] =\n useState<SelectContentInfo | null>();\n const editorViewRef = useRef<EditorView | null>(null);\n const pendingVariableContentRef = useRef<string | null>(null);\n const variableSearchAnchorRef = useRef<HTMLButtonElement | null>(null);\n const [variableSearchOpen, setVariableSearchOpen] = useState(false);\n const closeVariableSearch = useCallback(() => {\n setVariableSearchOpen(false);\n variableSearchAnchorRef.current = null;\n }, []);\n const handleVariableSearchToggle = useCallback(\n (button: HTMLButtonElement) => {\n if (disabled) {\n return;\n }\n if (variableSearchOpen && variableSearchAnchorRef.current === button) {\n closeVariableSearch();\n return;\n }\n variableSearchAnchorRef.current = button;\n setVariableSearchOpen(true);\n },\n [closeVariableSearch, disabled, variableSearchOpen]\n );\n\n const editorContextValue: IEditorContext = {\n selectedOption,\n setSelectedOption,\n dialogOpen,\n setDialogOpen,\n popoverOpen,\n setPopoverOpen,\n popoverPosition,\n setPopoverPosition,\n };\n\n useEffect(() => {\n if (!disabled) {\n return;\n }\n setDialogOpen(false);\n setPopoverOpen(false);\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n setPopoverPosition(null);\n closeVariableSearch();\n }, [\n closeVariableSearch,\n disabled,\n setDialogOpen,\n setPopoverOpen,\n setPopoverPosition,\n setSelectedOption,\n setSelectContentInfo,\n ]);\n\n const addVariablesFromContent = useCallback(\n (text: string) => {\n if (editMode !== EditMode.QuickEdit || !text) {\n return;\n }\n\n const names = extractVariableNames(text);\n if (!names.length) {\n return;\n }\n\n const systemNameSet = new Set(\n systemVariables.map((variable) => variable.name.toLowerCase())\n );\n\n setVariables((prev) => {\n const existingNames = new Set(\n prev.map((variable) => variable.name.toLowerCase())\n );\n const addedNames = new Set<string>();\n const newVariables: Variable[] = [];\n\n names.forEach((rawName) => {\n const normalized = rawName.toLowerCase();\n if (\n !rawName ||\n systemNameSet.has(normalized) ||\n existingNames.has(normalized) ||\n addedNames.has(normalized)\n ) {\n return;\n }\n newVariables.push({ name: rawName });\n addedNames.add(normalized);\n });\n\n if (!newVariables.length) {\n return prev;\n }\n\n return [...newVariables, ...prev];\n });\n },\n [editMode, systemVariables]\n );\n\n useEffect(() => {\n addVariablesFromContent(content);\n }, [content, addVariablesFromContent]);\n\n // const insertFixedText = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const selectedText = state.sliceDoc(selection.from, selection.to);\n // const startTag = \"===\";\n // const endTag = \"===\";\n // const insertContent = `${startTag}${selectedText ?? \"\"}${endTag}`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + startTag.length + (selectedText?.length ?? 0),\n // },\n // });\n // view.focus();\n // }, []);\n\n // const insertDivider = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const insertContent = `\\n\\n---\\n\\n`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + insertContent.length,\n // },\n // });\n // view.focus();\n // }, []);\n\n const onSelectedOption = useCallback(\n (option: SelectedOption) => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n // if (option === SelectedOption.FixedText) {\n // insertFixedText();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n // if (option === SelectedOption.Divider) {\n // insertDivider();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n setSelectedOption(option);\n\n if (option === SelectedOption.Variable) {\n if (editorViewRef.current) {\n const { state } = editorViewRef.current;\n const pos = state.selection.main.from;\n const coords = editorViewRef.current.coordsAtPos(pos);\n if (coords) {\n setPopoverPosition({\n x: coords.left,\n y: coords.bottom,\n });\n }\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [closeVariableSearch, disabled]\n );\n\n const insertText = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) return;\n\n const { state, dispatch } = editorViewRef.current;\n const from = state.selection.main.from;\n\n dispatch({\n changes: { from, insert: text },\n selection: { anchor: from + text.length },\n });\n },\n [editorViewRef, disabled]\n );\n\n const replaceSelection = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const { state, dispatch } = editorViewRef.current;\n const selection = state.selection.main;\n dispatch({\n changes: { from: selection.from, to: selection.to, insert: text },\n selection: { anchor: selection.from + text.length },\n });\n },\n [disabled]\n );\n\n const focusEditor = useCallback(() => {\n editorViewRef.current?.focus();\n }, []);\n\n const getContent = useCallback(() => {\n return editorViewRef.current?.state.doc.toString() ?? \"\";\n }, []);\n\n const setContent = useCallback(\n (text: string) => {\n if (disabled) {\n return;\n }\n if (!editorViewRef.current) {\n onChange?.(text);\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n dispatch({\n changes: { from: 0, to: state.doc.length, insert: text },\n selection: { anchor: text.length },\n });\n },\n [disabled, onChange]\n );\n\n const deleteSelectedContent = useCallback(() => {\n if (disabled) {\n return;\n }\n if (\n !selectContentInfo ||\n !editorViewRef.current ||\n selectContentInfo.from === -1\n )\n return;\n\n const { from, to } = selectContentInfo;\n const { dispatch } = editorViewRef.current;\n\n dispatch({\n changes: { from, to, insert: \"\" },\n });\n }, [selectContentInfo, editorViewRef, disabled]);\n\n const insertVariableContent = useCallback(\n (\n variableName: string,\n range?: { from: number; to: number },\n placeCursorAtEnd = false\n ) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = range ?? state.selection.main;\n const template = buildVariableTemplate(variableName);\n const cursorOffset = placeCursorAtEnd\n ? template.length\n : 2 + variableName.length; // 2 braces before variable content\n\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + cursorOffset,\n },\n });\n view.focus();\n },\n [disabled]\n );\n\n const insertVariableTemplate = useCallback(() => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n insertVariableContent(\"\");\n }, [closeVariableSearch, disabled, insertVariableContent]);\n\n const insertConfirmOutputMarker = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"======\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 3,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertLinkTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"[]()\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 1,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertButtonTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"?[]\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 2,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertSingleChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{}} ${optionLabel1} | ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertMultiChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{}} ${optionLabel1} || ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertInputFieldTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const placeholder = toolbarLabels.inputPlaceholder ?? \"请输入\";\n const template = `?[%{{}}...${placeholder}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [disabled, toolbarLabels.inputPlaceholder]);\n\n const handleSelectImage = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n }: {\n resourceUrl?: string;\n resourceTitle?: string;\n scalePercent?: number;\n }) => {\n if (!resourceUrl || disabled) return;\n const textToInsert = getImageContentToInsert({\n resourceUrl,\n resourceTitle,\n scalePercent,\n });\n if (selectContentInfo?.type === SelectedOption.Image) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVideo = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n }: {\n resourceUrl: string;\n resourceTitle: string;\n }) => {\n if (disabled) {\n return;\n }\n const textToInsert = getVideoContentToInsert(resourceUrl, resourceTitle);\n if (selectContentInfo?.type === SelectedOption.Video) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVariable = useCallback(\n (variable: Variable) => {\n if (disabled) {\n return;\n }\n const selectionRange =\n selectContentInfo?.type === SelectedOption.Variable\n ? { from: selectContentInfo.from, to: selectContentInfo.to }\n : undefined;\n insertVariableContent(variable.name, selectionRange, true);\n setPopoverOpen(false);\n closeVariableSearch();\n },\n [disabled, insertVariableContent, selectContentInfo, closeVariableSearch]\n );\n\n const slashCommandsExtension = useCallback(() => {\n return autocompletion({\n override: [\n createSlashCommands(onSelectedOption, {\n // divider: currentStrings.slashDivider,\n // fixedText: currentStrings.slashFixedText,\n image: currentStrings.slashImage,\n video: currentStrings.slashVideo,\n variable: currentStrings.slashVariable,\n }),\n ],\n });\n }, [\n // currentStrings.slashDivider,\n // currentStrings.slashFixedText,\n currentStrings.slashImage,\n currentStrings.slashVideo,\n currentStrings.slashVariable,\n onSelectedOption,\n ]);\n\n // const fixedTextPlaceholderExtension = useMemo(\n // () =>\n // createFixedTextPlaceholder(\n // currentStrings.fixedTextPlaceholder ?? \"添加固定文本\",\n // currentStrings.fixedTextTooltip ??\n // currentStrings.slashFixedText ??\n // \"固定文本\"\n // ),\n // [\n // currentStrings.fixedTextPlaceholder,\n // currentStrings.fixedTextTooltip,\n // currentStrings.slashFixedText,\n // ]\n // );\n\n const handleEditorUpdate = useCallback(\n (update: ViewUpdate) => {\n editorViewRef.current = update.view;\n if (\n editMode === EditMode.QuickEdit &&\n pendingVariableContentRef.current &&\n update.selectionSet\n ) {\n const cursorPosition = update.state.selection.main.head;\n const docText = update.state.doc.toString();\n const stillInside = isCursorInsideVariableExpression(\n docText,\n cursorPosition\n );\n if (!stillInside) {\n addVariablesFromContent(docText);\n pendingVariableContentRef.current = null;\n }\n }\n },\n [addVariablesFromContent, editMode]\n );\n\n const handleTagClick = useCallback(\n (event: any) => {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n const { type, from, to, dataset, target } = event.detail;\n const value = parseContentInfo(type, dataset);\n setSelectContentInfo({\n type,\n value,\n from,\n to,\n });\n setSelectedOption(type);\n\n if (type === SelectedOption.Variable) {\n if (target) {\n const rect = target.getBoundingClientRect();\n setPopoverPosition({\n x: rect.left,\n y: rect.bottom,\n });\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [disabled]\n );\n\n useEffect(() => {\n if (!dialogOpen) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [dialogOpen]);\n\n useEffect(() => {\n if (!popoverOpen && selectedOption === SelectedOption.Variable) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [popoverOpen, selectedOption]);\n\n useEffect(() => {\n const handleWrap = (e: any) => {\n if (e.detail.view === editorViewRef.current) {\n handleTagClick(e);\n }\n };\n window.addEventListener(\"globalTagClick\", handleWrap);\n return () => {\n window.removeEventListener(\"globalTagClick\", handleWrap);\n };\n }, [handleTagClick]);\n\n const editorExtensions = useMemo(() => {\n const extensions = [\n EditorView.lineWrapping,\n markdown(),\n syntaxHighlighting(defaultHighlightStyle),\n SyntaxHighlighter,\n ];\n\n if (!disabled) {\n extensions.push(slashCommandsExtension());\n }\n\n if (editMode === EditMode.QuickEdit) {\n extensions.push(\n ImgPlaceholder,\n VideoPlaceholder,\n VariablePlaceholder\n // fixedTextPlaceholderExtension,\n // DividerPlaceholder,\n );\n }\n\n extensions.push(\n EditorView.updateListener.of((update) => {\n handleEditorUpdate(update);\n })\n );\n\n return extensions;\n }, [disabled, editMode, slashCommandsExtension, handleEditorUpdate]);\n\n const handleContentChange = useCallback(\n (value: string) => {\n if (disabled) {\n return;\n }\n const cursorPosition =\n editorViewRef.current?.state.selection.main.head ?? -1;\n const skipAddition = isCursorInsideVariableExpression(\n value,\n cursorPosition\n );\n if (skipAddition) {\n pendingVariableContentRef.current = value;\n } else {\n pendingVariableContentRef.current = null;\n addVariablesFromContent(value);\n }\n onChange?.(value);\n },\n [addVariablesFromContent, onChange, disabled]\n );\n\n const isVariableSearchOpen = !disabled && variableSearchOpen;\n const editorApi = useMemo(\n () => ({\n insertTextAtCursor: insertText,\n replaceSelection,\n focus: focusEditor,\n getContent,\n setContent,\n }),\n [focusEditor, getContent, insertText, replaceSelection, setContent]\n );\n\n const handleToolbarActionClick = useCallback(\n (action: EditorAction) => {\n if (disabled || \"render\" in action) {\n return;\n }\n action.onClick?.(editorApi);\n },\n [disabled, editorApi]\n );\n\n const toolbarRightSlot = useMemo(() => {\n if (!toolbarActionsRight?.length) {\n return null;\n }\n return (\n <div className=\"markdown-flow-editor-toolbar-right\">\n {toolbarActionsRight.map((action) => {\n if (\"render\" in action) {\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {action.render(editorApi)}\n </div>\n );\n }\n const ariaLabel = action.label || action.tooltip || undefined;\n const button = (\n <button\n type=\"button\"\n key={action.key}\n disabled={disabled || action.disabled}\n onClick={() => handleToolbarActionClick(action)}\n className=\"markdown-flow-editor-toolbar-right-button\"\n aria-label={ariaLabel}\n title={action.label || action.tooltip}\n >\n {action.icon ? (\n <span className=\"toolbar-right-icon\">{action.icon}</span>\n ) : null}\n {action.label ? (\n <span className=\"toolbar-right-label\">{action.label}</span>\n ) : null}\n </button>\n );\n const wrapped = action.tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"top\">{action.tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n button\n );\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {wrapped}\n </div>\n );\n })}\n </div>\n );\n }, [disabled, editorApi, handleToolbarActionClick, toolbarActionsRight]);\n\n useEffect(() => {\n onReady?.(editorApi);\n }, [editorApi]);\n\n return (\n <div\n className=\"markdown-flow-editor\"\n data-disabled={disabled ? \"true\" : undefined}\n aria-disabled={disabled}\n >\n <EditorToolbar\n disabled={disabled}\n labels={toolbarLabels}\n onSelect={onSelectedOption}\n onInsertVariablePlaceholder={insertVariableTemplate}\n onVariableSearchToggle={handleVariableSearchToggle}\n onVariableSearchClose={closeVariableSearch}\n onInsertConfirmOutput={insertConfirmOutputMarker}\n onInsertLink={insertLinkTemplate}\n onInsertButton={insertButtonTemplate}\n onInsertSingleChoice={insertSingleChoiceTemplate}\n onInsertMultiChoice={insertMultiChoiceTemplate}\n onInsertInputField={insertInputFieldTemplate}\n variableSearchActive={isVariableSearchOpen}\n rightSlot={toolbarRightSlot}\n />\n <VariableSearchDropdown\n open={isVariableSearchOpen}\n anchorElement={variableSearchAnchorRef.current}\n onClose={closeVariableSearch}\n onSelect={handleSelectVariable}\n variables={variables}\n systemVariables={systemVariables}\n labels={variableSearchLabels}\n />\n <div className=\"markdown-flow-editor-body relative overflow-auto\">\n <EditorContext.Provider value={editorContextValue}>\n <CodeMirror\n extensions={editorExtensions}\n basicSetup={{\n lineNumbers: false,\n syntaxHighlighting: true,\n highlightActiveLine: true,\n highlightActiveLineGutter: true,\n foldGutter: false,\n }}\n className=\"rounded-md\"\n placeholder={placeholderText}\n value={content}\n theme=\"light\"\n minHeight=\"2rem\"\n editable={!disabled}\n onChange={handleContentChange}\n onBlur={onBlur}\n />\n {!disabled && (\n <CustomDialog\n labels={{\n title:\n selectedOption === SelectedOption.Image\n ? t(\"dialogTitleImage\")\n : selectedOption === SelectedOption.Video\n ? t(\"dialogTitleVideo\")\n : selectedOption === SelectedOption.Variable\n ? t(\"dialogTitleVariable\")\n : t(\"dialogTitle\"),\n }}\n >\n {selectedOption === SelectedOption.Image && (\n <ImageInject\n value={selectContentInfo?.value}\n onSelect={handleSelectImage}\n uploadProps={uploadProps}\n />\n )}\n {selectedOption === SelectedOption.Video && (\n <VideoInject\n value={selectContentInfo?.value}\n onSelect={handleSelectVideo}\n />\n )}\n </CustomDialog>\n )}\n\n {!disabled && (\n <CustomPopover>\n <VariableSelect\n variables={variables}\n systemVariables={systemVariables}\n selectedName={selectContentInfo?.value?.variableName}\n onSelect={handleSelectVariable}\n onAddVariable={(variable) => {\n setVariables((prev) => {\n const normalized = variable.name.toLowerCase();\n const exists = prev.some(\n (item) => item.name.toLowerCase() === normalized\n );\n if (exists) {\n return prev;\n }\n return [variable, ...prev];\n });\n }}\n />\n </CustomPopover>\n )}\n </EditorContext.Provider>\n </div>\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["i18next","editorLocaleResources","lng","resource","initReactI18next","DEFAULT_EDITOR_LOCALE","EMPTY_VARIABLES","isCursorInsideVariableExpression","content","cursorPosition","regexp","createVariableExpressionRegexp","match","matchStart","matchEnd","innerStart","innerEnd","buildVariableTemplate","variableName","Editor","editMode","initialVariables","initialSystemVariables","onChange","onBlur","locale","uploadProps","disabled","toolbarActionsRight","onReady","t","i18n","useTranslation","resolvedLocale","normalizeMarkdownFlowLocale","useEffect","currentStrings","getEditorLocaleMessages","toolbarLabels","useMemo","variableSearchLabels","placeholderText","normalizedSystemVariables","seen","variable","normalized","normalizedCustomVariables","systemNameSet","dialogOpen","setDialogOpen","useState","popoverOpen","setPopoverOpen","popoverPosition","setPopoverPosition","variables","setVariables","systemVariables","setSystemVariables","selectedOption","setSelectedOption","SelectedOption","selectContentInfo","setSelectContentInfo","editorViewRef","useRef","pendingVariableContentRef","variableSearchAnchorRef","variableSearchOpen","setVariableSearchOpen","closeVariableSearch","useCallback","handleVariableSearchToggle","button","editorContextValue","addVariablesFromContent","text","names","extractVariableNames","prev","existingNames","addedNames","newVariables","rawName","onSelectedOption","option","state","pos","coords","insertText","dispatch","from","replaceSelection","selection","focusEditor","getContent","setContent","view","deleteSelectedContent","to","insertVariableContent","range","placeCursorAtEnd","template","cursorOffset","insertVariableTemplate","insertConfirmOutputMarker","insertLinkTemplate","insertButtonTemplate","insertSingleChoiceTemplate","optionLabel1","optionLabel2","insertMultiChoiceTemplate","insertInputFieldTemplate","handleSelectImage","resourceUrl","resourceTitle","scalePercent","textToInsert","getImageContentToInsert","handleSelectVideo","getVideoContentToInsert","handleSelectVariable","selectionRange","slashCommandsExtension","autocompletion","createSlashCommands","handleEditorUpdate","update","docText","handleTagClick","event","type","dataset","target","value","parseContentInfo","rect","handleWrap","e","editorExtensions","extensions","EditorView","markdown","syntaxHighlighting","defaultHighlightStyle","SyntaxHighlighter","ImgPlaceholder","VideoPlaceholder","VariablePlaceholder","handleContentChange","isVariableSearchOpen","editorApi","handleToolbarActionClick","action","toolbarRightSlot","jsx","ariaLabel","jsxs","wrapped","Tooltip","TooltipTrigger","TooltipContent","EditorToolbar","VariableSearchDropdown","EditorContext","CodeMirror","CustomDialog","ImageInject","VideoInject","CustomPopover","VariableSelect","item"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Variable, EditorAction, EditorApi } from './types';
|
|
2
2
|
import { UploadProps } from './uploadTypes';
|
|
3
|
-
import {
|
|
3
|
+
import { MarkdownFlowLocale } from '../../lib/locale';
|
|
4
4
|
export declare enum EditMode {
|
|
5
5
|
CodeEdit = "codeEdit",
|
|
6
6
|
QuickEdit = "quickEdit"
|
|
@@ -12,7 +12,7 @@ type EditorProps = {
|
|
|
12
12
|
systemVariables?: Variable[];
|
|
13
13
|
onChange?: (value: string) => void;
|
|
14
14
|
onBlur?: () => void;
|
|
15
|
-
locale?:
|
|
15
|
+
locale?: MarkdownFlowLocale;
|
|
16
16
|
uploadProps?: UploadProps;
|
|
17
17
|
disabled?: boolean;
|
|
18
18
|
toolbarActionsRight?: EditorAction[];
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { j as l } from "../../_virtual/jsx-runtime.es.js";
|
|
2
2
|
import { useEffect as b, useMemo as L, useState as S, useRef as ee, useCallback as a } from "react";
|
|
3
|
-
import
|
|
4
|
-
import { autocompletion as
|
|
3
|
+
import Fe from "../../node_modules/@uiw/react-codemirror/esm/index.es.js";
|
|
4
|
+
import { autocompletion as $e } from "../../node_modules/@codemirror/autocomplete/dist/index.es.js";
|
|
5
5
|
import { EditorView as ge } from "../../node_modules/@codemirror/view/dist/index.es.js";
|
|
6
|
-
import { markdown as
|
|
6
|
+
import { markdown as De } from "../../node_modules/@codemirror/lang-markdown/dist/index.es.js";
|
|
7
7
|
import { syntaxHighlighting as He, defaultHighlightStyle as qe } from "../../node_modules/@codemirror/language/dist/index.es.js";
|
|
8
8
|
import { Tooltip as Me, TooltipTrigger as _e, TooltipContent as Ge } from "../ui/tooltip.es.js";
|
|
9
9
|
import We from "./components/CustomDialog.es.js";
|
|
@@ -22,7 +22,8 @@ import at from "./plugins/VideoPlaceholder.es.js";
|
|
|
22
22
|
import lt from "./plugins/VariablePlaceholder.es.js";
|
|
23
23
|
import ct from "./plugins/SyntaxHighlighter.es.js";
|
|
24
24
|
import te from "../../node_modules/i18next/dist/esm/i18next.es.js";
|
|
25
|
-
import { DEFAULT_EDITOR_LOCALE as oe, editorLocaleResources as de,
|
|
25
|
+
import { DEFAULT_EDITOR_LOCALE as oe, editorLocaleResources as de, getEditorLocaleMessages as ut } from "./editorI18n.es.js";
|
|
26
|
+
import { normalizeMarkdownFlowLocale as mt } from "../../lib/locale.es.js";
|
|
26
27
|
import { initReactI18next as ft } from "../../node_modules/react-i18next/dist/es/initReactI18next.es.js";
|
|
27
28
|
import { useTranslation as ht } from "../../node_modules/react-i18next/dist/es/useTranslation.es.js";
|
|
28
29
|
te.isInitialized ? Object.entries(de).forEach(([C, f]) => {
|
|
@@ -51,7 +52,7 @@ const Ve = [], Ce = (C, f) => {
|
|
|
51
52
|
T.lastIndex === x.index && T.lastIndex++;
|
|
52
53
|
}
|
|
53
54
|
return !1;
|
|
54
|
-
}, pt = (C = "") => `{{${C}}}`,
|
|
55
|
+
}, pt = (C = "") => `{{${C}}}`, Mt = ({
|
|
55
56
|
content: C = "",
|
|
56
57
|
editMode: f = "codeEdit",
|
|
57
58
|
variables: T,
|
|
@@ -64,11 +65,11 @@ const Ve = [], Ce = (C, f) => {
|
|
|
64
65
|
toolbarActionsRight: Q,
|
|
65
66
|
onReady: be
|
|
66
67
|
}) => {
|
|
67
|
-
const { t: i, i18n: B } = ht(),
|
|
68
|
+
const { t: i, i18n: B } = ht(), F = mt(G || B.language);
|
|
68
69
|
b(() => {
|
|
69
|
-
B.language !==
|
|
70
|
-
}, [B,
|
|
71
|
-
const O =
|
|
70
|
+
B.language !== F && B.changeLanguage(F);
|
|
71
|
+
}, [B, F]);
|
|
72
|
+
const O = ut(F), d = L(
|
|
72
73
|
() => ({
|
|
73
74
|
image: i("toolbarInsertImage", {
|
|
74
75
|
defaultValue: "Insert image"
|
|
@@ -144,7 +145,7 @@ const Ve = [], Ce = (C, f) => {
|
|
|
144
145
|
});
|
|
145
146
|
}, [T, A]), [Y, w] = S(!1), [J, k] = S(!1), [xe, R] = S(null), [ne, K] = S(
|
|
146
147
|
U
|
|
147
|
-
), [
|
|
148
|
+
), [$, ve] = S(
|
|
148
149
|
A
|
|
149
150
|
);
|
|
150
151
|
b(() => {
|
|
@@ -154,7 +155,7 @@ const Ve = [], Ce = (C, f) => {
|
|
|
154
155
|
}, [A]);
|
|
155
156
|
const [I, E] = S(
|
|
156
157
|
m.Empty
|
|
157
|
-
), [c, z] = S(), s = ee(null),
|
|
158
|
+
), [c, z] = S(), s = ee(null), D = ee(null), H = ee(null), [X, re] = S(!1), g = a(() => {
|
|
158
159
|
re(!1), H.current = null;
|
|
159
160
|
}, []), we = a(
|
|
160
161
|
(e) => {
|
|
@@ -196,7 +197,7 @@ const Ve = [], Ce = (C, f) => {
|
|
|
196
197
|
if (!o.length)
|
|
197
198
|
return;
|
|
198
199
|
const r = new Set(
|
|
199
|
-
|
|
200
|
+
$.map((t) => t.name.toLowerCase())
|
|
200
201
|
);
|
|
201
202
|
K((t) => {
|
|
202
203
|
const u = new Set(
|
|
@@ -208,7 +209,7 @@ const Ve = [], Ce = (C, f) => {
|
|
|
208
209
|
}), p.length ? [...p, ...t] : t;
|
|
209
210
|
});
|
|
210
211
|
},
|
|
211
|
-
[f,
|
|
212
|
+
[f, $]
|
|
212
213
|
);
|
|
213
214
|
b(() => {
|
|
214
215
|
y(C);
|
|
@@ -435,7 +436,7 @@ const Ve = [], Ce = (C, f) => {
|
|
|
435
436
|
M(e.name, o, !0), k(!1), g();
|
|
436
437
|
},
|
|
437
438
|
[n, M, c, g]
|
|
438
|
-
), ue = a(() =>
|
|
439
|
+
), ue = a(() => $e({
|
|
439
440
|
override: [
|
|
440
441
|
nt(Z, {
|
|
441
442
|
// divider: currentStrings.slashDivider,
|
|
@@ -454,12 +455,12 @@ const Ve = [], Ce = (C, f) => {
|
|
|
454
455
|
Z
|
|
455
456
|
]), me = a(
|
|
456
457
|
(e) => {
|
|
457
|
-
if (s.current = e.view, f === "quickEdit" &&
|
|
458
|
+
if (s.current = e.view, f === "quickEdit" && D.current && e.selectionSet) {
|
|
458
459
|
const o = e.state.selection.main.head, r = e.state.doc.toString();
|
|
459
460
|
Ce(
|
|
460
461
|
r,
|
|
461
462
|
o
|
|
462
|
-
) || (y(r),
|
|
463
|
+
) || (y(r), D.current = null);
|
|
463
464
|
}
|
|
464
465
|
},
|
|
465
466
|
[y, f]
|
|
@@ -502,7 +503,7 @@ const Ve = [], Ce = (C, f) => {
|
|
|
502
503
|
const Re = L(() => {
|
|
503
504
|
const e = [
|
|
504
505
|
ge.lineWrapping,
|
|
505
|
-
|
|
506
|
+
De(),
|
|
506
507
|
He(qe),
|
|
507
508
|
ct
|
|
508
509
|
];
|
|
@@ -525,7 +526,7 @@ const Ve = [], Ce = (C, f) => {
|
|
|
525
526
|
Ce(
|
|
526
527
|
e,
|
|
527
528
|
o
|
|
528
|
-
) ?
|
|
529
|
+
) ? D.current = e : (D.current = null, y(e)), v?.(e);
|
|
529
530
|
},
|
|
530
531
|
[y, v, n]
|
|
531
532
|
), he = !n && X, P = L(
|
|
@@ -616,13 +617,13 @@ const Ve = [], Ce = (C, f) => {
|
|
|
616
617
|
onClose: g,
|
|
617
618
|
onSelect: ce,
|
|
618
619
|
variables: ne,
|
|
619
|
-
systemVariables:
|
|
620
|
+
systemVariables: $,
|
|
620
621
|
labels: Ie
|
|
621
622
|
}
|
|
622
623
|
),
|
|
623
624
|
/* @__PURE__ */ l.jsx("div", { className: "markdown-flow-editor-body relative overflow-auto", children: /* @__PURE__ */ l.jsxs(Je.Provider, { value: Ee, children: [
|
|
624
625
|
/* @__PURE__ */ l.jsx(
|
|
625
|
-
|
|
626
|
+
Fe,
|
|
626
627
|
{
|
|
627
628
|
extensions: Re,
|
|
628
629
|
basicSetup: {
|
|
@@ -671,7 +672,7 @@ const Ve = [], Ce = (C, f) => {
|
|
|
671
672
|
Ze,
|
|
672
673
|
{
|
|
673
674
|
variables: ne,
|
|
674
|
-
systemVariables:
|
|
675
|
+
systemVariables: $,
|
|
675
676
|
selectedName: c?.value?.variableName,
|
|
676
677
|
onSelect: ce,
|
|
677
678
|
onAddVariable: (e) => {
|
|
@@ -690,6 +691,6 @@ const Ve = [], Ce = (C, f) => {
|
|
|
690
691
|
);
|
|
691
692
|
};
|
|
692
693
|
export {
|
|
693
|
-
|
|
694
|
+
Mt as default
|
|
694
695
|
};
|
|
695
696
|
//# sourceMappingURL=MarkdownFlowEditor.es.js.map
|