@vervedoc/docx-editor-view 1.0.4
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/docx-editor-view.js +13237 -0
- package/dist/docx-editor-view.js.map +1 -0
- package/dist/docx-editor-view.umd.cjs +113 -0
- package/dist/docx-editor-view.umd.cjs.map +1 -0
- package/dist/index.d.ts +1509 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docx-editor-view.umd.cjs","sources":["../../docx-editor-schema/dist/docx-editor-schema.js","../src/plugin-stubs.ts","../src/event/handlers/paste.ts","../src/cursor/CursorAgent.ts","../src/cursor/Cursor.ts","../src/control/CheckboxControl.ts","../src/control/radio/RadioControl.ts","../src/event/handlers/mousedown.ts","../src/event/handlers/mouseup.ts","../src/event/handlers/mouseleave.ts","../src/event/handlers/mousemove.ts","../src/event/handlers/keydown/backspace.ts","../src/event/handlers/keydown/delete.ts","../src/event/handlers/keydown/enter.ts","../src/event/handlers/keydown/left.ts","../src/event/handlers/keydown/right.ts","../src/event/handlers/keydown/tab.ts","../src/event/handlers/keydown/updown.ts","../src/event/handlers/keydown/index.ts","../src/event/handlers/input.ts","../src/event/handlers/cut.ts","../src/event/handlers/copy.ts","../src/event/handlers/drop.ts","../src/event/handlers/contextmenu.ts","../src/event/handlers/click.ts","../src/event/handlers/composition.ts","../src/event/handlers/drag.ts","../src/event/CanvasEvent.ts","../src/event/GlobalEvent.ts","../src/position/Position.ts","../../docx-editor-state/dist/docx-editor-state.js","../src/frame/Background.ts","../src/utils/separator.ts","../src/richtext/AbstractRichText.ts","../src/richtext/Highlight.ts","../src/richtext/ParagraphColor.ts","../src/frame/Margin.ts","../src/interactive/Search.ts","../src/richtext/Strikeout.ts","../src/richtext/Underline.ts","../src/particle/ImageParticle.ts","../src/particle/TextParticle.ts","../src/frame/PageNumber.ts","../src/observer/ScrollObserver.ts","../src/observer/SelectionObserver.ts","../src/particle/table/TableParticle.ts","../src/particle/table/TableTool.ts","../src/particle/HyperlinkParticle.ts","../src/frame/Header.ts","../src/particle/SuperscriptParticle.ts","../src/particle/SubscriptParticle.ts","../src/particle/SeparatorParticle.ts","../src/particle/PageBreakParticle.ts","../src/frame/Watermark.ts","../src/control/ControlSearch.ts","../src/control/Border.ts","../src/control/SelectControl.ts","../src/control/TextControl.ts","../src/control/date/DateControl.ts","../src/control/NumberControl.ts","../src/control/Control.ts","../src/particle/CheckboxParticle.ts","../src/particle/RadioParticle.ts","../src/particle/previewer/Previewer.ts","../src/observer/ImageObserver.ts","../src/zone/ZoneTip.ts","../src/zone/Zone.ts","../src/frame/Footer.ts","../src/particle/ListSymbolDrawer.ts","../src/particle/ListParticle.ts","../src/particle/LineBreakParticle.ts","../src/frame/Placeholder.ts","../src/interactive/Group.ts","../src/observer/MouseObserver.ts","../src/frame/LineNumber.ts","../src/frame/PageBorder.ts","../src/particle/table/TableOperate.ts","../src/interactive/Area.ts","../src/frame/Badge.ts","../src/draw/Draw.ts","../src/interactive/FloatingBar.ts","../src/plugin/Plugin.ts","../src/plugin/override/Override.ts","../src/plugin/register/Register.ts"],"sourcesContent":["var Xu = /* @__PURE__ */ ((u) => (u.EDIT = \"edit\", u.READONLY = \"readonly\", u.FORM = \"form\", u))(Xu || {}), vu = /* @__PURE__ */ ((u) => (u.CONTAIN = \"contain\", u.COVER = \"cover\", u))(vu || {}), Iu = /* @__PURE__ */ ((u) => (u.REPEAT = \"repeat\", u.NO_REPEAT = \"no-repeat\", u.REPEAT_X = \"repeat-x\", u.REPEAT_Y = \"repeat-y\", u))(Iu || {}), K = /* @__PURE__ */ ((u) => (u.IFRAME = \"iframe\", u.VIDEO = \"video\", u.AUDIO = \"audio\", u.CHART = \"chart\", u))(K || {}), $ = /* @__PURE__ */ ((u) => (u.HALF = \"half\", u.ONE_THIRD = \"one-third\", u.QUARTER = \"quarter\", u))($ || {}), G = /* @__PURE__ */ ((u) => (u.ARABIC = \"arabic\", u.CHINESE = \"chinese\", u))(G || {}), Cu = /* @__PURE__ */ ((u) => (u.INLINE = \"inline\", u.BLOCK = \"block\", u.SURROUND = \"surround\", u.FLOAT_TOP = \"float-top\", u.FLOAT_BOTTOM = \"float-bottom\", u))(Cu || {}), su = /* @__PURE__ */ ((u) => (u.BEFORE = \"before\", u.AFTER = \"after\", u.OUTER_BEFORE = \"outer-before\", u.OUTER_AFTER = \"outer-after\", u))(su || {}), Mu = /* @__PURE__ */ ((u) => (u.ROW = \"row\", u.COLUMN = \"column\", u))(Mu || {}), Y = /* @__PURE__ */ ((u) => (u.TEXT = \"text\", u.SELECT = \"select\", u.CHECKBOX = \"checkbox\", u.RADIO = \"radio\", u.DATE = \"date\", u.NUMBER = \"number\", u))(Y || {}), m = /* @__PURE__ */ ((u) => (u.PREFIX = \"prefix\", u.POSTFIX = \"postfix\", u.PRE_TEXT = \"preText\", u.POST_TEXT = \"postText\", u.PLACEHOLDER = \"placeholder\", u.VALUE = \"value\", u.CHECKBOX = \"checkbox\", u.RADIO = \"radio\", u))(m || {}), zu = /* @__PURE__ */ ((u) => (u.ROW_START = \"rowStart\", u.VALUE_START = \"valueStart\", u))(zu || {}), Wu = /* @__PURE__ */ ((u) => (u.ACTIVE = \"active\", u.INACTIVE = \"inactive\", u))(Wu || {}), ju = /* @__PURE__ */ ((u) => (u.COMPONENT = \"component\", u.MENU = \"menu\", u.MAIN = \"main\", u.FOOTER = \"footer\", u.CONTEXTMENU = \"contextmenu\", u.POPUP = \"popup\", u.CATALOG = \"catalog\", u.COMMENT = \"comment\", u))(ju || {}), Vu = /* @__PURE__ */ ((u) => (u.PAGE = \"page\", u.TABLE = \"table\", u))(Vu || {}), fu = /* @__PURE__ */ ((u) => (u.EDIT = \"edit\", u.CLEAN = \"clean\", u.READONLY = \"readonly\", u.FORM = \"form\", u.PRINT = \"print\", u.DESIGN = \"design\", u))(fu || {}), Yu = /* @__PURE__ */ ((u) => (u.HEADER = \"header\", u.MAIN = \"main\", u.FOOTER = \"footer\", u))(Yu || {}), Ou = /* @__PURE__ */ ((u) => (u.PAGING = \"paging\", u.CONTINUITY = \"continuity\", u))(Ou || {}), Lu = /* @__PURE__ */ ((u) => (u.VERTICAL = \"vertical\", u.HORIZONTAL = \"horizontal\", u))(Lu || {}), Ru = /* @__PURE__ */ ((u) => (u.BREAK_ALL = \"break-all\", u.BREAK_WORD = \"break-word\", u))(Ru || {}), bu = /* @__PURE__ */ ((u) => (u.SPEED = \"speed\", u.COMPATIBILITY = \"compatibility\", u))(bu || {}), f = /* @__PURE__ */ ((u) => (u.TEXT = \"text\", u.IMAGE = \"image\", u.TABLE = \"table\", u.HYPERLINK = \"hyperlink\", u.SUPERSCRIPT = \"superscript\", u.SUBSCRIPT = \"subscript\", u.SEPARATOR = \"separator\", u.PAGE_BREAK = \"pageBreak\", u.CONTROL = \"control\", u.AREA = \"area\", u.CHECKBOX = \"checkbox\", u.RADIO = \"radio\", u.LATEX = \"latex\", u.TAB = \"tab\", u.DATE = \"date\", u.BLOCK = \"block\", u.TITLE = \"title\", u.LIST = \"list\", u.PLACEHOLDER = \"placeholder\", u.FOOTNOTE_MARK = \"footnoteMark\", u.FOOTNOTE_CONTENT = \"footnoteContent\", u.FOOTNOTE_SEPARATOR = \"footnoteSeparator\", u.COLUMN_BREAK = \"columnBreak\", u.REVISION_INSERT = \"revisionInsert\", u.REVISION_DELETE = \"revisionDelete\", u))(f || {}), $u = /* @__PURE__ */ ((u) => (u.font = \"font\", u.size = \"size\", u.characterScale = \"characterScale\", u.width = \"width\", u.height = \"height\", u.bold = \"bold\", u.color = \"color\", u.highlight = \"highlight\", u.italic = \"italic\", u.underline = \"underline\", u.strikeout = \"strikeout\", u))($u || {}), Zu = /* @__PURE__ */ ((u) => (u[u.LEFT = 0] = \"LEFT\", u[u.CENTER = 1] = \"CENTER\", u[u.RIGHT = 2] = \"RIGHT\", u))(Zu || {}), qu = /* @__PURE__ */ ((u) => (u.Delete = \"Delete\", u.Backspace = \"Backspace\", u.Enter = \"Enter\", u.Left = \"ArrowLeft\", u.Right = \"ArrowRight\", u.Up = \"ArrowUp\", u.Down = \"ArrowDown\", u.ESC = \"Escape\", u.TAB = \"Tab\", u.META = \"Meta\", u.LEFT_BRACKET = \"[\", u.RIGHT_BRACKET = \"]\", u.COMMA = \",\", u.PERIOD = \".\", u.LEFT_ANGLE_BRACKET = \"<\", u.RIGHT_ANGLE_BRACKET = \">\", u.EQUAL = \"=\", u.MINUS = \"-\", u.PLUS = \"+\", u.BACKSLASH = \"\\\\\", u.A = \"a\", u.B = \"b\", u.C = \"c\", u.D = \"d\", u.E = \"e\", u.F = \"f\", u.G = \"g\", u.H = \"h\", u.I = \"i\", u.J = \"j\", u.K = \"k\", u.L = \"l\", u.M = \"m\", u.N = \"n\", u.O = \"o\", u.P = \"p\", u.Q = \"q\", u.R = \"r\", u.S = \"s\", u.T = \"t\", u.U = \"u\", u.V = \"v\", u.W = \"w\", u.X = \"x\", u.Y = \"y\", u.Z = \"z\", u.A_UPPERCASE = \"A\", u.B_UPPERCASE = \"B\", u.C_UPPERCASE = \"C\", u.D_UPPERCASE = \"D\", u.E_UPPERCASE = \"E\", u.F_UPPERCASE = \"F\", u.G_UPPERCASE = \"G\", u.H_UPPERCASE = \"H\", u.I_UPPERCASE = \"I\", u.J_UPPERCASE = \"J\", u.K_UPPERCASE = \"K\", u.L_UPPERCASE = \"L\", u.M_UPPERCASE = \"M\", u.N_UPPERCASE = \"N\", u.O_UPPERCASE = \"O\", u.P_UPPERCASE = \"P\", u.Q_UPPERCASE = \"Q\", u.R_UPPERCASE = \"R\", u.S_UPPERCASE = \"S\", u.T_UPPERCASE = \"T\", u.U_UPPERCASE = \"U\", u.V_UPPERCASE = \"V\", u.W_UPPERCASE = \"W\", u.X_UPPERCASE = \"X\", u.Y_UPPERCASE = \"Y\", u.Z_UPPERCASE = \"Z\", u.ZERO = \"0\", u.ONE = \"1\", u.TWO = \"2\", u.THREE = \"3\", u.FOUR = \"4\", u.FIVE = \"5\", u.SIX = \"6\", u.SEVEN = \"7\", u.EIGHT = \"8\", u.NINE = \"9\", u))(qu || {}), mu = /* @__PURE__ */ ((u) => (u.PAGE = \"page\", u.CONTINUITY = \"continuity\", u))(mu || {}), q = /* @__PURE__ */ ((u) => (u.UL = \"ul\", u.OL = \"ol\", u))(q || {}), b = /* @__PURE__ */ ((u) => (u.DISC = \"disc\", u.CIRCLE = \"circle\", u.SQUARE = \"square\", u.CHECKBOX = \"checkbox\", u.DIAMOND = \"diamond\", u.DASH = \"dash\", u.CHECK = \"check\", u.TRIANGLE = \"triangle\", u.STAR = \"star\", u.ARROW = \"arrow\", u.DIAMOND_SOLID = \"diamond-solid\", u.ANGLE = \"angle\", u.HOLLOW_CIRCLE = \"hollow-circle\", u.HOLLOW_SQUARE = \"hollow-square\", u.HEART_HOLLOW = \"heart-hollow\", u.HASH = \"hash\", u.TRIANGLE_SOLID = \"triangle-solid\", u.STAR_SOLID = \"star-solid\", u.HEART_SOLID = \"heart-solid\", u.FLOWER = \"flower\", u.ASTERISK = \"asterisk\", u.HOLLOW_DIAMOND = \"hollow-diamond\", u.HOLLOW_TRIANGLE = \"hollow-triangle\", u))(b || {}), Qu = /* @__PURE__ */ ((u) => (u.DECIMAL = \"decimal\", u.DECIMAL_DOT = \"decimal-dot\", u.DECIMAL_PAREN = \"decimal-paren\", u.DECIMAL_CIRCLE = \"decimal-circle\", u.DECIMAL_BRACKET = \"decimal-bracket\", u.CHINESE = \"chinese\", u.CHINESE_BRACKET = \"chinese-bracket\", u.UPPER_ALPHA = \"upper-alpha\", u.LOWER_ALPHA_DOT = \"lower-alpha-dot\", u))(Qu || {}), N = /* @__PURE__ */ ((u) => (u.DISC = \"disc\", u.CIRCLE = \"circle\", u.SQUARE = \"square\", u.CHECKBOX = \"checkbox\", u.DIAMOND = \"diamond\", u.DASH = \"dash\", u.CHECK = \"check\", u.DECIMAL = \"decimal\", u.DECIMAL_DOT = \"decimal-dot\", u.DECIMAL_PAREN = \"decimal-paren\", u.DECIMAL_CIRCLE = \"decimal-circle\", u.DECIMAL_BRACKET = \"decimal-bracket\", u.CHINESE = \"chinese\", u.CHINESE_BRACKET = \"chinese-bracket\", u.UPPER_ALPHA = \"upper-alpha\", u.LOWER_ALPHA_DOT = \"lower-alpha-dot\", u))(N || {}), Ju = /* @__PURE__ */ ((u) => (u.UP = \"top\", u.DOWN = \"down\", u.LEFT = \"left\", u.RIGHT = \"right\", u))(Ju || {}), P = /* @__PURE__ */ ((u) => (u.LEFT = \"left\", u.CENTER = \"center\", u.RIGHT = \"right\", u.ALIGNMENT = \"alignment\", u.JUSTIFY = \"justify\", u))(P || {}), Ku = /* @__PURE__ */ ((u) => (u.SOLID = \"solid\", u.DOUBLE = \"double\", u.DASHED = \"dashed\", u.DOTTED = \"dotted\", u.WAVY = \"wavy\", u))(Ku || {}), ue = /* @__PURE__ */ ((u) => (u.SOLID = \"solid\", u.DASHED = \"dashed\", u.DOTTED = \"dotted\", u))(ue || {}), S = /* @__PURE__ */ ((u) => (u.FIRST = \"first\", u.SECOND = \"second\", u.THIRD = \"third\", u.FOURTH = \"fourth\", u.FIFTH = \"fifth\", u.SIXTH = \"sixth\", u))(S || {}), du = /* @__PURE__ */ ((u) => (u.TOP = \"top\", u.MIDDLE = \"middle\", u.BOTTOM = \"bottom\", u))(du || {}), Su = /* @__PURE__ */ ((u) => (u.TEXT = \"text\", u.IMAGE = \"image\", u))(Su || {}), tu = /* @__PURE__ */ ((u) => (u.ALL = \"all\", u.EMPTY = \"empty\", u.EXTERNAL = \"external\", u.INTERNAL = \"internal\", u.DASH = \"dash\", u))(tu || {}), J = /* @__PURE__ */ ((u) => (u.TOP = \"top\", u.RIGHT = \"right\", u.BOTTOM = \"bottom\", u.LEFT = \"left\", u))(J || {}), ee = /* @__PURE__ */ ((u) => (u.FORWARD = \"forward\", u.BACK = \"back\", u))(ee || {}), te = /* @__PURE__ */ ((u) => (u.ROW = \"row\", u.COL = \"col\", u))(te || {});\nconst De = \"1.0.0\", re = {\n version: De\n}, vt = \"1.0.0\", It = String(re.version), Ot = \"editor-component\", ne = \"ce\", Lt = `${ne}-clipboard`, lu = {\n print: {\n imagePreviewerDisabled: !1\n },\n readonly: {\n imagePreviewerDisabled: !1\n },\n form: {\n controlDeletableDisabled: !1\n }\n}, H = \"\", Rt = `\n`, bt = \"\t\", mt = \" \", Au = \" \", St = [\n \"·\",\n \"、\",\n \":\",\n \":\",\n \",\",\n \",\",\n \".\",\n \"。\",\n \";\",\n \";\",\n \"?\",\n \"?\",\n \"!\",\n \"!\"\n], Nt = {\n [$.HALF]: 1 / 2,\n [$.ONE_THIRD]: 1 / 3,\n [$.QUARTER]: 1 / 4\n}, le = {\n ENGLISH: \"A-Za-z\",\n SPANISH: \"A-Za-zÁÉÍÓÚáéíóúÑñÜü\",\n FRENCH: \"A-Za-zÀÂÇàâçÉéÈèÊêËëÎîÏïÔôÙùÛûŸÿ\",\n GERMAN: \"A-Za-zÄäÖöÜüß\",\n RUSSIAN: \"А-Яа-яЁё\",\n PORTUGUESE: \"A-Za-zÁÉÍÓÚáéíóúÃÕãõÇç\",\n ITALIAN: \"A-Za-zÀàÈèÉéÌìÍíÎîÓóÒòÙù\",\n DUTCH: \"A-Za-zÀàÁáÂâÄäÈèÉéÊêËëÌìÍíÎîÏïÓóÒòÔôÖöÙùÛûÜü\",\n SWEDISH: \"A-Za-zÅåÄäÖö\",\n GREEK: \"ΑαΒβΓγΔδΕεΖζΗηΘθΙιΚκΛλΜμΝνΞξΟοΠπΡρΣσςΤτΥυΦφΧχΨψΩω\"\n}, yt = \"日\", Pt = [\n \"bold\",\n \"color\",\n \"highlight\",\n \"font\",\n \"size\",\n \"characterScale\",\n \"italic\",\n \"underline\",\n \"strikeout\",\n \"textDecoration\"\n], uu = [\n \"rowFlex\",\n \"rowMargin\",\n \"paragraphColor\",\n \"paragraphIndentLeft\",\n \"paragraphFirstLineIndent\",\n \"paragraphSpacingBefore\",\n \"paragraphSpacingAfter\"\n], Ht = [\n \"type\",\n \"font\",\n \"size\",\n \"characterScale\",\n \"bold\",\n \"color\",\n \"italic\",\n \"highlight\",\n \"paragraphColor\",\n \"underline\",\n \"strikeout\",\n \"rowFlex\",\n \"url\",\n \"areaId\",\n \"hyperlinkId\",\n \"dateId\",\n \"dateFormat\",\n \"groupIds\",\n \"rowMargin\",\n \"textDecoration\",\n \"dashArray\",\n \"separatorType\",\n \"separatorLineWidth\",\n \"revisionId\",\n \"revisionType\",\n \"revisionAuthor\",\n \"revisionDate\"\n], oe = [\n \"type\",\n \"font\",\n \"size\",\n \"characterScale\",\n \"bold\",\n \"color\",\n \"italic\",\n \"highlight\",\n \"paragraphColor\",\n \"underline\",\n \"strikeout\",\n \"rowFlex\",\n \"rowMargin\",\n \"dashArray\",\n \"separatorType\",\n \"separatorLineWidth\",\n \"trList\",\n \"tableToolDisabled\",\n \"borderType\",\n \"borderColor\",\n \"borderWidth\",\n \"borderExternalWidth\",\n \"width\",\n \"height\",\n \"url\",\n \"colgroup\",\n \"valueList\",\n \"control\",\n \"checkbox\",\n \"radio\",\n \"dateFormat\",\n \"block\",\n \"level\",\n \"title\",\n \"listType\",\n \"listStyle\",\n \"listWrap\",\n \"groupIds\",\n \"conceptId\",\n \"imgDisplay\",\n \"imgFloatPosition\",\n \"imgToolDisabled\",\n \"textDecoration\",\n \"extension\",\n \"externalId\",\n \"areaId\",\n \"area\",\n \"paragraphIndentLeft\",\n \"paragraphFirstLineIndent\",\n \"paragraphSpacingBefore\",\n \"paragraphSpacingAfter\",\n \"revisionId\",\n \"revisionType\",\n \"revisionAuthor\",\n \"revisionDate\"\n], ie = [\n \"conceptId\",\n \"extension\",\n \"externalId\",\n \"verticalAlign\",\n \"backgroundColor\",\n \"borderTypes\",\n \"borderStyle\",\n \"slashTypes\",\n \"disabled\",\n \"deletable\"\n], Nu = [\n \"tdId\",\n \"trId\",\n \"tableId\"\n], yu = [\n \"level\",\n \"titleId\",\n \"title\"\n], ae = [\n \"listId\",\n \"listType\",\n \"listStyle\"\n], wt = [\n \"control\",\n \"controlId\",\n \"controlComponent\"\n], Pu = [\n \"font\",\n \"size\",\n \"bold\",\n \"highlight\",\n \"italic\",\n \"strikeout\"\n], Hu = [\"areaId\", \"area\"], wu = [\n ...Nu,\n ...yu,\n ...ae,\n ...Hu\n], nu = [\n f.TEXT,\n f.HYPERLINK,\n f.SUBSCRIPT,\n f.SUPERSCRIPT,\n f.CONTROL,\n f.DATE,\n f.PLACEHOLDER\n], _t = [\n f.IMAGE,\n f.LATEX\n], ce = [\n f.BLOCK,\n f.PAGE_BREAK,\n f.SEPARATOR,\n f.TABLE\n], se = [\"HR\", \"TABLE\", \"UL\", \"OL\"], kt = [\n f.TITLE,\n f.LIST\n], xt = 12, Fe = {\n width: 1,\n color: \"#000000\",\n dragWidth: 2,\n dragColor: \"#0000FF\",\n dragFloatImageDisabled: !1\n}, Ut = {\n PAGE_SCALE: \"pageScale\"\n}, Ee = {\n PAGE_NO: \"{pageNo}\",\n PAGE_COUNT: \"{pageCount}\"\n}, Ce = {\n bottom: 60,\n size: 12,\n font: \"Microsoft YaHei\",\n color: \"#000000\",\n rowFlex: P.CENTER,\n format: Ee.PAGE_NO,\n numberType: G.ARABIC,\n disabled: !1,\n startPageNo: 1,\n fromPageNo: 0,\n maxPageNo: null\n}, Gt = [\n { value: \"{pageNo}\", label: \"1, 2, 3 ...\", numberType: G.ARABIC },\n { value: \"- {pageNo} -\", label: \"- 1 -, - 2 -, - 3 - ...\", numberType: G.ARABIC },\n { value: \"— {pageNo} —\", label: \"— 1 —, — 2 —, — 3 — ...\", numberType: G.ARABIC },\n { value: \"第 {pageNo} 页\", label: \"第 1 页\", numberType: G.ARABIC },\n { value: \"第 {pageNo} 页 共 {pageCount} 页\", label: \"第 1 页 共 X 页\", numberType: G.ARABIC },\n { value: \"{pageNo} / {pageCount}\", label: \"1 / X\", numberType: G.ARABIC },\n { value: \"{pageNo} of {pageCount}\", label: \"1 of X\", numberType: G.ARABIC },\n { value: \"第{pageNo}页\", label: \"第一页\", numberType: G.CHINESE },\n { value: \"第{pageNo}页 共 {pageCount} 页\", label: \"第一页 共 X 页\", numberType: G.CHINESE },\n { value: \"{pageNo}\", label: \"I, II, III ...\", numberType: \"roman-upper\" },\n { value: \"{pageNo}\", label: \"i, ii, iii ...\", numberType: \"roman-lower\" },\n { value: \"{pageNo}\", label: \"①, ②, ③ ...\", numberType: \"circled-number\" },\n { value: \"{pageNo}\", label: \"一, 二, 三 ...\", numberType: \"chinese-number\" },\n { value: \"{pageNo}\", label: \"壹, 贰, 叁 ...\", numberType: \"chinese-formal-number\" },\n { value: \"{pageNo}\", label: \"A, B, C ...\", numberType: \"alphabet-upper\" },\n { value: \"{pageNo}\", label: \"a, b, c ...\", numberType: \"alphabet-lower\" }\n], Xt = [\n { label: \"宋体\", value: \"SimSun, serif\" },\n { label: \"楷体\", value: \"KaiTi, serif\" },\n { label: \"仿宋\", value: \"FangSong, serif\" },\n { label: \"黑体\", value: \"SimHei, sans-serif\" },\n { label: \"微软雅黑\", value: \"Microsoft YaHei, sans-serif\" },\n { label: \"微软正黑体\", value: \"Microsoft JhengHei, sans-serif\" },\n { label: \"华文新魏\", value: \"STXinwei, serif\" },\n { label: \"思源黑体\", value: \"Source Han Sans CN, sans-serif\" },\n { label: \"思源宋体\", value: \"Source Han Serif CN, serif\" },\n { label: \"Arial\", value: \"Arial, sans-serif\" },\n { label: \"Times New Roman\", value: \"Times New Roman, serif\" },\n { label: \"Segoe UI\", value: \"Segoe UI, sans-serif\" },\n { label: \"Courier New\", value: \"Courier New, monospace\" }\n], Mt = [\n { label: \"初号\", value: 42 },\n { label: \"小初\", value: 36 },\n { label: \"一号\", value: 26 },\n { label: \"小一\", value: 24 },\n { label: \"二号\", value: 22 },\n { label: \"小二\", value: 18 },\n { label: \"三号\", value: 16 },\n { label: \"小三\", value: 15 },\n { label: \"四号\", value: 14 },\n { label: \"小四\", value: 12 },\n { label: \"五号\", value: 10.5 },\n { label: \"小五\", value: 9 },\n { label: \"六号\", value: 7.5 },\n { label: \"小六\", value: 6.5 },\n { label: \"七号\", value: 5.5 },\n { label: \"八号\", value: 5 },\n { label: \"5\", value: 5 },\n { label: \"5.5\", value: 5.5 },\n { label: \"6\", value: 6 },\n { label: \"6.5\", value: 6.5 },\n { label: \"7\", value: 7 },\n { label: \"7.5\", value: 7.5 },\n { label: \"8\", value: 8 },\n { label: \"9\", value: 9 },\n { label: \"10\", value: 10 },\n { label: \"10.5\", value: 10.5 },\n { label: \"11\", value: 11 },\n { label: \"12\", value: 12 },\n { label: \"14\", value: 14 },\n { label: \"16\", value: 16 },\n { label: \"18\", value: 18 },\n { label: \"20\", value: 20 },\n { label: \"22\", value: 22 },\n { label: \"24\", value: 24 },\n { label: \"26\", value: 26 },\n { label: \"28\", value: 28 },\n { label: \"36\", value: 36 },\n { label: \"48\", value: 48 },\n { label: \"72\", value: 72 }\n], zt = /[0-9.]/, fe = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/, de = /[#*0-9]\\uFE0F?\\u20E3|[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB\\u25FC\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692\\u2694-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A7\\u26AA\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C8\\u26CF\\u26D1\\u26E9\\u26F0-\\u26F5\\u26F7\\u26F8\\u26FA\\u2702\\u2708\\u2709\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u27A1\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B55\\u3030\\u303D\\u3297\\u3299]\\uFE0F?|[\\u261D\\u270C\\u270D](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?|[\\u270A\\u270B](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u2693\\u26A1\\u26AB\\u26C5\\u26CE\\u26D4\\u26EA\\u26FD\\u2705\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2795-\\u2797\\u27B0\\u27BF\\u2B50]|\\u26D3\\uFE0F?(?:\\u200D\\uD83D\\uDCA5)?|\\u26F9(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\u2764\\uFE0F?(?:\\u200D(?:\\uD83D\\uDD25|\\uD83E\\uDE79))?|\\uD83C(?:[\\uDC04\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDE02\\uDE37\\uDF21\\uDF24-\\uDF2C\\uDF36\\uDF7D\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E\\uDF9F\\uDFCD\\uDFCE\\uDFD4-\\uDFDF\\uDFF5\\uDFF7]\\uFE0F?|[\\uDF85\\uDFC2\\uDFC7](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDFC4\\uDFCA](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDFCB\\uDFCC](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF43\\uDF45-\\uDF4A\\uDF4C-\\uDF7C\\uDF7E-\\uDF84\\uDF86-\\uDF93\\uDFA0-\\uDFC1\\uDFC5\\uDFC6\\uDFC8\\uDFC9\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF8-\\uDFFF]|\\uDDE6\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF]|\\uDDE7\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF]|\\uDDE8\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF]|\\uDDE9\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF]|\\uDDEA\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA]|\\uDDEB\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7]|\\uDDEC\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE]|\\uDDED\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA]|\\uDDEE\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9]|\\uDDEF\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5]|\\uDDF0\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF]|\\uDDF1\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE]|\\uDDF2\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF]|\\uDDF3\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF]|\\uDDF4\\uD83C\\uDDF2|\\uDDF5\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE]|\\uDDF6\\uD83C\\uDDE6|\\uDDF7\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC]|\\uDDF8\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF]|\\uDDF9\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF]|\\uDDFA\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF]|\\uDDFB\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA]|\\uDDFC\\uD83C[\\uDDEB\\uDDF8]|\\uDDFD\\uD83C\\uDDF0|\\uDDFE\\uD83C[\\uDDEA\\uDDF9]|\\uDDFF\\uD83C[\\uDDE6\\uDDF2\\uDDFC]|\\uDF44(?:\\u200D\\uD83D\\uDFEB)?|\\uDF4B(?:\\u200D\\uD83D\\uDFE9)?|\\uDFC3(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDFF3\\uFE0F?(?:\\u200D(?:\\u26A7\\uFE0F?|\\uD83C\\uDF08))?|\\uDFF4(?:\\u200D\\u2620\\uFE0F?|\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40(?:\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F)?)|\\uD83D(?:[\\uDC3F\\uDCFD\\uDD49\\uDD4A\\uDD6F\\uDD70\\uDD73\\uDD76-\\uDD79\\uDD87\\uDD8A-\\uDD8D\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA\\uDECB\\uDECD-\\uDECF\\uDEE0-\\uDEE5\\uDEE9\\uDEF0\\uDEF3]\\uFE0F?|[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4\\uDEB5](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD74\\uDD90](?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC00-\\uDC07\\uDC09-\\uDC14\\uDC16-\\uDC25\\uDC27-\\uDC3A\\uDC3C-\\uDC3E\\uDC40\\uDC44\\uDC45\\uDC51-\\uDC65\\uDC6A\\uDC79-\\uDC7B\\uDC7D-\\uDC80\\uDC84\\uDC88-\\uDC8E\\uDC90\\uDC92-\\uDCA9\\uDCAB-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDDA4\\uDDFB-\\uDE2D\\uDE2F-\\uDE34\\uDE37-\\uDE41\\uDE43\\uDE44\\uDE48-\\uDE4A\\uDE80-\\uDEA2\\uDEA4-\\uDEB3\\uDEB7-\\uDEBF\\uDEC1-\\uDEC5\\uDED0-\\uDED2\\uDED5-\\uDED7\\uDEDC-\\uDEDF\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB\\uDFF0]|\\uDC08(?:\\u200D\\u2B1B)?|\\uDC15(?:\\u200D\\uD83E\\uDDBA)?|\\uDC26(?:\\u200D(?:\\u2B1B|\\uD83D\\uDD25))?|\\uDC3B(?:\\u200D\\u2744\\uFE0F?)?|\\uDC41\\uFE0F?(?:\\u200D\\uD83D\\uDDE8\\uFE0F?)?|\\uDC68(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDC68\\uDC69]\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDC69(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?[\\uDC68\\uDC69]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?|\\uDC69\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?))|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDC6F(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDD75(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDE2E(?:\\u200D\\uD83D\\uDCA8)?|\\uDE35(?:\\u200D\\uD83D\\uDCAB)?|\\uDE36(?:\\u200D\\uD83C\\uDF2B\\uFE0F?)?|\\uDE42(?:\\u200D[\\u2194\\u2195]\\uFE0F?)?|\\uDEB6(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?)|\\uD83E(?:[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5\\uDEC3-\\uDEC5\\uDEF0\\uDEF2-\\uDEF8](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD\\uDDCF\\uDDD4\\uDDD6-\\uDDDD](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDDDE\\uDDDF](?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD0D\\uDD0E\\uDD10-\\uDD17\\uDD20-\\uDD25\\uDD27-\\uDD2F\\uDD3A\\uDD3F-\\uDD45\\uDD47-\\uDD76\\uDD78-\\uDDB4\\uDDB7\\uDDBA\\uDDBC-\\uDDCC\\uDDD0\\uDDE0-\\uDDFF\\uDE70-\\uDE7C\\uDE80-\\uDE88\\uDE90-\\uDEBD\\uDEBF-\\uDEC2\\uDECE-\\uDEDB\\uDEE0-\\uDEE8]|\\uDD3C(?:\\u200D[\\u2640\\u2642]\\uFE0F?|\\uD83C[\\uDFFB-\\uDFFF])?|\\uDDCE(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDDD1(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1|\\uDDD1\\u200D\\uD83E\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?|\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?))?|\\uDEF1(?:\\uD83C(?:\\uDFFB(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFC-\\uDFFF])?|\\uDFFC(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])?|\\uDFFD(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])?|\\uDFFE(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])?|\\uDFFF(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFE])?))?)/g, pe = new RegExp(\n `${de.source}|${fe.source}`,\n \"g\"\n), Wt = /[、,。?!;:……「」“”‘’*()【】〔〕〖〗〘〙〚〛《》———﹝﹞–—\\\\/·.,!?;:`~<>()[\\]{}'\"|]/, pu = new RegExp(`^[${H}\n]`), Ae = {\n data: \"\",\n type: Su.TEXT,\n width: 0,\n height: 0,\n color: \"#AEB5C0\",\n opacity: 0.3,\n size: 200,\n font: \"Microsoft YaHei\",\n repeat: !1,\n gap: [10, 10],\n numberType: G.ARABIC\n}, he = {\n defaultFirstSize: 21,\n defaultSecondSize: 19,\n defaultThirdSize: 16,\n defaultFourthSize: 14,\n defaultFifthSize: 12,\n defaultSixthSize: 10\n}, ge = {\n [S.FIRST]: \"defaultFirstSize\",\n [S.SECOND]: \"defaultSecondSize\",\n [S.THIRD]: \"defaultThirdSize\",\n [S.FOURTH]: \"defaultFourthSize\",\n [S.FIFTH]: \"defaultFifthSize\",\n [S.SIXTH]: \"defaultSixthSize\"\n}, Fu = {\n [S.FIRST]: 1,\n [S.SECOND]: 2,\n [S.THIRD]: 3,\n [S.FOURTH]: 4,\n [S.FIFTH]: 5,\n [S.SIXTH]: 6\n}, Te = {\n H1: S.FIRST,\n H2: S.SECOND,\n H3: S.THIRD,\n H4: S.FOURTH,\n H5: S.FIFTH,\n H6: S.SIXTH\n}, Be = {\n [b.DISC]: \"•\",\n [b.CIRCLE]: \"◦\",\n [b.SQUARE]: \"▫︎\",\n [b.CHECKBOX]: \"☑️\",\n [b.DIAMOND]: \"◆\",\n [b.DASH]: \"—\",\n [b.CHECK]: \"✓\",\n [b.TRIANGLE]: \"▶\",\n [b.STAR]: \"★\",\n [b.ARROW]: \"▸\",\n [b.DIAMOND_SOLID]: \"♦\",\n [b.ANGLE]: \">\",\n [b.HOLLOW_CIRCLE]: \"○\",\n [b.HOLLOW_SQUARE]: \"□\",\n [b.HEART_HOLLOW]: \"♡\",\n [b.HASH]: \"#\",\n [b.TRIANGLE_SOLID]: \"▲\",\n [b.STAR_SOLID]: \"☆\",\n [b.HEART_SOLID]: \"♥\",\n [b.FLOWER]: \"✿\",\n [b.ASTERISK]: \"*\",\n [b.HOLLOW_DIAMOND]: \"◇\",\n [b.HOLLOW_TRIANGLE]: \"▷\"\n}, ve = {\n [q.OL]: \"ol\",\n [q.UL]: \"ul\"\n}, Ie = {\n [N.DISC]: \"disc\",\n [N.CIRCLE]: \"circle\",\n [N.SQUARE]: \"square\",\n [N.DECIMAL]: \"decimal\",\n [N.DECIMAL_DOT]: \"decimal\",\n [N.DECIMAL_PAREN]: \"decimal\",\n [N.DECIMAL_CIRCLE]: \"decimal\",\n [N.DECIMAL_BRACKET]: \"decimal\",\n [N.CHINESE]: \"decimal\",\n [N.CHINESE_BRACKET]: \"decimal\",\n [N.UPPER_ALPHA]: \"upper-alpha\",\n [N.LOWER_ALPHA_DOT]: \"lower-alpha\",\n [N.CHECKBOX]: \"checkbox\",\n [N.DIAMOND]: \"disc\",\n [N.DASH]: \"disc\",\n [N.CHECK]: \"disc\"\n}, Oe = {\n data: \"\",\n color: \"#DCDFE6\",\n opacity: 1,\n size: 16,\n font: \"Microsoft YaHei\"\n}, Le = {\n color: \"#FFFFFF\",\n image: \"\",\n size: vu.COVER,\n repeat: Iu.NO_REPEAT,\n applyPageNumbers: []\n}, Re = {\n top: 0,\n left: 5\n}, be = {\n width: 14,\n height: 14,\n gap: 5,\n lineWidth: 1,\n fillStyle: \"#5175f4\",\n strokeStyle: \"#ffffff\",\n verticalAlign: du.BOTTOM\n}, me = {\n placeholderColor: \"#9c9b9b\",\n bracketColor: \"#000000\",\n prefix: \"{\",\n postfix: \"}\",\n borderWidth: 1,\n borderColor: \"#000000\",\n activeBackgroundColor: \"\",\n disabledBackgroundColor: \"\",\n existValueBackgroundColor: \"\",\n noValueBackgroundColor: \"\"\n}, Se = {\n bottom: 30,\n inactiveAlpha: 1,\n maxHeightRadio: $.HALF,\n disabled: !1,\n editable: !0\n}, Ne = {\n opacity: 0.35,\n backgroundColor: \"#F8C4C4\",\n activeOpacity: 0.35,\n activeBackgroundColor: \"#F8C4C4\",\n disabled: !1,\n deletable: !0\n}, ye = {\n top: 30,\n inactiveAlpha: 1,\n maxHeightRadio: $.HALF,\n disabled: !1,\n editable: !0\n}, Pe = {\n disabled: !0,\n color: \"#CCCCCC\",\n lineWidth: 1.5\n}, He = {\n color: \"#000000\",\n lineWidth: 1,\n padding: [0, 5, 0, 5],\n disabled: !0\n}, we = {\n font: \"Microsoft YaHei\",\n fontSize: 12,\n lineDash: [3, 1],\n disabled: !0\n}, _e = {\n width: 14,\n height: 14,\n gap: 5,\n lineWidth: 1,\n fillStyle: \"#5175f4\",\n strokeStyle: \"#000000\",\n verticalAlign: du.BOTTOM\n}, ke = {\n lineWidth: 1,\n strokeStyle: \"#000000\"\n}, xe = {\n tdPadding: [0, 0, 0, 0],\n defaultTrHeight: 6,\n defaultTrMinHeight: 6,\n defaultColMinWidth: 40,\n defaultBorderColor: \"#000000\"\n}, Ue = {\n size: 12,\n font: \"Microsoft YaHei\",\n color: \"#000000\",\n disabled: !0,\n right: 20,\n type: mu.CONTINUITY\n}, Ge = {\n tipDisabled: !0\n};\nfunction _u(u) {\n return u && u.__esModule && Object.prototype.hasOwnProperty.call(u, \"default\") ? u.default : u;\n}\nvar Xe = function u(e, n) {\n if (e === n) return !0;\n if (e && n && typeof e == \"object\" && typeof n == \"object\") {\n if (e.constructor !== n.constructor) return !1;\n var r, o, c;\n if (Array.isArray(e)) {\n if (r = e.length, r != n.length) return !1;\n for (o = r; o-- !== 0; )\n if (!u(e[o], n[o])) return !1;\n return !0;\n }\n if (e.constructor === RegExp) return e.source === n.source && e.flags === n.flags;\n if (e.valueOf !== Object.prototype.valueOf) return e.valueOf() === n.valueOf();\n if (e.toString !== Object.prototype.toString) return e.toString() === n.toString();\n if (c = Object.keys(e), r = c.length, r !== Object.keys(n).length) return !1;\n for (o = r; o-- !== 0; )\n if (!Object.prototype.hasOwnProperty.call(n, c[o])) return !1;\n for (o = r; o-- !== 0; ) {\n var l = c[o];\n if (!u(e[l], n[l])) return !1;\n }\n return !0;\n }\n return e !== e && n !== n;\n};\nconst Me = /* @__PURE__ */ _u(Xe);\nvar ze = We;\nfunction Z(u) {\n return u instanceof Buffer ? Buffer.from(u) : new u.constructor(u.buffer.slice(), u.byteOffset, u.length);\n}\nfunction We(u) {\n if (u = u || {}, u.circles) return je(u);\n const e = /* @__PURE__ */ new Map();\n if (e.set(Date, (l) => new Date(l)), e.set(Map, (l, D) => new Map(r(Array.from(l), D))), e.set(Set, (l, D) => new Set(r(Array.from(l), D))), u.constructorHandlers)\n for (const l of u.constructorHandlers)\n e.set(l[0], l[1]);\n let n = null;\n return u.proto ? c : o;\n function r(l, D) {\n const i = Object.keys(l), t = new Array(i.length);\n for (let a = 0; a < i.length; a++) {\n const s = i[a], F = l[s];\n typeof F != \"object\" || F === null ? t[s] = F : F.constructor !== Object && (n = e.get(F.constructor)) ? t[s] = n(F, D) : ArrayBuffer.isView(F) ? t[s] = Z(F) : t[s] = D(F);\n }\n return t;\n }\n function o(l) {\n if (typeof l != \"object\" || l === null) return l;\n if (Array.isArray(l)) return r(l, o);\n if (l.constructor !== Object && (n = e.get(l.constructor)))\n return n(l, o);\n const D = {};\n for (const i in l) {\n if (Object.hasOwnProperty.call(l, i) === !1) continue;\n const t = l[i];\n typeof t != \"object\" || t === null ? D[i] = t : t.constructor !== Object && (n = e.get(t.constructor)) ? D[i] = n(t, o) : ArrayBuffer.isView(t) ? D[i] = Z(t) : D[i] = o(t);\n }\n return D;\n }\n function c(l) {\n if (typeof l != \"object\" || l === null) return l;\n if (Array.isArray(l)) return r(l, c);\n if (l.constructor !== Object && (n = e.get(l.constructor)))\n return n(l, c);\n const D = {};\n for (const i in l) {\n const t = l[i];\n typeof t != \"object\" || t === null ? D[i] = t : t.constructor !== Object && (n = e.get(t.constructor)) ? D[i] = n(t, c) : ArrayBuffer.isView(t) ? D[i] = Z(t) : D[i] = c(t);\n }\n return D;\n }\n}\nfunction je(u) {\n const e = [], n = [], r = /* @__PURE__ */ new Map();\n if (r.set(Date, (i) => new Date(i)), r.set(Map, (i, t) => new Map(c(Array.from(i), t))), r.set(Set, (i, t) => new Set(c(Array.from(i), t))), u.constructorHandlers)\n for (const i of u.constructorHandlers)\n r.set(i[0], i[1]);\n let o = null;\n return u.proto ? D : l;\n function c(i, t) {\n const a = Object.keys(i), s = new Array(a.length);\n for (let F = 0; F < a.length; F++) {\n const E = a[F], C = i[E];\n if (typeof C != \"object\" || C === null)\n s[E] = C;\n else if (C.constructor !== Object && (o = r.get(C.constructor)))\n s[E] = o(C, t);\n else if (ArrayBuffer.isView(C))\n s[E] = Z(C);\n else {\n const A = e.indexOf(C);\n A !== -1 ? s[E] = n[A] : s[E] = t(C);\n }\n }\n return s;\n }\n function l(i) {\n if (typeof i != \"object\" || i === null) return i;\n if (Array.isArray(i)) return c(i, l);\n if (i.constructor !== Object && (o = r.get(i.constructor)))\n return o(i, l);\n const t = {};\n e.push(i), n.push(t);\n for (const a in i) {\n if (Object.hasOwnProperty.call(i, a) === !1) continue;\n const s = i[a];\n if (typeof s != \"object\" || s === null)\n t[a] = s;\n else if (s.constructor !== Object && (o = r.get(s.constructor)))\n t[a] = o(s, l);\n else if (ArrayBuffer.isView(s))\n t[a] = Z(s);\n else {\n const F = e.indexOf(s);\n F !== -1 ? t[a] = n[F] : t[a] = l(s);\n }\n }\n return e.pop(), n.pop(), t;\n }\n function D(i) {\n if (typeof i != \"object\" || i === null) return i;\n if (Array.isArray(i)) return c(i, D);\n if (i.constructor !== Object && (o = r.get(i.constructor)))\n return o(i, D);\n const t = {};\n e.push(i), n.push(t);\n for (const a in i) {\n const s = i[a];\n if (typeof s != \"object\" || s === null)\n t[a] = s;\n else if (s.constructor !== Object && (o = r.get(s.constructor)))\n t[a] = o(s, D);\n else if (ArrayBuffer.isView(s))\n t[a] = Z(s);\n else {\n const F = e.indexOf(s);\n F !== -1 ? t[a] = n[F] : t[a] = D(s);\n }\n }\n return e.pop(), n.pop(), t;\n }\n}\nconst Ve = /* @__PURE__ */ _u(ze);\nvar Ye = $e;\nfunction $e() {\n for (var u = [].slice.call(arguments), e, n = u.length; e = u[n - 1], n--; )\n if (!e || typeof e != \"object\" && typeof e != \"function\")\n throw new Error(\"expected object, got \" + e);\n for (var r = u[0], o = u.slice(1), c = o.length, n = 0; n < c; n++) {\n var l = o[n];\n for (var D in l)\n r[D] = l[D];\n }\n return r;\n}\nvar Ze = qe;\nfunction qe(u, e) {\n var n = {};\n typeof e == \"string\" && (e = [].slice.call(arguments, 1));\n for (var r = e.length, o = 0; o < r; o++) {\n var c = e[o];\n c in u && (n[c] = u[c]);\n }\n return n;\n}\nvar Qe = Je;\nfunction Je(u, e) {\n var n = {};\n typeof e == \"string\" && (e = [].slice.call(arguments, 1));\n for (var r in u)\n (!u.hasOwnProperty || u.hasOwnProperty(r)) && e.indexOf(r) === -1 && (n[r] = u[r]);\n return n;\n}\nvar jt = Ke;\nfunction Ke(u, e, n) {\n var r = null, o = null, c = function() {\n r && (clearTimeout(r), o = null, r = null);\n }, l = function() {\n var i = o;\n c(), i && i();\n }, D = function() {\n if (!e)\n return u.apply(this, arguments);\n var i = this, t = arguments, a = n && !r;\n if (c(), o = function() {\n u.apply(i, t);\n }, r = setTimeout(function() {\n if (r = null, !a) {\n var s = o;\n return o = null, s();\n }\n }, e), a)\n return o();\n };\n return D.cancel = c, D.flush = l, D;\n}\nvar Vt = ut;\nfunction ut(u, e, n) {\n var r = null, o = null, c = n && n.leading, l = n && n.trailing;\n c == null && (c = !0), l == null && (l = !c), c == !0 && (l = !1);\n var D = function() {\n r && (clearTimeout(r), r = null);\n }, i = function() {\n var a = o;\n D(), a && a();\n }, t = function() {\n var a = c && !r, s = this, F = arguments;\n if (o = function() {\n return u.apply(s, F);\n }, r || (r = setTimeout(function() {\n if (r = null, l)\n return o();\n }, e)), a)\n return a = !1, o();\n };\n return t.cancel = D, t.flush = i, t;\n}\nlet et = \"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\", X = (u = 21) => {\n let e = \"\", n = crypto.getRandomValues(new Uint8Array(u |= 0));\n for (; u--; )\n e += et[n[u] & 63];\n return e;\n};\nconst tt = Ve();\nfunction Eu(u, e) {\n if (!u || typeof u != \"object\")\n return u;\n let n = {};\n return Array.isArray(u) ? n = u.map((r) => Eu(r, e)) : Object.keys(u).forEach((r) => {\n if (!e.includes(r))\n return n[r] = Eu(u[r], e);\n }), n;\n}\nfunction ku(u) {\n return typeof structuredClone == \"function\" ? structuredClone(u) : tt(u);\n}\nfunction ou(u) {\n return u && u.nodeType === 1 && u.tagName.toLowerCase() === \"body\";\n}\nfunction Yt(u, e, n) {\n if (u && !ou(u))\n for (u = n ? u : u.parentNode; u; ) {\n if (!e || e(u) || ou(u))\n return e && !e(u) && ou(u) ? null : u;\n u = u.parentNode;\n }\n return null;\n}\nfunction j(u) {\n const e = [];\n if (Intl.Segmenter) {\n const r = new Intl.Segmenter().segment(u);\n for (const { segment: o } of r)\n e.push(o);\n } else {\n const n = /* @__PURE__ */ new Map();\n for (const o of u.matchAll(pe))\n n.set(o.index, o[0]);\n let r = 0;\n for (; r < u.length; ) {\n const o = n.get(r);\n o ? (e.push(o), r += o.length) : (e.push(u[r]), r++);\n }\n }\n return e;\n}\nfunction $t(u, e) {\n const n = document.createElement(\"a\");\n n.href = u, n.download = e, n.click();\n}\nfunction Zt(u, e) {\n return Dt(3, u, e);\n}\nfunction Dt(u, e, n) {\n let r = 0, o = 0;\n const c = function(l) {\n r = (/* @__PURE__ */ new Date()).getTime() - o < 300 ? r + 1 : 0, o = (/* @__PURE__ */ new Date()).getTime(), r >= u - 1 && (n(l), r = 0);\n };\n return e.addEventListener(\"click\", c), () => {\n e.removeEventListener(\"click\", c);\n };\n}\nfunction hu(u) {\n return Object.prototype.toString.call(u) === \"[object Object]\";\n}\nfunction gu(u) {\n return Array.isArray(u);\n}\nfunction qt(u) {\n return Object.prototype.toString.call(u) === \"[object Number]\";\n}\nfunction Qt(u) {\n return Object.prototype.toString.call(u) === \"[object String]\";\n}\nfunction Jt(u, e) {\n return hu(u) && hu(e) ? Ye(e, u) : (gu(u) && gu(e) && e.push(...u), e);\n}\nfunction Kt(u) {\n queueMicrotask(() => {\n u();\n });\n}\nfunction uD(u) {\n const e = [\n \"零\",\n \"一\",\n \"二\",\n \"三\",\n \"四\",\n \"五\",\n \"六\",\n \"七\",\n \"八\",\n \"九\"\n ], n = [\n \"\",\n \"十\",\n \"百\",\n \"千\",\n \"万\",\n \"十\",\n \"百\",\n \"千\",\n \"亿\",\n \"十\",\n \"百\",\n \"千\",\n \"万\",\n \"十\",\n \"百\",\n \"千\",\n \"亿\"\n ];\n if (!u || isNaN(u)) return \"零\";\n const r = u.toString().split(\"\");\n let o = \"\";\n for (let c = 0; c < r.length; c++) {\n const l = r.length - 1 - c;\n o = `${n[c]}${o}`, o = `${e[Number(r[l])]}${o}`;\n }\n return o = o.replace(/零(千|百|十)/g, \"零\").replace(/十零/g, \"十\"), o = o.replace(/零+/g, \"零\"), o = o.replace(/零亿/g, \"亿\").replace(/零万/g, \"万\"), o = o.replace(/亿万/g, \"亿\"), o = o.replace(/零+$/, \"\"), o = o.replace(/^一十/g, \"十\"), o;\n}\nfunction iu(u, e, n) {\n for (let r = 0; r < u.length; r++) {\n const o = u[r], c = e[o];\n c !== void 0 ? n[o] = c : delete n[o];\n }\n}\nfunction Du(u, e) {\n return Ze(u, e);\n}\nfunction rt(u, e) {\n return Qe(u, e);\n}\nfunction eD(u) {\n const n = new TextEncoder().encode(u), r = Array.from(n, (c) => String.fromCharCode(c));\n return window.btoa(r.join(\"\"));\n}\nfunction tD(u) {\n let e = u.parentElement;\n for (; e; ) {\n const r = window.getComputedStyle(e).getPropertyValue(\"overflow-y\");\n if (e.scrollHeight > e.clientHeight && (r === \"auto\" || r === \"scroll\"))\n return e;\n e = e.parentElement;\n }\n return document.documentElement;\n}\nfunction DD(u, e) {\n const n = u.x, r = u.x + u.width, o = u.y, c = u.y + u.height, l = e.x, D = e.x + e.width, i = e.y, t = e.y + e.height;\n return !(n > D || r < l || o > t || c < i);\n}\nfunction rD(u) {\n return u == null;\n}\nfunction nD(u) {\n return u.replace(/\\r\\n|\\r/g, `\n`);\n}\nfunction nt(u) {\n return u !== null && typeof u == \"object\" && \"value\" in u && typeof u.value == \"string\";\n}\nfunction lD(u) {\n return Array.isArray(u) && u.every(nt);\n}\nconst lt = typeof navigator < \"u\" && /Mac OS X/.test(navigator.userAgent), oD = typeof navigator < \"u\" && /iPad|iPhone/.test(navigator.userAgent), iD = typeof navigator < \"u\" && /Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\nfunction aD(u) {\n return lt ? u.metaKey : u.ctrlKey;\n}\nfunction cD(u, e) {\n return JSON.stringify(u);\n}\nfunction ot(u = {}) {\n var h, O, M;\n const e = {\n ...xe,\n ...u.table\n }, n = {\n ...ye,\n ...u.header\n }, r = {\n ...Se,\n ...u.footer\n }, o = {\n ...Ce,\n ...u.pageNumber\n }, c = {\n ...Ae,\n ...u.watermark\n }, l = {\n ...me,\n ...u.control\n }, D = {\n ...be,\n ...u.checkbox\n }, i = {\n ..._e,\n ...u.radio\n }, t = {\n ...Fe,\n ...u.cursor\n }, a = {\n ...he,\n ...u.title\n }, s = {\n ...Oe,\n ...u.placeholder\n }, F = {\n ...Ne,\n ...u.group\n }, E = {\n ...we,\n ...u.pageBreak\n }, C = {\n ...Ge,\n ...u.zone\n }, A = {\n ...Le,\n ...u.background\n }, g = {\n ...Pe,\n ...u.lineBreak\n }, R = {\n ...ke,\n ...u.separator\n }, I = {\n ...Ue,\n ...u.lineNumber\n }, y = {\n ...He,\n ...u.pageBorder\n }, w = {\n ...Re,\n ...u.badge\n }, p = {\n print: {\n ...lu.print,\n ...(h = u.modeRule) == null ? void 0 : h.print\n },\n readonly: {\n ...lu.readonly,\n ...(O = u.modeRule) == null ? void 0 : O.readonly\n },\n form: {\n ...lu.form,\n ...(M = u.modeRule) == null ? void 0 : M.form\n }\n }, d = {\n enabled: !0,\n ...u.floatingBar\n };\n return {\n mode: fu.EDIT,\n locale: \"zhCN\",\n defaultType: \"TEXT\",\n defaultColor: \"#000000\",\n defaultFont: \"SimSun, serif\",\n defaultSize: 14,\n minSize: 5,\n maxSize: 72,\n defaultRowMargin: 1,\n defaultLineHeight: 1,\n defaultBasicRowMarginHeight: 8,\n defaultTabWidth: 32,\n width: 794,\n height: 1123,\n scale: 1,\n pageGap: 20,\n underlineColor: \"#000000\",\n strikeoutColor: \"#FF0000\",\n rangeAlpha: 0.6,\n rangeColor: \"#AECBFA\",\n rangeMinWidth: 5,\n searchMatchAlpha: 0.6,\n searchMatchColor: \"#FFFF00\",\n searchNavigateMatchColor: \"#AAD280\",\n highlightAlpha: 0.6,\n highlightMarginHeight: 8,\n resizerColor: \"#4182D9\",\n resizerSize: 5,\n marginIndicatorSize: 35,\n marginIndicatorColor: \"#BABABA\",\n marginIndicatorDisabled: !1,\n margins: [96, 120, 96, 120],\n pageMode: Ou.PAGING,\n renderMode: bu.SPEED,\n defaultHyperlinkColor: \"#0000FF\",\n paperDirection: Lu.VERTICAL,\n inactiveAlpha: 0.6,\n historyMaxRecordCount: 100,\n wordBreak: Ru.BREAK_WORD,\n printPixelRatio: 3,\n maskMargin: [0, 0, 0, 0],\n letterClass: [le.ENGLISH],\n shortcutDisableKeys: [],\n scrollContainerSelector: \"\",\n pageOuterSelectionDisable: !1,\n ...u,\n table: e,\n header: n,\n footer: r,\n pageNumber: o,\n watermark: c,\n control: l,\n checkbox: D,\n radio: i,\n cursor: t,\n title: a,\n placeholder: s,\n group: F,\n pageBreak: E,\n zone: C,\n background: A,\n lineBreak: g,\n separator: R,\n lineNumber: I,\n pageBorder: y,\n badge: w,\n modeRule: p,\n floatingBar: d,\n trackChanges: u.trackChanges ?? !1,\n revisionInsertColor: u.revisionInsertColor ?? \"#1a73e8\",\n revisionDeleteColor: u.revisionDeleteColor ?? \"#f56c6c\",\n annotationColor: u.annotationColor ?? \"#409eff\",\n revisionColor: u.revisionColor ?? \"#e60000\",\n revisionDisplayMode: u.revisionDisplayMode ?? \"all\",\n showCommentBalloons: u.showCommentBalloons ?? !0,\n showRevisionBalloons: u.showRevisionBalloons ?? !0\n };\n}\nconst it = [\"allow-scripts\", \"allow-same-origin\"];\nfunction Tu(u) {\n const e = [];\n for (let n = 0; n < u.length; n++) {\n const r = u[n], o = j(r.value);\n for (let c = 0; c < o.length; c++)\n e.push({ ...r, value: o[c] });\n }\n return e;\n}\nfunction Bu(u) {\n return gt(u).replace(/\\u200B/g, \"\").replace(/\\s+/g, \" \").trim();\n}\nfunction at(u) {\n return u || X();\n}\nfunction sD(u) {\n const e = [], n = (c) => {\n let l = 0;\n for (; l < c.length; ) {\n const D = c[l];\n if (!D) {\n l++;\n continue;\n }\n if (D.type === f.TITLE) {\n if (D.titleId && D.level) {\n const i = Bu(D.valueList || []);\n i && e.push({\n id: D.titleId,\n name: i,\n level: D.level,\n pageNo: 1,\n subCatalog: []\n });\n }\n l++;\n continue;\n }\n if (D.type === f.TABLE) {\n for (const i of D.trList || [])\n for (const t of i.tdList || [])\n n(t.value || []);\n l++;\n continue;\n }\n if (D.titleId && D.level) {\n const i = D.titleId, t = D.level, a = [];\n for (; l < c.length; ) {\n const F = c[l];\n if (!F || F.titleId !== i)\n break;\n a.push(F), l++;\n }\n const s = Bu(a);\n s && e.push({\n id: i,\n name: s,\n level: t,\n pageNo: 1,\n subCatalog: []\n });\n continue;\n }\n Array.isArray(D.valueList) && n(D.valueList), l++;\n }\n };\n if (n(u), !e.length) return null;\n const r = [], o = [];\n for (const c of e) {\n for (; o.length > 0 && Fu[o[o.length - 1].level] >= Fu[c.level]; )\n o.pop();\n o.length === 0 ? r.push(c) : o[o.length - 1].subCatalog.push(c), o.push(c);\n }\n return r;\n}\nfunction Q(u, e) {\n var i;\n const {\n isHandleFirstElement: n = !0,\n isForceCompensation: r = !1,\n editorOptions: o,\n laTexToSVG: c\n } = e, l = u[0];\n (r || n && (l == null ? void 0 : l.type) !== f.LIST && (l != null && l.type && l.type !== f.TEXT || !pu.test(l == null ? void 0 : l.value))) && u.unshift({\n value: H,\n rowFlex: l == null ? void 0 : l.rowFlex,\n listId: l == null ? void 0 : l.listId,\n listType: l == null ? void 0 : l.listType,\n listStyle: l == null ? void 0 : l.listStyle,\n listLevel: l == null ? void 0 : l.listLevel,\n listIndent: l == null ? void 0 : l.listIndent,\n listHanging: l == null ? void 0 : l.listHanging,\n paragraphIndentLeft: l == null ? void 0 : l.paragraphIndentLeft,\n paragraphSpacingBefore: l == null ? void 0 : l.paragraphSpacingBefore,\n paragraphSpacingAfter: l == null ? void 0 : l.paragraphSpacingAfter,\n paragraphFirstLineIndent: l == null ? void 0 : l.paragraphFirstLineIndent\n });\n let D = 0;\n for (; D < u.length; ) {\n let t = u[D];\n if (t.type === f.TITLE) {\n u.splice(D, 1);\n const a = t.valueList || [];\n if (Q(a, {\n ...e,\n isHandleFirstElement: !1,\n isForceCompensation: !1\n }), a.length) {\n const s = at(t.titleId), F = o.title;\n for (let E = 0; E < a.length; E++) {\n const C = a[E];\n C.title = t.title, t.level && (C.titleId = s, C.level = t.level), Et(C) && (C.size || (C.size = F[ge[C.level]]), C.bold === void 0 && (C.bold = !0)), u.splice(D, 0, C), D++;\n }\n }\n D--;\n } else if (t.type === f.LIST) {\n u.splice(D, 1);\n const a = t.valueList || [];\n if (Q(a, {\n ...e,\n isHandleFirstElement: !0,\n isForceCompensation: !1\n }), a.length) {\n const s = X();\n for (let F = 0; F < a.length; F++) {\n const E = a[F];\n E.listId = s, E.listType = t.listType, E.listStyle = t.listStyle, u.splice(D, 0, E), D++;\n }\n }\n D--;\n } else if (t.type === f.AREA) {\n u.splice(D, 1);\n const a = (t == null ? void 0 : t.valueList) || [];\n if (Q(a, {\n ...e,\n isHandleFirstElement: !0,\n isForceCompensation: !0\n }), a.length) {\n const s = X();\n for (let F = 0; F < a.length; F++) {\n const E = a[F];\n if (E.areaId = t.areaId || s, E.area = t.area, E.areaIndex = F, E.type === f.TABLE) {\n const C = E.trList;\n for (let A = 0; A < C.length; A++) {\n const g = C[A];\n for (let R = 0; R < g.tdList.length; R++) {\n const y = g.tdList[R].value;\n for (let w = 0; w < y.length; w++) {\n const p = y[w];\n p.areaId = t.areaId || s, p.area = t.area;\n }\n }\n }\n }\n u.splice(D, 0, E), D++;\n }\n }\n D--;\n } else if (t.type === f.TABLE) {\n const a = t.id || X();\n if (t.id = a, t.trList) {\n const { defaultTrMinHeight: s } = o.table;\n for (let F = 0; F < t.trList.length; F++) {\n const E = t.trList[F], C = E.id || X();\n E.id = C, (!E.minHeight || E.minHeight < s) && (E.minHeight = s), E.height < E.minHeight && (E.height = E.minHeight);\n for (let A = 0; A < E.tdList.length; A++) {\n const g = E.tdList[A], R = g.id || X();\n g.id = R, Q(g.value, {\n ...e,\n isHandleFirstElement: !0,\n isForceCompensation: !0\n });\n for (let I = 0; I < g.value.length; I++) {\n const y = g.value[I];\n y.tdId = R, y.trId = C, y.tableId = a;\n }\n }\n }\n }\n } else if (t.type === f.HYPERLINK) {\n u.splice(D, 1);\n const a = Tu(t.valueList || []);\n if (a.length) {\n const s = X();\n for (let F = 0; F < a.length; F++) {\n const E = a[F];\n E.type = t.type, E.url = t.url, E.hyperlinkId = s, u.splice(D, 0, E), D++;\n }\n }\n D--;\n } else if (t.type === f.DATE) {\n u.splice(D, 1);\n const a = Tu(t.valueList || []);\n if (a.length) {\n const s = X();\n for (let F = 0; F < a.length; F++) {\n const E = a[F];\n E.type = t.type, E.dateFormat = t.dateFormat, E.dateId = s, u.splice(D, 0, E), D++;\n }\n }\n D--;\n } else if (t.type === f.CONTROL) {\n if (!t.control) {\n D++;\n continue;\n }\n const {\n prefix: a,\n postfix: s,\n preText: F,\n postText: E,\n value: C,\n placeholder: A,\n code: g,\n type: R,\n valueSets: I\n } = t.control, {\n editorOptions: {\n control: y,\n checkbox: w,\n radio: p\n }\n } = e, d = t.controlId || X();\n u.splice(D, 1);\n const h = Du(t, [\n ...wu,\n ...uu\n ]), O = Du(\n t.control,\n Pu\n ), M = {\n ...O,\n color: o.control.bracketColor\n }, k = j(a || y.prefix);\n for (let B = 0; B < k.length; B++) {\n const v = k[B];\n u.splice(D, 0, {\n ...h,\n ...M,\n controlId: d,\n value: v,\n type: t.type,\n control: t.control,\n controlComponent: m.PREFIX\n }), D++;\n }\n if (F) {\n const B = j(F);\n for (let v = 0; v < B.length; v++) {\n const T = B[v];\n u.splice(D, 0, {\n ...h,\n ...O,\n controlId: d,\n value: T,\n type: t.type,\n control: t.control,\n controlComponent: m.PRE_TEXT\n }), D++;\n }\n }\n if (C && C.length || R === Y.CHECKBOX || R === Y.RADIO || R === Y.SELECT && g && (!C || !C.length)) {\n let B = C ? ku(C) : [];\n if (R === Y.CHECKBOX) {\n const v = g ? g.split(\",\") : [];\n if (Array.isArray(I) && I.length) {\n const T = B.reduce(\n (_, U) => _.concat(\n U.value.split(\"\").map((W) => ({ ...U, value: W }))\n ),\n []\n );\n let L = 0;\n for (let _ = 0; _ < I.length; _++) {\n const U = I[_];\n u.splice(D, 0, {\n ...h,\n ...O,\n controlId: d,\n value: \"\",\n type: t.type,\n control: t.control,\n controlComponent: m.CHECKBOX,\n checkbox: {\n code: U.code,\n value: v.includes(U.code)\n }\n }), D++;\n const W = j(U.value);\n for (let V = 0; V < W.length; V++) {\n const eu = W[V], Gu = V === W.length - 1;\n u.splice(D, 0, {\n ...h,\n ...O,\n ...T[L],\n controlId: d,\n value: eu === `\n` ? H : eu,\n letterSpacing: Gu ? w.gap : 0,\n control: t.control,\n controlComponent: m.VALUE\n }), L++, D++;\n }\n }\n }\n } else if (R === Y.RADIO) {\n if (Array.isArray(I) && I.length) {\n const v = B.reduce(\n (L, _) => L.concat(\n _.value.split(\"\").map((U) => ({ ..._, value: U }))\n ),\n []\n );\n let T = 0;\n for (let L = 0; L < I.length; L++) {\n const _ = I[L];\n u.splice(D, 0, {\n ...h,\n ...O,\n controlId: d,\n value: \"\",\n type: t.type,\n control: t.control,\n controlComponent: m.RADIO,\n radio: {\n code: _.code,\n value: g === _.code\n }\n }), D++;\n const U = j(_.value);\n for (let W = 0; W < U.length; W++) {\n const V = U[W], eu = W === U.length - 1;\n u.splice(D, 0, {\n ...h,\n ...O,\n ...v[T],\n controlId: d,\n value: V === `\n` ? H : V,\n letterSpacing: eu ? p.gap : 0,\n control: t.control,\n controlComponent: m.VALUE\n }), T++, D++;\n }\n }\n }\n } else {\n if ((!C || !C.length) && Array.isArray(I) && I.length) {\n const v = I.find((T) => T.code === g);\n v && (B = [\n {\n value: v.value\n }\n ]);\n }\n Q(B, {\n ...e,\n isHandleFirstElement: !1,\n isForceCompensation: !1\n });\n for (let v = 0; v < B.length; v++) {\n const T = B[v], L = T.value;\n u.splice(D, 0, {\n ...h,\n ...O,\n ...T,\n controlId: d,\n value: L === `\n` ? H : L,\n type: T.type || f.TEXT,\n control: t.control,\n controlComponent: m.VALUE\n }), D++;\n }\n }\n } else if (A) {\n const B = {\n ...O,\n color: o.control.placeholderColor\n }, v = j(A);\n for (let T = 0; T < v.length; T++) {\n const L = v[T];\n u.splice(D, 0, {\n ...h,\n ...B,\n controlId: d,\n value: L === `\n` ? H : L,\n type: t.type,\n control: t.control,\n controlComponent: m.PLACEHOLDER\n }), D++;\n }\n }\n if (E) {\n const B = j(E);\n for (let v = 0; v < B.length; v++) {\n const T = B[v];\n u.splice(D, 0, {\n ...h,\n ...O,\n controlId: d,\n value: T,\n type: t.type,\n control: t.control,\n controlComponent: m.POST_TEXT\n }), D++;\n }\n }\n const z = j(s || y.postfix);\n for (let B = 0; B < z.length; B++) {\n const v = z[B];\n u.splice(D, 0, {\n ...h,\n ...M,\n controlId: d,\n value: v,\n type: t.type,\n control: t.control,\n controlComponent: m.POSTFIX\n }), D++;\n }\n D--;\n } else if ((!t.type || nu.includes(t.type) && t.type !== f.PLACEHOLDER) && ((i = t.value) == null ? void 0 : i.length) > 1) {\n u.splice(D, 1);\n const a = j(t.value);\n for (let s = 0; s < a.length; s++)\n u.splice(D + s, 0, { ...t, value: a[s] });\n t = u[D];\n }\n if ((t.value === `\n` || t.value == `\\r\n`) && (t.value = H), (t.type === f.IMAGE || t.type === f.BLOCK) && (t.id = t.id || X()), t.type === f.LATEX && c) {\n const { svg: a, width: s, height: F } = c(t.value);\n t.width = t.width || s, t.height = t.height || F, t.laTexSVG = a, t.id = t.id || X();\n }\n D++;\n }\n}\nfunction ct(u, e) {\n const n = Object.keys(u), r = Object.keys(e);\n if (n.length !== r.length) return !1;\n for (let o = 0; o < n.length; o++) {\n const c = n[o];\n if (c !== \"value\" && !(c === \"groupIds\" && Array.isArray(u[c]) && Array.isArray(e[c]) && Me(u[c], e[c])) && u[c] !== e[c])\n return !1;\n }\n return !0;\n}\nfunction au(u, e = {}) {\n const { extraPickAttrs: n } = e, r = [...oe];\n n && r.push(...n);\n const o = {\n value: u.value === H ? `\n` : u.value\n };\n return r.forEach((c) => {\n const l = u[c];\n l !== void 0 && (o[c] = l);\n }), o;\n}\nfunction x(u, e = {}) {\n const { extraPickAttrs: n, isClassifyArea: r = !1, isClone: o = !0 } = e, c = o ? ku(u) : u, l = [];\n let D = 0;\n for (; D < c.length; ) {\n let i = c[D];\n if (D === 0 && i.value === H && !i.listId && (!i.type || i.type === f.TEXT)) {\n const a = c[D + 1];\n a && uu.forEach((s) => {\n i[s] !== void 0 && a[s] === void 0 && (a[s] = i[s]);\n }), D++;\n continue;\n }\n if (i.areaId) {\n const a = i.areaId, s = i.area, F = [];\n for (; D < c.length; ) {\n const C = c[D];\n if (a !== C.areaId) {\n D--;\n break;\n }\n delete C.area, delete C.areaId, F.push(C), D++;\n }\n const E = x(F, e);\n if (r) {\n const C = {\n type: f.AREA,\n value: \"\",\n areaId: a,\n area: s\n };\n C.valueList = E, i = C;\n } else {\n l.splice(D, 0, ...E);\n continue;\n }\n } else if (i.titleId && i.level) {\n const a = i.titleId;\n if (a) {\n const s = i.level, F = {\n type: f.TITLE,\n title: i.title,\n titleId: a,\n value: \"\",\n level: s\n }, E = [];\n for (; D < c.length; ) {\n const C = c[D];\n if (a !== C.titleId) {\n D--;\n break;\n }\n delete C.level, delete C.title, E.push(C), D++;\n }\n F.valueList = x(E, e), i = F;\n }\n } else if (i.listId && i.listType) {\n const a = i.listId;\n if (a) {\n const s = i.listType, F = i.listStyle, E = {\n type: f.LIST,\n value: \"\",\n listId: a,\n listType: s,\n listStyle: F\n }, C = [];\n for (; D < c.length; ) {\n const A = c[D];\n if (a !== A.listId) {\n D--;\n break;\n }\n delete A.listType, delete A.listStyle, C.push(A), D++;\n }\n E.valueList = x(C, e), i = E;\n }\n } else if (i.type === f.TABLE) {\n if (i.pagingId) {\n let a = D + 1, s = 0;\n for (; a < c.length; ) {\n const F = c[a];\n if (F.pagingId === i.pagingId)\n i.height += F.height, i.trList.push(...F.trList), a++, s++;\n else\n break;\n }\n D += s;\n }\n if (i.trList)\n for (let a = 0; a < i.trList.length; a++) {\n const s = i.trList[a];\n delete s.id;\n for (let F = 0; F < s.tdList.length; F++) {\n const E = s.tdList[F], C = {\n colspan: E.colspan,\n rowspan: E.rowspan,\n value: x(E.value, {\n ...e,\n isClassifyArea: !1\n })\n };\n ie.forEach((A) => {\n const g = E[A];\n g !== void 0 && (C[A] = g);\n }), s.tdList[F] = C;\n }\n }\n } else if (i.type === f.HYPERLINK) {\n const a = i.hyperlinkId;\n if (a) {\n const s = {\n type: f.HYPERLINK,\n value: \"\",\n url: i.url\n }, F = [];\n for (; D < c.length; ) {\n const E = c[D];\n if (a !== E.hyperlinkId) {\n D--;\n break;\n }\n delete E.type, delete E.url, F.push(E), D++;\n }\n s.valueList = x(F, e), i = s;\n }\n } else if (i.type === f.DATE) {\n const a = i.dateId;\n if (a) {\n const s = {\n type: f.DATE,\n value: \"\",\n dateFormat: i.dateFormat\n }, F = [];\n for (; D < c.length; ) {\n const E = c[D];\n if (a !== E.dateId) {\n D--;\n break;\n }\n delete E.type, delete E.dateFormat, F.push(E), D++;\n }\n s.valueList = x(F, e), i = s;\n }\n } else if (i.controlId) {\n const a = i.controlId;\n if (i.controlComponent === m.PREFIX) {\n const s = [];\n let F = !1, E = D;\n for (; E < c.length; ) {\n const C = c[E];\n if (a !== C.controlId) break;\n C.controlComponent === m.VALUE && (delete C.control, delete C.controlId, s.push(C)), C.controlComponent === m.POSTFIX && (F = !0), E++;\n }\n if (F) {\n const C = Du(i, Pu), A = {\n ...i.control,\n ...C\n }, g = {\n ...Du(i, uu),\n type: f.CONTROL,\n value: \"\",\n control: A,\n controlId: a\n };\n g.control.value = x(s, e), i = au(g, { extraPickAttrs: n }), D += E - D - 1;\n }\n }\n if (i.controlComponent && (delete i.control, delete i.controlId, i.controlComponent !== m.VALUE && i.controlComponent !== m.PRE_TEXT && i.controlComponent !== m.POST_TEXT)) {\n D++;\n continue;\n }\n }\n const t = au(i, { extraPickAttrs: n });\n if (!i.type || i.type === f.TEXT || i.type === f.SUBSCRIPT || i.type === f.SUPERSCRIPT)\n for (; D < c.length; ) {\n const a = c[D + 1];\n if (D++, a && ct(\n t,\n au(a, { extraPickAttrs: n })\n )) {\n const s = a.value === H ? `\n` : a.value;\n t.value += s;\n } else\n break;\n }\n else\n D++;\n l.push(t);\n }\n return l;\n}\nfunction st(u) {\n switch (window.getComputedStyle(u).textAlign) {\n case \"left\":\n case \"start\":\n return P.LEFT;\n case \"center\":\n return P.CENTER;\n case \"right\":\n case \"end\":\n return P.RIGHT;\n case \"justify\":\n return P.ALIGNMENT;\n case \"justify-all\":\n return P.JUSTIFY;\n default:\n return P.LEFT;\n }\n}\nfunction xu(u) {\n return u === P.ALIGNMENT ? \"justify\" : u;\n}\nfunction Ft(u) {\n switch (u) {\n case P.LEFT:\n return \"flex-start\";\n case P.CENTER:\n return \"center\";\n case P.RIGHT:\n return \"flex-end\";\n case P.ALIGNMENT:\n case P.JUSTIFY:\n return \"space-between\";\n default:\n return \"flex-start\";\n }\n}\nfunction Et(u) {\n return !u.type || nu.includes(u.type);\n}\nfunction Ct(u, e) {\n const n = u[e];\n if (!n) return null;\n const r = u[e + 1];\n return !n.listId && n.value === H && r && r.value !== H && n.areaId === r.areaId ? r : n;\n}\nfunction ft(u, e, n, r) {\n var t, a, s;\n let o = Ct(u, n);\n if (!o) return;\n const { isBreakWhenWrap: c = !1, editorOptions: l } = r || {}, { mode: D } = l || {};\n D !== fu.DESIGN && ((t = o.title) != null && t.disabled) && (o = rt(o, yu));\n let i = !1;\n for (let F = 0; F < e.length; F++) {\n const E = e[F];\n if (c && !o.listId && pu.test(E.value) && (i = !0), i || !o.listId && E.type === f.LIST) {\n const A = [\n ...Nu,\n ...uu,\n ...Hu\n ];\n iu(A, o, E), (a = E.valueList) == null || a.forEach((g) => {\n iu(A, o, g);\n });\n continue;\n }\n (s = E.valueList) != null && s.length && ft(\n u,\n E.valueList,\n n,\n r\n );\n const C = [...wu];\n ru(E) || C.push(...uu), iu(C, o, E);\n }\n}\nfunction dt(u, e) {\n let n = \"span\";\n u.type === f.SUPERSCRIPT ? n = \"sup\" : u.type === f.SUBSCRIPT && (n = \"sub\");\n const r = document.createElement(n);\n return r.style.fontFamily = u.font || e.defaultFont, u.rowFlex && (r.style.textAlign = xu(u.rowFlex)), u.color && (r.style.color = u.color), u.bold && (r.style.fontWeight = \"600\"), u.italic && (r.style.fontStyle = \"italic\"), r.style.fontSize = `${u.size || e.defaultSize}px`, u.highlight && (r.style.backgroundColor = u.highlight), u.underline && (r.style.textDecoration = \"underline\"), u.strikeout && (r.style.textDecoration += \" line-through\"), r.innerText = u.value.replace(new RegExp(`${H}`, \"g\"), `\n`), r;\n}\nfunction Uu(u) {\n let e = 0;\n const n = /* @__PURE__ */ new Map();\n for (let r = 0; r < u.length; r++) {\n const o = u[r];\n if (r === 0) {\n if (o.checkbox) continue;\n o.value = o.value.replace(pu, \"\");\n }\n if (o.listWrap) {\n const c = n.get(e) || [];\n c.push(o), n.set(e, c);\n } else {\n const c = o.value.split(`\n`);\n for (let l = 0; l < c.length; l++) {\n l > 0 && (e += 1);\n const D = c[l], i = n.get(e) || [];\n i.push({\n ...o,\n value: D\n }), n.set(e, i);\n }\n }\n }\n return n;\n}\nfunction pt(u) {\n var r;\n const e = [];\n if (!u.length) return e;\n let n = ((r = u[0]) == null ? void 0 : r.rowFlex) || null;\n e.push({\n rowFlex: n,\n data: [u[0]]\n });\n for (let o = 1; o < u.length; o++) {\n const c = u[o], l = c.rowFlex || null;\n n === l && !ru(c) && !ru(u[o - 1]) ? e[e.length - 1].data.push(c) : (e.push({\n rowFlex: l,\n data: [c]\n }), n = l);\n }\n for (let o = 0; o < e.length; o++) {\n const c = e[o];\n c.data = x(c.data);\n }\n return e;\n}\nfunction At(u, e) {\n const n = ot(e);\n function r(l) {\n var i, t, a, s, F, E, C, A, g, R, I, y;\n const D = document.createElement(\"div\");\n for (let w = 0; w < l.length; w++) {\n const p = l[w];\n if (p.type === f.TABLE) {\n const d = document.createElement(\"table\");\n d.setAttribute(\"cellSpacing\", \"0\"), d.setAttribute(\"cellpadding\", \"0\"), d.setAttribute(\"border\", \"0\");\n const h = \"1px solid #000000\";\n !p.borderType || p.borderType === tu.ALL ? (d.style.borderTop = h, d.style.borderLeft = h) : p.borderType === tu.EXTERNAL && (d.style.border = h), d.style.width = `${p.width}px`;\n const O = document.createElement(\"colgroup\");\n for (let k = 0; k < p.colgroup.length; k++) {\n const z = p.colgroup[k], B = document.createElement(\"col\");\n B.setAttribute(\"width\", `${z.width}`), O.append(B);\n }\n d.append(O);\n const M = p.trList;\n for (let k = 0; k < M.length; k++) {\n const z = document.createElement(\"tr\"), B = M[k];\n z.style.height = `${B.height}px`;\n for (let v = 0; v < B.tdList.length; v++) {\n const T = document.createElement(\"td\");\n (!p.borderType || p.borderType === tu.ALL) && (T.style.borderBottom = T.style.borderRight = \"1px solid\");\n const L = B.tdList[v];\n T.colSpan = L.colspan, T.rowSpan = L.rowspan, T.style.verticalAlign = L.verticalAlign || \"top\", (i = L.borderTypes) != null && i.includes(J.TOP) && (T.style.borderTop = h), (t = L.borderTypes) != null && t.includes(J.RIGHT) && (T.style.borderRight = h), (a = L.borderTypes) != null && a.includes(J.BOTTOM) && (T.style.borderBottom = h), (s = L.borderTypes) != null && s.includes(J.LEFT) && (T.style.borderLeft = h);\n const _ = At(L.value, e);\n T.innerHTML = _.innerHTML, L.backgroundColor && (T.style.backgroundColor = L.backgroundColor), z.append(T);\n }\n d.append(z);\n }\n D.append(d);\n } else if (p.type === f.HYPERLINK) {\n const d = document.createElement(\"a\");\n d.innerText = p.valueList.map((h) => h.value).join(\"\"), p.url && (d.href = p.url), D.append(d);\n } else if (p.type === f.TITLE) {\n const d = document.createElement(\n `h${Fu[p.level]}`\n ), h = r(p.valueList);\n d.innerHTML = h.innerHTML, D.append(d);\n } else if (p.type === f.LIST) {\n const d = document.createElement(\n ve[p.listType]\n );\n p.listStyle && (d.style.listStyleType = Ie[p.listStyle]);\n const h = x(p.valueList);\n Uu(h).forEach((M) => {\n const k = document.createElement(\"li\"), z = r(M);\n k.innerHTML = z.innerHTML, d.append(k);\n }), D.append(d);\n } else if (p.type === f.IMAGE) {\n const d = document.createElement(\"img\");\n p.value && (d.src = p.value, d.width = p.width, d.height = p.height), D.append(d);\n } else if (p.type === f.BLOCK) {\n if (((F = p.block) == null ? void 0 : F.type) === K.VIDEO) {\n const d = (E = p.block.videoBlock) == null ? void 0 : E.src;\n if (d) {\n const h = document.createElement(\"video\");\n h.style.display = \"block\", h.controls = !0, h.src = d, h.width = p.width || (e == null ? void 0 : e.width) || window.innerWidth, h.height = p.height, D.append(h);\n }\n } else if (((C = p.block) == null ? void 0 : C.type) === K.IFRAME) {\n const { src: d, srcdoc: h } = p.block.iframeBlock || {};\n if (d || h) {\n const O = document.createElement(\"iframe\");\n O.sandbox.add(...it), O.style.display = \"block\", O.style.border = \"none\", d ? O.src = d : h && (O.srcdoc = h), O.width = `${p.width || (e == null ? void 0 : e.width) || window.innerWidth}`, O.height = `${p.height}`, D.append(O);\n }\n }\n } else if (p.type === f.SEPARATOR) {\n const d = document.createElement(\"hr\");\n D.append(d);\n } else if (p.type === f.CHECKBOX) {\n const d = document.createElement(\"input\");\n d.type = \"checkbox\", (A = p.checkbox) != null && A.value && d.setAttribute(\"checked\", \"true\"), D.append(d);\n } else if (p.type === f.RADIO) {\n const d = document.createElement(\"input\");\n d.type = \"radio\", (g = p.radio) != null && g.value && d.setAttribute(\"checked\", \"true\"), D.append(d);\n } else if (p.type === f.TAB) {\n const d = document.createElement(\"span\");\n d.innerHTML = `${Au}${Au}`, D.append(d);\n } else if (p.type === f.CONTROL) {\n const d = document.createElement(\"span\"), h = r(((R = p.control) == null ? void 0 : R.value) || []);\n d.innerHTML = h.innerHTML, D.append(d);\n } else if (!p.type || p.type === f.LATEX || nu.includes(p.type)) {\n let d = \"\";\n if (p.type === f.DATE ? d = ((I = p.valueList) == null ? void 0 : I.map((O) => O.value).join(\"\")) || \"\" : d = p.value, !d) continue;\n const h = dt(p, n);\n ((y = l[w - 1]) == null ? void 0 : y.type) === f.TITLE && (d = d.replace(/^\\n/, \"\")), h.innerText = d.replace(new RegExp(`${H}`, \"g\"), `\n`), D.append(h);\n }\n }\n return D;\n }\n const o = document.createElement(\"div\"), c = pt(u);\n for (let l = 0; l < c.length; l++) {\n const D = c[l], i = !D.rowFlex || D.rowFlex === P.LEFT, t = document.createElement(\"div\");\n if (!i) {\n const a = D.data[0];\n ru(a) ? (t.style.display = \"flex\", t.style.justifyContent = Ft(\n a.rowFlex\n )) : t.style.textAlign = xu(\n D.rowFlex\n );\n }\n t.innerHTML = r(D.data).innerHTML, i ? t.childNodes.forEach((a) => {\n o.append(a.cloneNode(!0));\n }) : o.append(t);\n }\n return o;\n}\nfunction ht(u) {\n if (!u || u.nodeType !== 3) return null;\n const e = u.parentNode, n = e.nodeName === \"FONT\" ? e.parentNode : e, r = st(n), o = u.textContent, c = window.getComputedStyle(n);\n if (!o || n.nodeName === \"STYLE\") return null;\n const l = {\n value: o,\n color: c.color,\n bold: Number(c.fontWeight) > 500,\n italic: c.fontStyle.includes(\"italic\"),\n size: Math.floor(parseFloat(c.fontSize))\n };\n return n.nodeName === \"SUB\" || c.verticalAlign === \"sub\" ? l.type = f.SUBSCRIPT : (n.nodeName === \"SUP\" || c.verticalAlign === \"super\") && (l.type = f.SUPERSCRIPT), r !== P.LEFT && (l.rowFlex = r), c.backgroundColor !== \"rgba(0, 0, 0, 0)\" && (l.highlight = c.backgroundColor), c.textDecorationLine.includes(\"underline\") && (l.underline = !0), c.textDecorationLine.includes(\"line-through\") && (l.strikeout = !0), l;\n}\nfunction cu(u, e) {\n const n = [];\n function r(l) {\n if (l.nodeType === 3) {\n const D = ht(l);\n D && n.push(D);\n } else if (l.nodeType === 1) {\n const D = l.childNodes;\n for (let i = 0; i < D.length; i++) {\n const t = D[i];\n if (t.nodeName === \"BR\")\n n.push({\n value: `\n`\n });\n else if (t.nodeName === \"A\") {\n const a = t, s = a.innerText;\n s && n.push({\n type: f.HYPERLINK,\n value: \"\",\n valueList: [\n {\n value: s\n }\n ],\n url: a.href\n });\n } else if (/H[1-6]/.test(t.nodeName)) {\n const s = cu(\n Tt(t, \"div\").outerHTML,\n e\n );\n n.push({\n value: \"\",\n type: f.TITLE,\n level: Te[t.nodeName],\n valueList: s\n }), t.nextSibling && !se.includes(t.nextSibling.nodeName) && n.push({\n value: `\n`\n });\n } else if (t.nodeName === \"UL\" || t.nodeName === \"OL\") {\n const a = t, s = {\n value: \"\",\n type: f.LIST,\n valueList: []\n };\n t.nodeName === \"OL\" ? s.listType = q.OL : (s.listType = q.UL, s.listStyle = a.style.listStyleType), a.querySelectorAll(\"li\").forEach((F) => {\n const E = cu(F.innerHTML, e);\n E.forEach((C) => {\n C.value === `\n` && (C.listWrap = !0);\n }), E.unshift({\n value: `\n`\n }), s.valueList.push(...E);\n }), n.push(s);\n } else if (t.nodeName === \"HR\")\n n.push({\n value: `\n`,\n type: f.SEPARATOR\n });\n else if (t.nodeName === \"IMG\") {\n const { src: a, width: s, height: F } = t;\n a && s && F && n.push({\n width: s,\n height: F,\n value: a,\n type: f.IMAGE\n });\n } else if (t.nodeName === \"VIDEO\") {\n const { src: a, width: s, height: F } = t;\n a && s && F && n.push({\n value: \"\",\n type: f.BLOCK,\n block: {\n type: K.VIDEO,\n videoBlock: {\n src: a\n }\n },\n width: s,\n height: F\n });\n } else if (t.nodeName === \"IFRAME\") {\n const { src: a, srcdoc: s, width: F, height: E } = t;\n (a || s) && F && E && n.push({\n value: \"\",\n type: f.BLOCK,\n block: {\n type: K.IFRAME,\n iframeBlock: {\n src: a,\n srcdoc: s\n }\n },\n width: parseInt(F),\n height: parseInt(E)\n });\n } else if (t.nodeName === \"TABLE\") {\n const a = t, s = {\n type: f.TABLE,\n value: `\n`,\n colgroup: [],\n trList: []\n };\n if (a.querySelectorAll(\"tr\").forEach((F) => {\n const E = window.getComputedStyle(F).height.replace(\"px\", \"\"), C = {\n height: Number(E),\n tdList: []\n };\n F.querySelectorAll(\"th,td\").forEach((A) => {\n const g = A, R = cu(\n g.innerHTML,\n e\n ), I = {\n colspan: g.colSpan,\n rowspan: g.rowSpan,\n value: R\n };\n g.style.backgroundColor && (I.backgroundColor = g.style.backgroundColor), C.tdList.push(I);\n }), s.trList.push(C);\n }), s.trList.length) {\n const F = s.trList[0].tdList.reduce(\n (C, A) => C + A.colspan,\n 0\n ), E = Math.ceil(e.innerWidth / F);\n for (let C = 0; C < F; C++)\n s.colgroup.push({\n width: E\n });\n n.push(s);\n }\n } else t.nodeName === \"INPUT\" && t.type === m.CHECKBOX ? n.push({\n type: f.CHECKBOX,\n value: \"\",\n checkbox: {\n value: t.checked\n }\n }) : t.nodeName === \"INPUT\" && t.type === m.RADIO ? n.push({\n type: f.RADIO,\n value: \"\",\n radio: {\n value: t.checked\n }\n }) : (r(t), t.nodeType === 1 && i !== D.length - 1 && window.getComputedStyle(t).display === \"block\" && n.push({\n value: `\n`\n }));\n }\n }\n }\n const o = document.createElement(\"div\");\n o.innerHTML = u, document.body.appendChild(o);\n const c = [];\n return o.childNodes.forEach((l) => {\n var D;\n l.nodeType !== 1 && !((D = l.textContent) != null && D.trim()) && c.push(l);\n }), c.forEach((l) => l.remove()), r(o), o.remove(), n;\n}\nfunction gt(u) {\n function e(n) {\n var o, c, l, D, i, t, a;\n let r = \"\";\n for (let s = 0; s < n.length; s++) {\n const F = n[s];\n if (F.type === f.TABLE) {\n r += `\n`;\n const E = F.trList;\n for (let C = 0; C < E.length; C++) {\n const A = E[C];\n for (let g = 0; g < A.tdList.length; g++) {\n const R = A.tdList[g], I = e(x(R.value)), y = g === 0, w = A.tdList.length - 1 === g;\n r += `${y ? \"\" : \" \"}${I}${w ? `\n` : \"\"}`;\n }\n }\n } else if (F.type === f.TAB)\n r += \"\t\";\n else if (F.type === f.HYPERLINK)\n r += F.valueList.map((E) => E.value).join(\"\");\n else if (F.type === f.TITLE)\n r += `${e(x(F.valueList))}`;\n else if (F.type === f.LIST) {\n const E = x(F.valueList), C = Uu(E);\n let A = \"\";\n F.listType === q.UL && (A = Be[F.listStyle]), C.forEach((g, R) => {\n const I = C.size - 1 === R;\n r += `\n${A || `${R + 1}.`}${e(\n g\n )}${I ? `\n` : \"\"}`;\n });\n } else if (F.type === f.CHECKBOX)\n r += (o = F.checkbox) != null && o.value ? \"☑\" : \"□\";\n else if (F.type === f.RADIO)\n r += (c = F.radio) != null && c.value ? \"☉\" : \"○\";\n else if (!F.type || F.type === f.LATEX || nu.includes(F.type)) {\n let E = \"\";\n if (F.type === f.CONTROL) {\n const C = ((D = (l = F.control.value) == null ? void 0 : l[0]) == null ? void 0 : D.value) || \"\";\n E = C ? `${((i = F.control) == null ? void 0 : i.preText) || \"\"}${C}${((t = F.control) == null ? void 0 : t.postText) || \"\"}` : \"\";\n } else F.type === f.DATE ? E = ((a = F.valueList) == null ? void 0 : a.map((C) => C.value).join(\"\")) || \"\" : E = F.value;\n r += E.replace(new RegExp(`${H}`, \"g\"), `\n`);\n }\n }\n return r;\n }\n return e(x(u));\n}\nfunction FD(u) {\n return Eu(u, [\n \"metrics\",\n \"style\"\n ]);\n}\nfunction ru(u) {\n return !!(u != null && u.type) && (ce.includes(u.type) || u.imgDisplay === Cu.INLINE);\n}\nfunction Tt(u, e) {\n const n = document.createElement(e);\n for (let r = 0; r < u.attributes.length; r++) {\n const o = u.attributes[r];\n n.setAttribute(o.name, o.value);\n }\n return n.innerHTML = u.innerHTML, n;\n}\nfunction ED(u) {\n const e = [];\n for (let n = 0; n < u.length; n++) {\n const r = u[n];\n r.imgDisplay === Cu.SURROUND && e.push(r);\n }\n return e;\n}\nfunction CD(u, e) {\n var n;\n for (let r = u.length - 1; r >= 0; r--)\n ((n = u[r].imgFloatPosition) == null ? void 0 : n.pageNo) === e && u.splice(r, 1);\n}\nfunction Bt(u) {\n return u.value === H && !u.listWrap;\n}\nfunction fD(u, e) {\n return u === 0 || Bt(e[u - 1]);\n}\nfunction dD(u) {\n return u.type === f.TABLE;\n}\nfunction pD(u) {\n return u.type === f.IMAGE;\n}\nfunction AD(u, e, n = su.BEFORE) {\n var o, c, l, D, i, t, a, s, F, E, C, A;\n if (!((c = (o = u[e]) == null ? void 0 : o.control) != null && c.hide) && !((D = (l = u[e]) == null ? void 0 : l.area) != null && D.hide))\n return e;\n let r = e;\n if (n === su.BEFORE)\n for (r = e - 1; r > 0; ) {\n if (!((t = (i = u[r]) == null ? void 0 : i.control) != null && t.hide) && !((s = (a = u[r]) == null ? void 0 : a.area) != null && s.hide))\n return r;\n r--;\n }\n else\n for (r = e + 1; r < u.length; ) {\n if (!((E = (F = u[r]) == null ? void 0 : F.control) != null && E.hide) && !((A = (C = u[r]) == null ? void 0 : C.area) != null && A.hide))\n return r;\n r++;\n }\n return r;\n}\nexport {\n Hu as AREA_CONTEXT_ATTR,\n Xu as AreaMode,\n ce as BLOCK_ELEMENT_TYPE,\n Iu as BackgroundRepeat,\n vu as BackgroundSize,\n K as BlockType,\n wt as CONTROL_CONTEXT_ATTR,\n Pu as CONTROL_STYLE_ATTR,\n xt as CURSOR_AGENT_OFFSET_HEIGHT,\n m as ControlComponent,\n zu as ControlIndentation,\n Wu as ControlState,\n Y as ControlType,\n vt as DOCX_EDITOR_DATA_VERSION,\n It as DOCX_EDITOR_SCHEMA_VERSION,\n ue as DashType,\n Lt as EDITOR_CLIPBOARD,\n Ot as EDITOR_COMPONENT,\n wu as EDITOR_ELEMENT_CONTEXT_ATTR,\n Ht as EDITOR_ELEMENT_COPY_ATTR,\n Pt as EDITOR_ELEMENT_STYLE_ATTR,\n oe as EDITOR_ELEMENT_ZIP_ATTR,\n Xt as EDITOR_FONT_OPTIONS,\n ne as EDITOR_PREFIX,\n uu as EDITOR_ROW_ATTR,\n Mt as EDITOR_SIZE_OPTIONS,\n ju as EditorComponent,\n Vu as EditorContext,\n fu as EditorMode,\n Yu as EditorZone,\n $u as ElementStyleKey,\n f as ElementType,\n Ee as FORMAT_PLACEHOLDER,\n Mu as FlexDirection,\n bt as HORIZON_TAB,\n _t as IMAGE_ELEMENT_TYPE,\n se as INLINE_NODE_NAME,\n Ut as INTERNAL_SHORTCUT_KEY,\n Cu as ImageDisplay,\n qu as KeyMap,\n le as LETTER_CLASS,\n ae as LIST_CONTEXT_ATTR,\n mu as LineNumberType,\n N as ListStyle,\n q as ListType,\n su as LocationPosition,\n yt as METRICS_BASIS_TEXT,\n $ as MaxHeightRatio,\n Zu as MouseEventButton,\n Ju as MoveDirection,\n mt as NBSP,\n Au as NON_BREAKING_SPACE,\n zt as NUMBER_LIKE_REG,\n G as NumberType,\n Qu as OlStyle,\n Gt as PAGE_NUMBER_STYLES,\n St as PUNCTUATION_LIST,\n Wt as PUNCTUATION_REG,\n Ou as PageMode,\n Lu as PaperDirection,\n bu as RenderMode,\n P as RowFlex,\n pu as START_LINE_BREAK_REG,\n Nu as TABLE_CONTEXT_ATTR,\n ie as TABLE_TD_ZIP_ATTR,\n nu as TEXTLIKE_ELEMENT_TYPE,\n yu as TITLE_CONTEXT_ATTR,\n tu as TableBorder,\n te as TableOrder,\n J as TdBorder,\n ee as TdSlash,\n Ku as TextDecorationStyle,\n S as TitleLevel,\n pe as UNICODE_SYMBOL_REG,\n b as UlStyle,\n kt as VIRTUAL_ELEMENT_TYPE,\n du as VerticalAlign,\n Rt as WRAP,\n Su as WatermarkType,\n Ru as WordBreak,\n H as ZERO,\n sD as buildCatalogFromElementList,\n iu as cloneProperty,\n uD as convertNumberToChinese,\n eD as convertStringToBase64,\n At as createDomFromElementList,\n jt as debounce,\n ku as deepClone,\n Eu as deepCloneOmitKeys,\n Le as defaultBackground,\n Re as defaultBadgeOption,\n be as defaultCheckboxOption,\n me as defaultControlOption,\n Fe as defaultCursorOption,\n Se as defaultFooterOption,\n Ne as defaultGroupOption,\n ye as defaultHeaderOption,\n Pe as defaultLineBreak,\n Ue as defaultLineNumberOption,\n lu as defaultModeRuleOption,\n He as defaultPageBorderOption,\n we as defaultPageBreakOption,\n Ce as defaultPageNumberOption,\n Oe as defaultPlaceholderOption,\n _e as defaultRadioOption,\n ke as defaultSeparatorOption,\n xe as defaultTableOption,\n he as defaultTitleOption,\n Ae as defaultWatermarkOption,\n Ge as defaultZoneOption,\n CD as deleteSurroundElementList,\n $t as downloadFile,\n Yt as findParent,\n tD as findScrollContainer,\n ft as formatElementContext,\n Q as formatElementList,\n Ct as getAnchorElement,\n cu as getElementListByHTML,\n ru as getIsBlockElement,\n AD as getNonHideElementIndex,\n at as getOrCreateTitleId,\n FD as getSlimCloneElementList,\n gt as getTextFromElementList,\n X as getUUID,\n Zt as handleTripleClick,\n lt as isApple,\n gu as isArray,\n Me as isArrayEqual,\n nt as isElement,\n lD as isElementList,\n fD as isFirstElementOfParagraph,\n oD as isIOS,\n pD as isImageElement,\n iD as isMobile,\n aD as isMod,\n rD as isNonValue,\n qt as isNumber,\n hu as isObject,\n Me as isObjectEqual,\n Bt as isParagraphSeparator,\n DD as isRectIntersect,\n Qt as isString,\n dD as isTableElement,\n Et as isTextLikeElement,\n Ie as listStyleCSSMapping,\n ve as listTypeElementMapping,\n Nt as maxHeightRadioMapping,\n Jt as mergeObject,\n ot as mergeOption,\n Kt as nextTick,\n nD as normalizeLineBreak,\n rt as omitObject,\n au as pickElementAttr,\n Du as pickObject,\n ED as pickSurroundElementList,\n j as splitText,\n Vt as throttle,\n Te as titleNodeNameMapping,\n Fu as titleOrderNumberMapping,\n ge as titleSizeMapping,\n Be as ulStyleMapping,\n cD as writeElementList,\n x as zipElementList\n};\n//# sourceMappingURL=docx-editor-schema.js.map\n","import {\r\n DOCX_EDITOR_SCHEMA_VERSION,\r\n EDITOR_CLIPBOARD,\r\n createDomFromElementList,\r\n zipElementList\r\n} from '@vervedoc/docx-editor-schema'\r\nimport type {\r\n DeepRequired,\r\n IEditorOption,\r\n IElement\r\n} from '@vervedoc/docx-editor-schema'\r\n\r\nexport const version = DOCX_EDITOR_SCHEMA_VERSION\r\n\r\nexport class HistoryManager {\r\n constructor(..._: any[]) {}\r\n undo(..._: any[]) {}\r\n redo(..._: any[]) {}\r\n recovery(..._: any[]) {}\r\n clear(..._: any[]) {}\r\n popUndo(..._: any[]): any { return undefined }\r\n isStackEmpty(..._: any[]): boolean { return true }\r\n isCanUndo(..._: any[]): boolean { return false }\r\n isCanRedo(..._: any[]): boolean { return false }\r\n execute(..._: any[]) {}\r\n destroy(..._: any[]) {}\r\n}\r\n\r\nexport class WorkerManager {\r\n constructor(..._: any[]) {}\r\n destroy(..._: any[]) {}\r\n}\r\n\r\nexport class I18n {\r\n constructor(..._: any[]) {}\r\n t(key: string, ..._args: any[]): string { return key }\r\n registerLangMap(..._: any[]) {}\r\n destroy(..._: any[]) {}\r\n}\r\n\r\nexport class Actuator {\r\n constructor(..._: any[]) {}\r\n}\r\n\r\nexport class LaTexParticle {\r\n constructor(..._: any[]) {}\r\n render(..._: any[]) {}\r\n}\r\n\r\nexport class DateParticle {\r\n constructor(..._: any[]) {}\r\n render(..._: any[]) {}\r\n renderDatePicker(..._: any[]) {}\r\n clearDatePicker(..._: any[]) {}\r\n destroy(..._: any[]) {}\r\n}\r\n\r\nexport class BlockParticle {\r\n constructor(..._: any[]) {}\r\n render(..._: any[]) {}\r\n clear(..._: any[]) {}\r\n destroy(..._: any[]) {}\r\n}\r\n\r\nexport class DatePicker {\r\n constructor(..._: any[]) {}\r\n render(..._: any[]) {}\r\n destroy(..._: any[]) {}\r\n}\r\n\r\nexport interface IClipboardData {\r\n text: string\r\n elementList: IElement[]\r\n}\r\n\r\nfunction setClipboardData(data: IClipboardData) {\r\n if (typeof localStorage === 'undefined') return\r\n try {\r\n localStorage.setItem(\r\n EDITOR_CLIPBOARD,\r\n JSON.stringify({\r\n text: data.text,\r\n elementList: data.elementList\r\n })\r\n )\r\n } catch {\r\n // Ignore storage failures and still allow the system clipboard path.\r\n }\r\n}\r\n\r\nexport function getClipboardData(): IClipboardData | null {\r\n if (typeof localStorage === 'undefined') return null\r\n try {\r\n const clipboardText = localStorage.getItem(EDITOR_CLIPBOARD)\r\n if (!clipboardText) return null\r\n const clipboardData = JSON.parse(clipboardText)\r\n if (\r\n typeof clipboardData?.text === 'string' &&\r\n Array.isArray(clipboardData?.elementList)\r\n ) {\r\n return clipboardData\r\n }\r\n } catch {\r\n // Ignore malformed clipboard cache.\r\n }\r\n return null\r\n}\r\n\r\nexport function getIsClipboardContainFile(clipboardData: DataTransfer): boolean {\r\n return Array.from(clipboardData.items).some(item => item.kind === 'file')\r\n}\r\n\r\nexport function removeClipboardData(): void {\r\n if (typeof localStorage === 'undefined') return\r\n try {\r\n localStorage.removeItem(EDITOR_CLIPBOARD)\r\n } catch {\r\n // Ignore storage failures.\r\n }\r\n}\r\n\r\nfunction fallbackWriteClipboardItem(html: string) {\r\n if (typeof document === 'undefined' || typeof window === 'undefined') return\r\n const fakeElement = document.createElement('div')\r\n fakeElement.setAttribute('contenteditable', 'true')\r\n fakeElement.style.position = 'fixed'\r\n fakeElement.style.left = '-9999px'\r\n fakeElement.style.top = '0'\r\n fakeElement.style.opacity = '0'\r\n fakeElement.innerHTML = html\r\n const selection = window.getSelection()\r\n const ranges: Range[] = []\r\n if (selection) {\r\n for (let i = 0; i < selection.rangeCount; i++) {\r\n ranges.push(selection.getRangeAt(i).cloneRange())\r\n }\r\n }\r\n const range = document.createRange()\r\n const br = document.createElement('span')\r\n br.innerText = '\\n'\r\n fakeElement.append(br)\r\n document.body.append(fakeElement)\r\n range.selectNodeContents(fakeElement)\r\n selection?.removeAllRanges()\r\n selection?.addRange(range)\r\n try {\r\n document.execCommand('copy')\r\n } finally {\r\n selection?.removeAllRanges()\r\n ranges.forEach(savedRange => selection?.addRange(savedRange))\r\n fakeElement.remove()\r\n }\r\n}\r\n\r\nfunction writeClipboardItem(\r\n text: string,\r\n html: string,\r\n elementList: IElement[]\r\n) {\r\n if (!text && !html && !elementList.length) return\r\n setClipboardData({ text, elementList })\r\n if (typeof window === 'undefined') return\r\n const clipboard = window.navigator?.clipboard\r\n const ClipboardItemCtor = window.ClipboardItem\r\n if (clipboard?.write && ClipboardItemCtor) {\r\n const plainText = new Blob([text], { type: 'text/plain' })\r\n const htmlText = new Blob([html], { type: 'text/html' })\r\n // @ts-ignore Browser ClipboardItem typing differs across runtimes.\r\n const item = new ClipboardItemCtor({\r\n [plainText.type]: plainText,\r\n [htmlText.type]: htmlText\r\n })\r\n void clipboard.write([item]).catch(() => fallbackWriteClipboardItem(html))\r\n return\r\n }\r\n fallbackWriteClipboardItem(html)\r\n}\r\n\r\nexport function writeElementList(\r\n elementList: IElement[],\r\n options: DeepRequired<IEditorOption>\r\n): string {\r\n if (typeof document === 'undefined') {\r\n return JSON.stringify(elementList)\r\n }\r\n const clipboardDom = createDomFromElementList(elementList, options)\r\n document.body.append(clipboardDom)\r\n const text = clipboardDom.innerText\r\n const html = clipboardDom.innerHTML\r\n clipboardDom.remove()\r\n if (!text && !html && !elementList.length) return ''\r\n writeClipboardItem(text, html, zipElementList(elementList))\r\n return text\r\n}\r\n\r\nexport class Shortcut {\r\n constructor(..._: any[]) {}\r\n registerShortcutList(..._: any[]) {}\r\n removeEvent() {}\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { VIRTUAL_ELEMENT_TYPE } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { IPasteOption } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n getClipboardData,\r\n getIsClipboardContainFile,\r\n removeClipboardData\r\n} from '../../plugin-stubs'\r\nimport {\r\n formatElementContext,\r\n getElementListByHTML\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\nimport { IOverrideResult } from '../../plugin/override/Override'\r\nimport { normalizeLineBreak } from '@vervedoc/docx-editor-schema'\r\n\r\nexport function pasteElement(host: CanvasEvent, elementList: IElement[]) {\r\n const draw = host.getDraw()\r\n if (\r\n draw.isReadonly() ||\r\n draw.isDisabled() ||\r\n draw.getControl().getIsDisabledPasteControl()\r\n ) {\r\n return\r\n }\r\n const rangeManager = draw.getRange()\r\n const { startIndex } = rangeManager.getRange()\r\n const originalElementList = draw.getElementList()\r\n // 全选粘贴无需格式化上下文\r\n if (~startIndex && !rangeManager.getIsSelectAll()) {\r\n // 如果是复制到虚拟元素里,则粘贴列表的虚拟元素需扁平化处理,避免产生新的虚拟元素\r\n const anchorElement = originalElementList[startIndex]\r\n if (anchorElement?.titleId || anchorElement?.listId) {\r\n let start = 0\r\n while (start < elementList.length) {\r\n const pasteElement = elementList[start]\r\n if (anchorElement.titleId && /^\\n/.test(pasteElement.value)) {\r\n break\r\n }\r\n if (VIRTUAL_ELEMENT_TYPE.includes(pasteElement.type!)) {\r\n elementList.splice(start, 1)\r\n if (pasteElement.valueList) {\r\n for (let v = 0; v < pasteElement.valueList.length; v++) {\r\n const element = pasteElement.valueList[v]\r\n if (element.value === ZERO || element.value === '\\n') {\r\n continue\r\n }\r\n elementList.splice(start, 0, element)\r\n start++\r\n }\r\n }\r\n start--\r\n }\r\n start++\r\n }\r\n }\r\n formatElementContext(originalElementList, elementList, startIndex, {\r\n isBreakWhenWrap: true,\r\n editorOptions: draw.getOptions()\r\n })\r\n }\r\n draw.insertElementList(elementList)\r\n}\r\n\r\nexport function pasteHTML(host: CanvasEvent, htmlText: string) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly() || draw.isDisabled()) return\r\n const elementList = getElementListByHTML(htmlText, {\r\n innerWidth: draw.getOriginalInnerWidth()\r\n })\r\n pasteElement(host, elementList)\r\n}\r\n\r\nexport function pasteImage(host: CanvasEvent, file: File | Blob) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly() || draw.isDisabled()) return\r\n const rangeManager = draw.getRange()\r\n const { startIndex } = rangeManager.getRange()\r\n const elementList = draw.getElementList()\r\n // 创建文件读取器\r\n const fileReader = new FileReader()\r\n fileReader.readAsDataURL(file)\r\n fileReader.onload = () => {\r\n // 计算宽高\r\n const image = new Image()\r\n const value = fileReader.result as string\r\n image.src = value\r\n image.onload = () => {\r\n const imageElement: IElement = {\r\n value,\r\n type: ElementType.IMAGE,\r\n width: image.width,\r\n height: image.height\r\n }\r\n if (~startIndex) {\r\n formatElementContext(elementList, [imageElement], startIndex, {\r\n editorOptions: draw.getOptions()\r\n })\r\n }\r\n draw.insertElementList([imageElement])\r\n }\r\n }\r\n}\r\n\r\nexport function pasteByEvent(host: CanvasEvent, evt: ClipboardEvent) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly() || draw.isDisabled()) return\r\n const clipboardData = evt.clipboardData\r\n if (!clipboardData) return\r\n // 自定义粘贴事件\r\n const { paste } = draw.getOverride()\r\n if (paste) {\r\n const overrideResult = paste(evt)\r\n // 默认阻止默认事件\r\n if ((<IOverrideResult>overrideResult)?.preventDefault !== false) return\r\n }\r\n // 优先读取编辑器内部粘贴板数据(粘贴板不包含文件时)\r\n if (!getIsClipboardContainFile(clipboardData)) {\r\n const clipboardText = clipboardData.getData('text')\r\n const editorClipboardData = getClipboardData()\r\n // 不同系统间默认换行符不同 windows:\\r\\n mac:\\n\r\n if (\r\n editorClipboardData &&\r\n normalizeLineBreak(clipboardText) ===\r\n normalizeLineBreak(editorClipboardData.text)\r\n ) {\r\n pasteElement(host, editorClipboardData.elementList)\r\n return\r\n }\r\n }\r\n removeClipboardData()\r\n // 从粘贴板提取数据\r\n let isHTML = false\r\n for (let i = 0; i < clipboardData.items.length; i++) {\r\n const item = clipboardData.items[i]\r\n if (item.type === 'text/html') {\r\n isHTML = true\r\n break\r\n }\r\n }\r\n for (let i = 0; i < clipboardData.items.length; i++) {\r\n const item = clipboardData.items[i]\r\n if (item.kind === 'string') {\r\n if (item.type === 'text/plain' && !isHTML) {\r\n item.getAsString(plainText => {\r\n host.input(plainText)\r\n })\r\n break\r\n }\r\n if (item.type === 'text/html' && isHTML) {\r\n item.getAsString(htmlText => {\r\n pasteHTML(host, htmlText)\r\n })\r\n break\r\n }\r\n } else if (item.kind === 'file') {\r\n if (item.type.includes('image')) {\r\n const file = item.getAsFile()\r\n if (file) {\r\n pasteImage(host, file)\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport async function pasteByApi(host: CanvasEvent, options?: IPasteOption) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly() || draw.isDisabled()) return\r\n // 自定义粘贴事件\r\n const { paste } = draw.getOverride()\r\n if (paste) {\r\n const overrideResult = paste()\r\n // 默认阻止默认事件\r\n if ((<IOverrideResult>overrideResult)?.preventDefault !== false) return\r\n }\r\n const editorClipboardData = getClipboardData()\r\n let clipboardText = ''\r\n try {\r\n clipboardText = await navigator.clipboard.readText()\r\n } catch {\r\n clipboardText = editorClipboardData?.text || ''\r\n }\r\n if (\r\n editorClipboardData &&\r\n normalizeLineBreak(clipboardText) ===\r\n normalizeLineBreak(editorClipboardData.text)\r\n ) {\r\n pasteElement(host, editorClipboardData.elementList)\r\n return\r\n }\r\n removeClipboardData()\r\n // 从内存粘贴板获取数据\r\n if (options?.isPlainText) {\r\n if (clipboardText) {\r\n host.input(clipboardText)\r\n }\r\n } else {\r\n let clipboardData: ClipboardItem[] = []\r\n try {\r\n clipboardData = await navigator.clipboard.read()\r\n } catch {\r\n if (clipboardText) {\r\n host.input(clipboardText)\r\n }\r\n return\r\n }\r\n let isHTML = false\r\n for (const item of clipboardData) {\r\n if (item.types.includes('text/html')) {\r\n isHTML = true\r\n break\r\n }\r\n }\r\n for (const item of clipboardData) {\r\n if (item.types.includes('text/plain') && !isHTML) {\r\n const textBlob = await item.getType('text/plain')\r\n const text = await textBlob.text()\r\n if (text) {\r\n host.input(text)\r\n }\r\n } else if (item.types.includes('text/html') && isHTML) {\r\n const htmlTextBlob = await item.getType('text/html')\r\n const htmlText = await htmlTextBlob.text()\r\n if (htmlText) {\r\n pasteHTML(host, htmlText)\r\n }\r\n } else if (item.types.some(type => type.startsWith('image/'))) {\r\n const type = item.types.find(type => type.startsWith('image/'))!\r\n const imageBlob = await item.getType(type)\r\n pasteImage(host, imageBlob)\r\n }\r\n }\r\n }\r\n}\r\n","import { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { EventBusMap } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { CanvasEvent } from '../event/CanvasEvent'\r\nimport { EventBus } from '@vervedoc/docx-editor-state'\r\nimport { pasteByEvent } from '../event/handlers/paste'\r\n\r\nexport class CursorAgent {\r\n private draw: Draw\r\n private container: HTMLDivElement\r\n private agentCursorDom: HTMLTextAreaElement\r\n private canvasEvent: CanvasEvent\r\n private eventBus: EventBus<EventBusMap>\r\n\r\n constructor(draw: Draw, canvasEvent: CanvasEvent) {\r\n this.draw = draw\r\n this.container = draw.getContainer()\r\n this.canvasEvent = canvasEvent\r\n this.eventBus = draw.getEventBus()\r\n // 代理光标绘制\r\n const agentCursorDom = document.createElement('textarea')\r\n agentCursorDom.autocomplete = 'off'\r\n agentCursorDom.classList.add(`${EDITOR_PREFIX}-inputarea`)\r\n agentCursorDom.innerText = ''\r\n this.container.append(agentCursorDom)\r\n this.agentCursorDom = agentCursorDom\r\n // 事件\r\n agentCursorDom.onkeydown = (evt: KeyboardEvent) => this._keyDown(evt)\r\n agentCursorDom.oninput = this._input.bind(this)\r\n agentCursorDom.onpaste = (evt: ClipboardEvent) => this._paste(evt)\r\n agentCursorDom.addEventListener(\r\n 'compositionstart',\r\n this._compositionstart.bind(this)\r\n )\r\n agentCursorDom.addEventListener(\r\n 'compositionend',\r\n this._compositionend.bind(this)\r\n )\r\n }\r\n\r\n public getAgentCursorDom(): HTMLTextAreaElement {\r\n return this.agentCursorDom\r\n }\r\n\r\n private _keyDown(evt: KeyboardEvent) {\r\n this.canvasEvent.keydown(evt)\r\n }\r\n\r\n private _input(evt: Event) {\r\n const data = (<InputEvent>evt).data\r\n if (data) {\r\n this.canvasEvent.input(data)\r\n }\r\n if (this.eventBus.hasSubscribers('input')) {\r\n this.eventBus.emit('input', evt)\r\n }\r\n }\r\n\r\n private _paste(evt: ClipboardEvent) {\r\n const isReadonly = this.draw.isReadonly()\r\n if (isReadonly) return\r\n const clipboardData = evt.clipboardData\r\n if (!clipboardData) return\r\n pasteByEvent(this.canvasEvent, evt)\r\n evt.preventDefault()\r\n }\r\n\r\n private _compositionstart() {\r\n this.canvasEvent.compositionstart()\r\n }\r\n\r\n private _compositionend(evt: CompositionEvent) {\r\n this.canvasEvent.compositionend(evt)\r\n }\r\n}\r\n","import { CURSOR_AGENT_OFFSET_HEIGHT } from '@vervedoc/docx-editor-schema'\r\nimport { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { ICursorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { findScrollContainer } from '@vervedoc/docx-editor-schema'\r\nimport { isMobile } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { CanvasEvent } from '../event/CanvasEvent'\r\nimport { Position } from '../position/Position'\r\nimport { CursorAgent } from './CursorAgent'\r\n\r\nexport type IDrawCursorOption = ICursorOption & {\r\n isShow?: boolean\r\n isBlink?: boolean\r\n isFocus?: boolean\r\n hitLineStartIndex?: number\r\n}\r\n\r\nexport interface IMoveCursorToVisibleOption {\r\n direction: MoveDirection\r\n cursorPosition: IElementPosition\r\n}\r\n\r\nexport class Cursor {\r\n private readonly ANIMATION_CLASS = `${EDITOR_PREFIX}-cursor--animation`\r\n\r\n private draw: Draw\r\n private container: HTMLDivElement\r\n private options: DeepRequired<IEditorOption>\r\n private position: Position\r\n private cursorDom: HTMLDivElement\r\n private cursorAgent: CursorAgent\r\n private blinkTimeout: number | null\r\n private hitLineStartIndex: number | undefined\r\n\r\n constructor(draw: Draw, canvasEvent: CanvasEvent) {\r\n this.draw = draw\r\n this.container = draw.getContainer()\r\n this.position = draw.getPosition()\r\n this.options = draw.getOptions()\r\n\r\n this.cursorDom = document.createElement('div')\r\n this.cursorDom.classList.add(`${EDITOR_PREFIX}-cursor`)\r\n this.container.append(this.cursorDom)\r\n this.cursorAgent = new CursorAgent(draw, canvasEvent)\r\n this.blinkTimeout = null\r\n }\r\n\r\n public getCursorDom(): HTMLDivElement {\r\n return this.cursorDom\r\n }\r\n\r\n public getAgentDom(): HTMLTextAreaElement {\r\n return this.cursorAgent.getAgentCursorDom()\r\n }\r\n\r\n public getAgentIsActive(): boolean {\r\n return this.getAgentDom() === document.activeElement\r\n }\r\n\r\n public getAgentDomValue(): string {\r\n return this.getAgentDom().value\r\n }\r\n\r\n public clearAgentDomValue() {\r\n this.getAgentDom().value = ''\r\n }\r\n\r\n public getHitLineStartIndex() {\r\n return this.hitLineStartIndex\r\n }\r\n\r\n private _blinkStart() {\r\n this.cursorDom.classList.add(this.ANIMATION_CLASS)\r\n }\r\n\r\n private _blinkStop() {\r\n this.cursorDom.classList.remove(this.ANIMATION_CLASS)\r\n }\r\n\r\n private _setBlinkTimeout() {\r\n this._clearBlinkTimeout()\r\n this.blinkTimeout = window.setTimeout(() => {\r\n this._blinkStart()\r\n }, 500)\r\n }\r\n\r\n private _clearBlinkTimeout() {\r\n if (this.blinkTimeout) {\r\n this._blinkStop()\r\n window.clearTimeout(this.blinkTimeout)\r\n this.blinkTimeout = null\r\n }\r\n }\r\n\r\n public focus() {\r\n // 移动端只读模式禁用聚焦避免唤起输入法,web端允许聚焦避免事件无法捕获\r\n if (isMobile && this.draw.isReadonly()) return\r\n const agentCursorDom = this.cursorAgent.getAgentCursorDom()\r\n // 光标不聚焦时重新定位\r\n if (document.activeElement !== agentCursorDom) {\r\n agentCursorDom.focus()\r\n agentCursorDom.setSelectionRange(0, 0)\r\n }\r\n }\r\n\r\n public drawCursor(payload?: IDrawCursorOption) {\r\n let cursorPosition = this.position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const { scale, cursor } = this.options\r\n const {\r\n color,\r\n width,\r\n isShow = true,\r\n isBlink = true,\r\n isFocus = true,\r\n hitLineStartIndex\r\n } = { ...cursor, ...payload }\r\n // 设置光标代理\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n // 光标位置\r\n this.hitLineStartIndex = hitLineStartIndex\r\n if (hitLineStartIndex) {\r\n const positionList = this.position.getPositionList()\r\n cursorPosition = positionList[hitLineStartIndex]\r\n }\r\n const {\r\n metrics,\r\n coordinate: { leftTop, rightTop },\r\n ascent,\r\n pageNo\r\n } = cursorPosition\r\n const zoneManager = this.draw.getZone()\r\n const curPageNo = zoneManager.isMainActive()\r\n ? pageNo\r\n : this.draw.getPageNo()\r\n const preY = curPageNo * (height + pageGap)\r\n // 默认偏移高度\r\n const defaultOffsetHeight = CURSOR_AGENT_OFFSET_HEIGHT * scale\r\n // 增加1/4字体大小(最小为defaultOffsetHeight即默认偏移高度)\r\n const increaseHeight = Math.min(metrics.height / 4, defaultOffsetHeight)\r\n const cursorHeight = metrics.height + increaseHeight * 2\r\n const agentCursorDom = this.cursorAgent.getAgentCursorDom()\r\n if (isFocus) {\r\n setTimeout(() => {\r\n this.focus()\r\n })\r\n }\r\n // fillText位置 + 文字基线到底部距离 - 模拟光标偏移量\r\n const descent =\r\n metrics.boundingBoxDescent < 0 ? 0 : metrics.boundingBoxDescent\r\n const cursorTop =\r\n leftTop[1] + ascent + descent - (cursorHeight - increaseHeight) + preY\r\n const cursorLeft = hitLineStartIndex ? leftTop[0] : rightTop[0]\r\n agentCursorDom.style.left = `${cursorLeft}px`\r\n agentCursorDom.style.top = `${\r\n cursorTop + cursorHeight - defaultOffsetHeight\r\n }px`\r\n // 模拟光标显示\r\n if (!isShow) {\r\n this.recoveryCursor()\r\n return\r\n }\r\n const isReadonly = this.draw.isReadonly()\r\n this.cursorDom.style.width = `${width * scale}px`\r\n this.cursorDom.style.backgroundColor = color\r\n this.cursorDom.style.left = `${cursorLeft}px`\r\n this.cursorDom.style.top = `${cursorTop}px`\r\n this.cursorDom.style.display = isReadonly ? 'none' : 'block'\r\n this.cursorDom.style.height = `${cursorHeight}px`\r\n if (isBlink) {\r\n this._setBlinkTimeout()\r\n } else {\r\n this._clearBlinkTimeout()\r\n }\r\n }\r\n\r\n public recoveryCursor() {\r\n this.cursorDom.style.display = 'none'\r\n this._clearBlinkTimeout()\r\n }\r\n\r\n public moveCursorToVisible(payload: IMoveCursorToVisibleOption) {\r\n const { cursorPosition, direction } = payload\r\n if (!cursorPosition || !direction) return\r\n const {\r\n pageNo,\r\n coordinate: { leftTop, leftBottom }\r\n } = cursorPosition\r\n // 当前页面距离滚动容器顶部距离\r\n const prePageY =\r\n pageNo * (this.draw.getHeight() + this.draw.getPageGap()) +\r\n this.container.getBoundingClientRect().top\r\n // 向上移动时:以顶部距离为准,向下移动时:以底部位置为准\r\n const isUp = direction === MoveDirection.UP\r\n const x = leftBottom[0]\r\n const y = isUp ? leftTop[1] + prePageY : leftBottom[1] + prePageY\r\n // 查找滚动容器,如果是滚动容器是document,则限制范围为当前窗口\r\n const scrollContainer = findScrollContainer(this.container)\r\n const rect = {\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n bottom: 0\r\n }\r\n if (scrollContainer === document.documentElement) {\r\n rect.right = window.innerWidth\r\n rect.bottom = window.innerHeight\r\n } else {\r\n const { left, right, top, bottom } =\r\n scrollContainer.getBoundingClientRect()\r\n rect.left = left\r\n rect.right = right\r\n rect.top = top\r\n rect.bottom = bottom\r\n }\r\n // 可视范围根据参数调整\r\n const { maskMargin } = this.options\r\n rect.top += maskMargin[0]\r\n rect.bottom -= maskMargin[2]\r\n // 不在可视范围时,移动滚动条到合适位置\r\n if (\r\n !(x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom)\r\n ) {\r\n const { scrollLeft, scrollTop } = scrollContainer\r\n isUp\r\n ? scrollContainer.scroll(scrollLeft, scrollTop - (rect.top - y))\r\n : scrollContainer.scroll(scrollLeft, scrollTop + y - rect.bottom)\r\n }\r\n }\r\n}\r\n","import { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControlContext,\r\n IControlInstance,\r\n IControlRuleOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { Control } from './Control'\r\n\r\nexport class CheckboxControl implements IControlInstance {\r\n protected element: IElement\r\n protected control: Control\r\n\r\n constructor(element: IElement, control: Control) {\r\n this.element = element\r\n this.control = control\r\n }\r\n\r\n public setElement(element: IElement) {\r\n this.element = element\r\n }\r\n\r\n public getElement(): IElement {\r\n return this.element\r\n }\r\n\r\n public getCode(): string | null {\r\n return this.element.control?.code || null\r\n }\r\n\r\n public getValue(): IElement[] {\r\n const elementList = this.control.getElementList()\r\n const { startIndex } = this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n const data: IElement[] = []\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n if (preElement.controlComponent === ControlComponent.VALUE) {\r\n data.unshift(preElement)\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n break\r\n }\r\n if (nextElement.controlComponent === ControlComponent.VALUE) {\r\n data.push(nextElement)\r\n }\r\n nextIndex++\r\n }\r\n return data\r\n }\r\n\r\n public setValue(): number {\r\n return -1\r\n }\r\n\r\n public setSelect(\r\n codes: string[],\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ) {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return\r\n }\r\n const { control } = this.element\r\n const elementList = context.elementList || this.control.getElementList()\r\n const { startIndex } = context.range || this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n if (preElement.controlComponent === ControlComponent.CHECKBOX) {\r\n const checkbox = preElement.checkbox!\r\n checkbox.value = codes.includes(checkbox.code!)\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n break\r\n }\r\n if (nextElement.controlComponent === ControlComponent.CHECKBOX) {\r\n const checkbox = nextElement.checkbox!\r\n checkbox.value = codes.includes(checkbox.code!)\r\n }\r\n nextIndex++\r\n }\r\n control!.code = codes.join(',')\r\n this.control.repaintControl({\r\n curIndex: startIndex,\r\n isSetCursor: false\r\n })\r\n this.control.emitControlContentChange({\r\n context\r\n })\r\n }\r\n\r\n public keydown(evt: KeyboardEvent): number | null {\r\n if (this.control.getIsDisabledControl()) {\r\n return null\r\n }\r\n const range = this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = range\r\n // 删除\r\n if (evt.key === KeyMap.Backspace || evt.key === KeyMap.Delete) {\r\n return this.control.removeControl(startIndex)\r\n }\r\n return endIndex\r\n }\r\n\r\n public cut(): number {\r\n return -1\r\n }\r\n}\r\n","import { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControlContext,\r\n IControlRuleOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { CheckboxControl } from '../CheckboxControl'\r\n\r\nexport class RadioControl extends CheckboxControl {\r\n public setSelect(\r\n codes: string[],\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ) {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return\r\n }\r\n const { control } = this.element\r\n const elementList = context.elementList || this.control.getElementList()\r\n const { startIndex } = context.range || this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n if (preElement.controlComponent === ControlComponent.RADIO) {\r\n const radio = preElement.radio!\r\n radio.value = codes.includes(radio.code!)\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n break\r\n }\r\n if (nextElement.controlComponent === ControlComponent.RADIO) {\r\n const radio = nextElement.radio!\r\n radio.value = codes.includes(radio.code!)\r\n }\r\n nextIndex++\r\n }\r\n control!.code = codes.join(',')\r\n this.control.repaintControl({\r\n curIndex: startIndex,\r\n isSetCursor: false\r\n })\r\n this.control.emitControlContentChange({\r\n context\r\n })\r\n }\r\n}\r\n","import { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { EditorMode } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { MouseEventButton } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ControlType } from '@vervedoc/docx-editor-schema'\r\nimport { IPreviewerDrawOption } from '@vervedoc/docx-editor-schema'\r\nimport { deepClone } from '@vervedoc/docx-editor-schema'\r\nimport { isMod } from '@vervedoc/docx-editor-schema'\r\nimport { CheckboxControl } from '../../control/CheckboxControl'\r\nimport { RadioControl } from '../../control/radio/RadioControl'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../../draw/Draw'\r\n\r\nexport function setRangeCache(host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const position = draw.getPosition()\r\n const rangeManager = draw.getRange()\r\n // 缓存选区上下文信息\r\n host.isAllowDrag = true\r\n host.cacheRange = deepClone(rangeManager.getRange())\r\n host.cacheElementList = draw.getElementList()\r\n host.cachePositionList = position.getPositionList()\r\n host.cachePositionContext = position.getPositionContext()\r\n}\r\n\r\nexport function hitCheckbox(element: IElement, draw: Draw) {\r\n const { checkbox, control } = element\r\n // 复选框不在控件内独立控制\r\n if (!control) {\r\n draw.getCheckboxParticle().setSelect(element)\r\n } else {\r\n const codes = control?.code ? control.code.split(',') : []\r\n if (checkbox?.value) {\r\n const codeIndex = codes.findIndex(c => c === checkbox.code)\r\n codes.splice(codeIndex, 1)\r\n } else {\r\n if (checkbox?.code) {\r\n codes.push(checkbox.code)\r\n }\r\n }\r\n const activeControl = draw.getControl().getActiveControl()\r\n if (activeControl instanceof CheckboxControl) {\r\n activeControl.setSelect(codes)\r\n }\r\n }\r\n}\r\n\r\nexport function hitRadio(element: IElement, draw: Draw) {\r\n const { radio, control } = element\r\n // 单选框不在控件内独立控制\r\n if (!control) {\r\n draw.getRadioParticle().setSelect(element)\r\n } else {\r\n const codes = radio?.code ? [radio.code] : []\r\n const activeControl = draw.getControl().getActiveControl()\r\n if (activeControl instanceof RadioControl) {\r\n activeControl.setSelect(codes)\r\n }\r\n }\r\n}\r\n\r\nexport function mousedown(evt: MouseEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const isReadonly = draw.isReadonly()\r\n const rangeManager = draw.getRange()\r\n const position = draw.getPosition()\r\n // 存在选区时忽略右键点击\r\n const range = rangeManager.getRange()\r\n if (\r\n evt.button === MouseEventButton.RIGHT &&\r\n (range.isCrossRowCol || !rangeManager.getIsCollapsed())\r\n ) {\r\n return\r\n }\r\n // 是否是选区拖拽\r\n if (!host.isAllowDrag) {\r\n if (!isReadonly && range.startIndex !== range.endIndex) {\r\n const isPointInRange = rangeManager.getIsPointInRange(\r\n evt.offsetX,\r\n evt.offsetY\r\n )\r\n if (isPointInRange) {\r\n setRangeCache(host)\r\n return\r\n }\r\n }\r\n }\r\n const target = evt.target as HTMLDivElement\r\n const pageIndex = target.dataset.index\r\n // 设置pageNo\r\n if (pageIndex) {\r\n draw.setPageNo(Number(pageIndex))\r\n }\r\n host.isAllowSelection = true\r\n // 缓存旧上下文信息\r\n const oldPositionContext = deepClone(position.getPositionContext())\r\n const positionResult = position.adjustPositionContext({\r\n x: evt.offsetX,\r\n y: evt.offsetY\r\n })\r\n if (!positionResult) return\r\n const {\r\n index,\r\n isDirectHit,\r\n isCheckbox,\r\n isRadio,\r\n isImage,\r\n isTable,\r\n tdValueIndex,\r\n hitLineStartIndex\r\n } = positionResult\r\n // 记录选区开始位置\r\n host.mouseDownStartPosition = {\r\n ...positionResult,\r\n index: isTable ? tdValueIndex! : index,\r\n x: evt.offsetX,\r\n y: evt.offsetY\r\n }\r\n const elementList = draw.getElementList()\r\n const positionList = position.getPositionList()\r\n const curIndex = isTable ? tdValueIndex! : index\r\n const curElement = elementList[curIndex]\r\n // 绘制\r\n const isDirectHitImage = !!(isDirectHit && isImage)\r\n const isDirectHitCheckbox = !!(isDirectHit && isCheckbox)\r\n const isDirectHitRadio = !!(isDirectHit && isRadio)\r\n if (~index) {\r\n let startIndex = curIndex\r\n let endIndex = curIndex\r\n // shift激活时进行选区处理\r\n if (evt.shiftKey) {\r\n const { startIndex: oldStartIndex } = rangeManager.getRange()\r\n if (~oldStartIndex) {\r\n const newPositionContext = position.getPositionContext()\r\n if (newPositionContext.tdId === oldPositionContext.tdId) {\r\n if (curIndex > oldStartIndex) {\r\n startIndex = oldStartIndex\r\n } else {\r\n endIndex = oldStartIndex\r\n }\r\n }\r\n }\r\n }\r\n rangeManager.setRange(startIndex, endIndex)\r\n position.setCursorPosition(positionList[curIndex])\r\n // 复选框\r\n if (isDirectHitCheckbox && !isReadonly) {\r\n hitCheckbox(curElement, draw)\r\n } else if (isDirectHitRadio && !isReadonly) {\r\n hitRadio(curElement, draw)\r\n } else if (\r\n curElement.controlComponent === ControlComponent.VALUE &&\r\n (curElement.control?.type === ControlType.CHECKBOX ||\r\n curElement.control?.type === ControlType.RADIO)\r\n ) {\r\n // 向左查找\r\n let preIndex = curIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (preElement.controlComponent === ControlComponent.CHECKBOX) {\r\n hitCheckbox(preElement, draw)\r\n break\r\n } else if (preElement.controlComponent === ControlComponent.RADIO) {\r\n hitRadio(preElement, draw)\r\n break\r\n }\r\n preIndex--\r\n }\r\n } else {\r\n draw.render({\r\n curIndex,\r\n isCompute: false,\r\n isSubmitHistory: false,\r\n isSetCursor:\r\n !isDirectHitImage && !isDirectHitCheckbox && !isDirectHitRadio\r\n })\r\n }\r\n // 首字需定位到行首,非上一行最后一个字后\r\n if (hitLineStartIndex) {\r\n host.getDraw().getCursor().drawCursor({\r\n hitLineStartIndex\r\n })\r\n }\r\n }\r\n // 预览工具组件\r\n const previewer = draw.getPreviewer()\r\n previewer.clearResizer()\r\n if (isDirectHitImage) {\r\n const previewerDrawOption: IPreviewerDrawOption = {\r\n // 只读或控件外表单模式禁用拖拽\r\n dragDisable:\r\n isReadonly ||\r\n (!curElement.controlId && draw.getMode() === EditorMode.FORM)\r\n }\r\n if (curElement.type === ElementType.LATEX) {\r\n previewerDrawOption.mime = 'svg'\r\n previewerDrawOption.srcKey = 'laTexSVG'\r\n }\r\n previewer.drawResizer(\r\n curElement,\r\n positionList[curIndex],\r\n previewerDrawOption\r\n )\r\n // 光标事件代理丢失,重新定位\r\n draw.getCursor().drawCursor({\r\n isShow: false\r\n })\r\n // 点击图片允许拖拽调整位置\r\n setRangeCache(host)\r\n // 浮动元素创建镜像图片\r\n if (\r\n curElement.imgDisplay === ImageDisplay.SURROUND ||\r\n curElement.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n curElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n draw.getImageParticle().createFloatImage(curElement)\r\n }\r\n // 图片点击事件\r\n const eventBus = draw.getEventBus()\r\n if (eventBus.hasSubscribers('imageMousedown')) {\r\n eventBus.emit('imageMousedown', {\r\n evt,\r\n element: curElement\r\n })\r\n }\r\n }\r\n // 表格工具组件\r\n const tableTool = draw.getTableTool()\r\n tableTool.dispose()\r\n if (isTable && !isReadonly && draw.getMode() !== EditorMode.FORM) {\r\n tableTool.render()\r\n }\r\n // 超链接\r\n const hyperlinkParticle = draw.getHyperlinkParticle()\r\n hyperlinkParticle.clearHyperlinkPopup()\r\n if (curElement.type === ElementType.HYPERLINK) {\r\n if (isMod(evt)) {\r\n hyperlinkParticle.openHyperlink(curElement)\r\n } else {\r\n hyperlinkParticle.drawHyperlinkPopup(curElement, positionList[curIndex])\r\n }\r\n }\r\n // 日期控件\r\n const dateParticle = draw.getDateParticle()\r\n dateParticle.clearDatePicker()\r\n if (curElement.type === ElementType.DATE && !isReadonly) {\r\n dateParticle.renderDatePicker(curElement, positionList[curIndex])\r\n }\r\n}\r\n","import {\r\n CONTROL_CONTEXT_ATTR,\r\n EDITOR_ELEMENT_STYLE_ATTR\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent, ControlType } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { deepClone, getUUID, omitObject } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext, formatElementList } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\n\r\ntype IDragElement = IElement & { dragId: string }\r\n\r\nfunction createDragId(element: IElement): string {\r\n const dragId = getUUID()\r\n Reflect.set(element, 'dragId', dragId)\r\n return dragId\r\n}\r\n\r\nfunction getElementIndexByDragId(dragId: string, elementList: IElement[]) {\r\n return (<IDragElement[]>elementList).findIndex(el => el.dragId === dragId)\r\n}\r\n\r\n// 移动悬浮图片位置\r\nfunction moveImgPosition(\r\n element: IElement,\r\n evt: MouseEvent,\r\n host: CanvasEvent\r\n) {\r\n const draw = host.getDraw()\r\n if (\r\n element.imgDisplay === ImageDisplay.SURROUND ||\r\n element.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n element.imgDisplay === ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n const moveX = evt.offsetX - host.mouseDownStartPosition!.x!\r\n const moveY = evt.offsetY - host.mouseDownStartPosition!.y!\r\n const imgFloatPosition = element.imgFloatPosition!\r\n element.imgFloatPosition = {\r\n x: imgFloatPosition.x + moveX,\r\n y: imgFloatPosition.y + moveY,\r\n pageNo: draw.getPageNo()\r\n }\r\n }\r\n draw.getImageParticle().destroyFloatImage()\r\n}\r\n\r\nexport function mouseup(evt: MouseEvent, host: CanvasEvent) {\r\n // 判断是否允许拖放\r\n if (host.isAllowDrop) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly() || draw.isDisabled()) {\r\n host.mousedown(evt)\r\n return\r\n }\r\n const position = draw.getPosition()\r\n const positionList = position.getPositionList()\r\n const positionContext = position.getPositionContext()\r\n const rangeManager = draw.getRange()\r\n const cacheRange = host.cacheRange!\r\n const cacheElementList = host.cacheElementList!\r\n const cachePositionList = host.cachePositionList!\r\n const cachePositionContext = host.cachePositionContext\r\n const range = rangeManager.getRange()\r\n // 缓存选区的信息\r\n const isCacheRangeCollapsed = cacheRange.startIndex === cacheRange.endIndex\r\n // 选区闭合时,起始位置向前移动一位进行扩选\r\n const cacheStartIndex = isCacheRangeCollapsed\r\n ? cacheRange.startIndex - 1\r\n : cacheRange.startIndex\r\n const cacheEndIndex = cacheRange.endIndex\r\n // 是否需要拖拽-位置发生改变\r\n if (\r\n range.startIndex >= cacheStartIndex &&\r\n range.endIndex <= cacheEndIndex &&\r\n host.cachePositionContext?.tdId === positionContext.tdId\r\n ) {\r\n // 清除渲染副作用\r\n draw.clearSideEffect()\r\n // 浮动元素拖拽需要提交历史\r\n let isSubmitHistory = false\r\n let isCompute = false\r\n if (isCacheRangeCollapsed) {\r\n // 图片移动\r\n const dragElement = cacheElementList[cacheEndIndex]\r\n if (\r\n dragElement.type === ElementType.IMAGE ||\r\n dragElement.type === ElementType.LATEX\r\n ) {\r\n moveImgPosition(dragElement, evt, host)\r\n if (\r\n dragElement.imgDisplay === ImageDisplay.SURROUND ||\r\n dragElement.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n dragElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n draw.getPreviewer().drawResizer(dragElement)\r\n isSubmitHistory = true\r\n } else {\r\n const cachePosition = cachePositionList[cacheEndIndex]\r\n draw.getPreviewer().drawResizer(dragElement, cachePosition)\r\n }\r\n // 四周环绕型元素需计算\r\n isCompute = dragElement.imgDisplay === ImageDisplay.SURROUND\r\n }\r\n }\r\n rangeManager.replaceRange({\r\n ...cacheRange\r\n })\r\n draw.render({\r\n isCompute,\r\n isSubmitHistory,\r\n isSetCursor: false\r\n })\r\n return\r\n }\r\n // 是否是不可拖拽的控件结构元素\r\n const dragElementList = cacheElementList.slice(\r\n cacheStartIndex + 1,\r\n cacheEndIndex + 1\r\n )\r\n const isContainControl = dragElementList.find(element => element.controlId)\r\n if (isContainControl) {\r\n // 仅允许 (最前/后元素不是控件 || 在控件前后 || 文本控件且是值) 拖拽\r\n const cacheStartElement = cacheElementList[cacheStartIndex + 1]\r\n const cacheEndElement = cacheElementList[cacheEndIndex]\r\n const isAllowDragControl =\r\n ((!cacheStartElement.controlId ||\r\n cacheStartElement.controlComponent === ControlComponent.PREFIX) &&\r\n (!cacheEndElement.controlId ||\r\n cacheEndElement.controlComponent === ControlComponent.POSTFIX)) ||\r\n (cacheStartElement.controlId === cacheEndElement.controlId &&\r\n cacheStartElement.controlComponent === ControlComponent.PREFIX &&\r\n cacheEndElement.controlComponent === ControlComponent.POSTFIX) ||\r\n (cacheStartElement.control?.type === ControlType.TEXT &&\r\n cacheStartElement.controlComponent === ControlComponent.VALUE &&\r\n cacheEndElement.control?.type === ControlType.TEXT &&\r\n cacheEndElement.controlComponent === ControlComponent.VALUE)\r\n if (!isAllowDragControl) {\r\n draw.render({\r\n curIndex: range.startIndex,\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n return\r\n }\r\n }\r\n // 格式化元素\r\n const control = draw.getControl()\r\n const elementList = draw.getElementList()\r\n // 是否排除控件属性(1.不包含控件 2.新位置在控件内 3.选区不包含完整控件)\r\n const isOmitControlAttr =\r\n !isContainControl ||\r\n !!elementList[range.startIndex].controlId ||\r\n !control.getIsElementListContainFullControl(dragElementList)\r\n const editorOptions = draw.getOptions()\r\n // 元素属性复制(1.文本提取样式及相关上下文 2.非文本排除相关上下文)\r\n const replaceElementList = dragElementList.map(el => {\r\n if (!el.type || el.type === ElementType.TEXT) {\r\n const newElement: IElement = {\r\n value: el.value\r\n }\r\n const copyAttr = EDITOR_ELEMENT_STYLE_ATTR\r\n if (!isOmitControlAttr) {\r\n copyAttr.push(...CONTROL_CONTEXT_ATTR)\r\n }\r\n copyAttr.forEach(attr => {\r\n const value = el[attr] as never\r\n if (value !== undefined) {\r\n newElement[attr] = value\r\n }\r\n })\r\n return newElement\r\n } else {\r\n let newElement = deepClone(el)\r\n if (isOmitControlAttr) {\r\n newElement = omitObject(newElement, CONTROL_CONTEXT_ATTR)\r\n }\r\n formatElementList([newElement], {\r\n isHandleFirstElement: false,\r\n editorOptions\r\n })\r\n return newElement\r\n }\r\n })\r\n formatElementContext(elementList, replaceElementList, range.startIndex, {\r\n editorOptions: draw.getOptions()\r\n })\r\n // 缓存拖拽选区开始元素、位置、开始结束id\r\n const cacheStartElement = cacheElementList[cacheStartIndex]\r\n const cacheStartPosition = cachePositionList[cacheStartIndex]\r\n const cacheRangeStartId = createDragId(cacheElementList[cacheStartIndex])\r\n const cacheRangeEndId = createDragId(cacheElementList[cacheEndIndex])\r\n // 设置拖拽值\r\n const replaceLength = replaceElementList.length\r\n let rangeStart = range.startIndex\r\n let rangeEnd = rangeStart + replaceLength\r\n const activeControl = control.getActiveControl()\r\n if (\r\n activeControl &&\r\n cacheElementList[rangeStart].controlComponent !== ControlComponent.POSTFIX\r\n ) {\r\n rangeEnd = activeControl.setValue(replaceElementList)\r\n rangeStart = rangeEnd - replaceLength\r\n } else {\r\n draw.spliceElementList(elementList, rangeStart + 1, 0, replaceElementList)\r\n }\r\n if (!~rangeEnd) {\r\n draw.render({\r\n isSetCursor: false\r\n })\r\n return\r\n }\r\n // 缓存当前开始结束id\r\n const rangeStartId = createDragId(elementList[rangeStart])\r\n const rangeEndId = createDragId(elementList[rangeEnd])\r\n // 删除原有拖拽元素\r\n const cacheRangeStartIndex = getElementIndexByDragId(\r\n cacheRangeStartId,\r\n cacheElementList\r\n )\r\n const cacheRangeEndIndex = getElementIndexByDragId(\r\n cacheRangeEndId,\r\n cacheElementList\r\n )\r\n const cacheEndElement = cacheElementList[cacheRangeEndIndex]\r\n if (\r\n cacheEndElement.controlId &&\r\n cacheEndElement.controlComponent !== ControlComponent.POSTFIX\r\n ) {\r\n rangeManager.replaceRange({\r\n ...cacheRange,\r\n startIndex: cacheRangeStartIndex,\r\n endIndex: cacheRangeEndIndex\r\n })\r\n control.getActiveControl()?.cut()\r\n } else {\r\n // td不可删除判断\r\n let isTdElementDeletable = true\r\n if (cachePositionContext?.isTable) {\r\n const { tableId, trIndex, tdIndex } = cachePositionContext\r\n const originElementList = draw.getOriginalElementList()\r\n isTdElementDeletable = !originElementList.some(\r\n el =>\r\n el.id === tableId &&\r\n el?.trList?.[trIndex!]?.tdList?.[tdIndex!]?.deletable === false\r\n )\r\n }\r\n if (isTdElementDeletable) {\r\n draw.spliceElementList(\r\n cacheElementList,\r\n cacheRangeStartIndex + 1,\r\n cacheRangeEndIndex - cacheRangeStartIndex\r\n )\r\n }\r\n }\r\n // 重设上下文\r\n const startElement = elementList[range.startIndex]\r\n const startPosition = positionList[range.startIndex]\r\n let positionContextIndex = positionContext.index\r\n if (positionContextIndex) {\r\n if (startElement.tableId && !cacheStartElement.tableId) {\r\n // 表格外移动到表格内&&表格之前\r\n if (cacheStartPosition.index < positionContextIndex) {\r\n positionContextIndex -= replaceLength\r\n }\r\n } else if (!startElement.tableId && cacheStartElement.tableId) {\r\n // 表格内移到表格外&&表格之前\r\n if (startPosition.index < positionContextIndex) {\r\n positionContextIndex += replaceLength\r\n }\r\n }\r\n position.setPositionContext({\r\n ...positionContext,\r\n index: positionContextIndex\r\n })\r\n }\r\n // 重设选区\r\n const rangeStartIndex = getElementIndexByDragId(rangeStartId, elementList)\r\n const rangeEndIndex = getElementIndexByDragId(rangeEndId, elementList)\r\n rangeManager.setRange(\r\n isCacheRangeCollapsed ? rangeEndIndex : rangeStartIndex,\r\n rangeEndIndex,\r\n range.tableId,\r\n range.startTdIndex,\r\n range.endTdIndex,\r\n range.startTrIndex,\r\n range.endTrIndex\r\n )\r\n // 清除渲染副作用\r\n draw.clearSideEffect()\r\n // 移动图片\r\n let imgElement: IElement | null = null\r\n if (isCacheRangeCollapsed) {\r\n const elementList = draw.getElementList()\r\n const dragElement = elementList[rangeEndIndex]\r\n if (\r\n dragElement.type === ElementType.IMAGE ||\r\n dragElement.type === ElementType.LATEX\r\n ) {\r\n moveImgPosition(dragElement, evt, host)\r\n imgElement = dragElement\r\n }\r\n }\r\n // 重新渲染\r\n draw.render({\r\n isSetCursor: false\r\n })\r\n // 控件值变更回调\r\n if (activeControl) {\r\n control.emitControlContentChange()\r\n } else if (cacheStartElement.controlId) {\r\n control.emitControlContentChange({\r\n context: {\r\n range: cacheRange,\r\n elementList: cacheElementList\r\n },\r\n controlElement: cacheStartElement\r\n })\r\n }\r\n // 拖拽后渲染图片工具\r\n if (imgElement) {\r\n if (\r\n imgElement.imgDisplay === ImageDisplay.SURROUND ||\r\n imgElement.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n imgElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n draw.getPreviewer().drawResizer(imgElement)\r\n } else {\r\n const dragPositionList = position.getPositionList()\r\n const dragPosition = dragPositionList[rangeEndIndex]\r\n draw.getPreviewer().drawResizer(imgElement, dragPosition)\r\n }\r\n }\r\n } else if (host.isAllowDrag) {\r\n // 如果是允许拖拽不允许拖放(点击选区时光标闭合)则光标重置\r\n if (host.cacheRange?.startIndex !== host.cacheRange?.endIndex) {\r\n host.mousedown(evt)\r\n }\r\n }\r\n}\r\n","import { CanvasEvent } from '../CanvasEvent'\r\n\r\nexport function mouseleave(evt: MouseEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n // 鼠标移出页面时选区禁用\r\n if (!draw.getOptions().pageOuterSelectionDisable) return\r\n // 是否还在canvas内部\r\n const pageContainer = draw.getPageContainer()\r\n const { x, y, width, height } = pageContainer.getBoundingClientRect()\r\n if (evt.x >= x && evt.x <= x + width && evt.y >= y && evt.y <= y + height) {\r\n return\r\n }\r\n host.setIsAllowSelection(false)\r\n}\r\n","import { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\n\r\nexport function mousemove(evt: MouseEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n // 是否是拖拽文字\r\n if (host.isAllowDrag) {\r\n // 是否允许拖拽到选区\r\n const x = evt.offsetX\r\n const y = evt.offsetY\r\n const { startIndex, endIndex } = host.cacheRange!\r\n const positionList = host.cachePositionList!\r\n for (let p = startIndex + 1; p <= endIndex; p++) {\r\n const {\r\n coordinate: { leftTop, rightBottom }\r\n } = positionList[p]\r\n if (\r\n x >= leftTop[0] &&\r\n x <= rightBottom[0] &&\r\n y >= leftTop[1] &&\r\n y <= rightBottom[1]\r\n ) {\r\n return\r\n }\r\n }\r\n const cacheStartIndex = host.cacheRange?.startIndex\r\n if (cacheStartIndex) {\r\n // 浮动元素拖拽调整位置\r\n const dragElement = host.cacheElementList![cacheStartIndex]\r\n if (\r\n dragElement?.type === ElementType.IMAGE &&\r\n (dragElement.imgDisplay === ImageDisplay.SURROUND ||\r\n dragElement.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n dragElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM)\r\n ) {\r\n draw.getPreviewer().clearResizer()\r\n draw.getImageParticle().dragFloatImage(evt.movementX, evt.movementY)\r\n }\r\n }\r\n host.dragover(evt)\r\n host.isAllowDrop = true\r\n return\r\n }\r\n if (!host.isAllowSelection || !host.mouseDownStartPosition) return\r\n const target = evt.target as HTMLDivElement\r\n const pageIndex = target.dataset.index\r\n // 设置pageNo\r\n if (pageIndex) {\r\n draw.setPageNo(Number(pageIndex))\r\n }\r\n // 结束位置\r\n const position = draw.getPosition()\r\n const positionResult = position.getPositionByXY({\r\n x: evt.offsetX,\r\n y: evt.offsetY\r\n })\r\n if (!~positionResult.index) return\r\n const {\r\n index,\r\n isTable,\r\n tdValueIndex,\r\n tdIndex,\r\n trIndex,\r\n tableId,\r\n trId,\r\n tdId\r\n } = positionResult\r\n const {\r\n index: startIndex,\r\n isTable: startIsTable,\r\n tdIndex: startTdIndex,\r\n trIndex: startTrIndex,\r\n tableId: startTableId\r\n } = host.mouseDownStartPosition\r\n const endIndex = isTable ? tdValueIndex! : index\r\n // 判断是否是表格跨行/列\r\n const rangeManager = draw.getRange()\r\n if (\r\n isTable &&\r\n startIsTable &&\r\n (tdIndex !== startTdIndex || trIndex !== startTrIndex)\r\n ) {\r\n rangeManager.setRange(\r\n endIndex,\r\n endIndex,\r\n tableId,\r\n startTdIndex,\r\n tdIndex,\r\n startTrIndex,\r\n trIndex\r\n )\r\n position.setPositionContext({\r\n isTable,\r\n index,\r\n trIndex,\r\n tdIndex,\r\n tdId,\r\n trId,\r\n tableId\r\n })\r\n } else {\r\n let end = ~endIndex ? endIndex : 0\r\n // 开始或结束位置存在表格,但是非相同表格则忽略选区设置\r\n if ((startIsTable || isTable) && startTableId !== tableId) return\r\n // 开始位置\r\n let start = startIndex\r\n if (start > end) {\r\n // prettier-ignore\r\n [start, end] = [end, start]\r\n }\r\n if (start === end) return\r\n // 背景文本禁止选区\r\n const elementList = draw.getElementList()\r\n const startElement = elementList[start + 1]\r\n const endElement = elementList[end]\r\n if (\r\n startElement?.controlComponent === ControlComponent.PLACEHOLDER &&\r\n endElement?.controlComponent === ControlComponent.PLACEHOLDER &&\r\n startElement.controlId === endElement.controlId\r\n ) {\r\n return\r\n }\r\n rangeManager.setRange(start, end)\r\n }\r\n // 绘制\r\n draw.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\n\r\nexport function backspace(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly()) return\r\n const rangeManager = draw.getRange()\r\n if (!rangeManager.canInput()) return\r\n const options = draw.getOptions()\r\n const isTrackChanges = options.trackChanges\r\n\r\n const control = draw.getControl()\r\n const position = draw.getPosition()\r\n if (rangeManager.getIsCollapsed()) {\r\n const range = rangeManager.getRange()\r\n const elementList = draw.getElementList()\r\n const element = elementList[range.startIndex]\r\n if (element.control?.hide || element.area?.hide) {\r\n const newIndex = control.removeControl(range.startIndex)\r\n if (newIndex) {\r\n range.startIndex = newIndex\r\n range.endIndex = newIndex\r\n rangeManager.replaceRange(range)\r\n const positionList = position.getPositionList()\r\n position.setCursorPosition(positionList[newIndex])\r\n }\r\n }\r\n }\r\n const { startIndex, endIndex, isCrossRowCol } = rangeManager.getRange()\r\n let curIndex: number | null\r\n if (isCrossRowCol) {\r\n const rowCol = draw.getTableParticle().getRangeRowCol()\r\n if (!rowCol) return\r\n let isDeleted = false\r\n for (let r = 0; r < rowCol.length; r++) {\r\n const row = rowCol[r]\r\n for (let c = 0; c < row.length; c++) {\r\n const col = row[c]\r\n if (col.value.length > 1) {\r\n draw.spliceElementList(col.value, 1, col.value.length - 1)\r\n isDeleted = true\r\n }\r\n }\r\n }\r\n curIndex = isDeleted ? 0 : null\r\n } else if (\r\n control.getActiveControl() &&\r\n control.getIsRangeCanCaptureEvent()\r\n ) {\r\n curIndex = control.keydown(evt)\r\n if (curIndex) {\r\n control.emitControlContentChange()\r\n }\r\n } else {\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const { index } = cursorPosition\r\n const isCollapsed = rangeManager.getIsCollapsed()\r\n const elementList = draw.getElementList()\r\n if (isCollapsed && index === 0) {\r\n const firstElement = elementList[index]\r\n if (firstElement.value === ZERO) {\r\n if (firstElement.listId) {\r\n draw.getListParticle().unsetList()\r\n }\r\n evt.preventDefault()\r\n return\r\n }\r\n }\r\n const startElement = elementList[startIndex]\r\n if (isCollapsed && startElement.rowFlex && startElement.value === ZERO) {\r\n const rowFlexElementList = rangeManager.getRangeRowElementList()\r\n if (rowFlexElementList) {\r\n const preElement = elementList[startIndex - 1]\r\n rowFlexElementList.forEach(element => {\r\n element.rowFlex = preElement?.rowFlex\r\n })\r\n }\r\n }\r\n if (!isCollapsed) {\r\n if (isTrackChanges) {\r\n\r\n for (let i = startIndex + 1; i <= endIndex; i++) {\r\n const element = elementList[i]\r\n if (element && !element.revisionId) {\r\n element.revisionId = 'rev_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9)\r\n element.revisionType = 'delete'\r\n element.revisionAuthor = '当前用户'\r\n element.revisionDate = new Date().toISOString()\r\n }\r\n }\r\n curIndex = startIndex\r\n } else {\r\n draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex)\r\n curIndex = startIndex\r\n }\r\n } else {\r\n if (isTrackChanges) {\r\n const element = elementList[index]\r\n if (element && !element.revisionId) {\r\n let nextRevisionElement = null\r\n for (let i = index + 1; i < elementList.length; i++) {\r\n const el = elementList[i]\r\n if (el && el.revisionType === 'delete' && el.revisionAuthor === '当前用户') {\r\n nextRevisionElement = el\r\n break\r\n }\r\n if (el && !el.revisionId) break\r\n }\r\n if (nextRevisionElement) {\r\n element.revisionId = nextRevisionElement.revisionId\r\n element.revisionType = 'delete'\r\n element.revisionAuthor = nextRevisionElement.revisionAuthor\r\n element.revisionDate = nextRevisionElement.revisionDate\r\n } else {\r\n element.revisionId = 'rev_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9)\r\n element.revisionType = 'delete'\r\n element.revisionAuthor = '当前用户'\r\n element.revisionDate = new Date().toISOString()\r\n }\r\n }\r\n curIndex = index - 1\r\n } else {\r\n draw.spliceElementList(elementList, index, 1)\r\n curIndex = index - 1\r\n }\r\n }\r\n }\r\n draw.getGlobalEvent().setCanvasEventAbility()\r\n if (curIndex === null) {\r\n rangeManager.setRange(startIndex, startIndex)\r\n draw.render({\r\n curIndex: startIndex,\r\n isSubmitHistory: false,\r\n isPartialRender: true\r\n })\r\n } else {\r\n rangeManager.setRange(curIndex, curIndex)\r\n draw.render({\r\n curIndex,\r\n isPartialRender: true\r\n })\r\n }\r\n}\r\n","import { CanvasEvent } from '../../CanvasEvent'\r\n\r\nexport function del(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly()) return\r\n // 可输入性验证\r\n const rangeManager = draw.getRange()\r\n if (!rangeManager.canInput()) return\r\n const options = draw.getOptions()\r\n const isTrackChanges = options.trackChanges\r\n\r\n const { startIndex, endIndex, isCrossRowCol } = rangeManager.getRange()\r\n // 隐藏控件删除\r\n const elementList = draw.getElementList()\r\n const control = draw.getControl()\r\n if (rangeManager.getIsCollapsed()) {\r\n const nextElement = elementList[startIndex + 1]\r\n if (nextElement?.control?.hide || nextElement?.area?.hide) {\r\n const newIndex = control.removeControl(startIndex + 1)\r\n if (newIndex) {\r\n // 更新位置信息\r\n const position = draw.getPosition()\r\n const positionList = position.getPositionList()\r\n position.setCursorPosition(positionList[newIndex])\r\n }\r\n }\r\n }\r\n // 删除操作\r\n let curIndex: number | null\r\n if (isCrossRowCol) {\r\n // 表格跨行列选中时清空单元格内容\r\n const rowCol = draw.getTableParticle().getRangeRowCol()\r\n if (!rowCol) return\r\n let isDeleted = false\r\n for (let r = 0; r < rowCol.length; r++) {\r\n const row = rowCol[r]\r\n for (let c = 0; c < row.length; c++) {\r\n const col = row[c]\r\n if (col.value.length > 1) {\r\n draw.spliceElementList(col.value, 1, col.value.length - 1)\r\n isDeleted = true\r\n }\r\n }\r\n }\r\n // 删除成功后定位\r\n curIndex = isDeleted ? 0 : null\r\n } else if (control.getActiveControl() && control.getIsRangeWithinControl()) {\r\n // 光标在控件内\r\n curIndex = control.keydown(evt)\r\n if (curIndex) {\r\n control.emitControlContentChange()\r\n }\r\n } else if (elementList[endIndex + 1]?.controlId) {\r\n // 光标在控件前\r\n curIndex = control.removeControl(endIndex + 1)\r\n } else {\r\n // 普通元素\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const { index } = cursorPosition\r\n // 命中图片直接删除\r\n const positionContext = position.getPositionContext()\r\n if (positionContext.isDirectHit && positionContext.isImage) {\r\n draw.spliceElementList(elementList, index, 1)\r\n curIndex = index - 1\r\n } else {\r\n const isCollapsed = rangeManager.getIsCollapsed()\r\n if (!isCollapsed) {\r\n if (isTrackChanges) {\r\n\r\n for (let i = startIndex + 1; i <= endIndex; i++) {\r\n const element = elementList[i]\r\n if (element && !element.revisionId) {\r\n element.revisionId = `rev_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\r\n element.revisionType = 'delete'\r\n element.revisionAuthor = '当前用户'\r\n element.revisionDate = new Date().toISOString()\r\n }\r\n }\r\n curIndex = startIndex\r\n } else {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex\r\n )\r\n curIndex = startIndex\r\n }\r\n } else {\r\n if (!elementList[index + 1]) return\r\n if (isTrackChanges) {\r\n const element = elementList[index + 1]\r\n\r\n if (element && !element.revisionId) {\r\n const nextElement = elementList[index + 2]\r\n if (nextElement && nextElement.revisionType === 'delete' && nextElement.revisionAuthor === '当前用户') {\r\n element.revisionId = nextElement.revisionId\r\n element.revisionType = 'delete'\r\n element.revisionAuthor = nextElement.revisionAuthor\r\n element.revisionDate = nextElement.revisionDate\r\n } else {\r\n element.revisionId = `rev_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\r\n element.revisionType = 'delete'\r\n element.revisionAuthor = '当前用户'\r\n element.revisionDate = new Date().toISOString()\r\n }\r\n }\r\n curIndex = index\r\n } else {\r\n draw.spliceElementList(elementList, index + 1, 1)\r\n curIndex = index\r\n }\r\n }\r\n }\r\n }\r\n draw.getGlobalEvent().setCanvasEventAbility()\r\n if (curIndex === null) {\r\n rangeManager.setRange(startIndex, startIndex)\r\n draw.render({\r\n curIndex: startIndex,\r\n isSubmitHistory: false,\r\n isPartialRender: true\r\n })\r\n } else {\r\n rangeManager.setRange(curIndex, curIndex)\r\n draw.render({\r\n curIndex,\r\n isPartialRender: true\r\n })\r\n }\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n AREA_CONTEXT_ATTR,\r\n EDITOR_ELEMENT_STYLE_ATTR,\r\n EDITOR_ROW_ATTR\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { omitObject } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\n\r\nexport function enter(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly()) return\r\n const rangeManager = draw.getRange()\r\n if (!rangeManager.canInput()) return\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n const isCollapsed = rangeManager.getIsCollapsed()\r\n const elementList = draw.getElementList()\r\n const startElement = elementList[startIndex]\r\n const endElement = elementList[endIndex]\r\n // 最后一个列表项行首回车取消列表设置\r\n if (\r\n isCollapsed &&\r\n endElement.listId &&\r\n endElement.value === ZERO &&\r\n elementList[endIndex + 1]?.listId !== endElement.listId\r\n ) {\r\n draw.getListParticle().unsetList()\r\n return\r\n }\r\n // 列表块内换行\r\n let enterText: IElement = {\r\n value: ZERO\r\n }\r\n if (evt.shiftKey && startElement.listId) {\r\n enterText.listWrap = true\r\n }\r\n // 格式化上下文\r\n formatElementContext(elementList, [enterText], startIndex, {\r\n isBreakWhenWrap: true,\r\n editorOptions: draw.getOptions()\r\n })\r\n // shift长按 && 最后位置回车无需复制区域上下文\r\n if (\r\n evt.shiftKey &&\r\n endElement.areaId &&\r\n endElement.areaId !== elementList[endIndex + 1]?.areaId\r\n ) {\r\n enterText = omitObject(enterText, AREA_CONTEXT_ATTR)\r\n }\r\n // 标题结尾处回车无需格式化及样式复制\r\n if (\r\n !(\r\n endElement.titleId &&\r\n endElement.titleId !== elementList[endIndex + 1]?.titleId\r\n )\r\n ) {\r\n // 复制样式属性\r\n const copyElement = rangeManager.getRangeAnchorStyle(elementList, endIndex)\r\n if (copyElement) {\r\n const copyAttr = [...EDITOR_ROW_ATTR]\r\n // 不复制控件后缀样式\r\n if (copyElement.controlComponent !== ControlComponent.POSTFIX) {\r\n copyAttr.push(...EDITOR_ELEMENT_STYLE_ATTR)\r\n }\r\n copyAttr.forEach(attr => {\r\n if (!evt.shiftKey && attr === 'characterScale') {\r\n return\r\n }\r\n const value = copyElement[attr] as never\r\n if (value !== undefined) {\r\n enterText[attr] = value\r\n }\r\n })\r\n }\r\n }\r\n // 控件或文档插入换行元素\r\n const control = draw.getControl()\r\n const activeControl = control.getActiveControl()\r\n let curIndex: number\r\n if (activeControl && control.getIsRangeWithinControl()) {\r\n curIndex = control.setValue([enterText])\r\n control.emitControlContentChange()\r\n } else {\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const { index } = cursorPosition\r\n if (isCollapsed) {\r\n draw.spliceElementList(elementList, index + 1, 0, [enterText])\r\n } else {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex,\r\n [enterText]\r\n )\r\n }\r\n curIndex = index + 1\r\n }\r\n if (~curIndex) {\r\n rangeManager.setRange(curIndex, curIndex)\r\n draw.render({ curIndex })\r\n }\r\n evt.preventDefault()\r\n}\r\n","import { EditorMode } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport { getNonHideElementIndex } from '@vervedoc/docx-editor-schema'\r\nimport { isMod } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\n\r\nexport function left(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const isReadonly = draw.isReadonly()\r\n if (isReadonly) return\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const positionContext = position.getPositionContext()\r\n const { index } = cursorPosition\r\n if (index <= 0 && !positionContext.isTable) return\r\n const rangeManager = draw.getRange()\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n const isCollapsed = rangeManager.getIsCollapsed()\r\n const elementList = draw.getElementList()\r\n // 表单模式下控件移动\r\n const control = draw.getControl()\r\n if (\r\n draw.getMode() === EditorMode.FORM &&\r\n control.getActiveControl() &&\r\n (elementList[index]?.controlComponent === ControlComponent.PREFIX ||\r\n elementList[index]?.controlComponent === ControlComponent.PRE_TEXT)\r\n ) {\r\n control.initNextControl({\r\n direction: MoveDirection.UP\r\n })\r\n return\r\n }\r\n // 单词整体移动\r\n let moveCount = 1\r\n if (isMod(evt)) {\r\n const LETTER_REG = draw.getLetterReg()\r\n // 起始位置\r\n const moveStartIndex =\r\n evt.shiftKey && !isCollapsed && startIndex === cursorPosition?.index\r\n ? endIndex\r\n : startIndex\r\n if (LETTER_REG.test(elementList[moveStartIndex]?.value)) {\r\n let i = moveStartIndex - 1\r\n while (i > 0) {\r\n const element = elementList[i]\r\n if (!LETTER_REG.test(element.value)) {\r\n break\r\n }\r\n moveCount++\r\n i--\r\n }\r\n }\r\n }\r\n const curIndex = startIndex - moveCount\r\n // shift则缩放选区\r\n let anchorStartIndex = curIndex\r\n let anchorEndIndex = curIndex\r\n if (evt.shiftKey && cursorPosition) {\r\n if (startIndex !== endIndex) {\r\n if (startIndex === cursorPosition.index) {\r\n // 减小选区\r\n anchorStartIndex = startIndex\r\n anchorEndIndex = endIndex - moveCount\r\n } else {\r\n anchorStartIndex = curIndex\r\n anchorEndIndex = endIndex\r\n }\r\n } else {\r\n anchorEndIndex = endIndex\r\n }\r\n }\r\n // 表格单元格间跳转\r\n if (!evt.shiftKey) {\r\n const element = elementList[startIndex]\r\n // 之前是表格则进入最后一个单元格最后一个元素\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n const lastTrIndex = trList.length - 1\r\n const lastTr = trList[lastTrIndex]\r\n const lastTdIndex = lastTr.tdList.length - 1\r\n const lastTd = lastTr.tdList[lastTdIndex]\r\n position.setPositionContext({\r\n isTable: true,\r\n index: startIndex,\r\n trIndex: lastTrIndex,\r\n tdIndex: lastTdIndex,\r\n tdId: lastTd.id,\r\n trId: lastTr.id,\r\n tableId: element.id\r\n })\r\n anchorStartIndex = lastTd.value.length - 1\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().render()\r\n } else if (element.tableId) {\r\n // 在表格单元格内&在首位则往前移动单元格\r\n if (startIndex === 0) {\r\n const originalElementList = draw.getOriginalElementList()\r\n const trList = originalElementList[positionContext.index!].trList!\r\n outer: for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n if (tr.id !== element.trId) continue\r\n const tdList = tr.tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n if (td.id !== element.tdId) continue\r\n // 移动到表格前\r\n if (r === 0 && d === 0) {\r\n position.setPositionContext({\r\n isTable: false\r\n })\r\n anchorStartIndex = positionContext.index! - 1\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().dispose()\r\n } else {\r\n // 上一个单元格\r\n let preTrIndex = r\r\n let preTdIndex = d - 1\r\n if (preTdIndex < 0) {\r\n preTrIndex = r - 1\r\n preTdIndex = trList[preTrIndex].tdList.length - 1\r\n }\r\n const preTr = trList[preTrIndex]\r\n const preTd = preTr.tdList[preTdIndex]\r\n position.setPositionContext({\r\n isTable: true,\r\n index: positionContext.index,\r\n trIndex: preTrIndex,\r\n tdIndex: preTdIndex,\r\n tdId: preTd.id,\r\n trId: preTr.id,\r\n tableId: element.tableId\r\n })\r\n anchorStartIndex = preTd.value.length - 1\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().render()\r\n }\r\n break outer\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // 执行跳转\r\n if (!~anchorStartIndex || !~anchorEndIndex) return\r\n // 隐藏元素跳过\r\n const newElementList = draw.getElementList()\r\n anchorStartIndex = getNonHideElementIndex(newElementList, anchorStartIndex)\r\n anchorEndIndex = getNonHideElementIndex(newElementList, anchorEndIndex)\r\n // 设置上下文\r\n rangeManager.setRange(anchorStartIndex, anchorEndIndex)\r\n const isAnchorCollapsed = anchorStartIndex === anchorEndIndex\r\n draw.render({\r\n curIndex: isAnchorCollapsed ? anchorStartIndex : undefined,\r\n isSetCursor: isAnchorCollapsed,\r\n isSubmitHistory: false,\r\n isCompute: false\r\n })\r\n evt.preventDefault()\r\n}\r\n","import { LocationPosition } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { EditorMode } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport { getNonHideElementIndex } from '@vervedoc/docx-editor-schema'\r\nimport { isMod } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\n\r\nexport function right(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const isReadonly = draw.isReadonly()\r\n if (isReadonly) return\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const { index } = cursorPosition\r\n const positionList = position.getPositionList()\r\n const positionContext = position.getPositionContext()\r\n if (index > positionList.length - 1 && !positionContext.isTable) return\r\n const rangeManager = draw.getRange()\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n const isCollapsed = rangeManager.getIsCollapsed()\r\n let elementList = draw.getElementList()\r\n // 表单模式下控件移动\r\n const control = draw.getControl()\r\n if (\r\n draw.getMode() === EditorMode.FORM &&\r\n control.getActiveControl() &&\r\n (elementList[index + 1]?.controlComponent === ControlComponent.POSTFIX ||\r\n elementList[index + 1]?.controlComponent === ControlComponent.POST_TEXT)\r\n ) {\r\n control.initNextControl({\r\n direction: MoveDirection.DOWN\r\n })\r\n return\r\n }\r\n // 单词整体移动\r\n let moveCount = 1\r\n if (isMod(evt)) {\r\n const LETTER_REG = draw.getLetterReg()\r\n // 起始位置\r\n const moveStartIndex =\r\n evt.shiftKey && !isCollapsed && startIndex === cursorPosition?.index\r\n ? endIndex\r\n : startIndex\r\n if (LETTER_REG.test(elementList[moveStartIndex + 1]?.value)) {\r\n let i = moveStartIndex + 2\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n if (!LETTER_REG.test(element.value)) {\r\n break\r\n }\r\n moveCount++\r\n i++\r\n }\r\n }\r\n }\r\n const curIndex = endIndex + moveCount\r\n // shift则缩放选区\r\n let anchorStartIndex = curIndex\r\n let anchorEndIndex = curIndex\r\n if (evt.shiftKey && cursorPosition) {\r\n if (startIndex !== endIndex) {\r\n if (startIndex === cursorPosition.index) {\r\n // 增大选区\r\n anchorStartIndex = startIndex\r\n anchorEndIndex = curIndex\r\n } else {\r\n anchorStartIndex = startIndex + moveCount\r\n anchorEndIndex = endIndex\r\n }\r\n } else {\r\n anchorStartIndex = startIndex\r\n }\r\n }\r\n // 表格单元格间跳转\r\n if (!evt.shiftKey) {\r\n const element = elementList[endIndex]\r\n const nextElement = elementList[endIndex + 1]\r\n // 后一个元素是表格,则进入单元格第一个起始位置\r\n if (nextElement?.type === ElementType.TABLE) {\r\n const trList = nextElement.trList!\r\n const nextTr = trList[0]\r\n const nextTd = nextTr.tdList[0]\r\n position.setPositionContext({\r\n isTable: true,\r\n index: endIndex + 1,\r\n trIndex: 0,\r\n tdIndex: 0,\r\n tdId: nextTd.id,\r\n trId: nextTr.id,\r\n tableId: nextElement.id\r\n })\r\n anchorStartIndex = 0\r\n anchorEndIndex = 0\r\n draw.getTableTool().render()\r\n } else if (element.tableId) {\r\n // 在表格单元格内&单元格元素最后\r\n if (!nextElement) {\r\n const originalElementList = draw.getOriginalElementList()\r\n const trList = originalElementList[positionContext.index!].trList!\r\n outer: for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n if (tr.id !== element.trId) continue\r\n const tdList = tr.tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n if (td.id !== element.tdId) continue\r\n // 移动到表格后\r\n if (r === trList.length - 1 && d === tdList.length - 1) {\r\n position.setPositionContext({\r\n isTable: false\r\n })\r\n anchorStartIndex = positionContext.index!\r\n anchorEndIndex = anchorStartIndex\r\n elementList = draw.getElementList()\r\n draw.getTableTool().dispose()\r\n } else {\r\n // 下一个单元格\r\n let nextTrIndex = r\r\n let nextTdIndex = d + 1\r\n if (nextTdIndex > tdList.length - 1) {\r\n nextTrIndex = r + 1\r\n nextTdIndex = 0\r\n }\r\n const preTr = trList[nextTrIndex]\r\n const preTd = preTr.tdList[nextTdIndex]\r\n position.setPositionContext({\r\n isTable: true,\r\n index: positionContext.index,\r\n trIndex: nextTrIndex,\r\n tdIndex: nextTdIndex,\r\n tdId: preTd.id,\r\n trId: preTr.id,\r\n tableId: element.tableId\r\n })\r\n anchorStartIndex = 0\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().render()\r\n }\r\n break outer\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // 执行跳转\r\n const maxElementListIndex = elementList.length - 1\r\n if (\r\n anchorStartIndex > maxElementListIndex ||\r\n anchorEndIndex > maxElementListIndex\r\n ) {\r\n return\r\n }\r\n // 隐藏元素跳过\r\n const newElementList = draw.getElementList()\r\n anchorStartIndex = getNonHideElementIndex(\r\n newElementList,\r\n anchorStartIndex,\r\n LocationPosition.AFTER\r\n )\r\n anchorEndIndex = getNonHideElementIndex(\r\n newElementList,\r\n anchorEndIndex,\r\n LocationPosition.AFTER\r\n )\r\n // 设置上下文\r\n rangeManager.setRange(anchorStartIndex, anchorEndIndex)\r\n const isAnchorCollapsed = anchorStartIndex === anchorEndIndex\r\n draw.render({\r\n curIndex: isAnchorCollapsed ? anchorStartIndex : undefined,\r\n isSetCursor: isAnchorCollapsed,\r\n isSubmitHistory: false,\r\n isCompute: false\r\n })\r\n evt.preventDefault()\r\n}\r\n","import { EDITOR_ELEMENT_STYLE_ATTR } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { pickObject } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\n\r\nexport function tab(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const isReadonly = draw.isReadonly()\r\n if (isReadonly) return\r\n evt.preventDefault()\r\n // 在控件上下文时,tab键控制控件之间移动\r\n const control = draw.getControl()\r\n const activeControl = control.getActiveControl()\r\n if (activeControl && control.getIsRangeWithinControl()) {\r\n control.initNextControl({\r\n direction: evt.shiftKey ? MoveDirection.UP : MoveDirection.DOWN\r\n })\r\n } else {\r\n const rangeManager = draw.getRange()\r\n const elementList = draw.getElementList()\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n // 插入tab符\r\n const anchorStyle = rangeManager.getRangeAnchorStyle(elementList, endIndex)\r\n // 仅复制样式\r\n const copyStyle = anchorStyle\r\n ? pickObject(anchorStyle, EDITOR_ELEMENT_STYLE_ATTR)\r\n : null\r\n const tabElement: IElement = {\r\n ...copyStyle,\r\n type: ElementType.TAB,\r\n value: ''\r\n }\r\n formatElementContext(elementList, [tabElement], startIndex, {\r\n editorOptions: draw.getOptions()\r\n })\r\n draw.insertElementList([tabElement])\r\n }\r\n}\r\n","import { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport { IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\n\r\ninterface IGetNextPositionIndexPayload {\r\n positionList: IElementPosition[]\r\n index: number\r\n rowNo: number\r\n isUp: boolean\r\n cursorX: number\r\n}\r\n// 根据当前位置索引查找上下行最接近的索引位置\r\nfunction getNextPositionIndex(payload: IGetNextPositionIndexPayload) {\r\n const { positionList, index, isUp, rowNo, cursorX } = payload\r\n let nextIndex = -1\r\n // 查找下一行位置列表\r\n const probablePosition: IElementPosition[] = []\r\n if (isUp) {\r\n let p = index - 1\r\n // 等于0的时候上一行是第一行\r\n while (p >= 0) {\r\n const position = positionList[p]\r\n p--\r\n if (position.rowNo === rowNo) continue\r\n if (probablePosition[0] && probablePosition[0].rowNo !== position.rowNo) {\r\n break\r\n }\r\n probablePosition.unshift(position)\r\n }\r\n } else {\r\n let p = index + 1\r\n while (p < positionList.length) {\r\n const position = positionList[p]\r\n p++\r\n if (position.rowNo === rowNo) continue\r\n if (probablePosition[0] && probablePosition[0].rowNo !== position.rowNo) {\r\n break\r\n }\r\n probablePosition.push(position)\r\n }\r\n }\r\n // 查找下一行位置:第一个存在交叉宽度的元素位置\r\n for (let p = 0; p < probablePosition.length; p++) {\r\n const nextPosition = probablePosition[p]\r\n const {\r\n coordinate: {\r\n leftTop: [nextLeftX],\r\n rightTop: [nextRightX]\r\n }\r\n } = nextPosition\r\n if (p === probablePosition.length - 1) {\r\n nextIndex = nextPosition.index\r\n }\r\n if (cursorX < nextLeftX || cursorX > nextRightX) continue\r\n nextIndex = nextPosition.index\r\n break\r\n }\r\n return nextIndex\r\n}\r\n\r\nexport function updown(evt: KeyboardEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const isReadonly = draw.isReadonly()\r\n if (isReadonly) return\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const rangeManager = draw.getRange()\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n let positionList = position.getPositionList()\r\n const isUp = evt.key === KeyMap.Up\r\n // 新的光标开始结束位置\r\n let anchorStartIndex = -1\r\n let anchorEndIndex = -1\r\n // 单元格之间跳转及跳出表格逻辑\r\n const positionContext = position.getPositionContext()\r\n if (\r\n !evt.shiftKey &&\r\n positionContext.isTable &&\r\n ((isUp && cursorPosition.rowIndex === 0) ||\r\n (!isUp && cursorPosition.rowIndex === draw.getRowCount() - 1))\r\n ) {\r\n const { index, trIndex, tdIndex, tableId } = positionContext\r\n if (isUp) {\r\n // 向上移动-第一行则移出到表格外,否则上一行相同列位置\r\n if (trIndex === 0) {\r\n position.setPositionContext({\r\n isTable: false\r\n })\r\n anchorStartIndex = index! - 1\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().dispose()\r\n } else {\r\n // 查找上一行相同列索引位置信息\r\n let preTrIndex = -1\r\n let preTdIndex = -1\r\n const originalElementList = draw.getOriginalElementList()\r\n const trList = originalElementList[index!].trList!\r\n // 当前单元格所在列实际索引\r\n const curTdColIndex = trList[trIndex!].tdList[tdIndex!].colIndex!\r\n outer: for (let r = trIndex! - 1; r >= 0; r--) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList!\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n if (\r\n td.colIndex === curTdColIndex ||\r\n (td.colIndex! + td.colspan - 1 >= curTdColIndex &&\r\n td.colIndex! <= curTdColIndex)\r\n ) {\r\n preTrIndex = r\r\n preTdIndex = d\r\n break outer\r\n }\r\n }\r\n }\r\n if (!~preTrIndex || !~preTdIndex) return\r\n const preTr = trList[preTrIndex]\r\n const preTd = preTr.tdList[preTdIndex]\r\n position.setPositionContext({\r\n isTable: true,\r\n index,\r\n trIndex: preTrIndex,\r\n tdIndex: preTdIndex,\r\n tdId: preTd.id,\r\n trId: preTr.id,\r\n tableId\r\n })\r\n anchorStartIndex = preTd.value.length - 1\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().render()\r\n }\r\n } else {\r\n // 向下移动-最后一行则移出表格外,否则下一行相同列位置\r\n const originalElementList = draw.getOriginalElementList()\r\n const trList = originalElementList[index!].trList!\r\n if (trIndex === trList.length - 1) {\r\n position.setPositionContext({\r\n isTable: false\r\n })\r\n anchorStartIndex = index!\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().dispose()\r\n } else {\r\n // 查找下一行相同列索引位置信息\r\n let nexTrIndex = -1\r\n let nextTdIndex = -1\r\n // 当前单元格所在列实际索引\r\n const curTdColIndex = trList[trIndex!].tdList[tdIndex!].colIndex!\r\n outer: for (let r = trIndex! + 1; r < trList.length; r++) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList!\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n if (\r\n td.colIndex === curTdColIndex ||\r\n (td.colIndex! + td.colspan - 1 >= curTdColIndex &&\r\n td.colIndex! <= curTdColIndex)\r\n ) {\r\n nexTrIndex = r\r\n nextTdIndex = d\r\n break outer\r\n }\r\n }\r\n }\r\n if (!~nexTrIndex || !~nextTdIndex) return\r\n const nextTr = trList[nexTrIndex]\r\n const nextTd = nextTr.tdList[nextTdIndex]\r\n position.setPositionContext({\r\n isTable: true,\r\n index,\r\n trIndex: nexTrIndex,\r\n tdIndex: nextTdIndex,\r\n tdId: nextTd.id,\r\n trId: nextTr.id,\r\n tableId\r\n })\r\n anchorStartIndex = nextTd.value.length - 1\r\n anchorEndIndex = anchorStartIndex\r\n draw.getTableTool().render()\r\n }\r\n }\r\n } else {\r\n // 普通元素及跳进表格逻辑\r\n let anchorPosition: IElementPosition = cursorPosition\r\n // 扩大选区时,判断移动光标点\r\n if (evt.shiftKey) {\r\n if (startIndex === cursorPosition.index) {\r\n anchorPosition = positionList[endIndex]\r\n } else {\r\n anchorPosition = positionList[startIndex]\r\n }\r\n }\r\n const {\r\n index,\r\n rowNo,\r\n rowIndex,\r\n coordinate: {\r\n rightTop: [curRightX]\r\n }\r\n } = anchorPosition\r\n // 向上时在首行、向下时在尾行则忽略\r\n if (\r\n (isUp && rowIndex === 0) ||\r\n (!isUp && rowIndex === draw.getRowCount() - 1)\r\n ) {\r\n return\r\n }\r\n // 查找下一行位置列表\r\n const nextIndex = getNextPositionIndex({\r\n positionList,\r\n index,\r\n rowNo,\r\n isUp,\r\n cursorX: curRightX\r\n })\r\n if (nextIndex < 0) return\r\n // shift则缩放选区\r\n anchorStartIndex = nextIndex\r\n anchorEndIndex = nextIndex\r\n if (evt.shiftKey) {\r\n if (startIndex !== endIndex) {\r\n if (startIndex === cursorPosition.index) {\r\n anchorStartIndex = startIndex\r\n } else {\r\n anchorEndIndex = endIndex\r\n }\r\n } else {\r\n if (isUp) {\r\n anchorEndIndex = endIndex\r\n } else {\r\n anchorStartIndex = startIndex\r\n }\r\n }\r\n }\r\n // 如果下一行是表格则进入单元格内\r\n const elementList = draw.getElementList()\r\n const nextElement = elementList[nextIndex]\r\n if (nextElement.type === ElementType.TABLE) {\r\n const { scale } = draw.getOptions()\r\n const margins = draw.getMargins()\r\n const trList = nextElement.trList!\r\n // 查找进入的单元格及元素位置\r\n let trIndex = -1\r\n let tdIndex = -1\r\n let tdPositionIndex = -1\r\n if (isUp) {\r\n outer: for (let r = trList.length - 1; r >= 0; r--) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList!\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n const tdX = td.x! * scale + margins[3]\r\n const tdWidth = td.width! * scale\r\n if (curRightX >= tdX && curRightX <= tdX + tdWidth) {\r\n const tdPositionList = td.positionList!\r\n const lastPosition = tdPositionList[tdPositionList.length - 1]\r\n const nextPositionIndex =\r\n getNextPositionIndex({\r\n positionList: tdPositionList,\r\n index: lastPosition.index + 1, // 虚拟起始位置+1(从左往右找)\r\n rowNo: lastPosition.rowNo - 1, // 虚拟起始行号-1(从下往上找)\r\n isUp,\r\n cursorX: curRightX\r\n }) || lastPosition.index\r\n trIndex = r\r\n tdIndex = d\r\n tdPositionIndex = nextPositionIndex\r\n break outer\r\n }\r\n }\r\n }\r\n } else {\r\n outer: for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList!\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n const tdX = td.x! * scale + margins[3]\r\n const tdWidth = td.width! * scale\r\n if (curRightX >= tdX && curRightX <= tdX + tdWidth) {\r\n const tdPositionList = td.positionList!\r\n const nextPositionIndex =\r\n getNextPositionIndex({\r\n positionList: tdPositionList,\r\n index: -1, // 虚拟起始位置-1(从右往左找)\r\n rowNo: -1, // 虚拟起始行号-1(从上往下找)\r\n isUp,\r\n cursorX: curRightX\r\n }) || 0\r\n trIndex = r\r\n tdIndex = d\r\n tdPositionIndex = nextPositionIndex\r\n break outer\r\n }\r\n }\r\n }\r\n }\r\n // 设置上下文\r\n if (~trIndex && ~tdIndex && ~tdPositionIndex) {\r\n const nextTr = trList[trIndex]\r\n const nextTd = nextTr.tdList[tdIndex]\r\n position.setPositionContext({\r\n isTable: true,\r\n index: nextIndex,\r\n trIndex: trIndex,\r\n tdIndex: tdIndex,\r\n tdId: nextTd.id,\r\n trId: nextTr.id,\r\n tableId: nextElement.id\r\n })\r\n anchorStartIndex = tdPositionIndex\r\n anchorEndIndex = anchorStartIndex\r\n positionList = position.getPositionList()\r\n draw.getTableTool().render()\r\n }\r\n }\r\n }\r\n // 执行跳转\r\n if (!~anchorStartIndex || !~anchorEndIndex) return\r\n if (anchorStartIndex > anchorEndIndex) {\r\n // prettier-ignore\r\n [anchorStartIndex, anchorEndIndex] = [anchorEndIndex, anchorStartIndex]\r\n }\r\n rangeManager.setRange(anchorStartIndex, anchorEndIndex)\r\n const isCollapsed = anchorStartIndex === anchorEndIndex\r\n draw.render({\r\n curIndex: isCollapsed ? anchorStartIndex : undefined,\r\n isSetCursor: isCollapsed,\r\n isSubmitHistory: false,\r\n isCompute: false\r\n })\r\n // 将光标移动到可视范围内\r\n draw.getCursor().moveCursorToVisible({\r\n cursorPosition: positionList[isUp ? anchorStartIndex : anchorEndIndex],\r\n direction: isUp ? MoveDirection.UP : MoveDirection.DOWN\r\n })\r\n}\r\n","import { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../../CanvasEvent'\r\nimport { backspace } from './backspace'\r\nimport { del } from './delete'\r\nimport { enter } from './enter'\r\nimport { left } from './left'\r\nimport { right } from './right'\r\nimport { tab } from './tab'\r\nimport { updown } from './updown'\r\n\r\nexport function keydown(evt: KeyboardEvent, host: CanvasEvent) {\r\n if (host.isComposing) return\r\n const draw = host.getDraw()\r\n if (evt.key === KeyMap.Backspace) {\r\n backspace(evt, host)\r\n } else if (evt.key === KeyMap.Delete) {\r\n del(evt, host)\r\n } else if (evt.key === KeyMap.Enter) {\r\n enter(evt, host)\r\n } else if (evt.key === KeyMap.Left) {\r\n left(evt, host)\r\n } else if (evt.key === KeyMap.Right) {\r\n right(evt, host)\r\n } else if (evt.key === KeyMap.Up || evt.key === KeyMap.Down) {\r\n updown(evt, host)\r\n } else if (evt.key === KeyMap.ESC) {\r\n host.clearPainterStyle()\r\n const zoneManager = draw.getZone()\r\n if (!zoneManager.isMainActive()) {\r\n zoneManager.setZone(EditorZone.MAIN)\r\n }\r\n evt.preventDefault()\r\n } else if (evt.key === KeyMap.TAB) {\r\n tab(evt, host)\r\n }\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n EDITOR_ELEMENT_COPY_ATTR,\r\n EDITOR_ELEMENT_STYLE_ATTR\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { IRangeElementStyle } from '@vervedoc/docx-editor-schema'\r\nimport { splitText } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\n\r\n// 输入防抖定时器\r\nlet inputDebounceTimer: number | null = null\r\n// 待渲染标记\r\nlet pendingRender = false\r\n\r\nexport function input(data: string, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n if (draw.isReadonly() || draw.isDisabled()) return\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!data || !cursorPosition) return\r\n const isComposing = host.isComposing\r\n // 正在合成文本进行非输入操作\r\n if (isComposing && host.compositionInfo?.value === data) return\r\n const rangeManager = draw.getRange()\r\n if (!rangeManager.canInput()) return\r\n // 移除合成前,缓存设置的默认样式设置\r\n const defaultStyle =\r\n rangeManager.getDefaultStyle() || host.compositionInfo?.defaultStyle || null\r\n // 移除合成输入\r\n removeComposingInput(host)\r\n if (!isComposing) {\r\n const cursor = draw.getCursor()\r\n cursor.clearAgentDomValue()\r\n }\r\n const { TEXT, HYPERLINK, SUBSCRIPT, SUPERSCRIPT, DATE, TAB } = ElementType\r\n const text = data.replaceAll(`\\n`, ZERO)\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n // 格式化元素\r\n const elementList = draw.getElementList()\r\n const copyElement = rangeManager.getRangeAnchorStyle(elementList, endIndex)\r\n if (!copyElement) return\r\n const isDesignMode = draw.isDesignMode()\r\n const options = draw.getOptions()\r\n const isTrackChanges = options.trackChanges\r\n const inputData: IElement[] = splitText(text).map(value => {\r\n const newElement: IElement = {\r\n value\r\n }\r\n if (isTrackChanges) {\r\n newElement.revisionId = `rev_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\r\n newElement.revisionType = 'insert'\r\n newElement.revisionAuthor = '当前用户'\r\n newElement.revisionDate = new Date().toISOString()\r\n }\r\n if (\r\n isDesignMode ||\r\n (!copyElement.title?.disabled && !copyElement.control?.disabled)\r\n ) {\r\n const nextElement = elementList[endIndex + 1]\r\n // 文本、超链接、日期、上下标:复制所有信息(元素类型、样式、特殊属性)\r\n if (\r\n !copyElement.type ||\r\n copyElement.type === TEXT ||\r\n (copyElement.type === HYPERLINK && nextElement?.type === HYPERLINK) ||\r\n (copyElement.type === DATE && nextElement?.type === DATE) ||\r\n (copyElement.type === SUBSCRIPT && nextElement?.type === SUBSCRIPT) ||\r\n (copyElement.type === SUPERSCRIPT && nextElement?.type === SUPERSCRIPT)\r\n ) {\r\n EDITOR_ELEMENT_COPY_ATTR.forEach(attr => {\r\n // 在分组外无需复制分组信息\r\n if (attr === 'groupIds' && !nextElement?.groupIds) return\r\n const value = copyElement[attr] as never\r\n if (value !== undefined) {\r\n newElement[attr] = value\r\n }\r\n })\r\n }\r\n // 仅复制样式:存在默认样式设置 || 无法匹配文本类元素时(TAB)\r\n if (defaultStyle || copyElement.type === TAB) {\r\n EDITOR_ELEMENT_STYLE_ATTR.forEach(attr => {\r\n const value =\r\n defaultStyle?.[attr as keyof IRangeElementStyle] ||\r\n copyElement[attr]\r\n if (value !== undefined) {\r\n newElement[attr] = value as never\r\n }\r\n })\r\n }\r\n if (isComposing) {\r\n newElement.underline = true\r\n }\r\n }\r\n return newElement\r\n })\r\n // 控件-移除placeholder\r\n const control = draw.getControl()\r\n let curIndex: number\r\n if (control.getActiveControl() && control.getIsRangeWithinControl()) {\r\n curIndex = control.setValue(inputData)\r\n if (!isComposing) {\r\n control.emitControlContentChange()\r\n }\r\n } else {\r\n const start = startIndex + 1\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(elementList, start, endIndex - startIndex)\r\n }\r\n formatElementContext(elementList, inputData, startIndex, {\r\n editorOptions: draw.getOptions()\r\n })\r\n draw.spliceElementList(elementList, start, 0, inputData)\r\n curIndex = startIndex + inputData.length\r\n }\r\n if (~curIndex) {\r\n rangeManager.setRange(curIndex, curIndex)\r\n \r\n // 使用防抖渲染优化大文档编辑性能\r\n if (inputDebounceTimer) {\r\n window.clearTimeout(inputDebounceTimer)\r\n }\r\n pendingRender = true\r\n \r\n // 如果是合成输入(中文输入法),立即渲染以显示候选字\r\n if (isComposing) {\r\n draw.render({\r\n curIndex,\r\n isSubmitHistory: false,\r\n isPartialRender: true\r\n })\r\n pendingRender = false\r\n } else {\r\n // 普通输入使用防抖,50ms 内的连续输入只渲染一次\r\n inputDebounceTimer = window.setTimeout(() => {\r\n if (pendingRender) {\r\n draw.render({\r\n curIndex,\r\n isSubmitHistory: true,\r\n isPartialRender: true\r\n })\r\n pendingRender = false\r\n }\r\n inputDebounceTimer = null\r\n }, 50)\r\n }\r\n }\r\n if (isComposing) {\r\n host.compositionInfo = {\r\n elementList,\r\n value: text,\r\n startIndex: curIndex - inputData.length,\r\n endIndex: curIndex,\r\n defaultStyle\r\n }\r\n }\r\n}\r\n\r\nexport function removeComposingInput(host: CanvasEvent) {\r\n if (!host.compositionInfo) return\r\n const { elementList, startIndex, endIndex } = host.compositionInfo\r\n elementList.splice(startIndex + 1, endIndex - startIndex)\r\n const rangeManager = host.getDraw().getRange()\r\n rangeManager.setRange(startIndex, startIndex)\r\n host.compositionInfo = null\r\n}\r\n","import { CanvasEvent } from '../CanvasEvent'\r\nimport { writeElementList } from '../../plugin-stubs'\r\n\r\nexport function cut(host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const rangeManager = draw.getRange()\r\n const { startIndex, endIndex } = rangeManager.getRange()\r\n if (!~startIndex && !~endIndex) return\r\n if (draw.isReadonly() || !rangeManager.canInput()) return\r\n\r\n const elementList = draw.getElementList()\r\n let start = startIndex\r\n let end = endIndex\r\n // 无选区则剪切一行\r\n if (startIndex === endIndex) {\r\n const position = draw.getPosition()\r\n const positionList = position.getPositionList()\r\n const startPosition = positionList[startIndex]\r\n const curRowNo = startPosition.rowNo\r\n const curPageNo = startPosition.pageNo\r\n const cutElementIndexList: number[] = []\r\n for (let p = 0; p < positionList.length; p++) {\r\n const position = positionList[p]\r\n if (position.pageNo > curPageNo) break\r\n if (position.pageNo === curPageNo && position.rowNo === curRowNo) {\r\n cutElementIndexList.push(p)\r\n }\r\n }\r\n const firstElementIndex = cutElementIndexList[0] - 1\r\n start = firstElementIndex < 0 ? 0 : firstElementIndex\r\n end = cutElementIndexList[cutElementIndexList.length - 1]\r\n }\r\n const options = draw.getOptions()\r\n // 写入粘贴板\r\n writeElementList(elementList.slice(start + 1, end + 1), options)\r\n const control = draw.getControl()\r\n let curIndex: number\r\n if (control.getActiveControl() && control.getIsRangeWithinControl()) {\r\n curIndex = control.cut()\r\n control.emitControlContentChange()\r\n } else {\r\n draw.spliceElementList(elementList, start + 1, end - start)\r\n curIndex = start\r\n }\r\n rangeManager.setRange(curIndex, curIndex)\r\n draw.render({ curIndex })\r\n}\r\n","import { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { ICopyOption } from '@vervedoc/docx-editor-schema'\r\nimport { ITr } from '@vervedoc/docx-editor-schema'\r\nimport { getTextFromElementList, zipElementList } from '@vervedoc/docx-editor-schema'\r\nimport { IOverrideResult } from '../../plugin/override/Override'\r\nimport { writeElementList } from '../../plugin-stubs'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\n\r\nexport function copy(host: CanvasEvent, options?: ICopyOption) {\r\n const draw = host.getDraw()\r\n // 自定义粘贴事件\r\n const { copy } = draw.getOverride()\r\n if (copy) {\r\n const overrideResult = copy()\r\n // 默认阻止默认事件\r\n if ((<IOverrideResult>overrideResult)?.preventDefault !== false) return\r\n }\r\n const rangeManager = draw.getRange()\r\n // 光标闭合时复制整行\r\n let copyElementList: IElement[] | null = null\r\n const range = rangeManager.getRange()\r\n if (range.isCrossRowCol) {\r\n // 原始表格信息\r\n const tableElement = rangeManager.getRangeTableElement()\r\n if (!tableElement) return\r\n // 选区行列信息\r\n const rowCol = draw.getTableParticle().getRangeRowCol()\r\n if (!rowCol) return\r\n // 构造表格\r\n const copyTableElement: IElement = {\r\n type: ElementType.TABLE,\r\n value: '',\r\n colgroup: [],\r\n trList: []\r\n }\r\n const firstRow = rowCol[0]\r\n const colStartIndex = firstRow[0].colIndex!\r\n const lastCol = firstRow[firstRow.length - 1]\r\n const colEndIndex = lastCol.colIndex! + lastCol.colspan - 1\r\n for (let c = colStartIndex; c <= colEndIndex; c++) {\r\n copyTableElement.colgroup!.push(tableElement.colgroup![c])\r\n }\r\n for (let r = 0; r < rowCol.length; r++) {\r\n const row = rowCol[r]\r\n const tr = tableElement.trList![row[0].rowIndex!]\r\n const coptTr: ITr = {\r\n tdList: [],\r\n height: tr.height,\r\n minHeight: tr.minHeight\r\n }\r\n for (let c = 0; c < row.length; c++) {\r\n coptTr.tdList.push(row[c])\r\n }\r\n copyTableElement.trList!.push(coptTr)\r\n }\r\n copyElementList = zipElementList([copyTableElement])\r\n } else {\r\n copyElementList = rangeManager.getIsCollapsed()\r\n ? rangeManager.getRangeRowElementList()\r\n : rangeManager.getSelectionElementList()\r\n }\r\n if (options?.isPlainText && copyElementList?.length) {\r\n copyElementList = [\r\n {\r\n value: getTextFromElementList(copyElementList)\r\n }\r\n ]\r\n }\r\n if (!copyElementList?.length) return\r\n writeElementList(copyElementList, draw.getOptions())\r\n}\r\n","import { IOverrideResult } from '../../plugin/override/Override'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\nimport { pasteImage } from './paste'\r\n\r\nexport function drop(evt: DragEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n // 自定义拖放事件\r\n const { drop } = draw.getOverride()\r\n if (drop) {\r\n const overrideResult = drop(evt)\r\n // 默认阻止默认事件\r\n if ((<IOverrideResult>overrideResult)?.preventDefault !== false) return\r\n }\r\n evt.preventDefault()\r\n const data = evt.dataTransfer?.getData('text')\r\n if (data) {\r\n host.input(data)\r\n } else {\r\n const files = evt.dataTransfer?.files\r\n if (!files) return\r\n for (let i = 0; i < files.length; i++) {\r\n const file = files[i]\r\n if (file.type.startsWith('image')) {\r\n pasteImage(host, file)\r\n }\r\n }\r\n }\r\n}\r\n","import { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport type { Draw } from '../../draw/Draw'\r\n\r\nexport function contextmenu(evt: MouseEvent, draw: Draw) {\r\n const position = draw.getPosition()\r\n const positionContext = position.getPositionContext()\r\n\r\n if (!positionContext.isTable) {\r\n return\r\n }\r\n\r\n const elementList = draw.getOriginalElementList()\r\n const { index } = positionContext\r\n let tableElement = null\r\n for (let i = index!; i >= 0; i--) {\r\n const el = elementList[i]\r\n if (el && el.type === ElementType.TABLE) {\r\n tableElement = el\r\n break\r\n }\r\n }\r\n\r\n if (!tableElement) {\r\n return\r\n }\r\n\r\n evt.preventDefault()\r\n evt.stopPropagation()\r\n\r\n const tableContextMenu = (draw as any).__tableContextMenu\r\n if (tableContextMenu) {\r\n tableContextMenu.show(evt.clientX, evt.clientY, tableElement)\r\n }\r\n}\r\n","import { ZERO, TEXTLIKE_ELEMENT_TYPE, NUMBER_LIKE_REG, ElementType, IRange, IElement, isParagraphSeparator } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\n\r\n// 通过分词器获取单词所在选区\r\nfunction getWordRangeBySegmenter(host: CanvasEvent): IRange | null {\r\n if (!Intl.Segmenter) return null\r\n const draw = host.getDraw()\r\n const cursorPosition = draw.getPosition().getCursorPosition()\r\n if (!cursorPosition) return null\r\n const rangeManager = draw.getRange()\r\n const paragraphInfo = rangeManager.getRangeParagraphInfo()\r\n if (!paragraphInfo) return null\r\n // 组装段落文本\r\n const paragraphText =\r\n paragraphInfo?.elementList\r\n ?.map((e: IElement) =>\r\n !e.type ||\r\n (e.type !== ElementType.CONTROL &&\r\n TEXTLIKE_ELEMENT_TYPE.includes(e.type))\r\n ? e.value\r\n : ZERO\r\n )\r\n .join('') || ''\r\n if (!paragraphText) return null\r\n // 光标所在位置\r\n const cursorStartIndex = cursorPosition.index\r\n // 段落首字符相对文档起始位置\r\n const offset = paragraphInfo.startIndex\r\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'word' })\r\n const segments = segmenter.segment(paragraphText)\r\n // 新的光标位置\r\n let startIndex = -1\r\n let endIndex = -1\r\n for (const { segment, index, isWordLike } of segments) {\r\n const realSegmentStartIndex = index + offset\r\n if (\r\n isWordLike &&\r\n cursorStartIndex >= realSegmentStartIndex &&\r\n cursorStartIndex < realSegmentStartIndex + segment.length\r\n ) {\r\n startIndex = realSegmentStartIndex - 1\r\n endIndex = startIndex + segment.length\r\n break\r\n }\r\n }\r\n return ~startIndex && ~endIndex ? { startIndex, endIndex } : null\r\n}\r\n\r\n// 通过光标位置获取单词所在选区\r\nfunction getWordRangeByCursor(host: CanvasEvent): IRange | null {\r\n const draw = host.getDraw()\r\n const cursorPosition = draw.getPosition().getCursorPosition()\r\n if (!cursorPosition) return null\r\n const { value, index } = cursorPosition\r\n // 判断是否是数字或英文\r\n const LETTER_REG = draw.getLetterReg()\r\n let upCount = 0\r\n let downCount = 0\r\n const isNumber = NUMBER_LIKE_REG.test(value)\r\n if (isNumber || LETTER_REG.test(value)) {\r\n const elementList = draw.getElementList()\r\n // 向上查询\r\n let upStartIndex = index - 1\r\n while (upStartIndex > 0) {\r\n const value = elementList[upStartIndex].value\r\n if (\r\n (isNumber && NUMBER_LIKE_REG.test(value)) ||\r\n (!isNumber && LETTER_REG.test(value))\r\n ) {\r\n upCount++\r\n upStartIndex--\r\n } else {\r\n break\r\n }\r\n }\r\n // 向下查询\r\n let downStartIndex = index + 1\r\n while (downStartIndex < elementList.length) {\r\n const value = elementList[downStartIndex].value\r\n if (\r\n (isNumber && NUMBER_LIKE_REG.test(value)) ||\r\n (!isNumber && LETTER_REG.test(value))\r\n ) {\r\n downCount++\r\n downStartIndex++\r\n } else {\r\n break\r\n }\r\n }\r\n }\r\n // 新的光标位置\r\n const startIndex = index - upCount - 1\r\n if (startIndex < 0) return null\r\n return {\r\n startIndex,\r\n endIndex: index + downCount\r\n }\r\n}\r\n\r\nfunction dblclick(host: CanvasEvent, evt: MouseEvent) {\r\n const draw = host.getDraw()\r\n const position = draw.getPosition()\r\n const positionContext = position.getPositionByXY({\r\n x: evt.offsetX,\r\n y: evt.offsetY\r\n })\r\n // 图片预览\r\n if (positionContext.isImage && positionContext.isDirectHit) {\r\n draw.getPreviewer().render()\r\n return\r\n }\r\n // 切换区域\r\n if (draw.getIsPagingMode()) {\r\n if (!~positionContext.index && positionContext.zone) {\r\n draw.getZone().setZone(positionContext.zone)\r\n draw.clearSideEffect()\r\n position.setPositionContext({\r\n isTable: false\r\n })\r\n // 设置光标到对应区域的起始位置\r\n const rangeManager = draw.getRange()\r\n rangeManager.setRange(0, 0)\r\n draw.render({\r\n curIndex: 0,\r\n isSubmitHistory: false\r\n })\r\n return\r\n }\r\n }\r\n // 复选/单选框双击时是切换选择状态,禁用扩选\r\n if (\r\n (positionContext.isCheckbox || positionContext.isRadio) &&\r\n positionContext.isDirectHit\r\n ) {\r\n return\r\n }\r\n // 自动扩选文字-分词处理,优先使用分词器否则降级使用光标所在位置\r\n const rangeManager = draw.getRange()\r\n const segmenterRange =\r\n getWordRangeBySegmenter(host) || getWordRangeByCursor(host)\r\n if (!segmenterRange) return\r\n rangeManager.setRange(segmenterRange.startIndex, segmenterRange.endIndex)\r\n // 刷新文档\r\n draw.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n // 更新选区\r\n rangeManager.setRangeStyle()\r\n}\r\n\r\nfunction handleTripleClick(host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const position = draw.getPosition()\r\n const cursorPosition = position.getCursorPosition()\r\n if (!cursorPosition) return\r\n const { index } = cursorPosition\r\n const elementList = draw.getElementList()\r\n // 判断是否是零宽字符\r\n let upCount = 0\r\n let downCount = 0\r\n // 向上查询\r\n let upStartIndex = index - 1\r\n while (upStartIndex > 0) {\r\n const element = elementList[upStartIndex]\r\n const preElement = elementList[upStartIndex - 1]\r\n if (\r\n isParagraphSeparator(element) ||\r\n element.listId !== preElement?.listId ||\r\n element.titleId !== preElement?.titleId\r\n ) {\r\n break\r\n }\r\n upCount++\r\n upStartIndex--\r\n }\r\n // 向下查询\r\n let downStartIndex = index + 1\r\n while (downStartIndex < elementList.length) {\r\n const element = elementList[downStartIndex]\r\n const nextElement = elementList[downStartIndex + 1]\r\n if (\r\n isParagraphSeparator(element) ||\r\n element.listId !== nextElement?.listId ||\r\n element.titleId !== nextElement?.titleId\r\n ) {\r\n break\r\n }\r\n downCount++\r\n downStartIndex++\r\n }\r\n // 设置选中区域-不选择段落首尾换行符\r\n const rangeManager = draw.getRange()\r\n let newStartIndex = index - upCount - 1\r\n if (elementList[newStartIndex]?.value !== ZERO) {\r\n newStartIndex -= 1\r\n }\r\n if (newStartIndex < 0) return\r\n let newEndIndex = index + downCount + 1\r\n if (\r\n elementList[newEndIndex]?.value === ZERO ||\r\n newEndIndex > elementList.length - 1\r\n ) {\r\n newEndIndex -= 1\r\n }\r\n rangeManager.setRange(newStartIndex, newEndIndex)\r\n // 刷新文档\r\n draw.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n}\r\n\r\nexport default {\r\n dblclick,\r\n handleTripleClick\r\n}\r\n","import { CanvasEvent } from '../CanvasEvent'\r\nimport { input, removeComposingInput } from './input'\r\n\r\nfunction compositionstart(host: CanvasEvent) {\r\n host.isComposing = true\r\n}\r\n\r\nfunction compositionend(host: CanvasEvent, evt: CompositionEvent) {\r\n host.isComposing = false\r\n // 处理输入框关闭\r\n const draw = host.getDraw()\r\n // 不存在值:删除合成输入\r\n if (!evt.data) {\r\n removeComposingInput(host)\r\n const rangeManager = draw.getRange()\r\n const { endIndex: curIndex } = rangeManager.getRange()\r\n draw.render({\r\n curIndex,\r\n isSubmitHistory: false\r\n })\r\n } else {\r\n // 存在值:无法触发input事件需手动检测并触发渲染\r\n if (host.compositionInfo) {\r\n input(evt.data, host)\r\n }\r\n }\r\n // 移除代理输入框数据\r\n const cursor = draw.getCursor()\r\n cursor.clearAgentDomValue()\r\n}\r\n\r\nexport default {\r\n compositionstart,\r\n compositionend\r\n}\r\n","import { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { findParent } from '@vervedoc/docx-editor-schema'\r\nimport { CanvasEvent } from '../CanvasEvent'\r\n\r\nfunction dragover(evt: DragEvent | MouseEvent, host: CanvasEvent) {\r\n const draw = host.getDraw()\r\n const isReadonly = draw.isReadonly()\r\n if (isReadonly) return\r\n evt.preventDefault()\r\n // 非编辑器区禁止拖放\r\n const pageContainer = draw.getPageContainer()\r\n const editorRegion = findParent(\r\n evt.target as Element,\r\n (node: Element) => node === pageContainer,\r\n true\r\n )\r\n if (!editorRegion) return\r\n const target = evt.target as HTMLDivElement\r\n const pageIndex = target.dataset.index\r\n // 设置pageNo\r\n if (pageIndex) {\r\n draw.setPageNo(Number(pageIndex))\r\n }\r\n const position = draw.getPosition()\r\n const positionContext = position.adjustPositionContext({\r\n x: evt.offsetX,\r\n y: evt.offsetY\r\n })\r\n if (!positionContext) return\r\n const { isTable, tdValueIndex, index } = positionContext\r\n // 设置选区及光标位置\r\n const positionList = position.getPositionList()\r\n const curIndex = isTable ? tdValueIndex! : index\r\n if (~index) {\r\n const rangeManager = draw.getRange()\r\n rangeManager.setRange(curIndex, curIndex)\r\n position.setCursorPosition(positionList[curIndex])\r\n }\r\n const cursor = draw.getCursor()\r\n const {\r\n cursor: { dragColor, dragWidth, dragFloatImageDisabled }\r\n } = draw.getOptions()\r\n // 拖拽图片是否定位光标\r\n if (dragFloatImageDisabled) {\r\n const dragElement = host.cacheElementList?.[host.cacheRange!.startIndex]\r\n if (\r\n dragElement?.type === ElementType.IMAGE &&\r\n (dragElement.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n dragElement.imgDisplay === ImageDisplay.FLOAT_BOTTOM ||\r\n dragElement.imgDisplay === ImageDisplay.SURROUND)\r\n ) {\r\n return\r\n }\r\n }\r\n cursor.drawCursor({\r\n width: dragWidth,\r\n color: dragColor,\r\n isBlink: false,\r\n isFocus: false\r\n })\r\n}\r\n\r\nexport default {\r\n dragover\r\n}\r\n","import { ElementStyleKey } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { ICurrentPosition, IPositionContext } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { Position } from '../position/Position'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { handleTripleClick } from '@vervedoc/docx-editor-schema'\r\nimport { IRange, IRangeElementStyle } from '@vervedoc/docx-editor-schema'\r\nimport { mousedown } from './handlers/mousedown'\r\nimport { mouseup } from './handlers/mouseup'\r\nimport { mouseleave } from './handlers/mouseleave'\r\nimport { mousemove } from './handlers/mousemove'\r\nimport { keydown } from './handlers/keydown'\r\nimport { input } from './handlers/input'\r\nimport { cut } from './handlers/cut'\r\nimport { copy } from './handlers/copy'\r\nimport { drop } from './handlers/drop'\r\nimport { contextmenu } from './handlers/contextmenu'\r\nimport click from './handlers/click'\r\nimport composition from './handlers/composition'\r\nimport drag from './handlers/drag'\r\nimport { isIOS } from '@vervedoc/docx-editor-schema'\r\nimport { ICopyOption } from '@vervedoc/docx-editor-schema'\r\n\r\nexport interface ICompositionInfo {\r\n elementList: IElement[]\r\n startIndex: number\r\n endIndex: number\r\n value: string\r\n defaultStyle: IRangeElementStyle | null\r\n}\r\n\r\nexport class CanvasEvent {\r\n public isAllowSelection: boolean\r\n public isComposing: boolean\r\n public compositionInfo: ICompositionInfo | null\r\n\r\n public isAllowDrag: boolean\r\n public isAllowDrop: boolean\r\n public cacheRange: IRange | null\r\n public cacheElementList: IElement[] | null\r\n public cachePositionList: IElementPosition[] | null\r\n public cachePositionContext: IPositionContext | null\r\n public mouseDownStartPosition: ICurrentPosition | null\r\n\r\n private draw: Draw\r\n private pageContainer: HTMLDivElement\r\n private pageList: HTMLCanvasElement[]\r\n private range: RangeManager\r\n private position: Position\r\n\r\n private _clickHandler: ((evt: MouseEvent) => void) | null = null\r\n private _mousedownHandler: ((evt: MouseEvent) => void) | null = null\r\n private _mouseupHandler: ((evt: MouseEvent) => void) | null = null\r\n private _mouseleaveHandler: ((evt: MouseEvent) => void) | null = null\r\n private _mousemoveHandler: ((evt: MouseEvent) => void) | null = null\r\n private _dblclickHandler: ((evt: MouseEvent) => void) | null = null\r\n private _dragoverHandler: ((evt: DragEvent) => void) | null = null\r\n private _dropHandler: ((evt: DragEvent) => void) | null = null\r\n private _contextmenuHandler: ((evt: MouseEvent) => void) | null = null\r\n private _threeClickCleanup: (() => void) | null = null\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.pageContainer = draw.getPageContainer()\r\n this.pageList = draw.getPageList()\r\n this.range = this.draw.getRange()\r\n this.position = this.draw.getPosition()\r\n\r\n this.isAllowSelection = false\r\n this.isComposing = false\r\n this.compositionInfo = null\r\n this.isAllowDrag = false\r\n this.isAllowDrop = false\r\n this.cacheRange = null\r\n this.cacheElementList = null\r\n this.cachePositionList = null\r\n this.cachePositionContext = null\r\n this.mouseDownStartPosition = null\r\n }\r\n\r\n public getDraw(): Draw {\r\n return this.draw\r\n }\r\n\r\n public register() {\r\n this._clickHandler = this.click.bind(this)\r\n this._mousedownHandler = this.mousedown.bind(this)\r\n this._mouseupHandler = this.mouseup.bind(this)\r\n this._mouseleaveHandler = this.mouseleave.bind(this)\r\n this._mousemoveHandler = this.mousemove.bind(this)\r\n this._dblclickHandler = this.dblclick.bind(this)\r\n this._dragoverHandler = this.dragover.bind(this)\r\n this._dropHandler = this.drop.bind(this)\r\n this._contextmenuHandler = this._contextmenu.bind(this)\r\n this.pageContainer.addEventListener('click', this._clickHandler)\r\n this.pageContainer.addEventListener('mousedown', this._mousedownHandler)\r\n this.pageContainer.addEventListener('mouseup', this._mouseupHandler)\r\n this.pageContainer.addEventListener('mouseleave', this._mouseleaveHandler)\r\n this.pageContainer.addEventListener('mousemove', this._mousemoveHandler)\r\n this.pageContainer.addEventListener('dblclick', this._dblclickHandler)\r\n this.pageContainer.addEventListener('dragover', this._dragoverHandler)\r\n this.pageContainer.addEventListener('drop', this._dropHandler)\r\n this.pageContainer.addEventListener('contextmenu', this._contextmenuHandler)\r\n this._threeClickCleanup = handleTripleClick(this.pageContainer, this.handleTripleClick.bind(this))\r\n }\r\n\r\n public removeEvent() {\r\n if (this._clickHandler) this.pageContainer.removeEventListener('click', this._clickHandler)\r\n if (this._mousedownHandler) this.pageContainer.removeEventListener('mousedown', this._mousedownHandler)\r\n if (this._mouseupHandler) this.pageContainer.removeEventListener('mouseup', this._mouseupHandler)\r\n if (this._mouseleaveHandler) this.pageContainer.removeEventListener('mouseleave', this._mouseleaveHandler)\r\n if (this._mousemoveHandler) this.pageContainer.removeEventListener('mousemove', this._mousemoveHandler)\r\n if (this._dblclickHandler) this.pageContainer.removeEventListener('dblclick', this._dblclickHandler)\r\n if (this._dragoverHandler) this.pageContainer.removeEventListener('dragover', this._dragoverHandler)\r\n if (this._dropHandler) this.pageContainer.removeEventListener('drop', this._dropHandler)\r\n if (this._contextmenuHandler) this.pageContainer.removeEventListener('contextmenu', this._contextmenuHandler)\r\n if (this._threeClickCleanup) this._threeClickCleanup()\r\n this._clickHandler = null\r\n this._mousedownHandler = null\r\n this._mouseupHandler = null\r\n this._mouseleaveHandler = null\r\n this._mousemoveHandler = null\r\n this._dblclickHandler = null\r\n this._dragoverHandler = null\r\n this._dropHandler = null\r\n this._contextmenuHandler = null\r\n this._threeClickCleanup = null\r\n }\r\n\r\n public setIsAllowSelection(payload: boolean) {\r\n this.isAllowSelection = payload\r\n if (!payload) {\r\n this.applyPainterStyle()\r\n }\r\n }\r\n\r\n public setIsAllowDrag(payload: boolean) {\r\n this.isAllowDrag = payload\r\n this.isAllowDrop = payload\r\n }\r\n\r\n public clearPainterStyle() {\r\n this.pageList.forEach(p => {\r\n p.style.cursor = 'text'\r\n })\r\n this.draw.setPainterStyle(null)\r\n }\r\n\r\n public applyPainterStyle() {\r\n const painterStyle = this.draw.getPainterStyle()\r\n if (!painterStyle) return\r\n const isDisabled = this.draw.isReadonly() || this.draw.isDisabled()\r\n if (isDisabled) return\r\n const selection = this.range.getSelection()\r\n if (!selection) return\r\n const painterStyleKeys = Object.keys(painterStyle)\r\n selection.forEach(s => {\r\n painterStyleKeys.forEach(pKey => {\r\n const key = pKey as keyof typeof ElementStyleKey\r\n s[key] = painterStyle[key] as any\r\n })\r\n })\r\n this.draw.render({ isSetCursor: false })\r\n // 清除格式刷\r\n const painterOptions = this.draw.getPainterOptions()\r\n if (!painterOptions || !painterOptions.isDblclick) {\r\n this.clearPainterStyle()\r\n }\r\n }\r\n\r\n public selectAll() {\r\n const position = this.position.getPositionList()\r\n this.range.setRange(0, position.length - 1)\r\n this.draw.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n }\r\n\r\n public mousemove(evt: MouseEvent) {\r\n mousemove(evt, this)\r\n }\r\n\r\n public mousedown(evt: MouseEvent) {\r\n mousedown(evt, this)\r\n }\r\n\r\n public click() {\r\n // IOS系统限制非用户主动触发事件的键盘弹出\r\n if (isIOS && !this.draw.isReadonly()) {\r\n this.draw.getCursor().getAgentDom().focus()\r\n }\r\n }\r\n\r\n public mouseup(evt: MouseEvent) {\r\n mouseup(evt, this)\r\n }\r\n\r\n public mouseleave(evt: MouseEvent) {\r\n mouseleave(evt, this)\r\n }\r\n\r\n public keydown(evt: KeyboardEvent) {\r\n keydown(evt, this)\r\n }\r\n\r\n public dblclick(evt: MouseEvent) {\r\n click.dblclick(this, evt)\r\n }\r\n\r\n public handleTripleClick() {\r\n click.handleTripleClick(this)\r\n }\r\n\r\n public input(data: string) {\r\n input(data, this)\r\n }\r\n\r\n public cut() {\r\n cut(this)\r\n }\r\n\r\n public copy(options?: ICopyOption) {\r\n copy(this, options)\r\n }\r\n\r\n public compositionstart() {\r\n composition.compositionstart(this)\r\n }\r\n\r\n public compositionend(evt: CompositionEvent) {\r\n composition.compositionend(this, evt)\r\n }\r\n\r\n public drop(evt: DragEvent) {\r\n drop(evt, this)\r\n }\r\n\r\n public dragover(evt: DragEvent | MouseEvent) {\r\n drag.dragover(evt, this)\r\n }\r\n\r\n private _contextmenu(evt: MouseEvent) {\r\n contextmenu(evt, this.draw)\r\n }\r\n}\r\n","import { EDITOR_COMPONENT } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { findParent } from '@vervedoc/docx-editor-schema'\r\nimport { Cursor } from '../cursor/Cursor'\r\nimport { Control } from '../control/Control'\r\nimport { Draw } from '../draw/Draw'\r\nimport { HyperlinkParticle } from '../particle/HyperlinkParticle'\r\nimport { DateParticle } from '../plugin-stubs'\r\nimport { Previewer } from '../particle/previewer/Previewer'\r\nimport { TableTool } from '../particle/table/TableTool'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { CanvasEvent } from './CanvasEvent'\r\nimport { ImageParticle } from '../particle/ImageParticle'\r\nimport { INTERNAL_SHORTCUT_KEY } from '@vervedoc/docx-editor-schema'\r\n\r\nexport class GlobalEvent {\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n private cursor: Cursor | null\r\n private canvasEvent: CanvasEvent\r\n private range: RangeManager\r\n private previewer: Previewer\r\n private tableTool: TableTool\r\n private hyperlinkParticle: HyperlinkParticle\r\n private control: Control\r\n private dateParticle: DateParticle\r\n private imageParticle: ImageParticle\r\n private dprMediaQueryList: MediaQueryList\r\n\r\n constructor(draw: Draw, canvasEvent: CanvasEvent) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.canvasEvent = canvasEvent\r\n this.cursor = null\r\n this.range = draw.getRange()\r\n this.previewer = draw.getPreviewer()\r\n this.tableTool = draw.getTableTool()\r\n this.hyperlinkParticle = draw.getHyperlinkParticle()\r\n this.dateParticle = draw.getDateParticle()\r\n this.imageParticle = draw.getImageParticle()\r\n this.control = draw.getControl()\r\n this.dprMediaQueryList = window.matchMedia(\r\n `(resolution: ${window.devicePixelRatio}dppx)`\r\n )\r\n }\r\n\r\n public register() {\r\n this.cursor = this.draw.getCursor()\r\n this.addEvent()\r\n }\r\n\r\n private addEvent() {\r\n window.addEventListener('blur', this.clearSideEffect)\r\n document.addEventListener('mousedown', this.clearSideEffect)\r\n document.addEventListener('mouseup', this.setCanvasEventAbility)\r\n document.addEventListener('wheel', this.setPageScale, { passive: false })\r\n document.addEventListener('visibilitychange', this._handleVisibilityChange)\r\n this.dprMediaQueryList.addEventListener('change', this._handleDprChange)\r\n }\r\n\r\n public removeEvent() {\r\n window.removeEventListener('blur', this.clearSideEffect)\r\n document.removeEventListener('mousedown', this.clearSideEffect)\r\n document.removeEventListener('mouseup', this.setCanvasEventAbility)\r\n document.removeEventListener('wheel', this.setPageScale)\r\n document.removeEventListener(\r\n 'visibilitychange',\r\n this._handleVisibilityChange\r\n )\r\n this.dprMediaQueryList.removeEventListener('change', this._handleDprChange)\r\n }\r\n\r\n public clearSideEffect = (evt: Event) => {\r\n if (!this.cursor) return\r\n // 编辑器内部dom\r\n const target = <Element>(evt?.composedPath()[0] || evt.target)\r\n const pageList = this.draw.getPageList()\r\n const innerEditorDom = findParent(\r\n target,\r\n (node: any) => pageList.includes(node),\r\n true\r\n )\r\n if (innerEditorDom) return\r\n // 编辑器外部组件dom\r\n const outerEditorDom = findParent(\r\n target,\r\n (node: Node & Element) =>\r\n !!node && node.nodeType === 1 && !!node.getAttribute(EDITOR_COMPONENT),\r\n true\r\n )\r\n if (outerEditorDom) {\r\n this.watchCursorActive()\r\n return\r\n }\r\n this.cursor.recoveryCursor()\r\n this.range.recoveryRangeStyle()\r\n this.previewer.clearResizer()\r\n this.tableTool.dispose()\r\n this.hyperlinkParticle.clearHyperlinkPopup()\r\n this.control.destroyControl()\r\n this.dateParticle.clearDatePicker()\r\n this.imageParticle.destroyFloatImage()\r\n }\r\n\r\n public setCanvasEventAbility = () => {\r\n this.canvasEvent.setIsAllowDrag(false)\r\n this.canvasEvent.setIsAllowSelection(false)\r\n }\r\n\r\n public watchCursorActive() {\r\n // 选区闭合&实际光标移出光标代理\r\n if (!this.range.getIsCollapsed()) return\r\n setTimeout(() => {\r\n // 将模拟光标变成失活显示状态\r\n if (!this.cursor?.getAgentIsActive()) {\r\n this.cursor?.drawCursor({\r\n isFocus: false,\r\n isBlink: false\r\n })\r\n }\r\n })\r\n }\r\n\r\n public setPageScale = (evt: WheelEvent) => {\r\n // 设置禁用快捷键\r\n if (\r\n this.options.shortcutDisableKeys.includes(\r\n INTERNAL_SHORTCUT_KEY.PAGE_SCALE\r\n )\r\n ) {\r\n return\r\n }\r\n // 仅在按下Ctrl键时生效\r\n if (!evt.ctrlKey) return\r\n evt.preventDefault()\r\n const { scale } = this.options\r\n if (evt.deltaY < 0) {\r\n const nextScale = Math.round(scale * 10 + 1) / 10\r\n if (nextScale <= 3.0) {\r\n this.draw.setPageScale(nextScale)\r\n }\r\n } else {\r\n const nextScale = Math.round(scale * 10 - 1) / 10\r\n if (nextScale >= 0.5) {\r\n this.draw.setPageScale(nextScale)\r\n }\r\n }\r\n }\r\n\r\n private _handleVisibilityChange = () => {\r\n if (document.visibilityState === 'visible') {\r\n // 页面可见时重新渲染激活页面\r\n const range = this.range.getRange()\r\n const isSetCursor =\r\n !!~range.startIndex &&\r\n !!~range.endIndex &&\r\n range.startIndex === range.endIndex\r\n this.range.replaceRange(range)\r\n this.draw.render({\r\n isSetCursor,\r\n isCompute: false,\r\n isSubmitHistory: false,\r\n curIndex: range.startIndex\r\n })\r\n }\r\n }\r\n\r\n private _handleDprChange = () => {\r\n this.draw.setPageDevicePixel()\r\n }\r\n}\r\n","import { ListStyle, RowFlex, ElementType, VerticalAlign } from '@vervedoc/docx-editor-schema'\r\nimport { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IComputePageRowPositionPayload,\r\n IComputePageRowPositionResult,\r\n IComputeRowPositionPayload,\r\n IFloatPosition,\r\n IGetFloatPositionByXYPayload,\r\n ISetSurroundPositionPayload\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n ICurrentPosition,\r\n IGetPositionByXYPayload,\r\n IPositionContext\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { EditorMode, EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { deepClone, isRectIntersect } from '@vervedoc/docx-editor-schema'\r\nimport { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { EventBus } from '@vervedoc/docx-editor-state'\r\nimport { EventBusMap } from '@vervedoc/docx-editor-schema'\r\nimport { getIsBlockElement, isTableElement, isImageElement } from '@vervedoc/docx-editor-schema'\r\n\r\nexport class Position {\r\n private cursorPosition: IElementPosition | null\r\n private positionContext: IPositionContext\r\n private positionList: IElementPosition[]\r\n private floatPositionList: IFloatPosition[]\r\n\r\n private draw: Draw\r\n private eventBus: EventBus<EventBusMap>\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.positionList = []\r\n this.floatPositionList = []\r\n this.cursorPosition = null\r\n this.positionContext = {\r\n isTable: false,\r\n isControl: false\r\n }\r\n\r\n this.draw = draw\r\n this.eventBus = draw.getEventBus()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public getFloatPositionList(): IFloatPosition[] {\r\n return this.floatPositionList\r\n }\r\n\r\n public getTablePositionList(\r\n sourceElementList: IElement[]\r\n ): IElementPosition[] {\r\n const { index, trIndex, tdIndex } = this.positionContext\r\n return (\r\n sourceElementList[index!].trList![trIndex!].tdList[tdIndex!]\r\n .positionList || []\r\n )\r\n }\r\n\r\n public getPositionList(): IElementPosition[] {\r\n return this.positionContext.isTable\r\n ? this.getTablePositionList(this.draw.getOriginalElementList())\r\n : this.getOriginalPositionList()\r\n }\r\n\r\n public getMainPositionList(): IElementPosition[] {\r\n return this.positionContext.isTable\r\n ? this.getTablePositionList(this.draw.getOriginalMainElementList())\r\n : this.positionList\r\n }\r\n\r\n public getOriginalPositionList(): IElementPosition[] {\r\n const zoneManager = this.draw.getZone()\r\n if (zoneManager.isHeaderActive()) {\r\n const header = this.draw.getHeader()\r\n return header.getPositionList()\r\n }\r\n if (zoneManager.isFooterActive()) {\r\n const footer = this.draw.getFooter()\r\n return footer.getPositionList()\r\n }\r\n return this.positionList\r\n }\r\n\r\n public getOriginalMainPositionList(): IElementPosition[] {\r\n return this.positionList\r\n }\r\n\r\n public getSelectionPositionList(): IElementPosition[] | null {\r\n const { startIndex, endIndex } = this.draw.getRange().getRange()\r\n if (startIndex === endIndex) return null\r\n const positionList = this.getPositionList()\r\n return positionList.slice(startIndex + 1, endIndex + 1)\r\n }\r\n\r\n public setPositionList(payload: IElementPosition[]) {\r\n this.positionList = payload\r\n }\r\n\r\n public setFloatPositionList(payload: IFloatPosition[]) {\r\n this.floatPositionList = payload\r\n }\r\n\r\n public computePageRowPosition(\r\n payload: IComputePageRowPositionPayload\r\n ): IComputePageRowPositionResult {\r\n const {\r\n positionList,\r\n rowList,\r\n pageNo,\r\n startX,\r\n startY,\r\n startRowIndex,\r\n startIndex,\r\n innerWidth,\r\n zone\r\n } = payload\r\n const {\r\n scale,\r\n table: { tdPadding }\r\n } = this.options\r\n let x = startX\r\n let y = startY\r\n let index = startIndex\r\n for (let i = 0; i < rowList.length; i++) {\r\n const curRow = rowList[i]\r\n // 分栏容器行:各列独立计算位置\r\n if (curRow.isColumnContainer && curRow.columnRowLists) {\r\n const colWidths = curRow.columnWidths || []\r\n const colGap = curRow.columnGap || 0\r\n let colX = x\r\n for (let c = 0; c < curRow.columnRowLists.length; c++) {\r\n const colRowList = curRow.columnRowLists[c]\r\n if (colRowList.length > 0) {\r\n this.computePageRowPosition({\r\n positionList,\r\n rowList: colRowList,\r\n pageNo,\r\n startX: colX,\r\n startY: y,\r\n startRowIndex: startRowIndex + i,\r\n startIndex: index,\r\n innerWidth: colWidths[c] || 0,\r\n zone\r\n })\r\n // 更新 index\r\n for (const colRow of colRowList) {\r\n index += colRow.elementList.length\r\n }\r\n }\r\n colX += (colWidths[c] || 0) + colGap\r\n }\r\n y += curRow.height\r\n continue\r\n }\r\n // 行存在环绕的可能性均不设置行布局\r\n if (!curRow.isSurround) {\r\n // 计算行偏移量(行居中、居右)\r\n const curRowWidth = curRow.width + (curRow.offsetX || 0)\r\n if (curRow.rowFlex === RowFlex.CENTER) {\r\n x += (innerWidth - curRowWidth) / 2\r\n } else if (curRow.rowFlex === RowFlex.RIGHT) {\r\n x += innerWidth - curRowWidth\r\n }\r\n }\r\n // 当前行X/Y轴偏移量\r\n x += curRow.offsetX || 0\r\n y += curRow.offsetY || 0\r\n // 当前td所在位置\r\n const tablePreX = x\r\n const tablePreY = y\r\n for (let j = 0; j < curRow.elementList.length; j++) {\r\n const element = curRow.elementList[j]\r\n const metrics = element.metrics\r\n const offsetY =\r\n isImageElement(element) ||\r\n element.type === ElementType.LATEX\r\n ? curRow.ascent - metrics.height\r\n : curRow.ascent\r\n // 偏移量\r\n if (element.left) {\r\n x += element.left\r\n }\r\n const positionItem: IElementPosition = {\r\n pageNo,\r\n index,\r\n value: element.value,\r\n rowIndex: startRowIndex + i,\r\n rowNo: i,\r\n metrics,\r\n left: element.left || 0,\r\n ascent: offsetY,\r\n lineHeight: curRow.height,\r\n isFirstLetter: j === 0,\r\n isLastLetter: j === curRow.elementList.length - 1,\r\n coordinate: {\r\n leftTop: [x, y],\r\n leftBottom: [x, y + curRow.height],\r\n rightTop: [x + metrics.width, y],\r\n rightBottom: [x + metrics.width, y + curRow.height]\r\n }\r\n }\r\n // 缓存浮动元素信息\r\n if (\r\n element.imgDisplay === ImageDisplay.SURROUND ||\r\n element.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n element.imgDisplay === ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n // 浮动元素使用上一位置信息\r\n const prePosition = positionList[positionList.length - 1]\r\n if (prePosition) {\r\n positionItem.metrics = prePosition.metrics\r\n positionItem.coordinate = prePosition.coordinate\r\n }\r\n // 兼容浮动元素初始坐标为空的情况-默认使用左上坐标\r\n if (!element.imgFloatPosition) {\r\n element.imgFloatPosition = {\r\n x,\r\n y,\r\n pageNo\r\n }\r\n }\r\n this.floatPositionList.push({\r\n pageNo,\r\n element,\r\n position: positionItem,\r\n isTable: payload.isTable,\r\n index: payload.index,\r\n tdIndex: payload.tdIndex,\r\n trIndex: payload.trIndex,\r\n tdValueIndex: index,\r\n zone\r\n })\r\n }\r\n positionList.push(positionItem)\r\n index++\r\n x += metrics.width\r\n // 计算表格内元素位置\r\n if (isTableElement(element)) {\r\n const tableTdPadding = element.tdPadding || tdPadding\r\n for (let t = 0; t < element.trList!.length; t++) {\r\n const tr = element.trList![t]\r\n for (let d = 0; d < tr.tdList!.length; d++) {\r\n const td = tr.tdList[d]\r\n const effectiveTdPadding = td.padding || tableTdPadding\r\n const tdPaddingWidth = effectiveTdPadding[1] + effectiveTdPadding[3]\r\n const tdPaddingHeight = effectiveTdPadding[0] + effectiveTdPadding[2]\r\n td.positionList = []\r\n const rowList = td.rowList!\r\n const drawRowResult = this.computePageRowPosition({\r\n positionList: td.positionList,\r\n rowList,\r\n pageNo,\r\n startRowIndex: 0,\r\n startIndex: 0,\r\n startX: (td.x! + effectiveTdPadding[3]) * scale + tablePreX,\r\n startY: (td.y! + effectiveTdPadding[0]) * scale + tablePreY,\r\n innerWidth: (td.width! - tdPaddingWidth) * scale,\r\n isTable: true,\r\n index: index - 1,\r\n tdIndex: d,\r\n trIndex: t,\r\n zone\r\n })\r\n // 垂直对齐方式\r\n if (\r\n td.verticalAlign === VerticalAlign.MIDDLE ||\r\n td.verticalAlign === VerticalAlign.BOTTOM\r\n ) {\r\n const rowsHeight = rowList.reduce(\r\n (pre, cur) => pre + cur.height,\r\n 0\r\n )\r\n const blankHeight =\r\n (td.height! - tdPaddingHeight) * scale - rowsHeight\r\n const offsetHeight =\r\n td.verticalAlign === VerticalAlign.MIDDLE\r\n ? blankHeight / 2\r\n : blankHeight\r\n if (Math.floor(offsetHeight) > 0) {\r\n td.positionList.forEach(tdPosition => {\r\n const {\r\n coordinate: { leftTop, leftBottom, rightBottom, rightTop }\r\n } = tdPosition\r\n leftTop[1] += offsetHeight\r\n leftBottom[1] += offsetHeight\r\n rightBottom[1] += offsetHeight\r\n rightTop[1] += offsetHeight\r\n })\r\n }\r\n }\r\n x = drawRowResult.x\r\n y = drawRowResult.y\r\n }\r\n }\r\n // 恢复初始x、y\r\n x = tablePreX\r\n y = tablePreY\r\n }\r\n }\r\n x = startX\r\n y += curRow.height\r\n }\r\n return { x, y, index }\r\n }\r\n\r\n public computePositionList() {\r\n // 置空原位置信息\r\n this.positionList = []\r\n // 按每页行计算\r\n const innerWidth = this.draw.getInnerWidth()\r\n const pageRowList = this.draw.getPageRowList()\r\n const margins = this.draw.getMargins()\r\n const startX = margins[3]\r\n // 起始位置受页眉影响\r\n const header = this.draw.getHeader()\r\n const extraHeight = header.getExtraHeight()\r\n const startY = margins[0] + extraHeight\r\n let startRowIndex = 0\r\n for (let i = 0; i < pageRowList.length; i++) {\r\n const rowList = pageRowList[i]\r\n const startIndex = rowList[0]?.startIndex\r\n this.computePageRowPosition({\r\n positionList: this.positionList,\r\n rowList,\r\n pageNo: i,\r\n startRowIndex,\r\n startIndex,\r\n startX,\r\n startY,\r\n innerWidth\r\n })\r\n startRowIndex += rowList.length\r\n }\r\n }\r\n\r\n public computeRowPosition(\r\n payload: IComputeRowPositionPayload\r\n ): IElementPosition[] {\r\n const { row, innerWidth } = payload\r\n const positionList: IElementPosition[] = []\r\n this.computePageRowPosition({\r\n positionList,\r\n innerWidth,\r\n rowList: [deepClone(row)],\r\n pageNo: 0,\r\n startX: 0,\r\n startY: 0,\r\n startIndex: 0,\r\n startRowIndex: 0\r\n })\r\n return positionList\r\n }\r\n\r\n public setCursorPosition(position: IElementPosition | null) {\r\n this.cursorPosition = position\r\n }\r\n\r\n public getCursorPosition(): IElementPosition | null {\r\n return this.cursorPosition\r\n }\r\n\r\n public getPositionContext(): IPositionContext {\r\n return this.positionContext\r\n }\r\n\r\n public setPositionContext(payload: IPositionContext) {\r\n this.eventBus.emit('positionContextChange', {\r\n value: payload,\r\n oldValue: this.positionContext\r\n })\r\n this.positionContext = payload\r\n }\r\n\r\n public getPositionByXY(payload: IGetPositionByXYPayload): ICurrentPosition {\r\n const { x, y, isTable } = payload\r\n let { elementList, positionList } = payload\r\n if (!elementList) {\r\n elementList = this.draw.getOriginalElementList()\r\n }\r\n if (!positionList) {\r\n positionList = this.getOriginalPositionList()\r\n }\r\n const zoneManager = this.draw.getZone()\r\n const curPageNo = payload.pageNo ?? this.draw.getPageNo()\r\n const isMainActive = zoneManager.isMainActive()\r\n const positionNo = isMainActive ? curPageNo : 0\r\n // 验证浮于文字上方元素\r\n if (!isTable) {\r\n const floatTopPosition = this.getFloatPositionByXY({\r\n ...payload,\r\n imgDisplays: [ImageDisplay.FLOAT_TOP, ImageDisplay.SURROUND]\r\n })\r\n if (floatTopPosition) return floatTopPosition\r\n }\r\n // 普通元素\r\n for (let j = 0; j < positionList.length; j++) {\r\n const {\r\n index,\r\n pageNo,\r\n left,\r\n isFirstLetter,\r\n coordinate: { leftTop, rightTop, leftBottom }\r\n } = positionList[j]\r\n if (positionNo !== pageNo) continue\r\n if (pageNo > positionNo) break\r\n // 命中元素\r\n if (\r\n leftTop[0] - left <= x &&\r\n rightTop[0] >= x &&\r\n leftTop[1] <= y &&\r\n leftBottom[1] >= y\r\n ) {\r\n let curPositionIndex = j\r\n const element = elementList[j]\r\n // 表格被命中\r\n if (isTableElement(element)) {\r\n for (let t = 0; t < element.trList!.length; t++) {\r\n const tr = element.trList![t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const tablePosition = this.getPositionByXY({\r\n x,\r\n y,\r\n td,\r\n pageNo: curPageNo,\r\n tablePosition: positionList[j],\r\n isTable: true,\r\n elementList: td.value,\r\n positionList: td.positionList\r\n })\r\n if (~tablePosition.index) {\r\n const { index: tdValueIndex, hitLineStartIndex } = tablePosition\r\n const tdValueElement = td.value[tdValueIndex]\r\n return {\r\n index,\r\n isCheckbox:\r\n tablePosition.isCheckbox ||\r\n tdValueElement.type === ElementType.CHECKBOX ||\r\n tdValueElement.controlComponent ===\r\n ControlComponent.CHECKBOX,\r\n isRadio:\r\n tdValueElement.type === ElementType.RADIO ||\r\n tdValueElement.controlComponent === ControlComponent.RADIO,\r\n isControl: !!tdValueElement.controlId,\r\n isImage: tablePosition.isImage,\r\n isDirectHit: tablePosition.isDirectHit,\r\n isTable: true,\r\n tdIndex: d,\r\n trIndex: t,\r\n tdValueIndex,\r\n tdId: td.id,\r\n trId: tr.id,\r\n tableId: element.id,\r\n hitLineStartIndex\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // 图片区域均为命中\r\n if (\r\n isImageElement(element) ||\r\n element.type === ElementType.LATEX\r\n ) {\r\n return {\r\n index: curPositionIndex,\r\n isDirectHit: true,\r\n isImage: true\r\n }\r\n }\r\n if (\r\n element.type === ElementType.CHECKBOX ||\r\n element.controlComponent === ControlComponent.CHECKBOX\r\n ) {\r\n return {\r\n index: curPositionIndex,\r\n isDirectHit: true,\r\n isCheckbox: true\r\n }\r\n }\r\n if (\r\n element.type === ElementType.TAB &&\r\n element.listStyle === ListStyle.CHECKBOX\r\n ) {\r\n // 向前找checkbox元素\r\n let index = curPositionIndex - 1\r\n while (index > 0) {\r\n const element = elementList[index]\r\n if (\r\n element.value === ZERO &&\r\n element.listStyle === ListStyle.CHECKBOX\r\n ) {\r\n break\r\n }\r\n index--\r\n }\r\n return {\r\n index,\r\n isDirectHit: true,\r\n isCheckbox: true\r\n }\r\n }\r\n if (\r\n element.type === ElementType.RADIO ||\r\n element.controlComponent === ControlComponent.RADIO\r\n ) {\r\n return {\r\n index: curPositionIndex,\r\n isDirectHit: true,\r\n isRadio: true\r\n }\r\n }\r\n let hitLineStartIndex: number | undefined\r\n // 判断是否在文字中间前后\r\n if (elementList[index].value !== ZERO) {\r\n const valueWidth = rightTop[0] - leftTop[0]\r\n if (x < leftTop[0] + valueWidth / 2) {\r\n curPositionIndex = j - 1\r\n if (isFirstLetter) {\r\n hitLineStartIndex = j\r\n }\r\n }\r\n }\r\n return {\r\n isDirectHit: true,\r\n hitLineStartIndex,\r\n index: curPositionIndex,\r\n isControl: !!element.controlId\r\n }\r\n }\r\n }\r\n // 验证衬于文字下方元素\r\n if (!isTable) {\r\n const floatBottomPosition = this.getFloatPositionByXY({\r\n ...payload,\r\n imgDisplays: [ImageDisplay.FLOAT_BOTTOM]\r\n })\r\n if (floatBottomPosition) return floatBottomPosition\r\n }\r\n // 非命中区域\r\n let isLastArea = false\r\n let curPositionIndex = -1\r\n let hitLineStartIndex: number | undefined\r\n // 判断是否在表格内\r\n if (isTable) {\r\n const { scale } = this.options\r\n const { td, tablePosition } = payload\r\n if (td && tablePosition) {\r\n const { leftTop } = tablePosition.coordinate\r\n const tdX = td.x! * scale + leftTop[0]\r\n const tdY = td.y! * scale + leftTop[1]\r\n const tdWidth = td.width! * scale\r\n const tdHeight = td.height! * scale\r\n if (!(tdX < x && x < tdX + tdWidth && tdY < y && y < tdY + tdHeight)) {\r\n return {\r\n index: curPositionIndex\r\n }\r\n }\r\n }\r\n }\r\n // 判断所属行是否存在元素\r\n const lastLetterList = positionList.filter(\r\n p => p.isLastLetter && p.pageNo === positionNo\r\n )\r\n for (let j = 0; j < lastLetterList.length; j++) {\r\n const {\r\n index,\r\n rowNo,\r\n coordinate: { leftTop, leftBottom }\r\n } = lastLetterList[j]\r\n if (y > leftTop[1] && y <= leftBottom[1]) {\r\n const headIndex = positionList.findIndex(\r\n p => p.pageNo === positionNo && p.rowNo === rowNo\r\n )\r\n const headElement = elementList[headIndex]\r\n const headPosition = positionList[headIndex]\r\n // 是否在头部\r\n const headStartX =\r\n headElement.listStyle === ListStyle.CHECKBOX\r\n ? this.draw.getMargins()[3]\r\n : headPosition.coordinate.leftTop[0]\r\n if (x < headStartX) {\r\n // 头部元素为空元素时无需选中\r\n if (~headIndex) {\r\n if (headPosition.value === ZERO) {\r\n curPositionIndex = headIndex\r\n } else {\r\n curPositionIndex = headIndex - 1\r\n hitLineStartIndex = headIndex\r\n }\r\n } else {\r\n curPositionIndex = index\r\n }\r\n } else {\r\n // 是否是复选框列表\r\n if (headElement.listStyle === ListStyle.CHECKBOX && x < leftTop[0]) {\r\n return {\r\n index: headIndex,\r\n isDirectHit: true,\r\n isCheckbox: true\r\n }\r\n }\r\n curPositionIndex = index\r\n }\r\n isLastArea = true\r\n break\r\n }\r\n }\r\n if (!isLastArea) {\r\n // 页眉底部距离页面顶部距离\r\n const header = this.draw.getHeader()\r\n const headerBottomY = header.getExtraHeight() + this.draw.getMargins()[0]\r\n // 页脚上部距离页面顶部距离\r\n const footer = this.draw.getFooter()\r\n const pageHeight = this.draw.getHeight()\r\n const footerTopY =\r\n pageHeight - (footer.getExtraHeight() + this.draw.getMargins()[2])\r\n // 判断所属位置是否属于页眉页脚区域\r\n if (isMainActive) {\r\n // 页眉:当前位置小于页眉底部位置\r\n if (y < headerBottomY) {\r\n return {\r\n index: -1,\r\n zone: EditorZone.HEADER\r\n }\r\n }\r\n // 页脚:当前位置大于页脚顶部位置\r\n if (y > footerTopY) {\r\n return {\r\n index: -1,\r\n zone: EditorZone.FOOTER\r\n }\r\n }\r\n } else {\r\n // main区域:当前位置小于页眉底部位置 && 大于页脚顶部位置\r\n if (y <= footerTopY && y >= headerBottomY) {\r\n return {\r\n index: -1,\r\n zone: EditorZone.MAIN\r\n }\r\n }\r\n }\r\n // 正文上-循环首行\r\n const margins = this.draw.getMargins()\r\n if (y <= margins[0]) {\r\n for (let p = 0; p < positionList.length; p++) {\r\n const position = positionList[p]\r\n if (position.pageNo !== positionNo || position.rowNo !== 0) continue\r\n const { leftTop, rightTop } = position.coordinate\r\n // 小于左页边距 || 命中文字 || 首行最后元素\r\n if (\r\n x <= margins[3] ||\r\n (x >= leftTop[0] && x <= rightTop[0]) ||\r\n positionList[p + 1]?.rowNo !== 0\r\n ) {\r\n return {\r\n index: position.index\r\n }\r\n }\r\n }\r\n } else {\r\n // 正文下-循环尾行\r\n const lastLetter = lastLetterList[lastLetterList.length - 1]\r\n if (lastLetter) {\r\n const lastRowNo = lastLetter.rowNo\r\n for (let p = 0; p < positionList.length; p++) {\r\n const position = positionList[p]\r\n if (\r\n position.pageNo !== positionNo ||\r\n position.rowNo !== lastRowNo\r\n ) {\r\n continue\r\n }\r\n const { leftTop, rightTop } = position.coordinate\r\n // 小于左页边距 || 命中文字 || 尾行最后元素\r\n if (\r\n x <= margins[3] ||\r\n (x >= leftTop[0] && x <= rightTop[0]) ||\r\n positionList[p + 1]?.rowNo !== lastRowNo\r\n ) {\r\n return {\r\n index: position.index\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // 当前页最后一行\r\n return {\r\n index:\r\n lastLetterList[lastLetterList.length - 1]?.index ||\r\n positionList.length - 1\r\n }\r\n }\r\n return {\r\n hitLineStartIndex,\r\n index: curPositionIndex,\r\n isControl: !!elementList[curPositionIndex]?.controlId\r\n }\r\n }\r\n\r\n public getFloatPositionByXY(\r\n payload: IGetFloatPositionByXYPayload\r\n ): ICurrentPosition | void {\r\n const { x, y } = payload\r\n const currentPageNo = payload.pageNo ?? this.draw.getPageNo()\r\n const currentZone = this.draw.getZone().getZone()\r\n const { scale } = this.options\r\n for (let f = 0; f < this.floatPositionList.length; f++) {\r\n const {\r\n position,\r\n element,\r\n isTable,\r\n index,\r\n trIndex,\r\n tdIndex,\r\n tdValueIndex,\r\n zone: floatElementZone,\r\n pageNo\r\n } = this.floatPositionList[f]\r\n if (\r\n currentPageNo === pageNo &&\r\n isImageElement(element) &&\r\n element.imgDisplay &&\r\n payload.imgDisplays.includes(element.imgDisplay) &&\r\n (!floatElementZone || floatElementZone === currentZone)\r\n ) {\r\n const imgFloatPosition = element.imgFloatPosition!\r\n const imgFloatPositionX = imgFloatPosition.x * scale\r\n const imgFloatPositionY = imgFloatPosition.y * scale\r\n const elementWidth = element.width! * scale\r\n const elementHeight = element.height! * scale\r\n if (\r\n x >= imgFloatPositionX &&\r\n x <= imgFloatPositionX + elementWidth &&\r\n y >= imgFloatPositionY &&\r\n y <= imgFloatPositionY + elementHeight\r\n ) {\r\n if (isTable) {\r\n return {\r\n index: index!,\r\n isDirectHit: true,\r\n isImage: true,\r\n isTable,\r\n trIndex,\r\n tdIndex,\r\n tdValueIndex,\r\n tdId: element.tdId,\r\n trId: element.trId,\r\n tableId: element.tableId\r\n }\r\n }\r\n return {\r\n index: position.index,\r\n isDirectHit: true,\r\n isImage: true\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public adjustPositionContext(\r\n payload: IGetPositionByXYPayload\r\n ): ICurrentPosition | null {\r\n const positionResult = this.getPositionByXY(payload)\r\n if (!~positionResult.index) return null\r\n // 移动控件内光标\r\n if (\r\n positionResult.isControl &&\r\n this.draw.getMode() !== EditorMode.READONLY\r\n ) {\r\n const { index, isTable, trIndex, tdIndex, tdValueIndex } = positionResult\r\n const control = this.draw.getControl()\r\n const { newIndex } = control.moveCursor({\r\n index,\r\n isTable,\r\n trIndex,\r\n tdIndex,\r\n tdValueIndex\r\n })\r\n if (isTable) {\r\n positionResult.tdValueIndex = newIndex\r\n } else {\r\n positionResult.index = newIndex\r\n }\r\n }\r\n const {\r\n index,\r\n isCheckbox,\r\n isRadio,\r\n isControl,\r\n isImage,\r\n isDirectHit,\r\n isTable,\r\n trIndex,\r\n tdIndex,\r\n tdId,\r\n trId,\r\n tableId\r\n } = positionResult\r\n // 设置位置上下文\r\n this.setPositionContext({\r\n isTable: isTable || false,\r\n isCheckbox: isCheckbox || false,\r\n isRadio: isRadio || false,\r\n isControl: isControl || false,\r\n isImage: isImage || false,\r\n isDirectHit: isDirectHit || false,\r\n index,\r\n trIndex,\r\n tdIndex,\r\n tdId,\r\n trId,\r\n tableId\r\n })\r\n return positionResult\r\n }\r\n\r\n public setSurroundPosition(payload: ISetSurroundPositionPayload) {\r\n const {\r\n pageNo,\r\n row,\r\n rowElement,\r\n rowElementRect,\r\n surroundElementList,\r\n availableWidth\r\n } = payload\r\n let x = rowElementRect.x\r\n let rowIncreaseWidth = 0\r\n if (\r\n surroundElementList.length &&\r\n !getIsBlockElement(rowElement) &&\r\n !rowElement.control?.minWidth\r\n ) {\r\n for (let s = 0; s < surroundElementList.length; s++) {\r\n const surroundElement = surroundElementList[s]\r\n const floatPosition = surroundElement.imgFloatPosition!\r\n if (floatPosition.pageNo !== pageNo) continue\r\n const surroundRect = {\r\n ...floatPosition,\r\n width: surroundElement.width!,\r\n height: surroundElement.height!\r\n }\r\n if (isRectIntersect(rowElementRect, surroundRect)) {\r\n row.isSurround = true\r\n // 需向左移动距离:浮动元素宽度 + 浮动元素左上坐标 - 元素左上坐标\r\n const translateX =\r\n surroundRect.width + surroundRect.x - rowElementRect.x\r\n rowElement.left = translateX\r\n // 增加行宽\r\n row.width += translateX\r\n rowIncreaseWidth += translateX\r\n // 下个元素起始位置:浮动元素右坐标 - 元素宽度\r\n x = surroundRect.x + surroundRect.width\r\n // 检测宽度是否足够,不够则移动到下一行,并还原状态\r\n if (row.width + rowElement.metrics.width > availableWidth) {\r\n rowElement.left = 0\r\n row.width -= rowIncreaseWidth\r\n break\r\n }\r\n }\r\n }\r\n }\r\n return { x, rowIncreaseWidth }\r\n }\r\n}\r\n","var ae = Object.defineProperty;\nvar ce = (e, t, o) => t in e ? ae(e, t, { enumerable: !0, configurable: !0, writable: !0, value: o }) : e[t] = o;\nvar A = (e, t, o) => ce(e, typeof t != \"symbol\" ? t + \"\" : t, o);\nclass Re {\n constructor() {\n A(this, \"rangeStyleChange\");\n A(this, \"visiblePageNoListChange\");\n A(this, \"intersectionPageNoChange\");\n A(this, \"pageSizeChange\");\n A(this, \"pageScaleChange\");\n A(this, \"saved\");\n A(this, \"contentChange\");\n A(this, \"controlChange\");\n A(this, \"controlContentChange\");\n A(this, \"pageModeChange\");\n A(this, \"zoneChange\");\n A(this, \"catalogChange\");\n this.rangeStyleChange = null, this.visiblePageNoListChange = null, this.intersectionPageNoChange = null, this.pageSizeChange = null, this.pageScaleChange = null, this.saved = null, this.contentChange = null, this.controlChange = null, this.controlContentChange = null, this.pageModeChange = null, this.zoneChange = null, this.catalogChange = null;\n }\n}\nvar U = /* @__PURE__ */ ((e) => (e.CONTAIN = \"contain\", e.COVER = \"cover\", e))(U || {}), K = /* @__PURE__ */ ((e) => (e.REPEAT = \"repeat\", e.NO_REPEAT = \"no-repeat\", e.REPEAT_X = \"repeat-x\", e.REPEAT_Y = \"repeat-y\", e))(K || {}), _ = /* @__PURE__ */ ((e) => (e.HALF = \"half\", e.ONE_THIRD = \"one-third\", e.QUARTER = \"quarter\", e))(_ || {}), O = /* @__PURE__ */ ((e) => (e.ARABIC = \"arabic\", e.CHINESE = \"chinese\", e))(O || {}), C = /* @__PURE__ */ ((e) => (e.PREFIX = \"prefix\", e.POSTFIX = \"postfix\", e.PRE_TEXT = \"preText\", e.POST_TEXT = \"postText\", e.PLACEHOLDER = \"placeholder\", e.VALUE = \"value\", e.CHECKBOX = \"checkbox\", e.RADIO = \"radio\", e))(C || {}), W = /* @__PURE__ */ ((e) => (e.PAGE = \"page\", e.TABLE = \"table\", e))(W || {}), R = /* @__PURE__ */ ((e) => (e.TEXT = \"text\", e.IMAGE = \"image\", e.TABLE = \"table\", e.HYPERLINK = \"hyperlink\", e.SUPERSCRIPT = \"superscript\", e.SUBSCRIPT = \"subscript\", e.SEPARATOR = \"separator\", e.PAGE_BREAK = \"pageBreak\", e.CONTROL = \"control\", e.AREA = \"area\", e.CHECKBOX = \"checkbox\", e.RADIO = \"radio\", e.LATEX = \"latex\", e.TAB = \"tab\", e.DATE = \"date\", e.BLOCK = \"block\", e.TITLE = \"title\", e.LIST = \"list\", e.PLACEHOLDER = \"placeholder\", e.FOOTNOTE_MARK = \"footnoteMark\", e.FOOTNOTE_CONTENT = \"footnoteContent\", e.FOOTNOTE_SEPARATOR = \"footnoteSeparator\", e.COLUMN_BREAK = \"columnBreak\", e.REVISION_INSERT = \"revisionInsert\", e.REVISION_DELETE = \"revisionDelete\", e))(R || {}), G = /* @__PURE__ */ ((e) => (e.PAGE = \"page\", e.CONTINUITY = \"continuity\", e))(G || {}), M = /* @__PURE__ */ ((e) => (e.UL = \"ul\", e.OL = \"ol\", e))(M || {}), E = /* @__PURE__ */ ((e) => (e.DISC = \"disc\", e.CIRCLE = \"circle\", e.SQUARE = \"square\", e.CHECKBOX = \"checkbox\", e.DIAMOND = \"diamond\", e.DASH = \"dash\", e.CHECK = \"check\", e.TRIANGLE = \"triangle\", e.STAR = \"star\", e.ARROW = \"arrow\", e.DIAMOND_SOLID = \"diamond-solid\", e.ANGLE = \"angle\", e.HOLLOW_CIRCLE = \"hollow-circle\", e.HOLLOW_SQUARE = \"hollow-square\", e.HEART_HOLLOW = \"heart-hollow\", e.HASH = \"hash\", e.TRIANGLE_SOLID = \"triangle-solid\", e.STAR_SOLID = \"star-solid\", e.HEART_SOLID = \"heart-solid\", e.FLOWER = \"flower\", e.ASTERISK = \"asterisk\", e.HOLLOW_DIAMOND = \"hollow-diamond\", e.HOLLOW_TRIANGLE = \"hollow-triangle\", e))(E || {}), S = /* @__PURE__ */ ((e) => (e.DISC = \"disc\", e.CIRCLE = \"circle\", e.SQUARE = \"square\", e.CHECKBOX = \"checkbox\", e.DIAMOND = \"diamond\", e.DASH = \"dash\", e.CHECK = \"check\", e.DECIMAL = \"decimal\", e.DECIMAL_DOT = \"decimal-dot\", e.DECIMAL_PAREN = \"decimal-paren\", e.DECIMAL_CIRCLE = \"decimal-circle\", e.DECIMAL_BRACKET = \"decimal-bracket\", e.CHINESE = \"chinese\", e.CHINESE_BRACKET = \"chinese-bracket\", e.UPPER_ALPHA = \"upper-alpha\", e.LOWER_ALPHA_DOT = \"lower-alpha-dot\", e))(S || {}), z = /* @__PURE__ */ ((e) => (e.LEFT = \"left\", e.CENTER = \"center\", e.RIGHT = \"right\", e.ALIGNMENT = \"alignment\", e.JUSTIFY = \"justify\", e))(z || {}), L = /* @__PURE__ */ ((e) => (e.FIRST = \"first\", e.SECOND = \"second\", e.THIRD = \"third\", e.FOURTH = \"fourth\", e.FIFTH = \"fifth\", e.SIXTH = \"sixth\", e))(L || {}), B = /* @__PURE__ */ ((e) => (e.TOP = \"top\", e.MIDDLE = \"middle\", e.BOTTOM = \"bottom\", e))(B || {}), V = /* @__PURE__ */ ((e) => (e.TEXT = \"text\", e.IMAGE = \"image\", e))(V || {});\nconst N = \"\";\n_.HALF + \"\", 1 / 2, _.ONE_THIRD + \"\", 1 / 3, _.QUARTER + \"\", 1 / 4;\nconst j = [\n R.TEXT,\n R.HYPERLINK,\n R.SUBSCRIPT,\n R.SUPERSCRIPT,\n R.CONTROL,\n R.DATE,\n R.PLACEHOLDER\n];\nR.IMAGE, R.LATEX;\nR.BLOCK, R.PAGE_BREAK, R.SEPARATOR, R.TABLE;\nR.TITLE, R.LIST;\nz.CENTER, O.ARABIC;\nO.ARABIC, O.ARABIC, O.ARABIC, O.ARABIC, O.ARABIC, O.ARABIC, O.ARABIC, O.CHINESE, O.CHINESE;\nV.TEXT, O.ARABIC;\nL.FIRST + \"\", L.SECOND + \"\", L.THIRD + \"\", L.FOURTH + \"\", L.FIFTH + \"\", L.SIXTH + \"\";\nL.FIRST + \"\", L.SECOND + \"\", L.THIRD + \"\", L.FOURTH + \"\", L.FIFTH + \"\", L.SIXTH + \"\";\nL.FIRST, L.SECOND, L.THIRD, L.FOURTH, L.FIFTH, L.SIXTH;\nE.DISC + \"\", E.CIRCLE + \"\", E.SQUARE + \"\", E.CHECKBOX + \"\", E.DIAMOND + \"\", E.DASH + \"\", E.CHECK + \"\", E.TRIANGLE + \"\", E.STAR + \"\", E.ARROW + \"\", E.DIAMOND_SOLID + \"\", E.ANGLE + \"\", E.HOLLOW_CIRCLE + \"\", E.HOLLOW_SQUARE + \"\", E.HEART_HOLLOW + \"\", E.HASH + \"\", E.TRIANGLE_SOLID + \"\", E.STAR_SOLID + \"\", E.HEART_SOLID + \"\", E.FLOWER + \"\", E.ASTERISK + \"\", E.HOLLOW_DIAMOND + \"\", E.HOLLOW_TRIANGLE + \"\";\nM.OL + \"\", M.UL + \"\";\nS.DISC + \"\", S.CIRCLE + \"\", S.SQUARE + \"\", S.DECIMAL + \"\", S.DECIMAL_DOT + \"\", S.DECIMAL_PAREN + \"\", S.DECIMAL_CIRCLE + \"\", S.DECIMAL_BRACKET + \"\", S.CHINESE + \"\", S.CHINESE_BRACKET + \"\", S.UPPER_ALPHA + \"\", S.LOWER_ALPHA_DOT + \"\", S.CHECKBOX + \"\", S.DIAMOND + \"\", S.DASH + \"\", S.CHECK + \"\";\nU.COVER, K.NO_REPEAT;\nB.BOTTOM;\n_.HALF;\n_.HALF;\nB.BOTTOM;\nG.CONTINUITY;\nfunction he(e) {\n return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, \"default\") ? e.default : e;\n}\nvar ge = fe;\nfunction H(e) {\n return e instanceof Buffer ? Buffer.from(e) : new e.constructor(e.buffer.slice(), e.byteOffset, e.length);\n}\nfunction fe(e) {\n if (e = e || {}, e.circles) return de(e);\n const t = /* @__PURE__ */ new Map();\n if (t.set(Date, (s) => new Date(s)), t.set(Map, (s, h) => new Map(a(Array.from(s), h))), t.set(Set, (s, h) => new Set(a(Array.from(s), h))), e.constructorHandlers)\n for (const s of e.constructorHandlers)\n t.set(s[0], s[1]);\n let o = null;\n return e.proto ? g : c;\n function a(s, h) {\n const n = Object.keys(s), r = new Array(n.length);\n for (let l = 0; l < n.length; l++) {\n const i = n[l], f = s[i];\n typeof f != \"object\" || f === null ? r[i] = f : f.constructor !== Object && (o = t.get(f.constructor)) ? r[i] = o(f, h) : ArrayBuffer.isView(f) ? r[i] = H(f) : r[i] = h(f);\n }\n return r;\n }\n function c(s) {\n if (typeof s != \"object\" || s === null) return s;\n if (Array.isArray(s)) return a(s, c);\n if (s.constructor !== Object && (o = t.get(s.constructor)))\n return o(s, c);\n const h = {};\n for (const n in s) {\n if (Object.hasOwnProperty.call(s, n) === !1) continue;\n const r = s[n];\n typeof r != \"object\" || r === null ? h[n] = r : r.constructor !== Object && (o = t.get(r.constructor)) ? h[n] = o(r, c) : ArrayBuffer.isView(r) ? h[n] = H(r) : h[n] = c(r);\n }\n return h;\n }\n function g(s) {\n if (typeof s != \"object\" || s === null) return s;\n if (Array.isArray(s)) return a(s, g);\n if (s.constructor !== Object && (o = t.get(s.constructor)))\n return o(s, g);\n const h = {};\n for (const n in s) {\n const r = s[n];\n typeof r != \"object\" || r === null ? h[n] = r : r.constructor !== Object && (o = t.get(r.constructor)) ? h[n] = o(r, g) : ArrayBuffer.isView(r) ? h[n] = H(r) : h[n] = g(r);\n }\n return h;\n }\n}\nfunction de(e) {\n const t = [], o = [], a = /* @__PURE__ */ new Map();\n if (a.set(Date, (n) => new Date(n)), a.set(Map, (n, r) => new Map(g(Array.from(n), r))), a.set(Set, (n, r) => new Set(g(Array.from(n), r))), e.constructorHandlers)\n for (const n of e.constructorHandlers)\n a.set(n[0], n[1]);\n let c = null;\n return e.proto ? h : s;\n function g(n, r) {\n const l = Object.keys(n), i = new Array(l.length);\n for (let f = 0; f < l.length; f++) {\n const d = l[f], p = n[d];\n if (typeof p != \"object\" || p === null)\n i[d] = p;\n else if (p.constructor !== Object && (c = a.get(p.constructor)))\n i[d] = c(p, r);\n else if (ArrayBuffer.isView(p))\n i[d] = H(p);\n else {\n const y = t.indexOf(p);\n y !== -1 ? i[d] = o[y] : i[d] = r(p);\n }\n }\n return i;\n }\n function s(n) {\n if (typeof n != \"object\" || n === null) return n;\n if (Array.isArray(n)) return g(n, s);\n if (n.constructor !== Object && (c = a.get(n.constructor)))\n return c(n, s);\n const r = {};\n t.push(n), o.push(r);\n for (const l in n) {\n if (Object.hasOwnProperty.call(n, l) === !1) continue;\n const i = n[l];\n if (typeof i != \"object\" || i === null)\n r[l] = i;\n else if (i.constructor !== Object && (c = a.get(i.constructor)))\n r[l] = c(i, s);\n else if (ArrayBuffer.isView(i))\n r[l] = H(i);\n else {\n const f = t.indexOf(i);\n f !== -1 ? r[l] = o[f] : r[l] = s(i);\n }\n }\n return t.pop(), o.pop(), r;\n }\n function h(n) {\n if (typeof n != \"object\" || n === null) return n;\n if (Array.isArray(n)) return g(n, h);\n if (n.constructor !== Object && (c = a.get(n.constructor)))\n return c(n, h);\n const r = {};\n t.push(n), o.push(r);\n for (const l in n) {\n const i = n[l];\n if (typeof i != \"object\" || i === null)\n r[l] = i;\n else if (i.constructor !== Object && (c = a.get(i.constructor)))\n r[l] = c(i, h);\n else if (ArrayBuffer.isView(i))\n r[l] = H(i);\n else {\n const f = t.indexOf(i);\n f !== -1 ? r[l] = o[f] : r[l] = h(i);\n }\n }\n return t.pop(), o.pop(), r;\n }\n}\nconst ue = /* @__PURE__ */ he(ge);\nue();\nfunction pe(e, t) {\n const o = e[t];\n if (!o) return null;\n const a = e[t + 1];\n return !o.listId && o.value === N && a && a.value !== N && o.areaId === a.areaId ? a : o;\n}\nfunction D(e) {\n return e.value === N && !e.listWrap;\n}\nconst Ee = new RegExp(N, \"g\");\nclass Se {\n constructor(t) {\n A(this, \"draw\");\n A(this, \"range\");\n A(this, \"defaultStyle\");\n this.draw = t, this.range = {\n startIndex: -1,\n endIndex: -1\n }, this.defaultStyle = null;\n }\n get options() {\n return this.draw.getOptions();\n }\n get listener() {\n return this.draw.getListener();\n }\n get eventBus() {\n return this.draw.getEventBus();\n }\n get position() {\n return this.draw.getPosition();\n }\n get historyManager() {\n return this.draw.getHistoryManager();\n }\n getRange() {\n return this.range;\n }\n getRangeClone() {\n return { ...this.range };\n }\n clearRange() {\n this.setRange(-1, -1);\n }\n setDefaultStyle(t) {\n t ? this.defaultStyle = {\n ...this.defaultStyle,\n ...t\n } : this.defaultStyle = null;\n }\n getDefaultStyle() {\n return this.defaultStyle;\n }\n getRangeAnchorStyle(t, o) {\n const a = pe(t, o);\n return a ? {\n ...a,\n ...this.defaultStyle\n } : null;\n }\n getIsRangeChange(t, o, a, c, g, s, h) {\n return this.range.startIndex !== t || this.range.endIndex !== o || this.range.tableId !== a || this.range.startTdIndex !== c || this.range.endTdIndex !== g || this.range.startTrIndex !== s || this.range.endTrIndex !== h;\n }\n getIsCollapsed() {\n const { startIndex: t, endIndex: o } = this.range;\n return t === o;\n }\n getIsSelection() {\n const { startIndex: t, endIndex: o } = this.range;\n return !~t && !~o ? !1 : t !== o;\n }\n getSelection() {\n const { startIndex: t, endIndex: o } = this.range;\n return t === o ? null : this.draw.getElementList().slice(t + 1, o + 1);\n }\n getSelectionElementList() {\n if (this.range.isCrossRowCol) {\n const t = this.draw.getTableParticle().getRangeRowCol();\n if (!t) return null;\n const o = [];\n for (let a = 0; a < t.length; a++) {\n const c = t[a];\n for (let g = 0; g < c.length; g++) {\n const s = c[g];\n o.push(...s.value);\n }\n }\n return o;\n }\n return this.getSelection();\n }\n getTextLikeSelection() {\n const t = this.getSelection();\n return t ? t.filter(\n (o) => !o.type || j.includes(o.type)\n ) : null;\n }\n getTextLikeSelectionElementList() {\n const t = this.getSelectionElementList();\n return t ? t.filter(\n (o) => !o.type || j.includes(o.type)\n ) : null;\n }\n getRangeRow() {\n const { startIndex: t, endIndex: o } = this.range;\n if (!~t && !~o) return null;\n const a = this.position.getPositionList(), c = /* @__PURE__ */ new Map();\n for (let g = t; g < o + 1; g++) {\n const { pageNo: s, rowNo: h } = a[g], n = c.get(s);\n n ? n.has(h) || n.add(h) : c.set(s, /* @__PURE__ */ new Set([h]));\n }\n return c;\n }\n getRangeRowElementList() {\n const { startIndex: t, endIndex: o, isCrossRowCol: a } = this.range;\n if (!~t && !~o) return null;\n if (a)\n return this.getSelectionElementList();\n const c = this.getRangeRow();\n if (!c) return null;\n const g = this.position.getPositionList(), s = this.draw.getElementList(), h = [];\n for (let n = 0; n < g.length; n++) {\n const r = g[n], l = c.get(r.pageNo);\n l && l.has(r.rowNo) && h.push(s[n]);\n }\n return h;\n }\n getRangeParagraph() {\n const { startIndex: t, endIndex: o } = this.range;\n if (!~t && !~o) return null;\n const a = this.position.getPositionList(), c = this.draw.getElementList(), g = /* @__PURE__ */ new Map();\n let s = t;\n for (; s >= 0; ) {\n const { pageNo: r, rowNo: l } = a[s];\n let i = g.get(r);\n i || (i = [], g.set(r, i)), i.includes(l) || i.unshift(l);\n const f = c[s], d = c[s - 1];\n if (D(f) || f.listId !== (d == null ? void 0 : d.listId) || f.titleId !== (d == null ? void 0 : d.titleId))\n break;\n s--;\n }\n const h = t === o;\n if (!h) {\n let r = t + 1;\n for (; r < o; ) {\n const { pageNo: l, rowNo: i } = a[r];\n let f = g.get(l);\n f || (f = [], g.set(l, f)), f.includes(i) || f.push(i), r++;\n }\n }\n let n = o;\n for (h && c[t].value === N && (n += 1); n < a.length; ) {\n const r = c[n], l = c[n + 1];\n if (D(r) || r.listId !== (l == null ? void 0 : l.listId) || r.titleId !== (l == null ? void 0 : l.titleId))\n break;\n const { pageNo: i, rowNo: f } = a[n];\n let d = g.get(i);\n d || (d = [], g.set(i, d)), d.includes(f) || d.push(f), n++;\n }\n return g;\n }\n getRangeParagraphInfo() {\n const { startIndex: t, endIndex: o } = this.range;\n if (!~t && !~o) return null;\n let a = -1;\n const c = [], g = this.getRangeParagraph();\n if (!g) return null;\n const s = this.draw.getElementList(), h = this.position.getPositionList();\n for (let n = 0; n < h.length; n++) {\n const r = h[n], l = g.get(r.pageNo);\n l && l.includes(r.rowNo) && (~a || (a = r.index), c.push(s[n]));\n }\n return c.length ? {\n elementList: c,\n startIndex: a\n } : null;\n }\n getRangeParagraphElementList() {\n var t;\n return ((t = this.getRangeParagraphInfo()) == null ? void 0 : t.elementList) || null;\n }\n getRangeTableElement() {\n const t = this.position.getPositionContext();\n return t.isTable ? this.draw.getOriginalElementList()[t.index] : null;\n }\n getIsSelectAll() {\n const t = this.draw.getElementList(), { startIndex: o, endIndex: a } = this.range;\n return o === 0 && t.length - 1 === a && !this.position.getPositionContext().isTable;\n }\n getIsPointInRange(t, o) {\n const { startIndex: a, endIndex: c } = this.range, g = this.position.getPositionList();\n for (let s = a + 1; s <= c && g[s]; s++) {\n const {\n coordinate: { leftTop: n, rightBottom: r }\n } = g[s];\n if (t >= n[0] && t <= r[0] && o >= n[1] && o <= r[1])\n return !0;\n }\n return !1;\n }\n getKeywordRangeList(t) {\n const o = this.draw.getSearch().getMatchList(t, this.draw.getOriginalElementList()), a = /* @__PURE__ */ new Map();\n for (const g of o) {\n const s = a.get(g.groupId);\n if (s)\n s.endIndex += 1;\n else {\n const { type: h, groupId: n, tableId: r, index: l, tdIndex: i, trIndex: f } = g, d = {\n startIndex: l,\n endIndex: l\n };\n h === W.TABLE && (d.tableId = r, d.startTdIndex = i, d.endTdIndex = i, d.startTrIndex = f, d.endTrIndex = f), a.set(n, d);\n }\n }\n const c = [];\n return a.forEach((g) => {\n c.push(g);\n }), c;\n }\n canInput() {\n var s;\n const { startIndex: t, endIndex: o } = this.getRange();\n if (!~t && !~o) return !1;\n const a = this.draw.getElementList(), c = a[t];\n if (t === o)\n return (c.controlComponent !== C.PRE_TEXT || ((s = a[t + 1]) == null ? void 0 : s.controlComponent) !== C.PRE_TEXT) && c.controlComponent !== C.POST_TEXT;\n const g = a[o];\n return !c.controlId && !g.controlId || (!c.controlId || c.controlComponent === C.POSTFIX) && (!g.controlId || g.controlComponent === C.POSTFIX) || !!c.controlId && g.controlId === c.controlId && g.controlComponent !== C.PRE_TEXT && g.controlComponent !== C.POST_TEXT && g.controlComponent !== C.POSTFIX;\n }\n setRange(t, o, a, c, g, s, h) {\n this.getIsRangeChange(\n t,\n o,\n a,\n c,\n g,\n s,\n h\n ) && (this.range.startIndex = t, this.range.endIndex = o, this.range.tableId = a, this.range.startTdIndex = c, this.range.endTdIndex = g, this.range.startTrIndex = s, this.range.endTrIndex = h, this.range.isCrossRowCol = c !== void 0 || g !== void 0 || s !== void 0 || h !== void 0, this.setDefaultStyle(null)), this.range.zone = this.draw.getZone().getZone();\n const r = this.draw.getControl();\n if (~t && ~o) {\n const i = this.draw.getElementList()[t];\n if (i != null && i.controlId) {\n r.initControl();\n return;\n }\n }\n r.destroyControl();\n }\n replaceRange(t) {\n this.setRange(\n t.startIndex,\n t.endIndex,\n t.tableId,\n t.startTdIndex,\n t.endTdIndex,\n t.startTrIndex,\n t.endTrIndex\n );\n }\n shrinkRange() {\n const { startIndex: t, endIndex: o } = this.range;\n t === o || !~t && !~o || this.replaceRange({\n ...this.range,\n startIndex: o\n });\n }\n setRangeStyle() {\n var X;\n const t = this.listener.rangeStyleChange, o = this.eventBus.hasSubscribers(\"rangeStyleChange\");\n if (!t && !o) return;\n const { startIndex: a, endIndex: c, isCrossRowCol: g } = this.range;\n if (!~a && !~c) return;\n let s;\n if (g) {\n const T = this.draw.getOriginalElementList(), m = this.position.getPositionContext();\n s = T[m.index];\n } else {\n const T = ~c ? c : 0, m = this.draw.getElementList();\n s = this.getRangeAnchorStyle(m, T);\n }\n if (!s) return;\n const h = !!((X = this.getSelectionElementList()) != null && X.length), n = this.getSelection() || [s], r = s.type || R.TEXT, l = s.font || this.options.defaultFont, i = s.size || this.options.defaultSize, f = s.characterScale ?? 100, d = !~n.findIndex((T) => !T.bold), p = !~n.findIndex((T) => !T.italic), y = !~n.findIndex(\n (T) => {\n var m;\n return !T.underline && !((m = T.control) != null && m.underline);\n }\n ), u = !~n.findIndex((T) => !T.strikeout), b = s.color || null, w = s.highlight || null, I = s.paragraphColor || null;\n let P = 0;\n {\n const T = this.draw.getElementList();\n for (let m = ~c ? c : 0; m >= 0; m--) {\n const k = T[m];\n if (k.paragraphFirstLineIndent !== void 0) {\n P = k.paragraphFirstLineIndent;\n break;\n }\n if (m > 0 && D(T[m - 1]))\n break;\n }\n }\n const x = s.rowFlex || null, q = s.rowMargin ?? this.options.defaultRowMargin, Y = s.lineHeight ?? this.options.defaultLineHeight, Z = s.dashArray || [], $ = s.separatorType || null, J = s.separatorLineWidth ?? null, ee = s.level || null, te = s.listType || null, ne = s.listStyle || null, re = y && s.textDecoration || null, oe = !!this.draw.getPainterStyle(), se = this.historyManager.isCanUndo(), ie = this.historyManager.isCanRedo(), le = s.groupIds || null;\n let v = s.extension ?? null;\n if (r === R.TABLE) {\n const T = {\n borderType: s.borderType ?? null,\n borderColor: s.borderColor ?? null,\n borderWidth: s.borderWidth ?? null,\n borderExternalWidth: s.borderExternalWidth ?? null\n };\n v && typeof v == \"object\" && !Array.isArray(v) ? v = { ...v, table: T } : v = { table: T };\n }\n const F = {\n type: r,\n hasSelection: h,\n undo: se,\n redo: ie,\n painter: oe,\n font: l,\n size: i,\n characterScale: f,\n bold: d,\n italic: p,\n underline: y,\n strikeout: u,\n color: b,\n highlight: w,\n paragraphColor: I,\n rowFlex: x,\n rowMargin: q,\n lineHeight: Y,\n dashArray: Z,\n separatorType: $,\n separatorLineWidth: J,\n level: ee,\n listType: te,\n listStyle: ne,\n groupIds: le,\n textDecoration: re,\n paragraphFirstLineIndent: P,\n extension: v\n };\n t && t(F), o && this.eventBus.emit(\"rangeStyleChange\", F);\n }\n recoveryRangeStyle() {\n const t = this.listener.rangeStyleChange, o = this.eventBus.hasSubscribers(\"rangeStyleChange\");\n if (!t && !o) return;\n const a = this.options.defaultFont, c = this.options.defaultSize, g = this.options.defaultRowMargin, s = this.options.defaultLineHeight, h = !!this.draw.getPainterStyle(), n = this.historyManager.isCanUndo(), r = this.historyManager.isCanRedo(), l = {\n type: null,\n hasSelection: !1,\n undo: n,\n redo: r,\n painter: h,\n font: a,\n size: c,\n characterScale: 100,\n bold: !1,\n italic: !1,\n underline: !1,\n strikeout: !1,\n color: null,\n highlight: null,\n paragraphColor: null,\n rowFlex: null,\n rowMargin: g,\n lineHeight: s,\n dashArray: [],\n separatorType: null,\n separatorLineWidth: null,\n level: null,\n listType: null,\n listStyle: null,\n groupIds: null,\n textDecoration: null,\n paragraphFirstLineIndent: 0,\n extension: null\n };\n t && t(l), o && this.eventBus.emit(\"rangeStyleChange\", l);\n }\n shrinkBoundary(t = {}) {\n const o = t.elementList || this.draw.getElementList(), a = t.range || this.getRange(), { startIndex: c, endIndex: g } = a;\n if (!~c && !~g) return;\n const s = o[c], h = o[g];\n if (c === g) {\n if (s.controlComponent === C.PLACEHOLDER) {\n let n = c - 1;\n for (; n > 0; ) {\n const r = o[n];\n if (r.controlId !== s.controlId || r.controlComponent === C.PREFIX || r.controlComponent === C.PRE_TEXT) {\n a.startIndex = n, a.endIndex = n;\n break;\n }\n n--;\n }\n }\n } else {\n if (s.controlComponent === C.PLACEHOLDER || h.controlComponent === C.PLACEHOLDER) {\n let n = g - 1;\n for (; n > 0; ) {\n const r = o[n];\n if (r.controlId !== h.controlId || r.controlComponent === C.PREFIX || r.controlComponent === C.PRE_TEXT) {\n a.startIndex = n, a.endIndex = n;\n return;\n }\n n--;\n }\n }\n if (s.controlComponent === C.PREFIX) {\n let n = c + 1;\n for (; n < o.length; ) {\n const r = o[n];\n if (r.controlId !== s.controlId || r.controlComponent === C.VALUE) {\n a.startIndex = n - 1;\n break;\n } else if (r.controlComponent === C.PLACEHOLDER) {\n a.startIndex = n - 1, a.endIndex = n - 1;\n return;\n }\n n++;\n }\n }\n if (h.controlComponent !== C.VALUE) {\n let n = g;\n for (; n > 0; ) {\n const r = o[n];\n if (r.controlId !== s.controlId || r.controlComponent === C.VALUE) {\n a.startIndex = n;\n break;\n } else if (r.controlComponent === C.PLACEHOLDER) {\n a.startIndex = n, a.endIndex = n;\n return;\n }\n n--;\n }\n }\n }\n }\n render(t, o, a, c, g) {\n t.save(), t.globalAlpha = this.options.rangeAlpha, t.fillStyle = this.options.rangeColor, t.fillRect(o, a, c, g), t.restore();\n }\n toString() {\n const t = this.getTextLikeSelection();\n return t ? t.map((o) => o.value).join(\"\").replace(Ee, \"\") : \"\";\n }\n}\nfunction Ie(e) {\n return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, \"default\") ? e.default : e;\n}\nvar Q = { exports: {} };\n(function(e) {\n var t = Object.prototype.hasOwnProperty, o = \"~\";\n function a() {\n }\n Object.create && (a.prototype = /* @__PURE__ */ Object.create(null), new a().__proto__ || (o = !1));\n function c(n, r, l) {\n this.fn = n, this.context = r, this.once = l || !1;\n }\n function g(n, r, l, i, f) {\n if (typeof l != \"function\")\n throw new TypeError(\"The listener must be a function\");\n var d = new c(l, i || n, f), p = o ? o + r : r;\n return n._events[p] ? n._events[p].fn ? n._events[p] = [n._events[p], d] : n._events[p].push(d) : (n._events[p] = d, n._eventsCount++), n;\n }\n function s(n, r) {\n --n._eventsCount === 0 ? n._events = new a() : delete n._events[r];\n }\n function h() {\n this._events = new a(), this._eventsCount = 0;\n }\n h.prototype.eventNames = function() {\n var r = [], l, i;\n if (this._eventsCount === 0) return r;\n for (i in l = this._events)\n t.call(l, i) && r.push(o ? i.slice(1) : i);\n return Object.getOwnPropertySymbols ? r.concat(Object.getOwnPropertySymbols(l)) : r;\n }, h.prototype.listeners = function(r) {\n var l = o ? o + r : r, i = this._events[l];\n if (!i) return [];\n if (i.fn) return [i.fn];\n for (var f = 0, d = i.length, p = new Array(d); f < d; f++)\n p[f] = i[f].fn;\n return p;\n }, h.prototype.listenerCount = function(r) {\n var l = o ? o + r : r, i = this._events[l];\n return i ? i.fn ? 1 : i.length : 0;\n }, h.prototype.emit = function(r, l, i, f, d, p) {\n var y = o ? o + r : r;\n if (!this._events[y]) return !1;\n var u = this._events[y], b = arguments.length, w, I;\n if (u.fn) {\n switch (u.once && this.removeListener(r, u.fn, void 0, !0), b) {\n case 1:\n return u.fn.call(u.context), !0;\n case 2:\n return u.fn.call(u.context, l), !0;\n case 3:\n return u.fn.call(u.context, l, i), !0;\n case 4:\n return u.fn.call(u.context, l, i, f), !0;\n case 5:\n return u.fn.call(u.context, l, i, f, d), !0;\n case 6:\n return u.fn.call(u.context, l, i, f, d, p), !0;\n }\n for (I = 1, w = new Array(b - 1); I < b; I++)\n w[I - 1] = arguments[I];\n u.fn.apply(u.context, w);\n } else {\n var P = u.length, x;\n for (I = 0; I < P; I++)\n switch (u[I].once && this.removeListener(r, u[I].fn, void 0, !0), b) {\n case 1:\n u[I].fn.call(u[I].context);\n break;\n case 2:\n u[I].fn.call(u[I].context, l);\n break;\n case 3:\n u[I].fn.call(u[I].context, l, i);\n break;\n case 4:\n u[I].fn.call(u[I].context, l, i, f);\n break;\n default:\n if (!w) for (x = 1, w = new Array(b - 1); x < b; x++)\n w[x - 1] = arguments[x];\n u[I].fn.apply(u[I].context, w);\n }\n }\n return !0;\n }, h.prototype.on = function(r, l, i) {\n return g(this, r, l, i, !1);\n }, h.prototype.once = function(r, l, i) {\n return g(this, r, l, i, !0);\n }, h.prototype.removeListener = function(r, l, i, f) {\n var d = o ? o + r : r;\n if (!this._events[d]) return this;\n if (!l)\n return s(this, d), this;\n var p = this._events[d];\n if (p.fn)\n p.fn === l && (!f || p.once) && (!i || p.context === i) && s(this, d);\n else {\n for (var y = 0, u = [], b = p.length; y < b; y++)\n (p[y].fn !== l || f && !p[y].once || i && p[y].context !== i) && u.push(p[y]);\n u.length ? this._events[d] = u.length === 1 ? u[0] : u : s(this, d);\n }\n return this;\n }, h.prototype.removeAllListeners = function(r) {\n var l;\n return r ? (l = o ? o + r : r, this._events[l] && s(this, l)) : (this._events = new a(), this._eventsCount = 0), this;\n }, h.prototype.off = h.prototype.removeListener, h.prototype.addListener = h.prototype.on, h.prefixed = o, h.EventEmitter = h, e.exports = h;\n})(Q);\nvar Ce = Q.exports;\nconst Le = /* @__PURE__ */ Ie(Ce), Te = 50;\nclass ye {\n constructor(t = Te) {\n A(this, \"emitter\");\n A(this, \"_maxListeners\");\n this.emitter = new Le(), this._maxListeners = t;\n }\n on(t, o) {\n if (!(!t || typeof o != \"function\")) {\n if (this._maxListeners > 0 && this.emitter.listeners(t).length >= this._maxListeners) {\n console.warn(\n `[EventBus] Max listeners (${this._maxListeners}) reached for event \"${String(t)}\". Subsequent listeners are ignored.`\n );\n return;\n }\n this.emitter.on(t, o);\n }\n }\n emit(t, ...o) {\n t && this.emitter.emit(t, ...o);\n }\n off(t, o) {\n !t || typeof o != \"function\" || this.emitter.off(t, o);\n }\n hasSubscribers(t) {\n return this.emitter.listeners(t).length > 0;\n }\n destroy() {\n this.emitter.removeAllListeners();\n }\n}\nexport {\n C as ControlComponent,\n W as EditorContext,\n R as ElementType,\n ye as EventBus,\n Re as Listener,\n Se as RangeManager\n};\n//# sourceMappingURL=docx-editor-state.js.map\n","import {\r\n BackgroundRepeat,\r\n BackgroundSize\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Background {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n private imageCache: Map<string, HTMLImageElement>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.imageCache = new Map()\r\n }\r\n\r\n private _renderBackgroundColor(\r\n ctx: CanvasRenderingContext2D,\r\n color: string,\r\n width: number,\r\n height: number\r\n ) {\r\n ctx.save()\r\n ctx.fillStyle = color\r\n ctx.fillRect(0, 0, width, height)\r\n ctx.restore()\r\n }\r\n\r\n private _drawImage(\r\n ctx: CanvasRenderingContext2D,\r\n imageElement: HTMLImageElement,\r\n width: number,\r\n height: number\r\n ) {\r\n const { background, scale } = this.options\r\n // contain\r\n if (background.size === BackgroundSize.CONTAIN) {\r\n const imageWidth = imageElement.width * scale\r\n const imageHeight = imageElement.height * scale\r\n if (\r\n !background.repeat ||\r\n background.repeat === BackgroundRepeat.NO_REPEAT\r\n ) {\r\n ctx.drawImage(imageElement, 0, 0, imageWidth, imageHeight)\r\n } else {\r\n let startX = 0\r\n let startY = 0\r\n const repeatXCount =\r\n background.repeat === BackgroundRepeat.REPEAT ||\r\n background.repeat === BackgroundRepeat.REPEAT_X\r\n ? Math.ceil((width * scale) / imageWidth)\r\n : 1\r\n const repeatYCount =\r\n background.repeat === BackgroundRepeat.REPEAT ||\r\n background.repeat === BackgroundRepeat.REPEAT_Y\r\n ? Math.ceil((height * scale) / imageHeight)\r\n : 1\r\n for (let x = 0; x < repeatXCount; x++) {\r\n for (let y = 0; y < repeatYCount; y++) {\r\n ctx.drawImage(imageElement, startX, startY, imageWidth, imageHeight)\r\n startY += imageHeight\r\n }\r\n startY = 0\r\n startX += imageWidth\r\n }\r\n }\r\n } else {\r\n // cover\r\n ctx.drawImage(imageElement, 0, 0, width * scale, height * scale)\r\n }\r\n }\r\n\r\n private _renderBackgroundImage(\r\n ctx: CanvasRenderingContext2D,\r\n width: number,\r\n height: number\r\n ) {\r\n const { background } = this.options\r\n const imageElementCache = this.imageCache.get(background.image)\r\n if (imageElementCache) {\r\n this._drawImage(ctx, imageElementCache, width, height)\r\n } else {\r\n const img = new Image()\r\n img.setAttribute('crossOrigin', 'Anonymous')\r\n img.src = background.image\r\n img.onload = () => {\r\n this.imageCache.set(background.image, img)\r\n this._drawImage(ctx, img, width, height)\r\n // 避免层级上浮,触发编辑器二次渲染\r\n this.draw.render({\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n }\r\n }\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n const {\r\n background: { image, color, applyPageNumbers }\r\n } = this.options\r\n if (\r\n image &&\r\n (!applyPageNumbers?.length || applyPageNumbers.includes(pageNo))\r\n ) {\r\n const { width, height } = this.options\r\n this._renderBackgroundImage(ctx, width, height)\r\n } else {\r\n const width = this.draw.getCanvasWidth(pageNo)\r\n const height = this.draw.getCanvasHeight(pageNo)\r\n this._renderBackgroundColor(ctx, color, width, height)\r\n }\r\n }\r\n}\r\n","import { IElement, IRowElement, SeparatorType } from '@vervedoc/docx-editor-schema'\r\n\r\ntype SeparatorLikeElement = Pick<IElement, 'dashArray' | 'separatorType' | 'separatorLineWidth'> | Pick<IRowElement, 'dashArray' | 'separatorType' | 'separatorLineWidth'>\r\n\r\nconst DEFAULT_SEPARATOR_TYPE: SeparatorType = 'solid'\r\nconst DEFAULT_DASH_ARRAY: number[] = [0, 0]\r\n\r\nexport function getSeparatorType(element: SeparatorLikeElement): SeparatorType {\r\n return element.separatorType || DEFAULT_SEPARATOR_TYPE\r\n}\r\n\r\nexport function getSeparatorLineWidth(element: SeparatorLikeElement, defaultLineWidth: number): number {\r\n const lineWidth = Number(element.separatorLineWidth)\r\n if (Number.isFinite(lineWidth) && lineWidth > 0) {\r\n return lineWidth\r\n }\r\n return defaultLineWidth\r\n}\r\n\r\nexport function getSeparatorDashArray(element: SeparatorLikeElement, type = getSeparatorType(element)): number[] {\r\n if (Array.isArray(element.dashArray) && element.dashArray.length) {\r\n return element.dashArray\r\n }\r\n if (type === 'dotted') return [1, 1]\r\n if (type === 'dashed') return [6, 3]\r\n return DEFAULT_DASH_ARRAY\r\n}\r\n\r\nexport function getSeparatorRenderHeight(element: SeparatorLikeElement, defaultLineWidth: number): number {\r\n const lineWidth = getSeparatorLineWidth(element, defaultLineWidth)\r\n const type = getSeparatorType(element)\r\n switch (type) {\r\n case 'double':\r\n return lineWidth * 3 + 2\r\n case 'triple':\r\n return lineWidth * 5 + 4\r\n case 'wavy':\r\n return Math.max(lineWidth * 4, 8)\r\n case 'shadow':\r\n return lineWidth + 3\r\n case 'emboss':\r\n return lineWidth * 2 + 3\r\n default:\r\n return Math.max(lineWidth, 1)\r\n }\r\n}\r\n","import { TextDecorationStyle } from '@vervedoc/docx-editor-schema'\r\nimport { IElementFillRect } from '@vervedoc/docx-editor-schema'\r\n\r\nexport abstract class AbstractRichText {\r\n protected fillRect: IElementFillRect\r\n protected fillColor?: string\r\n protected fillDecorationStyle?: TextDecorationStyle\r\n\r\n constructor() {\r\n this.fillRect = this.clearFillInfo()\r\n }\r\n\r\n public clearFillInfo() {\r\n this.fillColor = undefined\r\n this.fillDecorationStyle = undefined\r\n this.fillRect = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0\r\n }\r\n return this.fillRect\r\n }\r\n\r\n public recordFillInfo(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height?: number,\r\n color?: string,\r\n decorationStyle?: TextDecorationStyle\r\n ) {\r\n const isFirstRecord = !this.fillRect.width\r\n // 颜色不同时立即绘制\r\n if (\r\n !isFirstRecord &&\r\n (this.fillColor !== color || this.fillDecorationStyle !== decorationStyle)\r\n ) {\r\n this.render(ctx)\r\n this.clearFillInfo()\r\n // 重新记录\r\n this.recordFillInfo(ctx, x, y, width, height, color, decorationStyle)\r\n return\r\n }\r\n if (isFirstRecord) {\r\n this.fillRect.x = x\r\n this.fillRect.y = y\r\n }\r\n if (height && this.fillRect.height < height) {\r\n this.fillRect.height = height\r\n }\r\n this.fillRect.width += width\r\n this.fillColor = color\r\n this.fillDecorationStyle = decorationStyle\r\n }\r\n\r\n public abstract render(ctx: CanvasRenderingContext2D): void\r\n}\r\n","import { AbstractRichText } from './AbstractRichText'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Highlight extends AbstractRichText {\r\n private options: Required<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n super()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D) {\r\n if (!this.fillRect.width) return\r\n const { highlightAlpha } = this.options\r\n const { x, y, width, height } = this.fillRect\r\n ctx.save()\r\n ctx.globalAlpha = highlightAlpha\r\n ctx.fillStyle = this.fillColor!\r\n ctx.fillRect(x, y, width, height)\r\n ctx.restore()\r\n this.clearFillInfo()\r\n }\r\n}\r\n","import { AbstractRichText } from './AbstractRichText'\r\n\r\nexport class ParagraphColor extends AbstractRichText {\r\n public render(ctx: CanvasRenderingContext2D) {\r\n if (!this.fillRect.width) return\r\n const { x, y, width, height } = this.fillRect\r\n ctx.save()\r\n ctx.fillStyle = this.fillColor!\r\n ctx.fillRect(x, y, width, height)\r\n ctx.restore()\r\n this.clearFillInfo()\r\n }\r\n}\r\n","import { PageMode } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Margin {\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n if (this.options.marginIndicatorDisabled) return\r\n const { marginIndicatorColor, pageMode } = this.options\r\n const width = this.draw.getWidth()\r\n const height =\r\n pageMode === PageMode.CONTINUITY\r\n ? this.draw.getCanvasHeight(pageNo) / this.draw.getPagePixelRatio()\r\n : this.draw.getHeight()\r\n const margins = this.draw.getMargins()\r\n const marginIndicatorSize = this.draw.getMarginIndicatorSize()\r\n ctx.save()\r\n ctx.translate(0.5, 0.5)\r\n ctx.strokeStyle = marginIndicatorColor\r\n ctx.beginPath()\r\n const leftTopPoint: [number, number] = [margins[3], margins[0]]\r\n const rightTopPoint: [number, number] = [width - margins[1], margins[0]]\r\n const leftBottomPoint: [number, number] = [margins[3], height - margins[2]]\r\n const rightBottomPoint: [number, number] = [\r\n width - margins[1],\r\n height - margins[2]\r\n ]\r\n // 上左\r\n ctx.moveTo(leftTopPoint[0] - marginIndicatorSize, leftTopPoint[1])\r\n ctx.lineTo(...leftTopPoint)\r\n ctx.lineTo(leftTopPoint[0], leftTopPoint[1] - marginIndicatorSize)\r\n // 上右\r\n ctx.moveTo(rightTopPoint[0] + marginIndicatorSize, rightTopPoint[1])\r\n ctx.lineTo(...rightTopPoint)\r\n ctx.lineTo(rightTopPoint[0], rightTopPoint[1] - marginIndicatorSize)\r\n // 下左\r\n ctx.moveTo(leftBottomPoint[0] - marginIndicatorSize, leftBottomPoint[1])\r\n ctx.lineTo(...leftBottomPoint)\r\n ctx.lineTo(leftBottomPoint[0], leftBottomPoint[1] + marginIndicatorSize)\r\n // 下右\r\n ctx.moveTo(rightBottomPoint[0] + marginIndicatorSize, rightBottomPoint[1])\r\n ctx.lineTo(...rightBottomPoint)\r\n ctx.lineTo(rightBottomPoint[0], rightBottomPoint[1] + marginIndicatorSize)\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { TEXTLIKE_ELEMENT_TYPE } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { EditorContext } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IReplaceOption,\r\n ISearchResult,\r\n ISearchResultRestArgs\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { getUUID, isNumber } from '@vervedoc/docx-editor-schema'\r\nimport { Position } from '../position/Position'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport interface INavigateInfo {\r\n index: number\r\n count: number\r\n}\r\n\r\nexport class Search {\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n private position: Position\r\n private searchKeyword: string | null\r\n private searchNavigateIndex: number | null\r\n private searchMatchList: ISearchResult[]\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.position = draw.getPosition()\r\n this.searchNavigateIndex = null\r\n this.searchKeyword = null\r\n this.searchMatchList = []\r\n }\r\n\r\n public getSearchKeyword(): string | null {\r\n return this.searchKeyword\r\n }\r\n\r\n public setSearchKeyword(payload: string | null) {\r\n this.searchKeyword = payload\r\n this.searchNavigateIndex = null\r\n }\r\n\r\n public searchNavigatePre(): number | null {\r\n if (!this.searchMatchList.length || !this.searchKeyword) return null\r\n if (this.searchNavigateIndex === null) {\r\n this.searchNavigateIndex = 0\r\n } else {\r\n let index = this.searchNavigateIndex - 1\r\n let isExistPre = false\r\n const searchNavigateId =\r\n this.searchMatchList[this.searchNavigateIndex].groupId\r\n while (index >= 0) {\r\n const match = this.searchMatchList[index]\r\n if (searchNavigateId !== match.groupId) {\r\n isExistPre = true\r\n this.searchNavigateIndex = index - (this.searchKeyword.length - 1)\r\n break\r\n }\r\n index--\r\n }\r\n if (!isExistPre) {\r\n const lastSearchMatch =\r\n this.searchMatchList[this.searchMatchList.length - 1]\r\n if (lastSearchMatch.groupId === searchNavigateId) return null\r\n this.searchNavigateIndex =\r\n this.searchMatchList.length - 1 - (this.searchKeyword.length - 1)\r\n }\r\n }\r\n return this.searchNavigateIndex\r\n }\r\n\r\n public searchNavigateNext(): number | null {\r\n if (!this.searchMatchList.length || !this.searchKeyword) return null\r\n if (this.searchNavigateIndex === null) {\r\n this.searchNavigateIndex = 0\r\n } else {\r\n let index = this.searchNavigateIndex + 1\r\n let isExistNext = false\r\n const searchNavigateId =\r\n this.searchMatchList[this.searchNavigateIndex].groupId\r\n while (index < this.searchMatchList.length) {\r\n const match = this.searchMatchList[index]\r\n if (searchNavigateId !== match.groupId) {\r\n isExistNext = true\r\n this.searchNavigateIndex = index\r\n break\r\n }\r\n index++\r\n }\r\n if (!isExistNext) {\r\n const firstSearchMatch = this.searchMatchList[0]\r\n if (firstSearchMatch.groupId === searchNavigateId) return null\r\n this.searchNavigateIndex = 0\r\n }\r\n }\r\n return this.searchNavigateIndex\r\n }\r\n\r\n public searchNavigateScrollIntoView(position: IElementPosition) {\r\n const {\r\n coordinate: { leftTop, leftBottom, rightTop },\r\n pageNo\r\n } = position\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const preY = pageNo * (height + pageGap)\r\n // 创建定位锚点\r\n const anchor = document.createElement('div')\r\n anchor.style.position = 'absolute'\r\n // 扩大搜索词尺寸,使可视范围更广\r\n const ANCHOR_OVERFLOW_SIZE = 50\r\n anchor.style.width = `${rightTop[0] - leftTop[0] + ANCHOR_OVERFLOW_SIZE}px`\r\n anchor.style.height = `${\r\n leftBottom[1] - leftTop[1] + ANCHOR_OVERFLOW_SIZE\r\n }px`\r\n anchor.style.left = `${leftTop[0]}px`\r\n anchor.style.top = `${leftTop[1] + preY}px`\r\n this.draw.getContainer().append(anchor)\r\n // 移动到可视范围\r\n anchor.scrollIntoView(false)\r\n anchor.remove()\r\n }\r\n\r\n public getSearchNavigateIndexList() {\r\n if (this.searchNavigateIndex === null || !this.searchKeyword) return []\r\n return new Array(this.searchKeyword.length)\r\n .fill(this.searchNavigateIndex)\r\n .map((navigate, index) => navigate + index)\r\n }\r\n\r\n public getSearchMatchList(): ISearchResult[] {\r\n return this.searchMatchList\r\n }\r\n\r\n public getSearchNavigateInfo(): null | INavigateInfo {\r\n if (!this.searchKeyword || !this.searchMatchList.length) return null\r\n const index =\r\n this.searchNavigateIndex !== null\r\n ? this.searchNavigateIndex / this.searchKeyword.length + 1\r\n : 0\r\n let count = 0\r\n let groupId = null\r\n for (let s = 0; s < this.searchMatchList.length; s++) {\r\n const match = this.searchMatchList[s]\r\n if (groupId === match.groupId) continue\r\n groupId = match.groupId\r\n count += 1\r\n }\r\n return {\r\n index,\r\n count\r\n }\r\n }\r\n\r\n public getMatchList(\r\n payload: string,\r\n originalElementList: IElement[]\r\n ): ISearchResult[] {\r\n const keyword = payload.toLocaleLowerCase()\r\n const searchMatchList: ISearchResult[] = []\r\n // 分组\r\n const elementListGroup: {\r\n type: EditorContext\r\n elementList: IElement[]\r\n index: number\r\n }[] = []\r\n const originalElementListLength = originalElementList.length\r\n // 查找表格所在位置\r\n const tableIndexList = []\r\n for (let e = 0; e < originalElementListLength; e++) {\r\n const element = originalElementList[e]\r\n if (element.type === ElementType.TABLE) {\r\n tableIndexList.push(e)\r\n }\r\n }\r\n let i = 0\r\n let elementIndex = 0\r\n while (elementIndex < originalElementListLength - 1) {\r\n const endIndex = tableIndexList.length\r\n ? tableIndexList[i]\r\n : originalElementListLength\r\n const pageElement = originalElementList.slice(elementIndex, endIndex)\r\n if (pageElement.length) {\r\n elementListGroup.push({\r\n index: elementIndex,\r\n type: EditorContext.PAGE,\r\n elementList: pageElement\r\n })\r\n }\r\n const tableElement = originalElementList[endIndex]\r\n if (tableElement) {\r\n elementListGroup.push({\r\n index: endIndex,\r\n type: EditorContext.TABLE,\r\n elementList: [tableElement]\r\n })\r\n }\r\n elementIndex = endIndex + 1\r\n i++\r\n }\r\n // 搜索文本\r\n function searchClosure(\r\n payload: string | null,\r\n type: EditorContext,\r\n elementList: IElement[],\r\n restArgs?: ISearchResultRestArgs\r\n ) {\r\n if (!payload) return\r\n const text = elementList\r\n .map(e =>\r\n !e.type ||\r\n (TEXTLIKE_ELEMENT_TYPE.includes(e.type) &&\r\n e.controlComponent !== ControlComponent.CHECKBOX &&\r\n !e.control?.hide &&\r\n !e.area?.hide)\r\n ? e.value\r\n : ZERO\r\n )\r\n .filter(Boolean)\r\n .join('')\r\n .toLocaleLowerCase()\r\n const matchStartIndexList = []\r\n let index = text.indexOf(payload)\r\n while (index !== -1) {\r\n matchStartIndexList.push(index)\r\n index = text.indexOf(payload, index + payload.length)\r\n }\r\n for (let m = 0; m < matchStartIndexList.length; m++) {\r\n const startIndex = matchStartIndexList[m]\r\n const groupId = getUUID()\r\n for (let i = 0; i < payload.length; i++) {\r\n const index = startIndex + i + (restArgs?.startIndex || 0)\r\n searchMatchList.push({\r\n type,\r\n index,\r\n groupId,\r\n ...restArgs\r\n })\r\n }\r\n }\r\n }\r\n for (let e = 0; e < elementListGroup.length; e++) {\r\n const group = elementListGroup[e]\r\n if (group.type === EditorContext.TABLE) {\r\n const tableElement = group.elementList[0]\r\n for (let t = 0; t < tableElement.trList!.length; t++) {\r\n const tr = tableElement.trList![t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const restArgs: ISearchResultRestArgs = {\r\n tableId: tableElement.id,\r\n tableIndex: group.index,\r\n trIndex: t,\r\n tdIndex: d,\r\n tdId: td.id\r\n }\r\n searchClosure(keyword, group.type, td.value, restArgs)\r\n }\r\n }\r\n } else {\r\n searchClosure(keyword, group.type, group.elementList, {\r\n startIndex: group.index\r\n })\r\n }\r\n }\r\n return searchMatchList\r\n }\r\n\r\n public compute(payload: string) {\r\n this.searchMatchList = this.getMatchList(\r\n payload,\r\n this.draw.getOriginalElementList()\r\n )\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageIndex: number) {\r\n if (\r\n !this.searchMatchList ||\r\n !this.searchMatchList.length ||\r\n !this.searchKeyword\r\n ) {\r\n return\r\n }\r\n const { searchMatchAlpha, searchMatchColor, searchNavigateMatchColor } =\r\n this.options\r\n const positionList = this.position.getOriginalPositionList()\r\n const elementList = this.draw.getOriginalElementList()\r\n ctx.save()\r\n ctx.globalAlpha = searchMatchAlpha\r\n for (let s = 0; s < this.searchMatchList.length; s++) {\r\n const searchMatch = this.searchMatchList[s]\r\n let position: IElementPosition | null = null\r\n if (searchMatch.type === EditorContext.TABLE) {\r\n const { tableIndex, trIndex, tdIndex, index } = searchMatch\r\n position =\r\n elementList[tableIndex!]?.trList![trIndex!].tdList[tdIndex!]\r\n ?.positionList![index]\r\n } else {\r\n position = positionList[searchMatch.index]\r\n }\r\n if (!position) continue\r\n const {\r\n coordinate: { leftTop, leftBottom, rightTop },\r\n pageNo\r\n } = position\r\n if (pageNo !== pageIndex) continue\r\n // 高亮并定位当前搜索词\r\n const searchMatchIndexList = this.getSearchNavigateIndexList()\r\n if (searchMatchIndexList.includes(s)) {\r\n ctx.fillStyle = searchNavigateMatchColor\r\n // 是否是第一个字符,则移动到可视范围\r\n const preSearchMatch = this.searchMatchList[s - 1]\r\n if (!preSearchMatch || preSearchMatch.groupId !== searchMatch.groupId) {\r\n this.searchNavigateScrollIntoView(position)\r\n }\r\n } else {\r\n ctx.fillStyle = searchMatchColor\r\n }\r\n const x = leftTop[0]\r\n const y = leftTop[1]\r\n const width = rightTop[0] - leftTop[0]\r\n const height = leftBottom[1] - leftTop[1]\r\n ctx.fillRect(x, y, width, height)\r\n }\r\n ctx.restore()\r\n }\r\n\r\n public replace(payload: string, option?: IReplaceOption) {\r\n const isReadonly = this.draw.isReadonly()\r\n if (isReadonly) return\r\n if (!payload || new RegExp(`${ZERO}`, 'g').test(payload)) return\r\n let matchList = this.getSearchMatchList()\r\n // 替换搜索项\r\n const replaceIndex = option?.index\r\n if (isNumber(replaceIndex)) {\r\n const matchGroup: ISearchResult[][] = []\r\n matchList.forEach(match => {\r\n const last = matchGroup[matchGroup.length - 1]\r\n if (!last || last[0].groupId !== match.groupId) {\r\n matchGroup.push([match])\r\n } else {\r\n last.push(match)\r\n }\r\n })\r\n matchList = matchGroup[replaceIndex]\r\n }\r\n if (!matchList?.length) return\r\n const isDesignMode = this.draw.isDesignMode()\r\n // 匹配index变化的差值\r\n let pageDiffCount = 0\r\n let tableDiffCount = 0\r\n // 匹配搜索词的组标识\r\n let curGroupId = ''\r\n // 表格上下文\r\n let curTdId = ''\r\n // 搜索值 > 替换值:增加元素;搜索值 < 替换值:减少元素\r\n let firstMatchIndex = -1\r\n const elementList = this.draw.getOriginalElementList()\r\n for (let m = 0; m < matchList.length; m++) {\r\n const match = matchList[m]\r\n if (match.type === EditorContext.TABLE) {\r\n const { tableIndex, trIndex, tdIndex, index, tdId } = match\r\n if (curTdId && tdId !== curTdId) {\r\n tableDiffCount = 0\r\n }\r\n curTdId = tdId!\r\n const curTableIndex = tableIndex! + pageDiffCount\r\n const tableElementList =\r\n elementList[curTableIndex].trList![trIndex!].tdList[tdIndex!].value\r\n // 表格内元素\r\n const curIndex = index + tableDiffCount\r\n const tableElement = tableElementList[curIndex]\r\n // 非设计模式下设置元素不可删除 || 控件结构元素 => 禁止替换\r\n if (\r\n !isDesignMode &&\r\n (tableElement?.control?.deletable === false ||\r\n tableElement?.title?.deletable === false)\r\n ) {\r\n continue\r\n }\r\n if (curGroupId === match.groupId) {\r\n this.draw.spliceElementList(tableElementList, curIndex, 1)\r\n tableDiffCount--\r\n continue\r\n }\r\n if (!~firstMatchIndex) {\r\n firstMatchIndex = m\r\n }\r\n for (let p = 0; p < payload.length; p++) {\r\n const value = payload[p]\r\n if (p === 0) {\r\n tableElement.value = value\r\n } else {\r\n this.draw.spliceElementList(tableElementList, curIndex + p, 0, [\r\n {\r\n ...tableElement,\r\n value\r\n }\r\n ])\r\n tableDiffCount++\r\n }\r\n }\r\n } else {\r\n const curIndex = match.index + pageDiffCount\r\n const element = elementList[curIndex]\r\n // 非设计模式下设置元素不可删除 || 控件结构元素 => 禁止替换\r\n if (\r\n (!isDesignMode &&\r\n (element?.control?.deletable === false ||\r\n element?.title?.deletable === false)) ||\r\n (element.type === ElementType.CONTROL &&\r\n element.controlComponent !== ControlComponent.VALUE)\r\n ) {\r\n continue\r\n }\r\n if (!~firstMatchIndex) {\r\n firstMatchIndex = m\r\n }\r\n if (curGroupId === match.groupId) {\r\n this.draw.spliceElementList(elementList, curIndex, 1)\r\n pageDiffCount--\r\n continue\r\n }\r\n for (let p = 0; p < payload.length; p++) {\r\n const value = payload[p]\r\n if (p === 0) {\r\n element.value = value\r\n } else {\r\n this.draw.spliceElementList(elementList, curIndex + p, 0, [\r\n {\r\n ...element,\r\n value\r\n }\r\n ])\r\n pageDiffCount++\r\n }\r\n }\r\n }\r\n curGroupId = match.groupId\r\n }\r\n if (!~firstMatchIndex) return\r\n // 定位-首个被匹配关键词后\r\n const firstMatch = matchList[firstMatchIndex]\r\n const firstIndex = firstMatch.index + (payload.length - 1)\r\n if (firstMatch.type === EditorContext.TABLE) {\r\n const { tableIndex, trIndex, tdIndex, index } = firstMatch\r\n const element =\r\n elementList[tableIndex!].trList![trIndex!].tdList[tdIndex!].value[index]\r\n this.position.setPositionContext({\r\n isTable: true,\r\n index: tableIndex,\r\n trIndex,\r\n tdIndex,\r\n tdId: element.tdId,\r\n trId: element.trId,\r\n tableId: element.tableId\r\n })\r\n } else {\r\n this.position.setPositionContext({\r\n isTable: false\r\n })\r\n }\r\n this.draw.getRange().setRange(firstIndex, firstIndex)\r\n // 重新渲染\r\n this.draw.render({\r\n curIndex: firstIndex\r\n })\r\n }\r\n}\r\n","import { AbstractRichText } from './AbstractRichText'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Strikeout extends AbstractRichText {\r\n private options: Required<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n super()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D) {\r\n if (!this.fillRect.width) return\r\n const { scale, strikeoutColor } = this.options\r\n const { x, y, width } = this.fillRect\r\n ctx.save()\r\n ctx.lineWidth = scale\r\n ctx.strokeStyle = this.fillColor || strikeoutColor\r\n const adjustY = y + 0.5\r\n ctx.beginPath()\r\n ctx.moveTo(x, adjustY)\r\n ctx.lineTo(x + width, adjustY)\r\n ctx.stroke()\r\n ctx.restore()\r\n this.clearFillInfo()\r\n }\r\n}\r\n","import { AbstractRichText } from './AbstractRichText'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { DashType, TextDecorationStyle } from '@vervedoc/docx-editor-schema'\r\n\r\nexport class Underline extends AbstractRichText {\r\n private options: Required<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n super()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n // 下划线\r\n private _drawLine(\r\n ctx: CanvasRenderingContext2D,\r\n startX: number,\r\n startY: number,\r\n width: number,\r\n dashType?: DashType\r\n ) {\r\n const endX = startX + width\r\n ctx.beginPath()\r\n switch (dashType) {\r\n case DashType.DASHED:\r\n // 长虚线- - - - - -\r\n ctx.setLineDash([3, 1])\r\n break\r\n case DashType.DOTTED:\r\n // 点虚线 . . . . . .\r\n ctx.setLineDash([1, 1])\r\n break\r\n }\r\n ctx.moveTo(startX, startY)\r\n ctx.lineTo(endX, startY)\r\n ctx.stroke()\r\n }\r\n\r\n // 双实线\r\n private _drawDouble(\r\n ctx: CanvasRenderingContext2D,\r\n startX: number,\r\n startY: number,\r\n width: number\r\n ) {\r\n const SPACING = 3 // 双实线间距\r\n const endX = startX + width\r\n const endY = startY + SPACING * this.options.scale\r\n ctx.beginPath()\r\n ctx.moveTo(startX, startY)\r\n ctx.lineTo(endX, startY)\r\n ctx.stroke()\r\n ctx.beginPath()\r\n ctx.moveTo(startX, endY)\r\n ctx.lineTo(endX, endY)\r\n ctx.stroke()\r\n }\r\n\r\n // 波浪线\r\n private _drawWave(\r\n ctx: CanvasRenderingContext2D,\r\n startX: number,\r\n startY: number,\r\n width: number\r\n ) {\r\n const { scale } = this.options\r\n const AMPLITUDE = 1.2 * scale // 振幅\r\n const FREQUENCY = 1 / scale // 频率\r\n const adjustY = startY + 2 * AMPLITUDE // 增加2倍振幅\r\n ctx.beginPath()\r\n for (let x = 0; x < width; x++) {\r\n const y = AMPLITUDE * Math.sin(FREQUENCY * x)\r\n ctx.lineTo(startX + x, adjustY + y)\r\n }\r\n ctx.stroke()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D) {\r\n if (!this.fillRect.width) return\r\n const { underlineColor, scale } = this.options\r\n const { x, y, width } = this.fillRect\r\n ctx.save()\r\n ctx.strokeStyle = this.fillColor || underlineColor\r\n ctx.lineWidth = scale\r\n const adjustY = Math.floor(y + 2 * ctx.lineWidth) + 0.5 // +0.5从1处渲染,避免线宽度等于3\r\n switch (this.fillDecorationStyle) {\r\n case TextDecorationStyle.WAVY:\r\n this._drawWave(ctx, x, adjustY, width)\r\n break\r\n case TextDecorationStyle.DOUBLE:\r\n this._drawDouble(ctx, x, adjustY, width)\r\n break\r\n case TextDecorationStyle.DASHED:\r\n this._drawLine(ctx, x, adjustY, width, DashType.DASHED)\r\n break\r\n case TextDecorationStyle.DOTTED:\r\n this._drawLine(ctx, x, adjustY, width, DashType.DOTTED)\r\n break\r\n default:\r\n this._drawLine(ctx, x, adjustY, width)\r\n break\r\n }\r\n ctx.restore()\r\n this.clearFillInfo()\r\n }\r\n}\r\n","import { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { convertStringToBase64 } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class ImageParticle {\r\n private draw: Draw\r\n protected options: Required<IEditorOption>\r\n protected imageCache: Map<string, HTMLImageElement>\r\n private container: HTMLDivElement\r\n private floatImageContainer: HTMLDivElement | null\r\n private floatImage: HTMLImageElement | null\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.container = draw.getContainer()\r\n this.imageCache = new Map()\r\n this.floatImageContainer = null\r\n this.floatImage = null\r\n }\r\n\r\n public getOriginalMainImageList(): IElement[] {\r\n const imageList: IElement[] = []\r\n const getImageList = (elementList: IElement[]) => {\r\n for (const element of elementList) {\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n getImageList(td.value)\r\n }\r\n }\r\n } else if (element.type === ElementType.IMAGE) {\r\n imageList.push(element)\r\n }\r\n }\r\n }\r\n // 获取正文图片列表\r\n getImageList(this.draw.getOriginalMainElementList())\r\n return imageList\r\n }\r\n\r\n public createFloatImage(element: IElement) {\r\n const { scale } = this.options\r\n // 复用浮动元素\r\n let floatImageContainer = this.floatImageContainer\r\n let floatImage = this.floatImage\r\n if (!floatImageContainer) {\r\n floatImageContainer = document.createElement('div')\r\n floatImageContainer.classList.add(`${EDITOR_PREFIX}-float-image`)\r\n this.container.append(floatImageContainer)\r\n this.floatImageContainer = floatImageContainer\r\n }\r\n if (!floatImage) {\r\n floatImage = document.createElement('img')\r\n floatImageContainer.append(floatImage)\r\n this.floatImage = floatImage\r\n }\r\n floatImageContainer.style.display = 'none'\r\n floatImage.style.width = `${element.width! * scale}px`\r\n floatImage.style.height = `${element.height! * scale}px`\r\n // 浮动图片初始信息\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const preY = this.draw.getPageNo() * (height + pageGap)\r\n const imgFloatPosition = element.imgFloatPosition!\r\n floatImageContainer.style.left = `${imgFloatPosition.x * scale}px`\r\n floatImageContainer.style.top = `${preY + imgFloatPosition.y * scale}px`\r\n floatImage.setAttribute('crossOrigin', 'Anonymous')\r\n floatImage.src = element.value\r\n }\r\n\r\n public dragFloatImage(movementX: number, movementY: number) {\r\n if (!this.floatImageContainer) return\r\n this.floatImageContainer.style.display = 'block'\r\n // 之前的坐标加移动长度\r\n const x = parseFloat(this.floatImageContainer.style.left) + movementX\r\n const y = parseFloat(this.floatImageContainer.style.top) + movementY\r\n this.floatImageContainer.style.left = `${x}px`\r\n this.floatImageContainer.style.top = `${y}px`\r\n }\r\n\r\n public destroyFloatImage() {\r\n if (this.floatImageContainer) {\r\n this.floatImageContainer.style.display = 'none'\r\n }\r\n }\r\n\r\n protected addImageObserver(promise: Promise<unknown>) {\r\n this.draw.getImageObserver().add(promise)\r\n }\r\n\r\n protected getFallbackImage(width: number, height: number): HTMLImageElement {\r\n const tileSize = 8\r\n const x = (width - Math.ceil(width / tileSize) * tileSize) / 2\r\n const y = (height - Math.ceil(height / tileSize) * tileSize) / 2\r\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\r\n <rect width=\"${width}\" height=\"${height}\" fill=\"url(#mosaic)\" />\r\n <defs>\r\n <pattern id=\"mosaic\" x=\"${x}\" y=\"${y}\" width=\"${\r\n tileSize * 2\r\n }\" height=\"${tileSize * 2}\" patternUnits=\"userSpaceOnUse\">\r\n <rect width=\"${tileSize}\" height=\"${tileSize}\" fill=\"#cccccc\" />\r\n <rect width=\"${tileSize}\" height=\"${tileSize}\" fill=\"#cccccc\" transform=\"translate(${tileSize}, ${tileSize})\" />\r\n </pattern>\r\n </defs>\r\n </svg>`\r\n const fallbackImage = new Image()\r\n fallbackImage.src = `data:image/svg+xml;base64,${convertStringToBase64(\r\n svg\r\n )}`\r\n return fallbackImage\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement,\r\n x: number,\r\n y: number\r\n ) {\r\n const { scale } = this.options\r\n const width = element.width! * scale\r\n const height = element.height! * scale\r\n if (this.imageCache.has(element.value)) {\r\n const img = this.imageCache.get(element.value)!\r\n ctx.drawImage(img, x, y, width, height)\r\n } else {\r\n const cacheRenderCount = this.draw.getRenderCount()\r\n const imageLoadPromise = new Promise((resolve) => {\r\n const img = new Image()\r\n img.setAttribute('crossOrigin', 'Anonymous')\r\n img.src = element.value\r\n img.onload = () => {\r\n this.imageCache.set(element.value, img)\r\n resolve(element)\r\n // 因图片加载异步,图片加载后可能属于上一次渲染方法\r\n if (cacheRenderCount !== this.draw.getRenderCount()) return\r\n // 衬于文字下方图片需要重新首先绘制\r\n if (element.imgDisplay === ImageDisplay.FLOAT_BOTTOM) {\r\n this.draw.render({\r\n isCompute: false,\r\n isSetCursor: false,\r\n isSubmitHistory: false\r\n })\r\n } else {\r\n ctx.drawImage(img, x, y, width, height)\r\n }\r\n }\r\n img.onerror = () => {\r\n const fallbackImage = this.getFallbackImage(width, height)\r\n fallbackImage.onload = () => {\r\n ctx.drawImage(fallbackImage, x, y, width, height)\r\n this.imageCache.set(element.value, fallbackImage)\r\n resolve(element)\r\n }\r\n fallbackImage.onerror = () => {\r\n resolve(element)\r\n }\r\n }\r\n })\r\n this.addImageObserver(imageLoadPromise)\r\n }\r\n }\r\n}\r\n","import { IEditorOption, IElement, ElementType, RenderMode } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n PUNCTUATION_LIST,\r\n METRICS_BASIS_TEXT\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { ITextMetrics } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport interface IMeasureWordResult {\r\n width: number\r\n endElement: IElement\r\n}\r\n\r\nexport class TextParticle {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n\r\n private ctx: CanvasRenderingContext2D\r\n private curX: number\r\n private curY: number\r\n private text: string\r\n private curStyle: string\r\n private curColor?: string\r\n private curCharacterScale: number\r\n public cacheMeasureText: Map<string, TextMetrics>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.ctx = draw.getCtx()\r\n this.curX = -1\r\n this.curY = -1\r\n this.text = ''\r\n this.curStyle = ''\r\n this.curCharacterScale = 100\r\n this.cacheMeasureText = new Map()\r\n }\r\n\r\n public static getCharacterScaleRatio(characterScale?: number): number {\r\n const nextCharacterScale = Math.round(characterScale ?? 100)\r\n return nextCharacterScale > 0 ? nextCharacterScale / 100 : 1\r\n }\r\n\r\n public static fillScaledText(\r\n ctx: CanvasRenderingContext2D,\r\n text: string,\r\n x: number,\r\n y: number,\r\n characterScale?: number\r\n ) {\r\n const ratio = TextParticle.getCharacterScaleRatio(characterScale)\r\n if (ratio === 1) {\r\n ctx.fillText(text, x, y)\r\n return\r\n }\r\n ctx.save()\r\n ctx.translate(x, y)\r\n ctx.scale(ratio, 1)\r\n ctx.fillText(text, 0, 0)\r\n ctx.restore()\r\n }\r\n\r\n public measureBasisWord(\r\n ctx: CanvasRenderingContext2D,\r\n font: string\r\n ): ITextMetrics {\r\n ctx.save()\r\n ctx.font = font\r\n const textMetrics = this.measureText(ctx, {\r\n value: METRICS_BASIS_TEXT\r\n })\r\n ctx.restore()\r\n return textMetrics\r\n }\r\n\r\n public measureWord(\r\n ctx: CanvasRenderingContext2D,\r\n elementList: IElement[],\r\n curIndex: number\r\n ): IMeasureWordResult {\r\n const LETTER_REG = this.draw.getLetterReg()\r\n let width = 0\r\n let endElement: IElement = elementList[curIndex]\r\n let i = curIndex\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n if (\r\n (element.type && element.type !== ElementType.TEXT) ||\r\n !LETTER_REG.test(element.value)\r\n ) {\r\n endElement = element\r\n break\r\n }\r\n width += this.measureText(ctx, element).width\r\n i++\r\n }\r\n return {\r\n width,\r\n endElement\r\n }\r\n }\r\n\r\n public measurePunctuationWidth(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement\r\n ): number {\r\n if (!element || !PUNCTUATION_LIST.includes(element.value)) return 0\r\n return this.measureText(ctx, element).width\r\n }\r\n\r\n public measureText(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement\r\n ): ITextMetrics {\r\n // 优先使用自定义字宽设置\r\n if (element.width) {\r\n const textMetrics = ctx.measureText(element.value)\r\n // TextMetrics是类无法解构\r\n return {\r\n width: element.width,\r\n actualBoundingBoxAscent: textMetrics.actualBoundingBoxAscent,\r\n actualBoundingBoxDescent: textMetrics.actualBoundingBoxDescent,\r\n actualBoundingBoxLeft: textMetrics.actualBoundingBoxLeft,\r\n actualBoundingBoxRight: textMetrics.actualBoundingBoxRight,\r\n fontBoundingBoxAscent: textMetrics.fontBoundingBoxAscent,\r\n fontBoundingBoxDescent: textMetrics.fontBoundingBoxDescent\r\n }\r\n }\r\n const id = `${element.value}${ctx.font}`\r\n const cacheTextMetrics = this.cacheMeasureText.get(id)\r\n if (cacheTextMetrics) {\r\n return cacheTextMetrics\r\n }\r\n const textMetrics = ctx.measureText(element.value)\r\n this.cacheMeasureText.set(id, textMetrics)\r\n return textMetrics\r\n }\r\n\r\n public complete() {\r\n this._render()\r\n this.text = ''\r\n }\r\n\r\n public record(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n this.ctx = ctx\r\n // 兼容模式立即绘制\r\n if (this.options.renderMode === RenderMode.COMPATIBILITY) {\r\n this._setCurXY(x, y)\r\n this.text = element.value\r\n this.curStyle = element.style\r\n this.curColor = element.color\r\n this.complete()\r\n return\r\n }\r\n // 主动完成的重设起始点\r\n if (!this.text) {\r\n this._setCurXY(x, y)\r\n }\r\n // 样式发生改变\r\n if (\r\n (this.curStyle && element.style !== this.curStyle) ||\r\n element.color !== this.curColor ||\r\n (element.characterScale ?? 100) !== this.curCharacterScale\r\n ) {\r\n this.complete()\r\n this._setCurXY(x, y)\r\n }\r\n this.text += element.value\r\n this.curStyle = element.style\r\n this.curColor = element.color\r\n this.curCharacterScale = element.characterScale ?? 100\r\n }\r\n\r\n private _setCurXY(x: number, y: number) {\r\n this.curX = x\r\n this.curY = y\r\n }\r\n\r\n private _render() {\r\n if (!this.text || !~this.curX || !~this.curX) return\r\n this.ctx.save()\r\n this.ctx.font = this.curStyle\r\n this.ctx.fillStyle = this.curColor || this.options.defaultColor\r\n TextParticle.fillScaledText(\r\n this.ctx,\r\n this.text,\r\n this.curX,\r\n this.curY,\r\n this.curCharacterScale\r\n )\r\n this.ctx.restore()\r\n }\r\n}\r\n","import { FORMAT_PLACEHOLDER } from '@vervedoc/docx-editor-schema'\r\nimport { NumberType } from '@vervedoc/docx-editor-schema'\r\nimport { RowFlex } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { convertNumberToChinese } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class PageNumber {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n }\r\n\r\n static formatNumberPlaceholder(\r\n text: string,\r\n pageNo: number,\r\n replaceReg: RegExp,\r\n numberType: NumberType\r\n ) {\r\n const pageNoText =\r\n numberType === NumberType.CHINESE\r\n ? convertNumberToChinese(pageNo)\r\n : `${pageNo}`\r\n return text.replace(replaceReg, pageNoText)\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n const {\r\n scale,\r\n pageNumber: {\r\n size,\r\n font,\r\n color,\r\n rowFlex,\r\n numberType,\r\n format,\r\n startPageNo,\r\n fromPageNo\r\n }\r\n } = this.options\r\n if (pageNo < fromPageNo) return\r\n // 处理页码格式\r\n let text = format\r\n const pageNoReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_NO)\r\n if (pageNoReg.test(text)) {\r\n text = PageNumber.formatNumberPlaceholder(\r\n text,\r\n pageNo + startPageNo - fromPageNo,\r\n pageNoReg,\r\n numberType\r\n )\r\n }\r\n const pageCountReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_COUNT)\r\n if (pageCountReg.test(text)) {\r\n text = PageNumber.formatNumberPlaceholder(\r\n text,\r\n this.draw.getPageCount() - fromPageNo,\r\n pageCountReg,\r\n numberType\r\n )\r\n }\r\n const width = this.draw.getWidth()\r\n // 计算y位置\r\n const height = this.draw.getHeight()\r\n const pageNumberBottom = this.draw.getPageNumberBottom()\r\n const y = height - pageNumberBottom\r\n ctx.save()\r\n ctx.fillStyle = color\r\n ctx.font = `${size * scale}px ${font}`\r\n // 计算x位置-居左、居中、居右\r\n let x = 0\r\n const margins = this.draw.getMargins()\r\n const { width: textWidth } = ctx.measureText(text)\r\n if (rowFlex === RowFlex.CENTER) {\r\n x = (width - textWidth) / 2\r\n } else if (rowFlex === RowFlex.RIGHT) {\r\n x = width - textWidth - margins[1]\r\n } else {\r\n x = margins[3]\r\n }\r\n ctx.fillText(text, x, y)\r\n ctx.restore()\r\n }\r\n}\r\n","import { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { debounce } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport interface IElementVisibleInfo {\r\n intersectionHeight: number\r\n}\r\n\r\nexport interface IPageVisibleInfo {\r\n intersectionPageNo: number\r\n visiblePageNoList: number[]\r\n}\r\n\r\nexport class ScrollObserver {\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n private scrollContainer: Element | Document\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.scrollContainer = this.getScrollContainer()\r\n // 监听滚轮\r\n setTimeout(() => {\r\n if (!window.scrollY) {\r\n this._observer()\r\n }\r\n })\r\n this._addEvent()\r\n }\r\n\r\n public getScrollContainer(): Element | Document {\r\n return this.options.scrollContainerSelector\r\n ? document.querySelector(this.options.scrollContainerSelector) || document\r\n : document\r\n }\r\n\r\n private _addEvent() {\r\n this.scrollContainer.addEventListener('scroll', this._observer)\r\n }\r\n\r\n public removeEvent() {\r\n this.scrollContainer.removeEventListener('scroll', this._observer)\r\n }\r\n\r\n public getElementVisibleInfo(element: Element): IElementVisibleInfo {\r\n const rect = element.getBoundingClientRect()\r\n const viewHeight =\r\n this.scrollContainer === document\r\n ? Math.max(document.documentElement.clientHeight, window.innerHeight)\r\n : (<Element>this.scrollContainer).clientHeight\r\n const visibleHeight =\r\n Math.min(rect.bottom, viewHeight) - Math.max(rect.top, 0)\r\n return {\r\n intersectionHeight: visibleHeight > 0 ? visibleHeight : 0\r\n }\r\n }\r\n\r\n public getPageVisibleInfo(): IPageVisibleInfo {\r\n const pageList = this.draw.getPageList()\r\n const visiblePageNoList: number[] = []\r\n let intersectionPageNo = 0\r\n let intersectionMaxHeight = 0\r\n for (let i = 0; i < pageList.length; i++) {\r\n const curPage = pageList[i]\r\n const { intersectionHeight } = this.getElementVisibleInfo(curPage)\r\n // 之前页存在交叉 && 当前页不交叉则后续均不交叉,结束循环\r\n if (intersectionMaxHeight && !intersectionHeight) break\r\n if (intersectionHeight) {\r\n visiblePageNoList.push(i)\r\n }\r\n if (intersectionHeight > intersectionMaxHeight) {\r\n intersectionMaxHeight = intersectionHeight\r\n intersectionPageNo = i\r\n }\r\n }\r\n return {\r\n intersectionPageNo,\r\n visiblePageNoList\r\n }\r\n }\r\n\r\n private _observer = debounce(() => {\r\n const { intersectionPageNo, visiblePageNoList } = this.getPageVisibleInfo()\r\n this.draw.setIntersectionPageNo(intersectionPageNo)\r\n this.draw.setVisiblePageNoList(visiblePageNoList)\r\n }, 150)\r\n}\r\n","import { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\n\r\nexport class SelectionObserver {\r\n // 每次滚动长度\r\n private readonly step: number = 5\r\n // 触发滚动阀值\r\n private readonly thresholdPoints: [\r\n top: number,\r\n down: number,\r\n left: number,\r\n right: number\r\n ] = [70, 40, 10, 20]\r\n\r\n private selectionContainer: Element | Document\r\n private rangeManager: RangeManager\r\n private requestAnimationFrameId: number | null\r\n private isMousedown: boolean\r\n private isMoving: boolean\r\n private clientWidth: number\r\n private clientHeight: number\r\n private containerRect: DOMRect | null\r\n\r\n constructor(draw: Draw) {\r\n this.rangeManager = draw.getRange()\r\n // 优先使用配置的滚动容器dom\r\n const { scrollContainerSelector } = draw.getOptions()\r\n this.selectionContainer = scrollContainerSelector\r\n ? document.querySelector(scrollContainerSelector) || document\r\n : document\r\n this.requestAnimationFrameId = null\r\n this.isMousedown = false\r\n this.isMoving = false\r\n // 缓存尺寸\r\n this.clientWidth = 0\r\n this.clientHeight = 0\r\n this.containerRect = null\r\n // 添加监听\r\n this._addEvent()\r\n }\r\n\r\n private _addEvent() {\r\n const container = <Document>this.selectionContainer\r\n container.addEventListener('mousedown', this._mousedown)\r\n container.addEventListener('mousemove', this._mousemove)\r\n container.addEventListener('mouseup', this._mouseup)\r\n document.addEventListener('mouseleave', this._mouseup)\r\n }\r\n\r\n public removeEvent() {\r\n const container = <Document>this.selectionContainer\r\n container.removeEventListener('mousedown', this._mousedown)\r\n container.removeEventListener('mousemove', this._mousemove)\r\n container.removeEventListener('mouseup', this._mouseup)\r\n document.removeEventListener('mouseleave', this._mouseup)\r\n }\r\n\r\n private _mousedown = () => {\r\n this.isMousedown = true\r\n // 更新容器宽高\r\n this.clientWidth =\r\n this.selectionContainer instanceof Document\r\n ? document.documentElement.clientWidth\r\n : this.selectionContainer.clientWidth\r\n this.clientHeight =\r\n this.selectionContainer instanceof Document\r\n ? document.documentElement.clientHeight\r\n : this.selectionContainer.clientHeight\r\n // 更新容器位置信息\r\n if (!(this.selectionContainer instanceof Document)) {\r\n const rect = this.selectionContainer.getBoundingClientRect()\r\n this.containerRect = rect\r\n }\r\n }\r\n\r\n private _mouseup = () => {\r\n this.isMousedown = false\r\n this._stopMove()\r\n }\r\n\r\n private _mousemove = (evt: MouseEvent) => {\r\n if (!this.isMousedown || this.rangeManager.getIsCollapsed()) return\r\n let { x, y } = evt\r\n if (this.containerRect) {\r\n x = x - this.containerRect.x\r\n y = y - this.containerRect.y\r\n }\r\n if (y < this.thresholdPoints[0]) {\r\n this._startMove(MoveDirection.UP)\r\n } else if (this.clientHeight - y <= this.thresholdPoints[1]) {\r\n this._startMove(MoveDirection.DOWN)\r\n } else if (x < this.thresholdPoints[2]) {\r\n this._startMove(MoveDirection.LEFT)\r\n } else if (this.clientWidth - x < this.thresholdPoints[3]) {\r\n this._startMove(MoveDirection.RIGHT)\r\n } else {\r\n this._stopMove()\r\n }\r\n }\r\n\r\n private _move(direction: MoveDirection) {\r\n // Document使用window\r\n const container =\r\n this.selectionContainer instanceof Document\r\n ? window\r\n : this.selectionContainer\r\n const x =\r\n this.selectionContainer instanceof Document\r\n ? window.scrollX\r\n : (<Element>container).scrollLeft\r\n const y =\r\n this.selectionContainer instanceof Document\r\n ? window.scrollY\r\n : (<Element>container).scrollTop\r\n if (direction === MoveDirection.DOWN) {\r\n container.scrollTo(x, y + this.step)\r\n } else if (direction === MoveDirection.UP) {\r\n container.scrollTo(x, y - this.step)\r\n } else if (direction === MoveDirection.LEFT) {\r\n container.scrollTo(x - this.step, y)\r\n } else {\r\n container.scrollTo(x + this.step, y)\r\n }\r\n this.requestAnimationFrameId = window.requestAnimationFrame(\r\n this._move.bind(this, direction)\r\n )\r\n }\r\n\r\n private _startMove(direction: MoveDirection) {\r\n if (this.isMoving) return\r\n this.isMoving = true\r\n this._move(direction)\r\n }\r\n\r\n private _stopMove() {\r\n if (this.requestAnimationFrameId) {\r\n window.cancelAnimationFrame(this.requestAnimationFrameId)\r\n this.requestAnimationFrameId = null\r\n this.isMoving = false\r\n }\r\n }\r\n}\r\n","import { ElementType, IElement, TableBorder } from '@vervedoc/docx-editor-schema'\r\nimport { TdBorder, TdSlash } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { ITd } from '@vervedoc/docx-editor-schema'\r\nimport { ITr } from '@vervedoc/docx-editor-schema'\r\nimport { deepClone } from '@vervedoc/docx-editor-schema'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../../draw/Draw'\r\n\r\nexport class TableParticle {\r\n private draw: Draw\r\n private range: RangeManager\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.range = draw.getRange()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public getTrListGroupByCol(payload: ITr[]): ITr[] {\r\n const trList = deepClone(payload)\r\n for (let t = 0; t < payload.length; t++) {\r\n const tr = trList[t]\r\n for (let d = tr.tdList.length - 1; d >= 0; d--) {\r\n const td = tr.tdList[d]\r\n const { rowspan, rowIndex, colIndex } = td\r\n const curRowIndex = rowIndex! + rowspan - 1\r\n if (curRowIndex !== d) {\r\n const changeTd = tr.tdList.splice(d, 1)[0]\r\n trList[curRowIndex]?.tdList.splice(colIndex!, 0, changeTd)\r\n }\r\n }\r\n }\r\n return trList\r\n }\r\n\r\n public getRangeRowCol(): ITd[][] | null {\r\n const { isTable, index, trIndex, tdIndex } = this.draw\r\n .getPosition()\r\n .getPositionContext()\r\n if (!isTable) return null\r\n const {\r\n isCrossRowCol,\r\n startTdIndex,\r\n endTdIndex,\r\n startTrIndex,\r\n endTrIndex\r\n } = this.range.getRange()\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n // 非跨列直接返回光标所在单元格\r\n if (!isCrossRowCol) {\r\n return [[curTrList[trIndex!].tdList[tdIndex!]]]\r\n }\r\n let startTd = curTrList[startTrIndex!].tdList[startTdIndex!]\r\n let endTd = curTrList[endTrIndex!].tdList[endTdIndex!]\r\n // 交换起始位置\r\n if (startTd.x! > endTd.x! || startTd.y! > endTd.y!) {\r\n // prettier-ignore\r\n [startTd, endTd] = [endTd, startTd]\r\n }\r\n const startColIndex = startTd.colIndex!\r\n const endColIndex = endTd.colIndex! + (endTd.colspan - 1)\r\n const startRowIndex = startTd.rowIndex!\r\n const endRowIndex = endTd.rowIndex! + (endTd.rowspan - 1)\r\n // 选区行列\r\n const rowCol: ITd[][] = []\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n const tdList: ITd[] = []\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const tdColIndex = td.colIndex!\r\n const tdRowIndex = td.rowIndex!\r\n if (\r\n tdColIndex >= startColIndex &&\r\n tdColIndex <= endColIndex &&\r\n tdRowIndex >= startRowIndex &&\r\n tdRowIndex <= endRowIndex\r\n ) {\r\n tdList.push(td)\r\n }\r\n }\r\n if (tdList.length) {\r\n rowCol.push(tdList)\r\n }\r\n }\r\n return rowCol.length ? rowCol : null\r\n }\r\n\r\n private _drawSlash(\r\n ctx: CanvasRenderingContext2D,\r\n td: ITd,\r\n startX: number,\r\n startY: number\r\n ) {\r\n const { scale } = this.options\r\n ctx.save()\r\n const width = td.width! * scale\r\n const height = td.height! * scale\r\n const x = Math.round(td.x! * scale + startX)\r\n const y = Math.round(td.y! * scale + startY)\r\n ctx.beginPath()\r\n // 正斜线 /\r\n if (td.slashTypes?.includes(TdSlash.FORWARD)) {\r\n ctx.moveTo(x + width, y)\r\n ctx.lineTo(x, y + height)\r\n }\r\n // 反斜线 \\\r\n if (td.slashTypes?.includes(TdSlash.BACK)) {\r\n ctx.moveTo(x, y)\r\n ctx.lineTo(x + width, y + height)\r\n }\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n\r\n private _drawBorder(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement,\r\n startX: number,\r\n startY: number\r\n ) {\r\n const {\r\n colgroup,\r\n trList,\r\n borderType,\r\n borderColor,\r\n borderWidth = 0.5,\r\n borderExternalWidth\r\n } = element\r\n if (!colgroup || !trList) return\r\n const {\r\n scale,\r\n table: { defaultBorderColor }\r\n } = this.options\r\n const colCount = colgroup.length\r\n const rowCount = trList.length\r\n const baseColor = borderColor || defaultBorderColor\r\n const baseWidth = borderWidth\r\n const outerWidth = borderExternalWidth || baseWidth\r\n const baseStyle = borderType === TableBorder.DASH ? 'dashed' : 'solid'\r\n const isEmpty = borderType === TableBorder.EMPTY\r\n const isExternal = borderType === TableBorder.EXTERNAL\r\n const isInternal = borderType === TableBorder.INTERNAL\r\n const drawOuter = !isEmpty && !isInternal\r\n const drawInner = !isEmpty && !isExternal\r\n\r\n const styleRank = (s: string) => {\r\n if (s === 'double') return 4\r\n if (s === 'solid') return 3\r\n if (s === 'dashed') return 2\r\n if (s === 'dotted') return 1\r\n return 0\r\n }\r\n\r\n const normalizeLine = (line: any) => {\r\n const w = Number(line?.width)\r\n const width = Number.isFinite(w) ? w : baseWidth\r\n const color = typeof line?.color === 'string' && line.color ? line.color : baseColor\r\n const style =\r\n line?.style === 'dashed' || line?.style === 'dotted' || line?.style === 'double'\r\n ? line.style\r\n : baseStyle\r\n return { width, color, style }\r\n }\r\n\r\n const pickLine = (a: any, b: any) => {\r\n if (!a) return b\r\n if (!b) return a\r\n if (a.width !== b.width) return a.width > b.width ? a : b\r\n if (a.style !== b.style) return styleRank(a.style) >= styleRank(b.style) ? a : b\r\n return a\r\n }\r\n\r\n type Seg = { x1: number; y1: number; x2: number; y2: number; width: number; color: string; style: string }\r\n const segMap = new Map<string, Seg>()\r\n\r\n const addSeg = (key: string, seg: Seg) => {\r\n const exist = segMap.get(key)\r\n if (!exist) {\r\n segMap.set(key, seg)\r\n return\r\n }\r\n const chosen = pickLine(exist, seg)\r\n segMap.set(key, chosen)\r\n }\r\n\r\n const addH = (x1: number, x2: number, y: number, line: any) => {\r\n const sx1 = Math.min(x1, x2)\r\n const sx2 = Math.max(x1, x2)\r\n const key = `H:${y}:${sx1}-${sx2}`\r\n const l = normalizeLine(line)\r\n addSeg(key, { x1: sx1, y1: y, x2: sx2, y2: y, ...l })\r\n }\r\n\r\n const addV = (x: number, y1: number, y2: number, line: any) => {\r\n const sy1 = Math.min(y1, y2)\r\n const sy2 = Math.max(y1, y2)\r\n const key = `V:${x}:${sy1}-${sy2}`\r\n const l = normalizeLine(line)\r\n addSeg(key, { x1: x, y1: sy1, x2: x, y2: sy2, ...l })\r\n }\r\n\r\n const getImplicitLine = (isOuterLine: boolean) => ({\r\n width: isOuterLine ? outerWidth : baseWidth,\r\n color: baseColor,\r\n style: baseStyle\r\n })\r\n\r\n const getTdLine = (td: any, side: TdBorder, implicit: any | null) => {\r\n const styleLine = td.borderStyle?.[side]\r\n if (styleLine) return styleLine\r\n if (td.borderTypes?.includes(side)) {\r\n return {\r\n width: baseWidth,\r\n color: baseColor,\r\n style: baseStyle\r\n }\r\n }\r\n return implicit\r\n }\r\n\r\n ctx.save()\r\n ctx.translate(0.5, 0.5)\r\n\r\n for (let t = 0; t < trList.length; t++) {\r\n const tr = trList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d] as any\r\n if (td.slashTypes?.length) {\r\n this._drawSlash(ctx, td, startX, startY)\r\n }\r\n\r\n const left = Math.round(td.x! * scale + startX)\r\n const top = Math.round(td.y! * scale + startY)\r\n const right = Math.round((td.x! + td.width!) * scale + startX)\r\n const bottom = Math.round((td.y! + td.height!) * scale + startY)\r\n\r\n const isLeftOuter = td.colIndex === 0\r\n const isRightOuter = td.colIndex! + td.colspan === colCount\r\n const isTopOuter = td.rowIndex === 0\r\n const isBottomOuter = td.rowIndex! + td.rowspan === rowCount\r\n\r\n const implicitTop = drawOuter && isTopOuter ? getImplicitLine(true) : null\r\n const implicitBottom = drawOuter && isBottomOuter ? getImplicitLine(true) : null\r\n const implicitLeft = drawOuter && isLeftOuter ? getImplicitLine(true) : null\r\n const implicitRight = drawOuter && isRightOuter ? getImplicitLine(true) : null\r\n\r\n const implicitInnerRight =\r\n drawInner && td.colIndex! + td.colspan < colCount\r\n ? getImplicitLine(false)\r\n : null\r\n const implicitInnerBottom =\r\n drawInner && td.rowIndex! + td.rowspan < rowCount\r\n ? getImplicitLine(false)\r\n : null\r\n\r\n const topLine = getTdLine(td, TdBorder.TOP, implicitTop)\r\n const bottomLine = getTdLine(td, TdBorder.BOTTOM, implicitBottom || implicitInnerBottom)\r\n const leftLine = getTdLine(td, TdBorder.LEFT, implicitLeft)\r\n const rightLine = getTdLine(td, TdBorder.RIGHT, implicitRight || implicitInnerRight)\r\n\r\n if (topLine && topLine.style !== 'none') addH(left, right, top, topLine)\r\n if (bottomLine && bottomLine.style !== 'none') addH(left, right, bottom, bottomLine)\r\n if (leftLine && leftLine.style !== 'none') addV(left, top, bottom, leftLine)\r\n if (rightLine && rightLine.style !== 'none') addV(right, top, bottom, rightLine)\r\n }\r\n }\r\n\r\n const groupKey = (s: Seg) => `${s.color}|${s.width}|${s.style}`\r\n const groups = new Map<string, Seg[]>()\r\n for (const seg of segMap.values()) {\r\n const k = groupKey(seg)\r\n const arr = groups.get(k)\r\n if (arr) arr.push(seg)\r\n else groups.set(k, [seg])\r\n }\r\n\r\n for (const [k, segs] of groups) {\r\n const [color, widthStr, style] = k.split('|')\r\n const lw = Number(widthStr)\r\n ctx.strokeStyle = color\r\n const scaledWidth = (Number.isFinite(lw) ? lw : baseWidth) * scale\r\n if (style === 'double') {\r\n const singleWidth = Math.max(0.5 * scale, Math.round((scaledWidth / 3) * 10) / 10)\r\n const gap = Math.max(0.5 * scale, Math.round(singleWidth * 1.2 * 10) / 10)\r\n const offset = (singleWidth + gap) / 2\r\n ctx.setLineDash([])\r\n ctx.lineWidth = singleWidth\r\n ctx.beginPath()\r\n for (const s of segs) {\r\n const isH = s.y1 === s.y2\r\n const isV = s.x1 === s.x2\r\n if (isH) {\r\n ctx.moveTo(s.x1, s.y1 - offset)\r\n ctx.lineTo(s.x2, s.y2 - offset)\r\n ctx.moveTo(s.x1, s.y1 + offset)\r\n ctx.lineTo(s.x2, s.y2 + offset)\r\n } else if (isV) {\r\n ctx.moveTo(s.x1 - offset, s.y1)\r\n ctx.lineTo(s.x2 - offset, s.y2)\r\n ctx.moveTo(s.x1 + offset, s.y1)\r\n ctx.lineTo(s.x2 + offset, s.y2)\r\n } else {\r\n ctx.moveTo(s.x1, s.y1)\r\n ctx.lineTo(s.x2, s.y2)\r\n }\r\n }\r\n ctx.stroke()\r\n } else {\r\n ctx.lineWidth = scaledWidth\r\n if (style === 'dashed') ctx.setLineDash([3 * scale, 3 * scale])\r\n else if (style === 'dotted') ctx.setLineDash([1 * scale, 2 * scale])\r\n else ctx.setLineDash([])\r\n ctx.beginPath()\r\n for (const s of segs) {\r\n ctx.moveTo(s.x1, s.y1)\r\n ctx.lineTo(s.x2, s.y2)\r\n }\r\n ctx.stroke()\r\n }\r\n }\r\n\r\n ctx.setLineDash([])\r\n ctx.translate(-0.5, -0.5)\r\n ctx.restore()\r\n }\r\n\r\n private _drawBackgroundColor(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement,\r\n startX: number,\r\n startY: number\r\n ) {\r\n const { trList } = element\r\n if (!trList) return\r\n const { scale } = this.options\r\n for (let t = 0; t < trList.length; t++) {\r\n const tr = trList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n if (!td.backgroundColor) continue\r\n ctx.save()\r\n const width = td.width! * scale\r\n const height = td.height! * scale\r\n const x = Math.round(td.x! * scale + startX)\r\n const y = Math.round(td.y! * scale + startY)\r\n ctx.fillStyle = td.backgroundColor\r\n ctx.fillRect(x, y, width, height)\r\n ctx.restore()\r\n }\r\n }\r\n }\r\n\r\n public getTableWidth(element: IElement): number {\r\n return element.colgroup!.reduce((pre, cur) => pre + cur.width, 0)\r\n }\r\n\r\n public getTableHeight(element: IElement): number {\r\n const trList = element.trList\r\n if (!trList?.length) return 0\r\n return this.getTdListByColIndex(trList, 0).reduce(\r\n (pre, cur) => pre + cur.height!,\r\n 0\r\n )\r\n }\r\n\r\n public getRowCountByColIndex(trList: ITr[], colIndex: number): number {\r\n return this.getTdListByColIndex(trList, colIndex).reduce(\r\n (pre, cur) => pre + cur.rowspan,\r\n 0\r\n )\r\n }\r\n\r\n public getTdListByColIndex(trList: ITr[], colIndex: number): ITd[] {\r\n const data: ITd[] = []\r\n for (let r = 0; r < trList.length; r++) {\r\n const tdList = trList[r].tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n const min = td.colIndex!\r\n const max = min + td.colspan - 1\r\n if (colIndex >= min && colIndex <= max) {\r\n data.push(td)\r\n }\r\n }\r\n }\r\n return data\r\n }\r\n\r\n public getTdListByRowIndex(trList: ITr[], rowIndex: number) {\r\n const data: ITd[] = []\r\n for (let r = 0; r < trList.length; r++) {\r\n const tdList = trList[r].tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n const min = td.rowIndex!\r\n const max = min + td.rowspan - 1\r\n if (rowIndex >= min && rowIndex <= max) {\r\n data.push(td)\r\n }\r\n }\r\n }\r\n return data\r\n }\r\n\r\n public computeRowColInfo(element: IElement) {\r\n const { colgroup, trList } = element\r\n if (!colgroup || !trList) return\r\n const colCount = colgroup.length\r\n const rowCount = trList.length\r\n if (!colCount || !rowCount) return\r\n\r\n const colOffsetList: number[] = new Array(colCount).fill(0)\r\n let colOffset = 0\r\n for (let c = 0; c < colCount; c++) {\r\n colOffsetList[c] = colOffset\r\n colOffset += colgroup[c].width\r\n }\r\n\r\n const rowOffsetList: number[] = new Array(rowCount).fill(0)\r\n let rowOffset = 0\r\n for (let r = 0; r < rowCount; r++) {\r\n rowOffsetList[r] = rowOffset\r\n rowOffset += trList[r].height\r\n }\r\n\r\n const occupiedRowSpan: number[] = new Array(colCount).fill(0)\r\n const canPlaceAt = (startColIndex: number, colspan: number) => {\r\n if (startColIndex < 0) return false\r\n if (startColIndex + colspan > colCount) return false\r\n for (let c = startColIndex; c < startColIndex + colspan; c++) {\r\n if (occupiedRowSpan[c] > 0) return false\r\n }\r\n return true\r\n }\r\n\r\n for (let t = 0; t < rowCount; t++) {\r\n for (let c = 0; c < colCount; c++) {\r\n if (occupiedRowSpan[c] > 0) occupiedRowSpan[c] -= 1\r\n }\r\n\r\n const tr = trList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const colspan = Math.max(1, td.colspan || 1)\r\n const rowspan = Math.max(1, td.rowspan || 1)\r\n\r\n let colIndex = 0\r\n let isFound = false\r\n const maxStart = Math.max(0, colCount - colspan)\r\n for (let startColIndex = 0; startColIndex <= maxStart; startColIndex++) {\r\n if (canPlaceAt(startColIndex, colspan)) {\r\n colIndex = startColIndex\r\n isFound = true\r\n break\r\n }\r\n }\r\n if (!isFound) {\r\n colIndex = Math.max(0, Math.min(colCount - 1, colCount - colspan))\r\n }\r\n\r\n for (let c = colIndex; c < colIndex + colspan && c < colCount; c++) {\r\n occupiedRowSpan[c] = Math.max(occupiedRowSpan[c], rowspan)\r\n }\r\n\r\n let width = 0\r\n for (let col = 0; col < colspan; col++) {\r\n const colItem = colgroup[colIndex + col]\r\n if (!colItem) break\r\n width += colItem.width\r\n }\r\n\r\n let height = 0\r\n for (let row = 0; row < rowspan; row++) {\r\n const curTr = trList[t + row]\r\n if (!curTr) break\r\n height += curTr.height\r\n }\r\n\r\n const isLastRowTd = tr.tdList.length - 1 === d\r\n const isLastColTd = t + rowspan === rowCount\r\n const isLastTd = isLastRowTd && isLastColTd && colIndex + colspan === colCount\r\n\r\n td.isLastRowTd = isLastRowTd\r\n td.isLastColTd = isLastColTd\r\n td.isLastTd = isLastTd\r\n\r\n td.x = colOffsetList[colIndex]\r\n td.y = rowOffsetList[t]\r\n td.width = width\r\n td.height = height\r\n td.rowIndex = t\r\n td.colIndex = colIndex\r\n td.trIndex = t\r\n td.tdIndex = d\r\n }\r\n }\r\n }\r\n\r\n public drawRange(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement,\r\n startX: number,\r\n startY: number\r\n ) {\r\n const { scale, rangeAlpha, rangeColor } = this.options\r\n const { type, trList } = element\r\n if (!trList || type !== ElementType.TABLE) return\r\n const {\r\n isCrossRowCol,\r\n startTdIndex,\r\n endTdIndex,\r\n startTrIndex,\r\n endTrIndex\r\n } = this.range.getRange()\r\n // 存在跨行/列\r\n if (!isCrossRowCol) return\r\n let startTd = trList[startTrIndex!].tdList[startTdIndex!]\r\n let endTd = trList[endTrIndex!].tdList[endTdIndex!]\r\n // 交换起始位置\r\n if (startTd.x! > endTd.x! || startTd.y! > endTd.y!) {\r\n // prettier-ignore\r\n [startTd, endTd] = [endTd, startTd]\r\n }\r\n const startColIndex = startTd.colIndex!\r\n const endColIndex = endTd.colIndex! + (endTd.colspan - 1)\r\n const startRowIndex = startTd.rowIndex!\r\n const endRowIndex = endTd.rowIndex! + (endTd.rowspan - 1)\r\n ctx.save()\r\n for (let t = 0; t < trList.length; t++) {\r\n const tr = trList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const tdColIndex = td.colIndex!\r\n const tdRowIndex = td.rowIndex!\r\n if (\r\n tdColIndex >= startColIndex &&\r\n tdColIndex <= endColIndex &&\r\n tdRowIndex >= startRowIndex &&\r\n tdRowIndex <= endRowIndex\r\n ) {\r\n const x = td.x! * scale\r\n const y = td.y! * scale\r\n const width = td.width! * scale\r\n const height = td.height! * scale\r\n ctx.globalAlpha = rangeAlpha\r\n ctx.fillStyle = rangeColor\r\n ctx.fillRect(x + startX, y + startY, width, height)\r\n }\r\n }\r\n }\r\n ctx.restore()\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IElement,\r\n startX: number,\r\n startY: number\r\n ) {\r\n this._drawBackgroundColor(ctx, element, startX, startY)\r\n this._drawBorder(ctx, element, startX, startY)\r\n }\r\n}\r\n","import { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { TableOrder } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Position } from '../../position/Position'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../../draw/Draw'\r\n\r\ninterface IAnchorMouseDown {\r\n evt: MouseEvent\r\n order: TableOrder\r\n index: number\r\n element: IElement\r\n}\r\n\r\nexport class TableTool {\r\n // 单元格最小宽度\r\n private readonly MIN_TD_WIDTH = 20\r\n // 行列工具相对表格偏移值\r\n private readonly ROW_COL_OFFSET = 18\r\n // 快速添加行列工具宽度\r\n private readonly ROW_COL_QUICK_WIDTH = 16\r\n // 快速添加行列工具偏移值\r\n private readonly ROW_COL_QUICK_OFFSET = 5\r\n // 快速添加行列工具相对表格位置\r\n private readonly ROW_COL_QUICK_POSITION =\r\n this.ROW_COL_OFFSET + (this.ROW_COL_OFFSET - this.ROW_COL_QUICK_WIDTH) / 2\r\n // 边框工具宽/高度\r\n private readonly BORDER_VALUE = 4\r\n // 快速选择工具偏移值\r\n private readonly TABLE_SELECT_OFFSET = 20\r\n\r\n private draw: Draw\r\n private canvas: HTMLCanvasElement\r\n private options: DeepRequired<IEditorOption>\r\n private position: Position\r\n private range: RangeManager\r\n private container: HTMLDivElement\r\n private toolRowContainer: HTMLDivElement | null\r\n private toolRowAddBtn: HTMLDivElement | null\r\n private toolColAddBtn: HTMLDivElement | null\r\n private toolTableSelectBtn: HTMLDivElement | null\r\n private toolColContainer: HTMLDivElement | null\r\n private toolBorderContainer: HTMLDivElement | null\r\n private anchorLine: HTMLDivElement | null\r\n private mousedownX: number\r\n private mousedownY: number\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.canvas = draw.getPage()\r\n this.options = draw.getOptions()\r\n this.position = draw.getPosition()\r\n this.range = draw.getRange()\r\n this.container = draw.getContainer()\r\n // x、y轴\r\n this.toolRowContainer = null\r\n this.toolRowAddBtn = null\r\n this.toolColAddBtn = null\r\n this.toolTableSelectBtn = null\r\n this.toolColContainer = null\r\n this.toolBorderContainer = null\r\n this.anchorLine = null\r\n this.mousedownX = 0\r\n this.mousedownY = 0\r\n }\r\n\r\n public dispose() {\r\n this.toolRowContainer?.remove()\r\n this.toolRowAddBtn?.remove()\r\n this.toolColAddBtn?.remove()\r\n this.toolTableSelectBtn?.remove()\r\n this.toolColContainer?.remove()\r\n this.toolBorderContainer?.remove()\r\n this.toolRowContainer = null\r\n this.toolRowAddBtn = null\r\n this.toolColAddBtn = null\r\n this.toolTableSelectBtn = null\r\n this.toolColContainer = null\r\n this.toolBorderContainer = null\r\n }\r\n\r\n public render() {\r\n const { isTable, index, trIndex, tdIndex } =\r\n this.position.getPositionContext()\r\n if (!isTable) return\r\n // 销毁之前工具\r\n this.dispose()\r\n const elementList = this.draw.getOriginalElementList()\r\n const positionList = this.position.getOriginalPositionList()\r\n const element = elementList[index!]\r\n // 表格工具配置禁用又非设计模式时不渲染\r\n if (element.tableToolDisabled && !this.draw.isDesignMode()) return\r\n // 渲染所需数据\r\n const { scale } = this.options\r\n const position = positionList[index!]\r\n const { colgroup, trList } = element\r\n const {\r\n coordinate: { leftTop }\r\n } = position\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const prePageHeight = this.draw.getPageNo() * (height + pageGap)\r\n const tableX = leftTop[0]\r\n const tableY = leftTop[1] + prePageHeight\r\n const td = element.trList![trIndex!].tdList[tdIndex!]\r\n const rowIndex = td.rowIndex\r\n const colIndex = td.colIndex\r\n const tableHeight = element.height! * scale\r\n const tableWidth = element.width! * scale\r\n // 表格选择工具\r\n const tableSelectBtn = document.createElement('div')\r\n tableSelectBtn.classList.add(`${EDITOR_PREFIX}-table-tool__select`)\r\n tableSelectBtn.style.height = `${tableHeight * scale}`\r\n tableSelectBtn.style.left = `${tableX}px`\r\n tableSelectBtn.style.top = `${tableY}px`\r\n tableSelectBtn.style.transform = `translate(-${\r\n this.TABLE_SELECT_OFFSET * scale\r\n }px, ${-this.TABLE_SELECT_OFFSET * scale}px)`\r\n // 快捷全选\r\n tableSelectBtn.onclick = () => {\r\n this.draw.getTableOperate().tableSelectAll()\r\n }\r\n this.container.append(tableSelectBtn)\r\n this.toolTableSelectBtn = tableSelectBtn\r\n // 渲染行工具\r\n const rowHeightList = trList!.map(tr => tr.height)\r\n const rowContainer = document.createElement('div')\r\n rowContainer.classList.add(`${EDITOR_PREFIX}-table-tool__row`)\r\n rowContainer.style.transform = `translateX(-${\r\n this.ROW_COL_OFFSET * scale\r\n }px)`\r\n for (let r = 0; r < rowHeightList.length; r++) {\r\n const rowHeight = rowHeightList[r] * scale\r\n const rowItem = document.createElement('div')\r\n rowItem.classList.add(`${EDITOR_PREFIX}-table-tool__row__item`)\r\n if (r === rowIndex) {\r\n rowItem.classList.add('active')\r\n }\r\n // 快捷行选择\r\n rowItem.onclick = () => {\r\n const tdList = this.draw\r\n .getTableParticle()\r\n .getTdListByRowIndex(trList!, r)\r\n const firstTd = tdList[0]\r\n const lastTd = tdList[tdList.length - 1]\r\n this.position.setPositionContext({\r\n index,\r\n isTable: true,\r\n trIndex: firstTd.trIndex,\r\n tdIndex: firstTd.tdIndex,\r\n tableId: element.id\r\n })\r\n this.range.setRange(\r\n 0,\r\n 0,\r\n element.id,\r\n firstTd.tdIndex,\r\n lastTd.tdIndex,\r\n firstTd.trIndex,\r\n lastTd.trIndex\r\n )\r\n this.draw.render({\r\n curIndex: 0,\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n this._setAnchorActive(rowContainer, r)\r\n }\r\n const rowItemAnchor = document.createElement('div')\r\n rowItemAnchor.classList.add(`${EDITOR_PREFIX}-table-tool__anchor`)\r\n // 行高度拖拽开始\r\n rowItemAnchor.onmousedown = evt => {\r\n this._mousedown({\r\n evt,\r\n element,\r\n index: r,\r\n order: TableOrder.ROW\r\n })\r\n }\r\n rowItem.append(rowItemAnchor)\r\n rowItem.style.height = `${rowHeight}px`\r\n rowContainer.append(rowItem)\r\n }\r\n rowContainer.style.left = `${tableX}px`\r\n rowContainer.style.top = `${tableY}px`\r\n this.container.append(rowContainer)\r\n this.toolRowContainer = rowContainer\r\n // 添加行按钮\r\n const rowAddBtn = document.createElement('div')\r\n rowAddBtn.classList.add(`${EDITOR_PREFIX}-table-tool__quick__add`)\r\n rowAddBtn.style.left = `${tableX + tableWidth / 2}px`\r\n rowAddBtn.style.top = `${tableY + tableHeight}px`\r\n rowAddBtn.style.transform = `translate(-50%, ${this.ROW_COL_QUICK_OFFSET * scale}px)`\r\n // 快捷添加行\r\n rowAddBtn.onclick = () => {\r\n this.position.setPositionContext({\r\n index,\r\n isTable: true,\r\n trIndex: trList!.length - 1,\r\n tdIndex: 0,\r\n tableId: element.id\r\n })\r\n this.draw.getTableOperate().insertTableBottomRow()\r\n }\r\n this.container.append(rowAddBtn)\r\n this.toolRowAddBtn = rowAddBtn\r\n // 渲染列工具\r\n const colWidthList = colgroup!.map(col => col.width)\r\n const colContainer = document.createElement('div')\r\n colContainer.classList.add(`${EDITOR_PREFIX}-table-tool__col`)\r\n colContainer.style.transform = `translateY(-${\r\n this.ROW_COL_OFFSET * scale\r\n }px)`\r\n for (let c = 0; c < colWidthList.length; c++) {\r\n const colWidth = colWidthList[c] * scale\r\n const colItem = document.createElement('div')\r\n colItem.classList.add(`${EDITOR_PREFIX}-table-tool__col__item`)\r\n if (c === colIndex) {\r\n colItem.classList.add('active')\r\n }\r\n // 快捷列选择\r\n colItem.onclick = () => {\r\n const tdList = this.draw\r\n .getTableParticle()\r\n .getTdListByColIndex(trList!, c)\r\n const firstTd = tdList[0]\r\n const lastTd = tdList[tdList.length - 1]\r\n this.position.setPositionContext({\r\n index,\r\n isTable: true,\r\n trIndex: firstTd.trIndex,\r\n tdIndex: firstTd.tdIndex,\r\n tableId: element.id\r\n })\r\n this.range.setRange(\r\n 0,\r\n 0,\r\n element.id,\r\n firstTd.tdIndex,\r\n lastTd.tdIndex,\r\n firstTd.trIndex,\r\n lastTd.trIndex\r\n )\r\n this.draw.render({\r\n curIndex: 0,\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n this._setAnchorActive(colContainer, c)\r\n }\r\n const colItemAnchor = document.createElement('div')\r\n colItemAnchor.classList.add(`${EDITOR_PREFIX}-table-tool__anchor`)\r\n // 列高度拖拽开始\r\n colItemAnchor.onmousedown = evt => {\r\n this._mousedown({\r\n evt,\r\n element,\r\n index: c,\r\n order: TableOrder.COL\r\n })\r\n }\r\n colItem.append(colItemAnchor)\r\n colItem.style.width = `${colWidth}px`\r\n colContainer.append(colItem)\r\n }\r\n colContainer.style.left = `${tableX}px`\r\n colContainer.style.top = `${tableY}px`\r\n this.container.append(colContainer)\r\n this.toolColContainer = colContainer\r\n // 添加列按钮\r\n const colAddBtn = document.createElement('div')\r\n colAddBtn.classList.add(`${EDITOR_PREFIX}-table-tool__quick__add`)\r\n colAddBtn.style.height = `${tableHeight * scale}`\r\n colAddBtn.style.left = `${tableX + tableWidth}px`\r\n colAddBtn.style.top = `${tableY}px`\r\n colAddBtn.style.transform = `translate(${\r\n this.ROW_COL_QUICK_OFFSET * scale\r\n }px, -${this.ROW_COL_QUICK_POSITION * scale}px)`\r\n // 快捷添加列\r\n colAddBtn.onclick = () => {\r\n this.position.setPositionContext({\r\n index,\r\n isTable: true,\r\n trIndex: 0,\r\n tdIndex: trList![0].tdList.length - 1 || 0,\r\n tableId: element.id\r\n })\r\n this.draw.getTableOperate().insertTableRightCol()\r\n }\r\n this.container.append(colAddBtn)\r\n this.toolColAddBtn = colAddBtn\r\n // 渲染单元格边框拖拽工具\r\n const borderContainer = document.createElement('div')\r\n borderContainer.classList.add(`${EDITOR_PREFIX}-table-tool__border`)\r\n borderContainer.style.height = `${tableHeight}px`\r\n borderContainer.style.width = `${tableWidth}px`\r\n borderContainer.style.left = `${tableX}px`\r\n borderContainer.style.top = `${tableY}px`\r\n for (let r = 0; r < trList!.length; r++) {\r\n const tr = trList![r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const rowBorder = document.createElement('div')\r\n rowBorder.classList.add(`${EDITOR_PREFIX}-table-tool__border__row`)\r\n rowBorder.style.width = `${td.width! * scale}px`\r\n rowBorder.style.height = `${this.BORDER_VALUE}px`\r\n rowBorder.style.top = `${\r\n (td.y! + td.height!) * scale - this.BORDER_VALUE / 2\r\n }px`\r\n rowBorder.style.left = `${td.x! * scale}px`\r\n // 行宽度拖拽开始\r\n rowBorder.onmousedown = evt => {\r\n this._mousedown({\r\n evt,\r\n element,\r\n index: td.rowIndex! + td.rowspan - 1,\r\n order: TableOrder.ROW\r\n })\r\n }\r\n borderContainer.appendChild(rowBorder)\r\n const colBorder = document.createElement('div')\r\n colBorder.classList.add(`${EDITOR_PREFIX}-table-tool__border__col`)\r\n colBorder.style.width = `${this.BORDER_VALUE}px`\r\n colBorder.style.height = `${td.height! * scale}px`\r\n colBorder.style.top = `${td.y! * scale}px`\r\n colBorder.style.left = `${\r\n (td.x! + td.width!) * scale - this.BORDER_VALUE / 2\r\n }px`\r\n // 列高度拖拽开始\r\n colBorder.onmousedown = evt => {\r\n this._mousedown({\r\n evt,\r\n element,\r\n index: td.colIndex! + td.colspan - 1,\r\n order: TableOrder.COL\r\n })\r\n }\r\n borderContainer.appendChild(colBorder)\r\n }\r\n }\r\n this.container.append(borderContainer)\r\n this.toolBorderContainer = borderContainer\r\n }\r\n\r\n private _setAnchorActive(container: HTMLDivElement, index: number) {\r\n const children = container.children\r\n for (let c = 0; c < children.length; c++) {\r\n const child = children[c]\r\n if (c === index) {\r\n child.classList.add('active')\r\n } else {\r\n child.classList.remove('active')\r\n }\r\n }\r\n }\r\n\r\n private _mousedown(payload: IAnchorMouseDown) {\r\n const { evt, index, order, element } = payload\r\n this.canvas = this.draw.getPage()\r\n const { scale } = this.options\r\n const width = this.draw.getWidth()\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const prePageHeight = this.draw.getPageNo() * (height + pageGap)\r\n this.mousedownX = evt.x\r\n this.mousedownY = evt.y\r\n const target = evt.target as HTMLDivElement\r\n const canvasRect = this.canvas.getBoundingClientRect()\r\n // 改变光标\r\n const cursor = window.getComputedStyle(target).cursor\r\n document.body.style.cursor = cursor\r\n this.canvas.style.cursor = cursor\r\n // 拖拽线\r\n let startX = 0\r\n let startY = 0\r\n const anchorLine = document.createElement('div')\r\n anchorLine.classList.add(`${EDITOR_PREFIX}-table-anchor__line`)\r\n if (order === TableOrder.ROW) {\r\n anchorLine.classList.add(`${EDITOR_PREFIX}-table-anchor__line__row`)\r\n anchorLine.style.width = `${width}px`\r\n startX = 0\r\n startY = prePageHeight + this.mousedownY - canvasRect.top\r\n } else {\r\n anchorLine.classList.add(`${EDITOR_PREFIX}-table-anchor__line__col`)\r\n anchorLine.style.height = `${height}px`\r\n startX = this.mousedownX - canvasRect.left\r\n startY = prePageHeight\r\n }\r\n anchorLine.style.left = `${startX}px`\r\n anchorLine.style.top = `${startY}px`\r\n this.container.append(anchorLine)\r\n this.anchorLine = anchorLine\r\n // 追加全局事件\r\n let dx = 0\r\n let dy = 0\r\n const mousemoveFn = (evt: MouseEvent) => {\r\n const movePosition = this._mousemove(evt, order, startX, startY)\r\n if (movePosition) {\r\n dx = movePosition.dx\r\n dy = movePosition.dy\r\n }\r\n }\r\n document.addEventListener('mousemove', mousemoveFn)\r\n document.addEventListener(\r\n 'mouseup',\r\n () => {\r\n let isChangeSize = false\r\n // 改变尺寸\r\n if (order === TableOrder.ROW) {\r\n const trList = element.trList!\r\n const tr = trList[index] || trList[index - 1]\r\n // 最大移动高度-向上移动超出最小高度限定,则减少移动量\r\n const { defaultTrMinHeight } = this.options.table\r\n if (dy < 0 && tr.height + dy < defaultTrMinHeight) {\r\n dy = defaultTrMinHeight - tr.height\r\n }\r\n if (dy) {\r\n tr.height += dy\r\n tr.minHeight = tr.height\r\n isChangeSize = true\r\n }\r\n } else {\r\n const { colgroup } = element\r\n if (colgroup && dx) {\r\n // 宽度分配\r\n const innerWidth = this.draw.getInnerWidth()\r\n const curColWidth = colgroup[index].width\r\n // 最小移动距离计算-如果向左移动:使单元格小于最小宽度,则减少移动量\r\n if (dx < 0 && curColWidth + dx < this.MIN_TD_WIDTH) {\r\n dx = this.MIN_TD_WIDTH - curColWidth\r\n }\r\n // 最大移动距离计算-如果向右移动:使后面一个单元格小于最小宽度,则减少移动量\r\n const nextColWidth = colgroup[index + 1]?.width\r\n if (\r\n dx > 0 &&\r\n nextColWidth &&\r\n nextColWidth - dx < this.MIN_TD_WIDTH\r\n ) {\r\n dx = nextColWidth - this.MIN_TD_WIDTH\r\n }\r\n const moveColWidth = curColWidth + dx\r\n // 开始移动,只有表格的最后一列线才会改变表格的宽度,其他场景不用计算表格超出\r\n if (index === colgroup.length - 1) {\r\n let moveTableWidth = 0\r\n for (let c = 0; c < colgroup.length; c++) {\r\n const group = colgroup[c]\r\n // 下一列减去偏移量\r\n if (c === index + 1) {\r\n moveTableWidth -= dx\r\n }\r\n // 当前列加上偏移量\r\n if (c === index) {\r\n moveTableWidth += moveColWidth\r\n }\r\n if (c !== index) {\r\n moveTableWidth += group.width\r\n }\r\n }\r\n if (moveTableWidth > innerWidth) {\r\n const tableWidth = element.width!\r\n dx = innerWidth - tableWidth\r\n }\r\n }\r\n if (dx) {\r\n // 当前列增加,后列减少\r\n if (colgroup.length - 1 !== index) {\r\n colgroup[index + 1].width -= dx / scale\r\n }\r\n colgroup[index].width += dx / scale\r\n isChangeSize = true\r\n }\r\n }\r\n }\r\n if (isChangeSize) {\r\n this.draw.render({ isSetCursor: false })\r\n }\r\n // 还原副作用\r\n anchorLine.remove()\r\n document.removeEventListener('mousemove', mousemoveFn)\r\n document.body.style.cursor = ''\r\n this.canvas.style.cursor = 'text'\r\n },\r\n {\r\n once: true\r\n }\r\n )\r\n evt.preventDefault()\r\n }\r\n\r\n private _mousemove(\r\n evt: MouseEvent,\r\n tableOrder: TableOrder,\r\n startX: number,\r\n startY: number\r\n ): { dx: number; dy: number } | null {\r\n if (!this.anchorLine) return null\r\n const dx = evt.x - this.mousedownX\r\n const dy = evt.y - this.mousedownY\r\n if (tableOrder === TableOrder.ROW) {\r\n this.anchorLine.style.top = `${startY + dy}px`\r\n } else {\r\n this.anchorLine.style.left = `${startX + dx}px`\r\n }\r\n evt.preventDefault()\r\n return { dx, dy }\r\n }\r\n}\r\n","import { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { TextParticle } from './TextParticle'\r\n\r\nexport class HyperlinkParticle {\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n private container: HTMLDivElement\r\n private hyperlinkPopupContainer: HTMLDivElement\r\n private hyperlinkDom: HTMLAnchorElement\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.container = draw.getContainer()\r\n const { hyperlinkPopupContainer, hyperlinkDom } =\r\n this._createHyperlinkPopupDom()\r\n this.hyperlinkDom = hyperlinkDom\r\n this.hyperlinkPopupContainer = hyperlinkPopupContainer\r\n }\r\n\r\n private _createHyperlinkPopupDom() {\r\n const hyperlinkPopupContainer = document.createElement('div')\r\n hyperlinkPopupContainer.classList.add(`${EDITOR_PREFIX}-hyperlink-popup`)\r\n const hyperlinkDom = document.createElement('a')\r\n hyperlinkDom.target = '_blank'\r\n hyperlinkDom.rel = 'noopener'\r\n hyperlinkPopupContainer.append(hyperlinkDom)\r\n this.container.append(hyperlinkPopupContainer)\r\n return { hyperlinkPopupContainer, hyperlinkDom }\r\n }\r\n\r\n private _isSafeUrl(url: string): boolean {\r\n try {\r\n const parsed = new URL(url, 'https://placeholder.local')\r\n return parsed.protocol === 'http:' || parsed.protocol === 'https:'\r\n } catch {\r\n return url.startsWith('#') || url.startsWith('/')\r\n }\r\n }\r\n\r\n public drawHyperlinkPopup(element: IElement, position: IElementPosition) {\r\n const {\r\n coordinate: {\r\n leftTop: [left, top]\r\n },\r\n lineHeight\r\n } = position\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const preY = this.draw.getPageNo() * (height + pageGap)\r\n // 位置\r\n this.hyperlinkPopupContainer.style.display = 'block'\r\n this.hyperlinkPopupContainer.style.left = `${left}px`\r\n this.hyperlinkPopupContainer.style.top = `${top + preY + lineHeight}px`\r\n // 标签\r\n const url = element.url || '#'\r\n if (this._isSafeUrl(url)) {\r\n this.hyperlinkDom.href = url\r\n } else {\r\n this.hyperlinkDom.removeAttribute('href')\r\n }\r\n this.hyperlinkDom.title = url\r\n this.hyperlinkDom.innerText = url\r\n }\r\n\r\n public clearHyperlinkPopup() {\r\n this.hyperlinkPopupContainer.style.display = 'none'\r\n }\r\n\r\n public openHyperlink(element: IElement) {\r\n const url = element.url\r\n if (!url || !this._isSafeUrl(url)) {\r\n console.warn(`[HyperlinkParticle] Blocked unsafe URL protocol: ${url}`)\r\n return\r\n }\r\n const newTab = window.open(url, '_blank', 'noopener')\r\n if (newTab) {\r\n newTab.opener = null\r\n }\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n ctx.save()\r\n ctx.font = element.style\r\n if (!element.color) {\r\n element.color = this.options.defaultHyperlinkColor\r\n }\r\n ctx.fillStyle = element.color\r\n if (element.underline === undefined) {\r\n element.underline = true\r\n }\r\n TextParticle.fillScaledText(\r\n ctx,\r\n element.value,\r\n x,\r\n y,\r\n element.characterScale\r\n )\r\n ctx.restore()\r\n }\r\n}\r\n","import { maxHeightRadioMapping } from '@vervedoc/docx-editor-schema'\r\nimport { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { IRow } from '@vervedoc/docx-editor-schema'\r\nimport { pickSurroundElementList } from '@vervedoc/docx-editor-schema'\r\nimport { Position } from '../position/Position'\r\nimport { Zone } from '../zone/Zone'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Header {\r\n private draw: Draw\r\n private position: Position\r\n private zone: Zone\r\n private options: DeepRequired<IEditorOption>\r\n\r\n private elementList: IElement[]\r\n private rowList: IRow[]\r\n private positionList: IElementPosition[]\r\n\r\n constructor(draw: Draw, data?: IElement[]) {\r\n this.draw = draw\r\n this.position = draw.getPosition()\r\n this.zone = draw.getZone()\r\n this.options = draw.getOptions()\r\n\r\n this.elementList = data || []\r\n this.rowList = []\r\n this.positionList = []\r\n }\r\n\r\n public getRowList(): IRow[] {\r\n return this.rowList\r\n }\r\n\r\n public setElementList(elementList: IElement[]) {\r\n this.elementList = elementList\r\n }\r\n\r\n public getElementList(): IElement[] {\r\n return this.elementList\r\n }\r\n\r\n public getPositionList(): IElementPosition[] {\r\n return this.positionList\r\n }\r\n\r\n public compute() {\r\n this.recovery()\r\n this._computeRowList()\r\n this._computePositionList()\r\n }\r\n\r\n public recovery() {\r\n this.rowList = []\r\n this.positionList = []\r\n }\r\n\r\n private _computeRowList() {\r\n const innerWidth = this.draw.getInnerWidth()\r\n const margins = this.draw.getMargins()\r\n const surroundElementList = pickSurroundElementList(this.elementList)\r\n this.rowList = this.draw.computeRowList({\r\n startX: margins[3],\r\n startY: this.getHeaderTop(),\r\n innerWidth,\r\n elementList: this.elementList,\r\n surroundElementList\r\n })\r\n }\r\n\r\n private _computePositionList() {\r\n const headerTop = this.getHeaderTop()\r\n const innerWidth = this.draw.getInnerWidth()\r\n const margins = this.draw.getMargins()\r\n const startX = margins[3]\r\n const startY = headerTop\r\n this.position.computePageRowPosition({\r\n positionList: this.positionList,\r\n rowList: this.rowList,\r\n pageNo: 0,\r\n startRowIndex: 0,\r\n startIndex: 0,\r\n startX,\r\n startY,\r\n innerWidth,\r\n zone: EditorZone.HEADER\r\n })\r\n }\r\n\r\n public getHeaderTop(): number {\r\n const {\r\n header: { top, disabled },\r\n scale\r\n } = this.options\r\n if (disabled) return 0\r\n return Math.floor(top * scale)\r\n }\r\n\r\n public getMaxHeight(): number {\r\n const {\r\n header: { maxHeightRadio }\r\n } = this.options\r\n const height = this.draw.getHeight()\r\n return Math.floor(height * maxHeightRadioMapping[maxHeightRadio])\r\n }\r\n\r\n public getHeight(): number {\r\n const maxHeight = this.getMaxHeight()\r\n const rowHeight = this.getRowHeight()\r\n return rowHeight > maxHeight ? maxHeight : rowHeight\r\n }\r\n\r\n public getRowHeight(): number {\r\n return this.rowList.reduce((pre, cur) => pre + cur.height, 0)\r\n }\r\n\r\n public getExtraHeight(): number {\r\n // 页眉上边距 + 实际高 - 页面上边距\r\n const margins = this.draw.getMargins()\r\n const headerHeight = this.getHeight()\r\n const headerTop = this.getHeaderTop()\r\n const extraHeight = headerTop + headerHeight - margins[0]\r\n return extraHeight <= 0 ? 0 : extraHeight\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n ctx.save()\r\n ctx.globalAlpha = this.zone.isHeaderActive()\r\n ? 1\r\n : this.options.header.inactiveAlpha\r\n const innerWidth = this.draw.getInnerWidth()\r\n const maxHeight = this.getMaxHeight()\r\n // 超出最大高度不渲染\r\n const rowList: IRow[] = []\r\n let curRowHeight = 0\r\n for (let r = 0; r < this.rowList.length; r++) {\r\n const row = this.rowList[r]\r\n if (curRowHeight + row.height > maxHeight) {\r\n break\r\n }\r\n rowList.push(row)\r\n curRowHeight += row.height\r\n }\r\n this.draw.drawRow(ctx, {\r\n elementList: this.elementList,\r\n positionList: this.positionList,\r\n rowList,\r\n pageNo,\r\n startIndex: 0,\r\n innerWidth,\r\n zone: EditorZone.HEADER,\r\n isDrawLineBreak: false\r\n })\r\n ctx.restore()\r\n }\r\n}\r\n","import { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { TextParticle } from './TextParticle'\r\n\r\nexport class SuperscriptParticle {\r\n // 向上偏移字高的一半\r\n public getOffsetY(element: IRowElement): number {\r\n return -element.metrics.height / 2\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n ctx.save()\r\n ctx.font = element.style\r\n if (element.color) {\r\n ctx.fillStyle = element.color\r\n }\r\n TextParticle.fillScaledText(\r\n ctx,\r\n element.value,\r\n x,\r\n y + this.getOffsetY(element),\r\n element.characterScale\r\n )\r\n ctx.restore()\r\n }\r\n}\r\n","import { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { TextParticle } from './TextParticle'\r\n\r\nexport class SubscriptParticle {\r\n // 向下偏移字高的一半\r\n public getOffsetY(element: IRowElement): number {\r\n return element.metrics.height / 2\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n ctx.save()\r\n ctx.font = element.style\r\n if (element.color) {\r\n ctx.fillStyle = element.color\r\n }\r\n TextParticle.fillScaledText(\r\n ctx,\r\n element.value,\r\n x,\r\n y + this.getOffsetY(element),\r\n element.characterScale\r\n )\r\n ctx.restore()\r\n }\r\n}\r\n","import { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { getSeparatorDashArray, getSeparatorLineWidth, getSeparatorRenderHeight, getSeparatorType } from '../utils/separator'\r\n\r\nexport class SeparatorParticle {\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.options = draw.getOptions()\r\n }\r\n\r\n private withAlpha(color: string, alpha: number) {\r\n const normalizedAlpha = Math.max(0, Math.min(1, alpha))\r\n if (color.startsWith('#')) {\r\n const hex = color.slice(1)\r\n const fullHex =\r\n hex.length === 3\r\n ? hex.split('').map(char => char + char).join('')\r\n : hex.length === 6\r\n ? hex\r\n : ''\r\n if (fullHex) {\r\n const r = Number.parseInt(fullHex.slice(0, 2), 16)\r\n const g = Number.parseInt(fullHex.slice(2, 4), 16)\r\n const b = Number.parseInt(fullHex.slice(4, 6), 16)\r\n return `rgba(${r}, ${g}, ${b}, ${normalizedAlpha})`\r\n }\r\n }\r\n const rgbMatch = color.match(/^rgba?\\(([^)]+)\\)$/i)\r\n if (rgbMatch) {\r\n const [r = '0', g = '0', b = '0'] = rgbMatch[1].split(',').map(item => item.trim())\r\n return `rgba(${r}, ${g}, ${b}, ${normalizedAlpha})`\r\n }\r\n return color\r\n }\r\n\r\n private scaleDashArray(dashArray: number[], scale: number, lineWidth: number) {\r\n if (!dashArray.some(item => item > 0)) return []\r\n return dashArray.map(item => {\r\n if (item <= 0) return 0\r\n return Math.max(item * Math.max(scale * Math.max(lineWidth, 1), 1), 1)\r\n })\r\n }\r\n\r\n private drawStraightLine(\r\n ctx: CanvasRenderingContext2D,\r\n startX: number,\r\n endX: number,\r\n y: number,\r\n lineWidth: number,\r\n color: string | CanvasGradient,\r\n dashArray: number[] = []\r\n ) {\r\n ctx.save()\r\n ctx.lineWidth = lineWidth\r\n ctx.strokeStyle = color\r\n ctx.lineCap = dashArray.length ? 'round' : 'butt'\r\n ctx.setLineDash(dashArray)\r\n ctx.beginPath()\r\n ctx.moveTo(startX, y)\r\n ctx.lineTo(endX, y)\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n\r\n private drawWavyLine(\r\n ctx: CanvasRenderingContext2D,\r\n startX: number,\r\n endX: number,\r\n centerY: number,\r\n lineWidth: number,\r\n color: string\r\n ) {\r\n const amplitude = Math.max(lineWidth, 2)\r\n const wavelength = Math.max(lineWidth * 6, 12)\r\n ctx.save()\r\n ctx.lineWidth = lineWidth\r\n ctx.strokeStyle = color\r\n ctx.lineCap = 'round'\r\n ctx.lineJoin = 'round'\r\n ctx.beginPath()\r\n ctx.moveTo(startX, centerY)\r\n let currentX = startX\r\n while (currentX < endX) {\r\n const midX = Math.min(currentX + wavelength / 2, endX)\r\n const nextX = Math.min(currentX + wavelength, endX)\r\n ctx.quadraticCurveTo(\r\n currentX + wavelength / 4,\r\n centerY - amplitude,\r\n midX,\r\n centerY\r\n )\r\n if (midX < endX) {\r\n ctx.quadraticCurveTo(\r\n currentX + (wavelength * 3) / 4,\r\n centerY + amplitude,\r\n nextX,\r\n centerY\r\n )\r\n }\r\n currentX = nextX\r\n }\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n ctx.save()\r\n const {\r\n scale,\r\n separator: { lineWidth, strokeStyle }\r\n } = this.options\r\n const startX = x\r\n const endX = x + (element.width || 0) * scale\r\n const type = getSeparatorType(element)\r\n const actualLineWidth = getSeparatorLineWidth(element, lineWidth) * scale\r\n const actualDashArray = this.scaleDashArray(getSeparatorDashArray(element, type), scale, actualLineWidth)\r\n const color = element.color || strokeStyle\r\n const renderHeight = getSeparatorRenderHeight(element, lineWidth) * scale\r\n const centerY = Math.round(y + renderHeight / 2)\r\n\r\n if (endX <= startX) {\r\n ctx.restore()\r\n return\r\n }\r\n\r\n if (type === 'double') {\r\n const gap = Math.max(actualLineWidth + scale, 2)\r\n this.drawStraightLine(ctx, startX, endX, centerY - gap / 2, actualLineWidth, color, actualDashArray)\r\n this.drawStraightLine(ctx, startX, endX, centerY + gap / 2, actualLineWidth, color, actualDashArray)\r\n } else if (type === 'triple') {\r\n const gap = Math.max(actualLineWidth + scale, 2)\r\n this.drawStraightLine(ctx, startX, endX, centerY - gap, actualLineWidth, color, actualDashArray)\r\n this.drawStraightLine(ctx, startX, endX, centerY, actualLineWidth, color, actualDashArray)\r\n this.drawStraightLine(ctx, startX, endX, centerY + gap, actualLineWidth, color, actualDashArray)\r\n } else if (type === 'wavy') {\r\n this.drawWavyLine(ctx, startX, endX, centerY, actualLineWidth, color)\r\n } else if (type === 'gradient') {\r\n const gradient = ctx.createLinearGradient(startX, centerY, endX, centerY)\r\n gradient.addColorStop(0, this.withAlpha(color, 0))\r\n gradient.addColorStop(0.2, this.withAlpha(color, 0.4))\r\n gradient.addColorStop(0.5, this.withAlpha(color, 1))\r\n gradient.addColorStop(0.8, this.withAlpha(color, 0.4))\r\n gradient.addColorStop(1, this.withAlpha(color, 0))\r\n this.drawStraightLine(ctx, startX, endX, centerY, actualLineWidth, gradient as unknown as string, actualDashArray)\r\n } else if (type === 'shadow') {\r\n this.drawStraightLine(ctx, startX + scale, endX + scale, centerY + scale, actualLineWidth, this.withAlpha('#000000', 0.18), actualDashArray)\r\n this.drawStraightLine(ctx, startX, endX, centerY, actualLineWidth, color, actualDashArray)\r\n } else if (type === 'emboss') {\r\n this.drawStraightLine(ctx, startX, endX, centerY - scale, Math.max(actualLineWidth / 2, 1), this.withAlpha('#ffffff', 0.85), actualDashArray)\r\n this.drawStraightLine(ctx, startX, endX, centerY, actualLineWidth, color, actualDashArray)\r\n this.drawStraightLine(ctx, startX, endX, centerY + scale, Math.max(actualLineWidth / 2, 1), this.withAlpha('#000000', 0.25), actualDashArray)\r\n } else {\r\n this.drawStraightLine(ctx, startX, endX, centerY, actualLineWidth, color, actualDashArray)\r\n }\r\n ctx.restore()\r\n }\r\n}\r\n","import { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { I18n } from '../plugin-stubs'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class PageBreakParticle {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n private i18n: I18n\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.i18n = draw.getI18n()\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n const {\r\n pageBreak: { font, fontSize, lineDash }\r\n } = this.draw.getOptions()\r\n \r\n const displayName = this.i18n.t('pageBreak.displayName')\r\n const { scale, defaultRowMargin } = this.options\r\n const size = fontSize * scale\r\n const elementWidth = element.width! * scale\r\n const offsetY =\r\n this.draw.getDefaultBasicRowMarginHeight() * defaultRowMargin\r\n ctx.save()\r\n ctx.font = `${size}px ${font}`\r\n const textMeasure = ctx.measureText(displayName)\r\n const halfX = (elementWidth - textMeasure.width) / 2\r\n // 线段\r\n ctx.setLineDash(lineDash)\r\n ctx.translate(0, 0.5 + offsetY)\r\n ctx.beginPath()\r\n ctx.moveTo(x, y)\r\n ctx.lineTo(x + halfX, y)\r\n ctx.moveTo(x + halfX + textMeasure.width, y)\r\n ctx.lineTo(x + elementWidth, y)\r\n ctx.stroke()\r\n // 文字\r\n ctx.fillText(\r\n displayName,\r\n x + halfX,\r\n y + textMeasure.actualBoundingBoxAscent - size / 2\r\n )\r\n ctx.restore()\r\n }\r\n}\r\n","import { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { FORMAT_PLACEHOLDER } from '@vervedoc/docx-editor-schema'\r\nimport { WatermarkType } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { PageNumber } from './PageNumber'\r\n\r\nexport class Watermark {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n private imageCache: Map<string, HTMLImageElement>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = <DeepRequired<IEditorOption>>draw.getOptions()\r\n this.imageCache = new Map()\r\n }\r\n\r\n public renderText(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n const {\r\n watermark: { data, opacity, font, size, color, repeat, gap, numberType },\r\n scale\r\n } = this.options\r\n const width = this.draw.getWidth()\r\n const height = this.draw.getHeight()\r\n // 开始绘制\r\n ctx.save()\r\n ctx.globalAlpha = opacity\r\n ctx.font = `${size * scale}px ${font}`\r\n // 格式化文本\r\n let text = data\r\n const pageNoReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_NO)\r\n if (pageNoReg.test(text)) {\r\n text = PageNumber.formatNumberPlaceholder(\r\n text,\r\n pageNo + 1,\r\n pageNoReg,\r\n numberType\r\n )\r\n }\r\n const pageCountReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_COUNT)\r\n if (pageCountReg.test(text)) {\r\n text = PageNumber.formatNumberPlaceholder(\r\n text,\r\n this.draw.getPageCount(),\r\n pageCountReg,\r\n numberType\r\n )\r\n }\r\n // 测量长度并绘制\r\n const measureText = ctx.measureText(text)\r\n if (repeat) {\r\n // 使用 OffscreenCanvas 进行水印渲染(性能更好)\r\n let temporaryCanvas: HTMLCanvasElement | OffscreenCanvas\r\n let temporaryCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D\r\n if (typeof OffscreenCanvas !== 'undefined') {\r\n temporaryCanvas = new OffscreenCanvas(1, 1)\r\n temporaryCtx = temporaryCanvas.getContext('2d') as OffscreenCanvasRenderingContext2D\r\n } else {\r\n temporaryCanvas = document.createElement('canvas')\r\n temporaryCtx = temporaryCanvas.getContext('2d')!\r\n }\r\n // 勾股定理计算旋转后的宽高对角线尺寸 a^2 + b^2 = c^2\r\n const textWidth = measureText.width\r\n const textHeight =\r\n measureText.actualBoundingBoxAscent +\r\n measureText.actualBoundingBoxDescent\r\n const diagonalLength = Math.sqrt(\r\n Math.pow(textWidth, 2) + Math.pow(textHeight, 2)\r\n )\r\n // 加上 gap 间距\r\n const patternWidth = diagonalLength + 2 * gap[0] * scale\r\n const patternHeight = diagonalLength + 2 * gap[1] * scale\r\n // 宽高设置\r\n temporaryCanvas.width = patternWidth\r\n temporaryCanvas.height = patternHeight\r\n // 旋转45度\r\n temporaryCtx.translate(patternWidth / 2, patternHeight / 2)\r\n temporaryCtx.rotate((-45 * Math.PI) / 180)\r\n temporaryCtx.translate(-patternWidth / 2, -patternHeight / 2)\r\n // 绘制文本\r\n temporaryCtx.font = `${size * scale}px ${font}`\r\n temporaryCtx.fillStyle = color\r\n temporaryCtx.fillText(\r\n text,\r\n (patternWidth - textWidth) / 2,\r\n (patternHeight - textHeight) / 2 + measureText.actualBoundingBoxAscent\r\n )\r\n // 创建平铺模式\r\n const pattern = ctx.createPattern(temporaryCanvas, 'repeat')\r\n if (pattern) {\r\n ctx.fillStyle = pattern\r\n ctx.fillRect(0, 0, width, height)\r\n }\r\n } else {\r\n const x = width / 2\r\n const y = height / 2\r\n ctx.fillStyle = color\r\n ctx.translate(x, y)\r\n ctx.rotate((-45 * Math.PI) / 180)\r\n ctx.fillText(\r\n text,\r\n -measureText.width / 2,\r\n measureText.actualBoundingBoxAscent - (size * scale) / 2\r\n )\r\n }\r\n ctx.restore()\r\n }\r\n\r\n public renderImage(ctx: CanvasRenderingContext2D) {\r\n const {\r\n watermark: { width, height, data, opacity, repeat, gap },\r\n scale\r\n } = this.options\r\n if (!this.imageCache.has(data)) {\r\n const img = new Image()\r\n img.setAttribute('crossOrigin', 'Anonymous')\r\n img.src = data\r\n img.onload = () => {\r\n this.imageCache.set(data, img)\r\n // 避免层级上浮,触发编辑器二次渲染\r\n this.draw.render({\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n }\r\n return\r\n }\r\n const docWidth = this.draw.getWidth()\r\n const docHeight = this.draw.getHeight()\r\n const imageWidth = width * scale\r\n const imageHeight = height * scale\r\n // 开始绘制\r\n ctx.save()\r\n ctx.globalAlpha = opacity\r\n if (repeat) {\r\n // 使用 OffscreenCanvas 进行水印渲染(性能更好)\r\n let temporaryCanvas: HTMLCanvasElement | OffscreenCanvas\r\n let temporaryCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D\r\n if (typeof OffscreenCanvas !== 'undefined') {\r\n temporaryCanvas = new OffscreenCanvas(1, 1)\r\n temporaryCtx = temporaryCanvas.getContext('2d') as OffscreenCanvasRenderingContext2D\r\n } else {\r\n temporaryCanvas = document.createElement('canvas')\r\n temporaryCtx = temporaryCanvas.getContext('2d')!\r\n }\r\n // 勾股定理计算旋转后的宽高对角线尺寸 a^2 + b^2 = c^2\r\n const diagonalLength = Math.sqrt(\r\n Math.pow(imageWidth, 2) + Math.pow(imageHeight, 2)\r\n )\r\n // 加上 gap 间距\r\n const patternWidth = diagonalLength + 2 * gap[0] * scale\r\n const patternHeight = diagonalLength + 2 * gap[1] * scale\r\n // 宽高设置\r\n temporaryCanvas.width = patternWidth\r\n temporaryCanvas.height = patternHeight\r\n // 旋转45度\r\n temporaryCtx.translate(patternWidth / 2, patternHeight / 2)\r\n temporaryCtx.rotate((-45 * Math.PI) / 180)\r\n temporaryCtx.translate(-patternWidth / 2, -patternHeight / 2)\r\n // 绘制图片\r\n temporaryCtx.drawImage(\r\n this.imageCache.get(data)!,\r\n (patternWidth - imageWidth) / 2,\r\n (patternHeight - imageHeight) / 2,\r\n imageWidth,\r\n imageHeight\r\n )\r\n // 创建平铺模式\r\n const pattern = ctx.createPattern(temporaryCanvas, 'repeat')\r\n if (pattern) {\r\n ctx.fillStyle = pattern\r\n ctx.fillRect(0, 0, docWidth, docHeight)\r\n }\r\n } else {\r\n const x = docWidth / 2\r\n const y = docHeight / 2\r\n ctx.translate(x, y)\r\n ctx.rotate((-45 * Math.PI) / 180)\r\n ctx.drawImage(\r\n this.imageCache.get(data)!,\r\n -imageWidth / 2,\r\n -imageHeight / 2,\r\n imageWidth,\r\n imageHeight\r\n )\r\n }\r\n ctx.restore()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n if (this.options.watermark.type === WatermarkType.IMAGE) {\r\n this.renderImage(ctx)\r\n } else {\r\n this.renderText(ctx, pageNo)\r\n }\r\n }\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControlHighlight,\r\n IControlHighlightRule\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n ISearchResult,\r\n ISearchResultRestArgs\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { Control } from './Control'\r\n\r\ntype IHighlightMatchResult = (ISearchResult & IControlHighlightRule)[]\r\n\r\nexport class ControlSearch {\r\n private draw: Draw\r\n private control: Control\r\n private options: DeepRequired<IEditorOption>\r\n private highlightList: IControlHighlight[]\r\n private highlightMatchResult: IHighlightMatchResult\r\n\r\n constructor(control: Control) {\r\n this.draw = control.getDraw()\r\n this.control = control\r\n this.options = this.draw.getOptions()\r\n\r\n this.highlightList = []\r\n this.highlightMatchResult = []\r\n }\r\n\r\n // 获取控件设置高亮信息\r\n public getControlHighlight(elementList: IElement[], index: number) {\r\n const {\r\n control: {\r\n activeBackgroundColor,\r\n disabledBackgroundColor,\r\n existValueBackgroundColor,\r\n noValueBackgroundColor\r\n }\r\n } = this.options\r\n const element = elementList[index]\r\n const isPrintMode = this.draw.isPrintMode()\r\n const activeControlElement = this.control.getActiveControl()?.getElement()\r\n // 颜色配置:元素 > 控件激活 > 控件禁用 > 控件存在值 > 控件不存在值\r\n let isActiveControlHighlight = false\r\n let isDisabledControlHighlight = false\r\n let isExitsValueControlHighlight = false\r\n let isNoValueControlHighlight = false\r\n if (!element.highlight) {\r\n // 控件激活时高亮色\r\n isActiveControlHighlight =\r\n !isPrintMode &&\r\n !!activeBackgroundColor &&\r\n !!activeControlElement &&\r\n element.controlId === activeControlElement.controlId &&\r\n !this.control.getIsRangeInPostfix()\r\n }\r\n if (!isActiveControlHighlight) {\r\n // 控件禁用时高亮色\r\n isDisabledControlHighlight =\r\n !isPrintMode && !!disabledBackgroundColor && !!element.control?.disabled\r\n }\r\n if (!isDisabledControlHighlight) {\r\n // 控件存在值时高亮色\r\n isExitsValueControlHighlight =\r\n !isPrintMode &&\r\n !!existValueBackgroundColor &&\r\n !!element.controlId &&\r\n this.control.getIsExistValueByElementListIndex(elementList, index)\r\n }\r\n if (!isExitsValueControlHighlight) {\r\n // 控件不存在值时高亮色\r\n isNoValueControlHighlight =\r\n !isPrintMode &&\r\n !!noValueBackgroundColor &&\r\n !!element.controlId &&\r\n !this.control.getIsExistValueByElementListIndex(elementList, index)\r\n }\r\n return (\r\n (isActiveControlHighlight ? activeBackgroundColor : '') ||\r\n (isDisabledControlHighlight ? disabledBackgroundColor : '') ||\r\n (isExitsValueControlHighlight ? existValueBackgroundColor : '') ||\r\n (isNoValueControlHighlight ? noValueBackgroundColor : '')\r\n )\r\n }\r\n\r\n public getHighlightMatchResult(): IHighlightMatchResult {\r\n return this.highlightMatchResult\r\n }\r\n\r\n public getHighlightList(): IControlHighlight[] {\r\n return this.highlightList\r\n }\r\n\r\n public setHighlightList(payload: IControlHighlight[]) {\r\n this.highlightList = payload\r\n }\r\n\r\n public computeHighlightList() {\r\n const search = this.draw.getSearch()\r\n const computeHighlight = (\r\n elementList: IElement[],\r\n restArgs?: ISearchResultRestArgs\r\n ) => {\r\n let i = 0\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n i++\r\n // 表格下钻处理\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const restArgs: ISearchResultRestArgs = {\r\n tableId: element.id,\r\n tableIndex: i - 1,\r\n trIndex: r,\r\n tdIndex: d,\r\n tdId: td.id\r\n }\r\n computeHighlight(td.value, restArgs)\r\n }\r\n }\r\n }\r\n const currentControl = element?.control\r\n if (!currentControl) continue\r\n const highlightIndex = this.highlightList.findIndex(\r\n highlight =>\r\n highlight.id === element.controlId ||\r\n (currentControl.conceptId &&\r\n currentControl.conceptId === highlight.conceptId)\r\n )\r\n if (!~highlightIndex) continue\r\n // 搜索后控件结束索引\r\n const startIndex = i\r\n let newEndIndex = i\r\n while (newEndIndex < elementList.length) {\r\n const nextElement = elementList[newEndIndex]\r\n if (nextElement.controlId !== element.controlId) break\r\n newEndIndex++\r\n }\r\n i = newEndIndex\r\n // 高亮信息\r\n const controlElementList = elementList\r\n .slice(startIndex, newEndIndex)\r\n .map(element =>\r\n element.controlComponent === ControlComponent.VALUE\r\n ? element\r\n : { value: ZERO }\r\n )\r\n const highlight = this.highlightList[highlightIndex]\r\n const { ruleList } = highlight\r\n for (let r = 0; r < ruleList.length; r++) {\r\n const rule = ruleList[r]\r\n const searchResult = search.getMatchList(\r\n rule.keyword,\r\n controlElementList\r\n )\r\n this.highlightMatchResult.push(\r\n ...searchResult.map(result => ({\r\n ...result,\r\n ...rule,\r\n ...restArgs,\r\n index: result.index + startIndex // 实际索引\r\n }))\r\n )\r\n }\r\n }\r\n }\r\n this.highlightMatchResult = []\r\n computeHighlight(this.draw.getOriginalMainElementList())\r\n }\r\n\r\n public renderHighlightList(ctx: CanvasRenderingContext2D, pageIndex: number) {\r\n if (!this.highlightMatchResult?.length) return\r\n const { searchMatchAlpha, searchMatchColor } = this.options\r\n const positionList = this.draw.getPosition().getOriginalPositionList()\r\n const elementList = this.draw.getOriginalElementList()\r\n ctx.save()\r\n for (let s = 0; s < this.highlightMatchResult.length; s++) {\r\n const searchMatch = this.highlightMatchResult[s]\r\n let position: IElementPosition | null = null\r\n if (searchMatch.tableId) {\r\n const { tableIndex, trIndex, tdIndex, index } = searchMatch\r\n position =\r\n elementList[tableIndex!]?.trList![trIndex!].tdList[tdIndex!]\r\n ?.positionList![index]\r\n } else {\r\n position = positionList[searchMatch.index]\r\n }\r\n if (!position) continue\r\n const {\r\n coordinate: { leftTop, leftBottom, rightTop },\r\n pageNo\r\n } = position\r\n if (pageNo !== pageIndex) continue\r\n ctx.fillStyle = searchMatch.backgroundColor || searchMatchColor\r\n ctx.globalAlpha = searchMatch.alpha || searchMatchAlpha\r\n const x = leftTop[0]\r\n const y = leftTop[1]\r\n const width = rightTop[0] - leftTop[0]\r\n const height = leftBottom[1] - leftTop[1]\r\n ctx.fillRect(x, y, width, height)\r\n }\r\n ctx.restore()\r\n }\r\n}\r\n","import { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElementFillRect } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class ControlBorder {\r\n protected borderRect: IElementFillRect\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.borderRect = this.clearBorderInfo()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public clearBorderInfo() {\r\n this.borderRect = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0\r\n }\r\n return this.borderRect\r\n }\r\n\r\n public recordBorderInfo(x: number, y: number, width: number, height: number) {\r\n const isFirstRecord = !this.borderRect.width\r\n if (isFirstRecord) {\r\n this.borderRect.x = x\r\n this.borderRect.y = y\r\n this.borderRect.height = height\r\n }\r\n this.borderRect.width += width\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D) {\r\n if (!this.borderRect.width) return\r\n const {\r\n scale,\r\n control: { borderWidth, borderColor }\r\n } = this.options\r\n const { x, y, width, height } = this.borderRect\r\n ctx.save()\r\n ctx.translate(0, 1 * scale)\r\n ctx.lineWidth = borderWidth * scale\r\n ctx.strokeStyle = borderColor\r\n ctx.beginPath()\r\n ctx.rect(x, y, width, height)\r\n ctx.stroke()\r\n ctx.restore()\r\n this.clearBorderInfo()\r\n }\r\n}\r\n","import {\r\n EDITOR_COMPONENT,\r\n EDITOR_PREFIX\r\n} from '@vervedoc/docx-editor-schema'\r\nimport {\r\n CONTROL_STYLE_ATTR,\r\n EDITOR_ELEMENT_STYLE_ATTR,\r\n TEXTLIKE_ELEMENT_TYPE\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { EditorComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControlContext,\r\n IControlInstance,\r\n IControlRuleOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n isArrayEqual,\r\n isNonValue,\r\n omitObject,\r\n pickObject,\r\n splitText\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext } from '@vervedoc/docx-editor-schema'\r\nimport { Control } from './Control'\r\n\r\nexport class SelectControl implements IControlInstance {\r\n private element: IElement\r\n private control: Control\r\n private isPopup: boolean\r\n private selectDom: HTMLDivElement | null\r\n private options: DeepRequired<IEditorOption>\r\n private VALUE_DELIMITER = ','\r\n private DEFAULT_MULTI_SELECT_DELIMITER = ','\r\n\r\n constructor(element: IElement, control: Control) {\r\n const draw = control.getDraw()\r\n this.options = draw.getOptions()\r\n this.element = element\r\n this.control = control\r\n this.isPopup = false\r\n this.selectDom = null\r\n }\r\n\r\n public setElement(element: IElement) {\r\n this.element = element\r\n }\r\n\r\n public getElement(): IElement {\r\n return this.element\r\n }\r\n\r\n public getIsPopup(): boolean {\r\n return this.isPopup\r\n }\r\n\r\n public getCodes(): string[] {\r\n return this.element?.control?.code\r\n ? this.element.control.code.split(',')\r\n : []\r\n }\r\n\r\n public getText(codes: string[]): string | null {\r\n if (!this.element?.control) return null\r\n const control = this.element.control\r\n if (!control.valueSets?.length) return null\r\n const multiSelectDelimiter =\r\n control?.multiSelectDelimiter || this.DEFAULT_MULTI_SELECT_DELIMITER\r\n const valueSets = control.valueSets\r\n const valueList: string[] = []\r\n codes.forEach(code => {\r\n const valueSet = valueSets.find(v => v.code === code)\r\n if (valueSet && !isNonValue(valueSet.value)) {\r\n valueList.push(valueSet.value)\r\n }\r\n })\r\n return valueList.join(multiSelectDelimiter) || null\r\n }\r\n\r\n public getValue(context: IControlContext = {}): IElement[] {\r\n const elementList = context.elementList || this.control.getElementList()\r\n const { startIndex } = context.range || this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n const data: IElement[] = []\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n if (preElement.controlComponent === ControlComponent.VALUE) {\r\n data.unshift(preElement)\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n break\r\n }\r\n if (nextElement.controlComponent === ControlComponent.VALUE) {\r\n data.push(nextElement)\r\n }\r\n nextIndex++\r\n }\r\n return data\r\n }\r\n\r\n public setValue(\r\n data: IElement[],\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ): number {\r\n // 校验是否可以设置\r\n if (\r\n !this.element.control?.selectExclusiveOptions?.inputAble ||\r\n (!options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context))\r\n ) {\r\n return -1\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = context.range || this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary(context)\r\n const { startIndex, endIndex } = range\r\n const draw = this.control.getDraw()\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex)\r\n } else {\r\n // 移除空白占位符\r\n this.control.removePlaceholder(startIndex, context)\r\n }\r\n // 非文本类元素或前缀过渡掉样式属性\r\n const startElement = elementList[startIndex]\r\n const anchorElement =\r\n (startElement.type &&\r\n !TEXTLIKE_ELEMENT_TYPE.includes(startElement.type)) ||\r\n startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT\r\n ? pickObject(startElement, [\r\n 'control',\r\n 'controlId',\r\n ...CONTROL_STYLE_ATTR\r\n ])\r\n : omitObject(startElement, ['type'])\r\n // 插入起始位置\r\n const start = range.startIndex + 1\r\n for (let i = 0; i < data.length; i++) {\r\n const newElement: IElement = {\r\n ...anchorElement,\r\n ...data[i],\r\n controlComponent: ControlComponent.VALUE\r\n }\r\n formatElementContext(elementList, [newElement], startIndex, {\r\n editorOptions: this.options\r\n })\r\n draw.spliceElementList(elementList, start + i, 0, [newElement])\r\n }\r\n return start + data.length - 1\r\n }\r\n\r\n public keydown(evt: KeyboardEvent): number | null {\r\n if (this.control.getIsDisabledControl()) {\r\n return null\r\n }\r\n const elementList = this.control.getElementList()\r\n const range = this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = range\r\n const startElement = elementList[startIndex]\r\n const endElement = elementList[endIndex]\r\n // backspace\r\n if (evt.key === KeyMap.Backspace) {\r\n // 清空选项\r\n if (startIndex !== endIndex) {\r\n return this.clearSelect()\r\n } else {\r\n if (\r\n startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT ||\r\n endElement.controlComponent === ControlComponent.POSTFIX ||\r\n endElement.controlComponent === ControlComponent.POST_TEXT ||\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n // 前缀、后缀、占位符\r\n return this.control.removeControl(startIndex)\r\n } else {\r\n // 清空选项\r\n return this.clearSelect()\r\n }\r\n }\r\n } else if (evt.key === KeyMap.Delete) {\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n // 清空选项\r\n return this.clearSelect()\r\n } else {\r\n const endNextElement = elementList[endIndex + 1]\r\n if (\r\n ((startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT) &&\r\n endNextElement.controlComponent === ControlComponent.PLACEHOLDER) ||\r\n endNextElement.controlComponent === ControlComponent.POSTFIX ||\r\n endNextElement.controlComponent === ControlComponent.POST_TEXT ||\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n // 前缀、后缀、占位符\r\n return this.control.removeControl(startIndex)\r\n } else {\r\n // 清空选项\r\n return this.clearSelect()\r\n }\r\n }\r\n }\r\n return endIndex\r\n }\r\n\r\n public cut(): number {\r\n if (this.control.getIsDisabledControl()) {\r\n return -1\r\n }\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = this.control.getRange()\r\n if (startIndex === endIndex) {\r\n return startIndex\r\n }\r\n // 清空选项\r\n return this.clearSelect()\r\n }\r\n\r\n public clearSelect(\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ): number {\r\n const { isIgnoreDisabledRule = false, isAddPlaceholder = true } = options\r\n // 校验是否可以设置\r\n if (!isIgnoreDisabledRule && this.control.getIsDisabledControl(context)) {\r\n return -1\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const { startIndex } = context.range || this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n let leftIndex = -1\r\n let rightIndex = -1\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n leftIndex = preIndex\r\n break\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n rightIndex = nextIndex - 1\r\n break\r\n }\r\n nextIndex++\r\n }\r\n if (!~leftIndex || !~rightIndex) return -1\r\n // 删除元素\r\n const draw = this.control.getDraw()\r\n draw.spliceElementList(\r\n elementList,\r\n leftIndex + 1,\r\n rightIndex - leftIndex,\r\n [],\r\n {\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n }\r\n )\r\n // 增加占位符\r\n if (isAddPlaceholder) {\r\n this.control.addPlaceholder(preIndex, context)\r\n }\r\n this.control.setControlProperties(\r\n {\r\n code: null\r\n },\r\n {\r\n elementList,\r\n range: { startIndex: preIndex, endIndex: preIndex }\r\n }\r\n )\r\n return preIndex\r\n }\r\n\r\n public setSelect(\r\n code: string,\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ) {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = context.range || this.control.getRange()\r\n const control = this.element.control!\r\n const newCodes = code?.split(this.VALUE_DELIMITER) || []\r\n // 缓存旧值\r\n const oldCode = control.code\r\n const oldCodes = control.code?.split(this.VALUE_DELIMITER) || []\r\n // 选项相同时无需重复渲染\r\n const isMultiSelect = control.isMultiSelect\r\n if (\r\n (!isMultiSelect && code === oldCode) ||\r\n (isMultiSelect && isArrayEqual(oldCodes, newCodes))\r\n ) {\r\n this.control.repaintControl({\r\n curIndex: range.startIndex,\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n this.destroy()\r\n return\r\n }\r\n const valueSets = control.valueSets\r\n if (!Array.isArray(valueSets) || !valueSets.length) return\r\n // 转换文本\r\n const text = this.getText(newCodes)\r\n if (!text) {\r\n // 之前存在内容时清空文本\r\n if (oldCode) {\r\n const prefixIndex = this.clearSelect(context, {\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n })\r\n if (~prefixIndex) {\r\n this.control.repaintControl({\r\n curIndex: prefixIndex\r\n })\r\n this.control.emitControlContentChange({\r\n controlValue: []\r\n })\r\n }\r\n }\r\n return\r\n }\r\n // 样式赋值元素-默认值的第一个字符样式,否则取默认样式\r\n const valueElement = this.getValue(context)[0]\r\n const styleElement = valueElement\r\n ? pickObject(valueElement, EDITOR_ELEMENT_STYLE_ATTR)\r\n : pickObject(elementList[range.startIndex], CONTROL_STYLE_ATTR)\r\n // 清空选项\r\n const prefixIndex = this.clearSelect(context, {\r\n isAddPlaceholder: false,\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n })\r\n if (!~prefixIndex) return\r\n // 当前无值时清空占位符\r\n if (!oldCode) {\r\n this.control.removePlaceholder(prefixIndex, context)\r\n }\r\n // 属性赋值元素-默认为前缀属性\r\n const propertyElement = omitObject(\r\n elementList[prefixIndex],\r\n EDITOR_ELEMENT_STYLE_ATTR\r\n )\r\n const start = prefixIndex + 1\r\n const data = splitText(text)\r\n const draw = this.control.getDraw()\r\n for (let i = 0; i < data.length; i++) {\r\n const newElement: IElement = {\r\n ...styleElement,\r\n ...propertyElement,\r\n type: ElementType.TEXT,\r\n value: data[i],\r\n controlComponent: ControlComponent.VALUE\r\n }\r\n formatElementContext(elementList, [newElement], prefixIndex, {\r\n editorOptions: this.options\r\n })\r\n draw.spliceElementList(elementList, start + i, 0, [newElement])\r\n }\r\n // 设置状态\r\n this.control.setControlProperties(\r\n {\r\n code\r\n },\r\n {\r\n elementList,\r\n range: { startIndex: prefixIndex, endIndex: prefixIndex }\r\n }\r\n )\r\n // 重新渲染控件\r\n if (!context.range) {\r\n const newIndex = start + data.length - 1\r\n this.control.repaintControl({\r\n curIndex: newIndex\r\n })\r\n this.control.emitControlContentChange({\r\n context\r\n })\r\n if (!isMultiSelect) {\r\n this.destroy()\r\n }\r\n }\r\n }\r\n\r\n private _createSelectPopupDom() {\r\n const control = this.element.control!\r\n const valueSets = control.valueSets\r\n if (!Array.isArray(valueSets) || !valueSets.length) return\r\n const position = this.control.getPosition()\r\n if (!position) return\r\n // dom树:<div><ul><li>item</li></ul></div>\r\n const selectPopupContainer = document.createElement('div')\r\n selectPopupContainer.classList.add(`${EDITOR_PREFIX}-select-control-popup`)\r\n selectPopupContainer.setAttribute(EDITOR_COMPONENT, EditorComponent.POPUP)\r\n const ul = document.createElement('ul')\r\n for (let v = 0; v < valueSets.length; v++) {\r\n const valueSet = valueSets[v]\r\n const li = document.createElement('li')\r\n let codes = this.getCodes()\r\n if (codes.includes(valueSet.code)) {\r\n li.classList.add('active')\r\n }\r\n li.onclick = () => {\r\n const codeIndex = codes.findIndex(code => code === valueSet.code)\r\n if (control.isMultiSelect) {\r\n if (~codeIndex) {\r\n codes.splice(codeIndex, 1)\r\n } else {\r\n codes.push(valueSet.code)\r\n }\r\n } else {\r\n if (~codeIndex) {\r\n codes = []\r\n } else {\r\n codes = [valueSet.code]\r\n }\r\n }\r\n this.setSelect(codes.join(this.VALUE_DELIMITER))\r\n }\r\n li.append(document.createTextNode(valueSet.value))\r\n ul.append(li)\r\n }\r\n selectPopupContainer.append(ul)\r\n // 定位\r\n const {\r\n coordinate: {\r\n leftTop: [left, top]\r\n },\r\n lineHeight\r\n } = position\r\n const preY = this.control.getPreY()\r\n selectPopupContainer.style.left = `${left}px`\r\n selectPopupContainer.style.top = `${top + preY + lineHeight}px`\r\n // 追加至container\r\n const container = this.control.getContainer()\r\n container.append(selectPopupContainer)\r\n this.selectDom = selectPopupContainer\r\n }\r\n\r\n public awake() {\r\n if (\r\n this.isPopup ||\r\n this.control.getIsDisabledControl() ||\r\n !this.control.getIsRangeWithinControl()\r\n ) {\r\n return\r\n }\r\n const { startIndex } = this.control.getRange()\r\n const elementList = this.control.getElementList()\r\n if (elementList[startIndex + 1]?.controlId !== this.element.controlId) {\r\n return\r\n }\r\n this._createSelectPopupDom()\r\n this.isPopup = true\r\n }\r\n\r\n public destroy() {\r\n if (!this.isPopup) return\r\n this.selectDom?.remove()\r\n this.isPopup = false\r\n }\r\n}\r\n","import {\r\n CONTROL_STYLE_ATTR,\r\n TEXTLIKE_ELEMENT_TYPE\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControlContext,\r\n IControlInstance,\r\n IControlRuleOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { omitObject, pickObject } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext } from '@vervedoc/docx-editor-schema'\r\nimport { Control } from './Control'\r\n\r\nexport class TextControl implements IControlInstance {\r\n private element: IElement\r\n private control: Control\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(element: IElement, control: Control) {\r\n const draw = control.getDraw()\r\n this.options = draw.getOptions()\r\n this.element = element\r\n this.control = control\r\n }\r\n\r\n public setElement(element: IElement) {\r\n this.element = element\r\n }\r\n\r\n public getElement(): IElement {\r\n return this.element\r\n }\r\n\r\n public getValue(context: IControlContext = {}): IElement[] {\r\n const elementList = context.elementList || this.control.getElementList()\r\n const { startIndex } = context.range || this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n const data: IElement[] = []\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n if (preElement.controlComponent === ControlComponent.VALUE) {\r\n data.unshift(preElement)\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n break\r\n }\r\n if (nextElement.controlComponent === ControlComponent.VALUE) {\r\n data.push(nextElement)\r\n }\r\n nextIndex++\r\n }\r\n return data\r\n }\r\n\r\n public setValue(\r\n data: IElement[],\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ): number {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return -1\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = context.range || this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary(context)\r\n const { startIndex, endIndex } = range\r\n const draw = this.control.getDraw()\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex,\r\n [],\r\n {\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n }\r\n )\r\n } else {\r\n // 移除空白占位符\r\n this.control.removePlaceholder(startIndex, context)\r\n }\r\n // 非文本类元素或前缀过渡掉样式属性\r\n const startElement = elementList[startIndex]\r\n const anchorElement =\r\n (startElement.type &&\r\n !TEXTLIKE_ELEMENT_TYPE.includes(startElement.type)) ||\r\n startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT\r\n ? pickObject(startElement, [\r\n 'control',\r\n 'controlId',\r\n ...CONTROL_STYLE_ATTR\r\n ])\r\n : omitObject(startElement, ['type'])\r\n // 插入起始位置\r\n const start = range.startIndex + 1\r\n for (let i = 0; i < data.length; i++) {\r\n const newElement: IElement = {\r\n ...anchorElement,\r\n ...data[i],\r\n controlComponent: ControlComponent.VALUE\r\n }\r\n formatElementContext(elementList, [newElement], startIndex, {\r\n editorOptions: this.options\r\n })\r\n draw.spliceElementList(elementList, start + i, 0, [newElement])\r\n }\r\n return start + data.length - 1\r\n }\r\n\r\n public clearValue(\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ): number {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return -1\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = context.range || this.control.getRange()\r\n const { startIndex, endIndex } = range\r\n this.control\r\n .getDraw()\r\n .spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex,\r\n [],\r\n {\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n }\r\n )\r\n const value = this.getValue(context)\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex, context)\r\n }\r\n return startIndex\r\n }\r\n\r\n public keydown(evt: KeyboardEvent): number | null {\r\n if (this.control.getIsDisabledControl()) {\r\n return null\r\n }\r\n const elementList = this.control.getElementList()\r\n const range = this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = range\r\n const startElement = elementList[startIndex]\r\n const endElement = elementList[endIndex]\r\n const draw = this.control.getDraw()\r\n // backspace\r\n if (evt.key === KeyMap.Backspace) {\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex\r\n )\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n } else {\r\n if (\r\n startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT ||\r\n endElement.controlComponent === ControlComponent.POSTFIX ||\r\n endElement.controlComponent === ControlComponent.POST_TEXT ||\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n // 前缀、后缀、占位符\r\n return this.control.removeControl(startIndex)\r\n } else {\r\n // 文本\r\n draw.spliceElementList(elementList, startIndex, 1)\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex - 1)\r\n }\r\n return startIndex - 1\r\n }\r\n }\r\n } else if (evt.key === KeyMap.Delete) {\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex\r\n )\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n } else {\r\n const endNextElement = elementList[endIndex + 1]\r\n if (\r\n ((startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT) &&\r\n endNextElement.controlComponent === ControlComponent.PLACEHOLDER) ||\r\n endNextElement.controlComponent === ControlComponent.POSTFIX ||\r\n endNextElement.controlComponent === ControlComponent.POST_TEXT ||\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n // 前缀、后缀、占位符\r\n return this.control.removeControl(startIndex)\r\n } else {\r\n // 文本\r\n draw.spliceElementList(elementList, startIndex + 1, 1)\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n }\r\n }\r\n }\r\n return endIndex\r\n }\r\n\r\n public cut(): number {\r\n if (this.control.getIsDisabledControl()) {\r\n return -1\r\n }\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = this.control.getRange()\r\n if (startIndex === endIndex) {\r\n return startIndex\r\n }\r\n const draw = this.control.getDraw()\r\n const elementList = this.control.getElementList()\r\n draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex)\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n }\r\n}\r\n","import {\r\n CONTROL_STYLE_ATTR,\r\n EDITOR_ELEMENT_STYLE_ATTR,\r\n TEXTLIKE_ELEMENT_TYPE\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ControlComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControlContext,\r\n IControlInstance,\r\n IControlRuleOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { omitObject, pickObject } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementContext } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../../draw/Draw'\r\nimport { DatePicker } from '../../plugin-stubs'\r\nimport { Control } from '../Control'\r\n\r\nexport class DateControl implements IControlInstance {\r\n private draw: Draw\r\n private element: IElement\r\n private control: Control\r\n private isPopup: boolean\r\n private datePicker: DatePicker | null\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(element: IElement, control: Control) {\r\n const draw = control.getDraw()\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.element = element\r\n this.control = control\r\n this.isPopup = false\r\n this.datePicker = null\r\n }\r\n\r\n public setElement(element: IElement) {\r\n this.element = element\r\n }\r\n\r\n public getElement(): IElement {\r\n return this.element\r\n }\r\n\r\n public getIsPopup(): boolean {\r\n return this.isPopup\r\n }\r\n\r\n public getValueRange(context: IControlContext = {}): [number, number] | null {\r\n const elementList = context.elementList || this.control.getElementList()\r\n const { startIndex } = context.range || this.control.getRange()\r\n const startElement = elementList[startIndex]\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (\r\n preElement.controlId !== startElement.controlId ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlId !== startElement.controlId ||\r\n nextElement.controlComponent === ControlComponent.POSTFIX ||\r\n nextElement.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n break\r\n }\r\n nextIndex++\r\n }\r\n if (preIndex === nextIndex) return null\r\n return [preIndex, nextIndex - 1]\r\n }\r\n\r\n public getValue(context: IControlContext = {}): IElement[] {\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = this.getValueRange(context)\r\n if (!range) return []\r\n const data: IElement[] = []\r\n const [startIndex, endIndex] = range\r\n for (let i = startIndex; i <= endIndex; i++) {\r\n const element = elementList[i]\r\n if (element.controlComponent === ControlComponent.VALUE) {\r\n data.push(element)\r\n }\r\n }\r\n return data\r\n }\r\n\r\n public setValue(\r\n data: IElement[],\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ): number {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return -1\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = context.range || this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary(context)\r\n const { startIndex, endIndex } = range\r\n const draw = this.control.getDraw()\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex)\r\n } else {\r\n // 移除空白占位符\r\n this.control.removePlaceholder(startIndex, context)\r\n }\r\n // 非文本类元素或前缀过渡掉样式属性\r\n const startElement = elementList[startIndex]\r\n const anchorElement =\r\n (startElement.type &&\r\n !TEXTLIKE_ELEMENT_TYPE.includes(startElement.type)) ||\r\n startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT\r\n ? pickObject(startElement, [\r\n 'control',\r\n 'controlId',\r\n ...CONTROL_STYLE_ATTR\r\n ])\r\n : omitObject(startElement, ['type'])\r\n // 插入起始位置\r\n const start = range.startIndex + 1\r\n for (let i = 0; i < data.length; i++) {\r\n const newElement: IElement = {\r\n ...anchorElement,\r\n ...data[i],\r\n controlComponent: ControlComponent.VALUE\r\n }\r\n formatElementContext(elementList, [newElement], startIndex, {\r\n editorOptions: this.options\r\n })\r\n draw.spliceElementList(elementList, start + i, 0, [newElement])\r\n }\r\n return start + data.length - 1\r\n }\r\n\r\n public clearSelect(\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ): number {\r\n const { isIgnoreDisabledRule = false, isAddPlaceholder = true } = options\r\n // 校验是否可以设置\r\n if (!isIgnoreDisabledRule && this.control.getIsDisabledControl(context)) {\r\n return -1\r\n }\r\n const range = this.getValueRange(context)\r\n if (!range) return -1\r\n const [leftIndex, rightIndex] = range\r\n if (!~leftIndex || !~rightIndex) return -1\r\n const elementList = context.elementList || this.control.getElementList()\r\n // 删除元素\r\n const draw = this.control.getDraw()\r\n draw.spliceElementList(\r\n elementList,\r\n leftIndex + 1,\r\n rightIndex - leftIndex,\r\n [],\r\n {\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n }\r\n )\r\n // 增加占位符\r\n if (isAddPlaceholder) {\r\n this.control.addPlaceholder(leftIndex, context)\r\n }\r\n return leftIndex\r\n }\r\n\r\n public setSelect(\r\n date: string,\r\n context: IControlContext = {},\r\n options: IControlRuleOption = {}\r\n ) {\r\n // 校验是否可以设置\r\n if (\r\n !options.isIgnoreDisabledRule &&\r\n this.control.getIsDisabledControl(context)\r\n ) {\r\n return\r\n }\r\n const elementList = context.elementList || this.control.getElementList()\r\n const range = context.range || this.control.getRange()\r\n // 样式赋值元素-默认值的第一个字符样式,否则取默认样式\r\n const valueElement = this.getValue(context)[0]\r\n const styleElement = valueElement\r\n ? pickObject(valueElement, EDITOR_ELEMENT_STYLE_ATTR)\r\n : pickObject(elementList[range.startIndex], CONTROL_STYLE_ATTR)\r\n // 清空选项\r\n const prefixIndex = this.clearSelect(context, {\r\n isAddPlaceholder: false,\r\n isIgnoreDeletedRule: options.isIgnoreDeletedRule\r\n })\r\n if (!~prefixIndex) return\r\n // 属性赋值元素-默认为前缀属性\r\n const propertyElement = omitObject(\r\n elementList[prefixIndex],\r\n EDITOR_ELEMENT_STYLE_ATTR\r\n )\r\n const start = prefixIndex + 1\r\n const draw = this.control.getDraw()\r\n for (let i = 0; i < date.length; i++) {\r\n const newElement: IElement = {\r\n ...styleElement,\r\n ...propertyElement,\r\n type: ElementType.TEXT,\r\n value: date[i],\r\n controlComponent: ControlComponent.VALUE\r\n }\r\n formatElementContext(elementList, [newElement], prefixIndex, {\r\n editorOptions: this.options\r\n })\r\n draw.spliceElementList(elementList, start + i, 0, [newElement])\r\n }\r\n // 重新渲染控件\r\n if (!context.range) {\r\n const newIndex = start + date.length - 1\r\n this.control.repaintControl({\r\n curIndex: newIndex\r\n })\r\n this.control.emitControlContentChange({\r\n context\r\n })\r\n this.destroy()\r\n }\r\n }\r\n\r\n public keydown(evt: KeyboardEvent): number | null {\r\n if (this.control.getIsDisabledControl()) {\r\n return null\r\n }\r\n const elementList = this.control.getElementList()\r\n const range = this.control.getRange()\r\n // 收缩边界到Value内\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = range\r\n const startElement = elementList[startIndex]\r\n const endElement = elementList[endIndex]\r\n const draw = this.control.getDraw()\r\n // backspace\r\n if (evt.key === KeyMap.Backspace) {\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex\r\n )\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n } else {\r\n if (\r\n startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT ||\r\n endElement.controlComponent === ControlComponent.POSTFIX ||\r\n endElement.controlComponent === ControlComponent.POST_TEXT ||\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n // 前缀、后缀、占位符\r\n return this.control.removeControl(startIndex)\r\n } else {\r\n // 文本\r\n draw.spliceElementList(elementList, startIndex, 1)\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex - 1)\r\n }\r\n return startIndex - 1\r\n }\r\n }\r\n } else if (evt.key === KeyMap.Delete) {\r\n // 移除选区元素\r\n if (startIndex !== endIndex) {\r\n draw.spliceElementList(\r\n elementList,\r\n startIndex + 1,\r\n endIndex - startIndex\r\n )\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n } else {\r\n const endNextElement = elementList[endIndex + 1]\r\n if (\r\n ((startElement.controlComponent === ControlComponent.PREFIX ||\r\n startElement.controlComponent === ControlComponent.PRE_TEXT) &&\r\n endNextElement.controlComponent === ControlComponent.PLACEHOLDER) ||\r\n endNextElement.controlComponent === ControlComponent.POSTFIX ||\r\n endNextElement.controlComponent === ControlComponent.POST_TEXT ||\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n // 前缀、后缀、占位符\r\n return this.control.removeControl(startIndex)\r\n } else {\r\n // 文本\r\n draw.spliceElementList(elementList, startIndex + 1, 1)\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n }\r\n }\r\n }\r\n return endIndex\r\n }\r\n\r\n public cut(): number {\r\n if (this.control.getIsDisabledControl()) {\r\n return -1\r\n }\r\n this.control.shrinkBoundary()\r\n const { startIndex, endIndex } = this.control.getRange()\r\n if (startIndex === endIndex) {\r\n return startIndex\r\n }\r\n const draw = this.control.getDraw()\r\n const elementList = this.control.getElementList()\r\n draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex)\r\n const value = this.getValue()\r\n if (!value.length) {\r\n this.control.addPlaceholder(startIndex)\r\n }\r\n return startIndex\r\n }\r\n\r\n public awake() {\r\n if (\r\n this.isPopup ||\r\n this.control.getIsDisabledControl() ||\r\n !this.control.getIsRangeWithinControl()\r\n ) {\r\n return\r\n }\r\n const position = this.control.getPosition()\r\n if (!position) return\r\n const elementList = this.draw.getElementList()\r\n const { startIndex } = this.control.getRange()\r\n if (elementList[startIndex + 1]?.controlId !== this.element.controlId) {\r\n return\r\n }\r\n // 渲染日期控件\r\n this.datePicker = new DatePicker(this.draw, {\r\n onSubmit: this._setDate.bind(this)\r\n })\r\n const value =\r\n this.getValue()\r\n .map(el => el.value)\r\n .join('') || ''\r\n const dateFormat = this.element.control?.dateFormat\r\n this.datePicker.render({\r\n value,\r\n position,\r\n dateFormat\r\n })\r\n // 弹窗状态\r\n this.isPopup = true\r\n }\r\n\r\n public destroy() {\r\n if (!this.isPopup) return\r\n this.datePicker?.destroy()\r\n this.isPopup = false\r\n }\r\n\r\n private _setDate(date: string) {\r\n if (!date) {\r\n this.clearSelect()\r\n } else {\r\n this.setSelect(date)\r\n }\r\n this.destroy()\r\n }\r\n}\r\n","import { TextControl } from './TextControl'\r\n\r\nexport class NumberControl extends TextControl {}\r\n","import {\r\n ControlComponent,\r\n ControlState,\r\n ControlType\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { EditorMode, EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IControl,\r\n IControlChangeOption,\r\n IControlChangeResult,\r\n IControlContentChangeResult,\r\n IControlContext,\r\n IControlHighlight,\r\n IControlInitOption,\r\n IControlInstance,\r\n IControlOption,\r\n IControlRuleOption,\r\n IDestroyControlOption,\r\n IGetControlValueOption,\r\n IGetControlValueResult,\r\n IInitNextControlOption,\r\n INextControlContext,\r\n IRepaintControlOption,\r\n ISetControlExtensionOption,\r\n ISetControlProperties,\r\n ISetControlRowFlexOption,\r\n ISetControlValueOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IEditorData, IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { EventBusMap } from '@vervedoc/docx-editor-schema'\r\nimport { IRange } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n deepClone,\r\n isArray,\r\n isString,\r\n omitObject,\r\n pickObject,\r\n splitText\r\n} from '@vervedoc/docx-editor-schema'\r\nimport {\r\n formatElementContext,\r\n formatElementList,\r\n getNonHideElementIndex,\r\n pickElementAttr,\r\n zipElementList\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { EventBus } from '@vervedoc/docx-editor-state'\r\nimport { Listener } from '@vervedoc/docx-editor-state'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../draw/Draw'\r\nimport { CheckboxControl } from './CheckboxControl'\r\nimport { RadioControl } from './radio/RadioControl'\r\nimport { ControlSearch } from './ControlSearch'\r\nimport { ControlBorder } from './Border'\r\nimport { SelectControl } from './SelectControl'\r\nimport { TextControl } from './TextControl'\r\nimport { DateControl } from './date/DateControl'\r\nimport { NumberControl } from './NumberControl'\r\nimport { MoveDirection } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n CONTROL_CONTEXT_ATTR,\r\n CONTROL_STYLE_ATTR,\r\n LIST_CONTEXT_ATTR,\r\n TITLE_CONTEXT_ATTR\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { RowFlex } from '@vervedoc/docx-editor-schema'\r\nimport { ZERO } from '@vervedoc/docx-editor-schema'\r\n\r\ninterface IMoveCursorResult {\r\n newIndex: number\r\n newElement: IElement\r\n}\r\nexport class Control {\r\n private controlBorder: ControlBorder\r\n private draw: Draw\r\n private range: RangeManager\r\n private listener: Listener\r\n private eventBus: EventBus<EventBusMap>\r\n private controlSearch: ControlSearch\r\n private options: DeepRequired<IEditorOption>\r\n private controlOptions: IControlOption\r\n private activeControl: IControlInstance | null\r\n private activeControlValue: IElement[]\r\n private preElement: IElement | null\r\n\r\n constructor(draw: Draw) {\r\n this.controlBorder = new ControlBorder(draw)\r\n\r\n this.draw = draw\r\n this.range = draw.getRange()\r\n this.listener = draw.getListener()\r\n this.eventBus = draw.getEventBus()\r\n this.controlSearch = new ControlSearch(this)\r\n\r\n this.options = draw.getOptions()\r\n this.controlOptions = this.options.control\r\n this.activeControl = null\r\n this.activeControlValue = []\r\n this.preElement = null\r\n }\r\n\r\n // 搜索高亮匹配\r\n public setHighlightList(payload: IControlHighlight[]) {\r\n this.controlSearch.setHighlightList(payload)\r\n }\r\n\r\n public computeHighlightList() {\r\n const highlightList = this.controlSearch.getHighlightList()\r\n if (highlightList.length) {\r\n this.controlSearch.computeHighlightList()\r\n }\r\n }\r\n\r\n public renderHighlightList(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n const highlightMatchResult = this.controlSearch.getHighlightMatchResult()\r\n if (highlightMatchResult.length) {\r\n this.controlSearch.renderHighlightList(ctx, pageNo)\r\n }\r\n }\r\n\r\n public getDraw(): Draw {\r\n return this.draw\r\n }\r\n\r\n // 过滤控件辅助元素(前后缀、背景提示)\r\n public filterAssistElement(elementList: IElement[]): IElement[] {\r\n return elementList.filter((element, index) => {\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n td.value = this.filterAssistElement(td.value)\r\n }\r\n }\r\n }\r\n if (!element.controlId) return true\r\n if (element.control?.minWidth) {\r\n if (\r\n element.controlComponent === ControlComponent.PREFIX ||\r\n element.controlComponent === ControlComponent.POSTFIX\r\n ) {\r\n element.value = ''\r\n return true\r\n }\r\n } else {\r\n // 控件存在值时无需过滤前后文本\r\n if (\r\n element.control?.preText &&\r\n element.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n let isExistValue = false\r\n let start = index + 1\r\n while (start < elementList.length) {\r\n const nextElement = elementList[start]\r\n if (element.controlId !== nextElement.controlId) break\r\n if (nextElement.controlComponent === ControlComponent.VALUE) {\r\n isExistValue = true\r\n break\r\n }\r\n start++\r\n }\r\n return isExistValue\r\n }\r\n if (\r\n element.control?.postText &&\r\n element.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n let isExistValue = false\r\n let start = index - 1\r\n while (start < elementList.length) {\r\n const preElement = elementList[start]\r\n if (element.controlId !== preElement.controlId) break\r\n if (preElement.controlComponent === ControlComponent.VALUE) {\r\n isExistValue = true\r\n break\r\n }\r\n start--\r\n }\r\n return isExistValue\r\n }\r\n }\r\n return (\r\n element.controlComponent !== ControlComponent.PREFIX &&\r\n element.controlComponent !== ControlComponent.POSTFIX &&\r\n element.controlComponent !== ControlComponent.PLACEHOLDER\r\n )\r\n })\r\n }\r\n\r\n // 是否属于控件可以捕获事件的选区\r\n public getIsRangeCanCaptureEvent(): boolean {\r\n if (!this.activeControl) return false\r\n const { startIndex, endIndex } = this.getRange()\r\n if (!~startIndex && !~endIndex) return false\r\n const elementList = this.getElementList()\r\n const startElement = elementList[startIndex]\r\n // 闭合光标在后缀处\r\n if (\r\n startIndex === endIndex &&\r\n startElement.controlComponent === ControlComponent.POSTFIX\r\n ) {\r\n return true\r\n }\r\n // 在控件内\r\n const endElement = elementList[endIndex]\r\n if (\r\n startElement.controlId &&\r\n startElement.controlId === endElement.controlId &&\r\n endElement.controlComponent !== ControlComponent.POSTFIX\r\n ) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n // 判断选区是否在后缀处\r\n public getIsRangeInPostfix(): boolean {\r\n if (!this.activeControl) return false\r\n const { startIndex, endIndex } = this.getRange()\r\n if (startIndex !== endIndex) return false\r\n const elementList = this.getElementList()\r\n const element = elementList[startIndex]\r\n return element.controlComponent === ControlComponent.POSTFIX\r\n }\r\n\r\n // 判断选区是否在控件内\r\n public getIsRangeWithinControl(): boolean {\r\n const { startIndex, endIndex } = this.getRange()\r\n if (!~startIndex && !~endIndex) return false\r\n const elementList = this.getElementList()\r\n const startElement = elementList[startIndex]\r\n const endElement = elementList[endIndex]\r\n if (\r\n startElement?.controlId &&\r\n startElement.controlId === endElement.controlId &&\r\n endElement.controlComponent !== ControlComponent.POSTFIX\r\n ) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n // 是否元素包含完整控件元素\r\n public getIsElementListContainFullControl(elementList: IElement[]): boolean {\r\n if (!elementList.some(element => element.controlId)) return false\r\n let prefixCount = 0\r\n let postfixCount = 0\r\n for (let e = 0; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n if (element.controlComponent === ControlComponent.PREFIX) {\r\n prefixCount++\r\n } else if (element.controlComponent === ControlComponent.POSTFIX) {\r\n postfixCount++\r\n }\r\n }\r\n if (!prefixCount || !postfixCount) return false\r\n return prefixCount === postfixCount\r\n }\r\n\r\n public getIsDisabledControl(context: IControlContext = {}): boolean {\r\n if (this.draw.isDesignMode() || !this.activeControl) return false\r\n const { startIndex, endIndex } = context.range || this.range.getRange()\r\n if (startIndex === endIndex && ~startIndex && ~endIndex) {\r\n const elementList = context.elementList || this.getElementList()\r\n const startElement = elementList[startIndex]\r\n if (startElement.controlComponent === ControlComponent.POSTFIX) {\r\n return false\r\n }\r\n }\r\n return !!this.activeControl.getElement()?.control?.disabled\r\n }\r\n\r\n public getIsDisabledPasteControl(context: IControlContext = {}): boolean {\r\n if (this.draw.isDesignMode() || !this.activeControl) return false\r\n const { startIndex, endIndex } = context.range || this.range.getRange()\r\n if (startIndex === endIndex && ~startIndex && ~endIndex) {\r\n const elementList = context.elementList || this.getElementList()\r\n const startElement = elementList[startIndex]\r\n if (startElement.controlComponent === ControlComponent.POSTFIX) {\r\n return false\r\n }\r\n }\r\n return !!this.activeControl.getElement()?.control?.pasteDisabled\r\n }\r\n\r\n // 通过索引找到控件并判断控件是否存在值\r\n public getIsExistValueByElementListIndex(\r\n elementList: IElement[],\r\n index: number\r\n ): boolean {\r\n const element = elementList[index]\r\n // 是否是控件\r\n if (!element.controlId) return false\r\n // 单选框、复选框仅需验证控件值\r\n if (\r\n element.control?.type === ControlType.CHECKBOX ||\r\n element.control?.type === ControlType.RADIO\r\n ) {\r\n return !!element.control?.code\r\n }\r\n // 其他控件需校验文本\r\n if (element.controlComponent === ControlComponent.VALUE) {\r\n return true\r\n }\r\n if (element.controlComponent === ControlComponent.PLACEHOLDER) {\r\n return false\r\n }\r\n // 向后查找值元素\r\n if (\r\n element.controlComponent === ControlComponent.PREFIX ||\r\n element.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n let i = index + 1\r\n while (i < elementList.length) {\r\n const nextElement = elementList[i]\r\n if (nextElement.controlId !== element.controlId) {\r\n return false\r\n }\r\n if (nextElement.controlComponent === ControlComponent.VALUE) {\r\n return true\r\n }\r\n if (nextElement.controlComponent === ControlComponent.PLACEHOLDER) {\r\n return false\r\n }\r\n i++\r\n }\r\n }\r\n // 向前查找值元素\r\n if (\r\n element.controlComponent === ControlComponent.POSTFIX ||\r\n element.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n let i = index - 1\r\n while (i >= 0) {\r\n const preElement = elementList[i]\r\n if (preElement.controlId !== element.controlId) {\r\n return false\r\n }\r\n if (preElement.controlComponent === ControlComponent.VALUE) {\r\n return true\r\n }\r\n if (preElement.controlComponent === ControlComponent.PLACEHOLDER) {\r\n return false\r\n }\r\n i--\r\n }\r\n }\r\n return false\r\n }\r\n\r\n public getControlHighlight(elementList: IElement[], index: number) {\r\n return this.controlSearch.getControlHighlight(elementList, index)\r\n }\r\n\r\n public getContainer(): HTMLDivElement {\r\n return this.draw.getContainer()\r\n }\r\n\r\n public getElementList(): IElement[] {\r\n return this.draw.getElementList()\r\n }\r\n\r\n public getPosition(): IElementPosition | null {\r\n const positionList = this.draw.getPosition().getPositionList()\r\n const { endIndex } = this.range.getRange()\r\n return positionList[endIndex] || null\r\n }\r\n\r\n public getPreY(): number {\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const pageNo = this.getPosition()?.pageNo ?? this.draw.getPageNo()\r\n return pageNo * (height + pageGap)\r\n }\r\n\r\n public getRange(): IRange {\r\n return this.range.getRange()\r\n }\r\n\r\n public shrinkBoundary(context: IControlContext = {}) {\r\n this.range.shrinkBoundary(context)\r\n }\r\n\r\n public getActiveControl(): IControlInstance | null {\r\n return this.activeControl\r\n }\r\n\r\n public getControlElementList(context: IControlContext = {}): IElement[] {\r\n const elementList = context.elementList || this.getElementList()\r\n const { startIndex } = context.range || this.getRange()\r\n const startElement = elementList[startIndex]\r\n if (!startElement?.controlId) return []\r\n const data: IElement[] = []\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (preElement.controlId !== startElement.controlId) break\r\n data.unshift(preElement)\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (nextElement.controlId !== startElement.controlId) break\r\n data.push(nextElement)\r\n nextIndex++\r\n }\r\n return data\r\n }\r\n\r\n public updateActiveControlValue() {\r\n if (this.activeControl) {\r\n this.activeControlValue = this.getControlElementList()\r\n }\r\n }\r\n\r\n public emitControlChange(state: ControlState) {\r\n if (!this.activeControl) return\r\n const isSubscribeControlChange = this.eventBus.hasSubscribers('controlChange')\r\n if (!this.listener.controlChange && !isSubscribeControlChange) return\r\n let control: IControl\r\n const value = this.activeControlValue\r\n const activeElement = this.activeControl.getElement()\r\n if (value?.length) {\r\n control = zipElementList(value)[0].control!\r\n } else {\r\n control = pickElementAttr(deepClone(activeElement)).control!\r\n control.value = []\r\n }\r\n const payload: IControlChangeResult = {\r\n state,\r\n control,\r\n controlId: activeElement.controlId!\r\n }\r\n this.listener.controlChange?.(payload)\r\n if (isSubscribeControlChange) {\r\n this.eventBus.emit('controlChange', payload)\r\n }\r\n }\r\n\r\n public initControl() {\r\n const elementList = this.getElementList()\r\n const range = this.getRange()\r\n const element = elementList[range.startIndex]\r\n // 判断控件是否已经激活\r\n if (this.activeControl) {\r\n // 弹窗类控件唤醒弹窗,后缀处移除弹窗\r\n if (\r\n this.activeControl instanceof SelectControl ||\r\n this.activeControl instanceof DateControl\r\n ) {\r\n if (element.controlComponent === ControlComponent.POSTFIX) {\r\n this.activeControl.destroy()\r\n } else {\r\n this.activeControl.awake()\r\n }\r\n }\r\n // 相同控件元素\r\n if (this.preElement?.controlId === element.controlId) {\r\n // 当前元素在尾部:控件失活事件\r\n if (element.controlComponent === ControlComponent.POSTFIX) {\r\n this.emitControlChange(ControlState.INACTIVE)\r\n } else if (\r\n // 之前元素在尾部 && 当前不在尾部:控件激活事件\r\n this.preElement?.controlComponent === ControlComponent.POSTFIX\r\n ) {\r\n this.emitControlChange(ControlState.ACTIVE)\r\n }\r\n }\r\n // 更新缓存控件数据\r\n const controlElement = this.activeControl.getElement()\r\n if (element.controlId === controlElement.controlId) {\r\n this.updateActiveControlValue()\r\n this.preElement = element\r\n return\r\n }\r\n }\r\n // 销毁旧激活控件\r\n this.destroyControl()\r\n // 激活控件\r\n const isReadonly = this.draw.isReadonly()\r\n if (isReadonly) return\r\n const control = element.control!\r\n if (control.type === ControlType.TEXT) {\r\n this.activeControl = new TextControl(element, this)\r\n } else if (control.type === ControlType.SELECT) {\r\n const selectControl = new SelectControl(element, this)\r\n this.activeControl = selectControl\r\n selectControl.awake()\r\n } else if (control.type === ControlType.CHECKBOX) {\r\n this.activeControl = new CheckboxControl(element, this)\r\n } else if (control.type === ControlType.RADIO) {\r\n this.activeControl = new RadioControl(element, this)\r\n } else if (control.type === ControlType.DATE) {\r\n const dateControl = new DateControl(element, this)\r\n this.activeControl = dateControl\r\n dateControl.awake()\r\n } else if (control.type === ControlType.NUMBER) {\r\n this.activeControl = new NumberControl(element, this)\r\n }\r\n // 缓存控件数据\r\n this.updateActiveControlValue()\r\n this.preElement = element\r\n // 激活控件回调\r\n if (element.controlComponent !== ControlComponent.POSTFIX) {\r\n this.emitControlChange(ControlState.ACTIVE)\r\n }\r\n }\r\n\r\n public destroyControl(options: IDestroyControlOption = {}) {\r\n if (!this.activeControl) return\r\n const { isEmitEvent = true } = options\r\n if (\r\n this.activeControl instanceof SelectControl ||\r\n this.activeControl instanceof DateControl\r\n ) {\r\n this.activeControl.destroy()\r\n }\r\n // 销毁控件回调\r\n if (\r\n isEmitEvent &&\r\n this.preElement?.controlComponent !== ControlComponent.POSTFIX\r\n ) {\r\n this.emitControlChange(ControlState.INACTIVE)\r\n }\r\n // 清空变量\r\n this.preElement = null\r\n this.activeControl = null\r\n this.activeControlValue = []\r\n }\r\n\r\n public repaintControl(options: IRepaintControlOption = {}) {\r\n const {\r\n curIndex,\r\n isCompute = true,\r\n isSubmitHistory = true,\r\n isSetCursor = true\r\n } = options\r\n // 重新渲染\r\n if (curIndex === undefined) {\r\n this.range.clearRange()\r\n this.draw.render({\r\n isCompute,\r\n isSubmitHistory,\r\n isSetCursor: false\r\n })\r\n } else {\r\n this.range.setRange(curIndex, curIndex)\r\n this.draw.render({\r\n curIndex,\r\n isCompute,\r\n isSetCursor,\r\n isSubmitHistory\r\n })\r\n }\r\n }\r\n\r\n public emitControlContentChange(options?: IControlChangeOption) {\r\n const isSubscribeControlContentChange = this.eventBus.hasSubscribers(\r\n 'controlContentChange'\r\n )\r\n if (\r\n !isSubscribeControlContentChange &&\r\n !this.listener.controlContentChange\r\n ) {\r\n return\r\n }\r\n const controlElement =\r\n options?.controlElement || this.activeControl?.getElement()\r\n if (!controlElement) return\r\n // 控件被删除不触发事件\r\n const elementList = options?.context?.elementList || this.getElementList()\r\n const { startIndex } = options?.context?.range || this.getRange()\r\n if (!elementList[startIndex]?.controlId) return\r\n // 格式化回调数据\r\n const controlValue =\r\n options?.controlValue || this.getControlElementList(options?.context)\r\n let control: IControl\r\n if (controlValue?.length) {\r\n control = zipElementList(controlValue)[0].control!\r\n } else {\r\n control = controlElement.control!\r\n control.value = []\r\n }\r\n if (!control) return\r\n const payload: IControlContentChangeResult = {\r\n control,\r\n controlId: controlElement.controlId!\r\n }\r\n this.listener.controlContentChange?.(payload)\r\n if (isSubscribeControlContentChange) {\r\n this.eventBus.emit('controlContentChange', payload)\r\n }\r\n }\r\n\r\n public reAwakeControl() {\r\n if (!this.activeControl) return\r\n const elementList = this.getElementList()\r\n const range = this.getRange()\r\n const element = elementList[range.startIndex]\r\n this.activeControl.setElement(element)\r\n if (\r\n (this.activeControl instanceof DateControl ||\r\n this.activeControl instanceof SelectControl) &&\r\n this.activeControl.getIsPopup()\r\n ) {\r\n this.activeControl.destroy()\r\n this.activeControl.awake()\r\n }\r\n }\r\n\r\n public moveCursor(position: IControlInitOption): IMoveCursorResult {\r\n const { index, trIndex, tdIndex, tdValueIndex } = position\r\n let elementList = this.draw.getOriginalElementList()\r\n let element: IElement\r\n const newIndex = position.isTable ? tdValueIndex! : index\r\n if (position.isTable) {\r\n elementList = elementList[index!].trList![trIndex!].tdList[tdIndex!].value\r\n element = elementList[tdValueIndex!]\r\n } else {\r\n element = elementList[index]\r\n }\r\n // 隐藏元素移动光标\r\n if (element.control?.hide || element.area?.hide) {\r\n const nonHideIndex = getNonHideElementIndex(elementList, newIndex)\r\n return {\r\n newIndex: nonHideIndex,\r\n newElement: elementList[nonHideIndex]\r\n }\r\n }\r\n // 控件内移动光标\r\n if (element.controlComponent === ControlComponent.VALUE) {\r\n // VALUE-无需移动\r\n return {\r\n newIndex,\r\n newElement: element\r\n }\r\n } else if (element.controlComponent === ControlComponent.POSTFIX) {\r\n // POSTFIX-移动到最后一个后缀字符后\r\n let startIndex = newIndex + 1\r\n while (startIndex < elementList.length) {\r\n const nextElement = elementList[startIndex]\r\n if (nextElement.controlId !== element.controlId) {\r\n return {\r\n newIndex: startIndex - 1,\r\n newElement: elementList[startIndex - 1]\r\n }\r\n }\r\n startIndex++\r\n }\r\n } else if (\r\n element.controlComponent === ControlComponent.PREFIX ||\r\n element.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n // PREFIX或前文本-移动到最后一个前缀字符后\r\n let startIndex = newIndex + 1\r\n while (startIndex < elementList.length) {\r\n const nextElement = elementList[startIndex]\r\n if (\r\n nextElement.controlId !== element.controlId ||\r\n (nextElement.controlComponent !== ControlComponent.PREFIX &&\r\n nextElement.controlComponent !== ControlComponent.PRE_TEXT)\r\n ) {\r\n return {\r\n newIndex: startIndex - 1,\r\n newElement: elementList[startIndex - 1]\r\n }\r\n }\r\n startIndex++\r\n }\r\n } else if (\r\n element.controlComponent === ControlComponent.PLACEHOLDER ||\r\n element.controlComponent === ControlComponent.POST_TEXT\r\n ) {\r\n // PLACEHOLDER或后文本-移动到第一个前缀或内容后\r\n let startIndex = newIndex - 1\r\n while (startIndex > 0) {\r\n const preElement = elementList[startIndex]\r\n if (\r\n preElement.controlId !== element.controlId ||\r\n preElement.controlComponent === ControlComponent.VALUE ||\r\n preElement.controlComponent === ControlComponent.PREFIX ||\r\n preElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n return {\r\n newIndex: startIndex,\r\n newElement: elementList[startIndex]\r\n }\r\n }\r\n startIndex--\r\n }\r\n }\r\n return {\r\n newIndex,\r\n newElement: element\r\n }\r\n }\r\n\r\n public removeControl(\r\n startIndex: number,\r\n context: IControlContext = {}\r\n ): number | null {\r\n const elementList = context.elementList || this.getElementList()\r\n const startElement = elementList[startIndex]\r\n // 设计模式 || 元素隐藏 => 不验证删除权限\r\n if (\r\n !this.draw.isDesignMode() &&\r\n !startElement?.control?.hide &&\r\n !startElement?.area?.hide\r\n ) {\r\n const { deletable = true } = startElement.control!\r\n if (!deletable) return null\r\n // 表单模式控件删除权限验证\r\n const mode = this.draw.getMode()\r\n if (\r\n mode === EditorMode.FORM &&\r\n this.options.modeRule[mode].controlDeletableDisabled\r\n ) {\r\n return null\r\n }\r\n }\r\n let leftIndex = -1\r\n let rightIndex = -1\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (preElement.controlId !== startElement.controlId) {\r\n leftIndex = preIndex\r\n break\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (nextElement.controlId !== startElement.controlId) {\r\n rightIndex = nextIndex - 1\r\n break\r\n }\r\n nextIndex++\r\n }\r\n // 控件在最后\r\n if (nextIndex === elementList.length) {\r\n rightIndex = nextIndex - 1\r\n }\r\n if (!~leftIndex && !~rightIndex) return startIndex\r\n leftIndex = ~leftIndex ? leftIndex : 0\r\n // 删除元素\r\n this.draw.spliceElementList(\r\n elementList,\r\n leftIndex + 1,\r\n rightIndex - leftIndex\r\n )\r\n return leftIndex\r\n }\r\n\r\n public removePlaceholder(startIndex: number, context: IControlContext = {}) {\r\n const elementList = context.elementList || this.getElementList()\r\n const startElement = elementList[startIndex]\r\n const nextElement = elementList[startIndex + 1]\r\n if (\r\n startElement.controlComponent === ControlComponent.PLACEHOLDER ||\r\n nextElement.controlComponent === ControlComponent.PLACEHOLDER\r\n ) {\r\n let isHasSubmitHistory = false\r\n let index = startIndex\r\n while (index < elementList.length) {\r\n const curElement = elementList[index]\r\n if (curElement.controlId !== startElement.controlId) break\r\n if (curElement.controlComponent === ControlComponent.PLACEHOLDER) {\r\n // 删除占位符时替换前一个历史记录\r\n if (!isHasSubmitHistory) {\r\n isHasSubmitHistory = true\r\n this.draw.getHistoryManager().popUndo()\r\n this.draw.submitHistory(startIndex)\r\n }\r\n elementList.splice(index, 1)\r\n } else {\r\n index++\r\n }\r\n }\r\n }\r\n }\r\n\r\n public addPlaceholder(startIndex: number, context: IControlContext = {}) {\r\n const elementList = context.elementList || this.getElementList()\r\n const startElement = elementList[startIndex]\r\n const control = startElement.control!\r\n if (!control.placeholder) return\r\n const placeholderStrList = splitText(control.placeholder)\r\n // 优先使用默认控件样式\r\n const anchorElementStyleAttr = pickObject(startElement, CONTROL_STYLE_ATTR)\r\n for (let p = 0; p < placeholderStrList.length; p++) {\r\n const value = placeholderStrList[p]\r\n const newElement: IElement = {\r\n ...anchorElementStyleAttr,\r\n value: value === '\\n' ? ZERO : value,\r\n controlId: startElement.controlId,\r\n type: ElementType.CONTROL,\r\n control: startElement.control,\r\n controlComponent: ControlComponent.PLACEHOLDER,\r\n color: this.controlOptions.placeholderColor\r\n }\r\n formatElementContext(elementList, [newElement], startIndex, {\r\n editorOptions: this.options\r\n })\r\n this.draw.spliceElementList(elementList, startIndex + p + 1, 0, [\r\n newElement\r\n ])\r\n }\r\n }\r\n\r\n public setValue(data: IElement[]): number {\r\n if (!this.activeControl) {\r\n throw new Error('active control is null')\r\n }\r\n return this.activeControl.setValue(data)\r\n }\r\n\r\n public setControlProperties(\r\n properties: Partial<IControl>,\r\n context: IControlContext = {}\r\n ) {\r\n const elementList = context.elementList || this.getElementList()\r\n const { startIndex } = context.range || this.getRange()\r\n const startElement = elementList[startIndex]\r\n // 向左查找\r\n let preIndex = startIndex\r\n while (preIndex > 0) {\r\n const preElement = elementList[preIndex]\r\n if (preElement.controlId !== startElement.controlId) break\r\n preElement.control = {\r\n ...preElement.control!,\r\n ...properties\r\n }\r\n preIndex--\r\n }\r\n // 向右查找\r\n let nextIndex = startIndex + 1\r\n while (nextIndex < elementList.length) {\r\n const nextElement = elementList[nextIndex]\r\n if (nextElement.controlId !== startElement.controlId) break\r\n nextElement.control = {\r\n ...nextElement.control!,\r\n ...properties\r\n }\r\n nextIndex++\r\n }\r\n }\r\n\r\n public keydown(evt: KeyboardEvent): number | null {\r\n if (!this.activeControl) {\r\n throw new Error('active control is null')\r\n }\r\n return this.activeControl.keydown(evt)\r\n }\r\n\r\n public cut(): number {\r\n if (!this.activeControl) {\r\n throw new Error('active control is null')\r\n }\r\n return this.activeControl.cut()\r\n }\r\n\r\n public getValueById(payload: IGetControlValueOption): IGetControlValueResult {\r\n const { id, conceptId, areaId } = payload\r\n const result: IGetControlValueResult = []\r\n if (!id && !conceptId) return result\r\n const getValue = (elementList: IElement[], zone: EditorZone) => {\r\n let i = 0\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n i++\r\n // 表格下钻处理\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n getValue(td.value, zone)\r\n }\r\n }\r\n }\r\n if (\r\n !element.control ||\r\n (id && element.controlId !== id) ||\r\n (conceptId && element.control.conceptId !== conceptId) ||\r\n (areaId && element.areaId !== areaId)\r\n ) {\r\n continue\r\n }\r\n const { type, code, valueSets } = element.control\r\n let j = i\r\n let textControlValue = ''\r\n const textControlElementList = []\r\n while (j < elementList.length) {\r\n const nextElement = elementList[j]\r\n if (nextElement.controlId !== element.controlId) break\r\n if (\r\n (type === ControlType.TEXT ||\r\n type === ControlType.DATE ||\r\n type === ControlType.NUMBER) &&\r\n nextElement.controlComponent === ControlComponent.VALUE\r\n ) {\r\n textControlValue += nextElement.value\r\n textControlElementList.push(\r\n omitObject(nextElement, CONTROL_CONTEXT_ATTR)\r\n )\r\n }\r\n j++\r\n }\r\n if (\r\n type === ControlType.TEXT ||\r\n type === ControlType.DATE ||\r\n type === ControlType.NUMBER\r\n ) {\r\n result.push({\r\n ...element.control,\r\n zone,\r\n value: textControlValue || null,\r\n innerText: textControlValue || null,\r\n elementList: zipElementList(textControlElementList)\r\n })\r\n } else if (\r\n type === ControlType.SELECT ||\r\n type === ControlType.CHECKBOX ||\r\n type === ControlType.RADIO\r\n ) {\r\n const innerText = code\r\n ?.split(',')\r\n .map(\r\n selectCode =>\r\n valueSets?.find(valueSet => valueSet.code === selectCode)?.value\r\n )\r\n .filter(Boolean)\r\n .join('')\r\n result.push({\r\n ...element.control,\r\n zone,\r\n value: code || null,\r\n innerText: innerText || null\r\n })\r\n }\r\n i = j\r\n }\r\n }\r\n const data = [\r\n {\r\n zone: EditorZone.HEADER,\r\n elementList: this.draw.getHeaderElementList()\r\n },\r\n {\r\n zone: EditorZone.MAIN,\r\n elementList: this.draw.getOriginalMainElementList()\r\n },\r\n {\r\n zone: EditorZone.FOOTER,\r\n elementList: this.draw.getFooterElementList()\r\n }\r\n ]\r\n for (const { zone, elementList } of data) {\r\n getValue(elementList, zone)\r\n }\r\n return result\r\n }\r\n\r\n public setValueListById(payload: ISetControlValueOption[]) {\r\n if (!payload.length) return\r\n let isExistSet = false\r\n let isExistSubmitHistory = false\r\n // 设置值\r\n const setValue = (elementList: IElement[]) => {\r\n let i = 0\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n i++\r\n // 表格下钻处理\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n setValue(td.value)\r\n }\r\n }\r\n }\r\n if (!element.control) continue\r\n // 获取设置值优先id、conceptId、areaId\r\n const payloadItem = payload.find(\r\n p =>\r\n (p.id && element.controlId === p.id) ||\r\n (p.conceptId && element.control!.conceptId === p.conceptId) ||\r\n (p.areaId && element.areaId === p.areaId)\r\n )\r\n if (!payloadItem) continue\r\n const { value, isSubmitHistory = true } = payloadItem\r\n // 只要存在一次保存历史均记录\r\n isExistSet = true\r\n if (isSubmitHistory) {\r\n isExistSubmitHistory = true\r\n }\r\n const { type } = element.control!\r\n // 当前控件结束索引\r\n let currentEndIndex = i\r\n while (currentEndIndex < elementList.length) {\r\n const nextElement = elementList[currentEndIndex]\r\n if (nextElement.controlId !== element.controlId) break\r\n currentEndIndex++\r\n }\r\n // 模拟光标选区上下文\r\n const fakeRange = {\r\n startIndex: i - 1,\r\n endIndex: currentEndIndex - 2\r\n }\r\n const controlContext: IControlContext = {\r\n range: fakeRange,\r\n elementList\r\n }\r\n const controlRule: IControlRuleOption = {\r\n isIgnoreDisabledRule: true,\r\n isIgnoreDeletedRule: true\r\n }\r\n if (type === ControlType.TEXT) {\r\n const formatValue = Array.isArray(value)\r\n ? value\r\n : value\r\n ? [{ value }]\r\n : []\r\n if (formatValue.length) {\r\n formatElementList(formatValue, {\r\n isHandleFirstElement: false,\r\n editorOptions: this.options\r\n })\r\n }\r\n const text = new TextControl(element, this)\r\n this.activeControl = text\r\n if (formatValue.length) {\r\n text.setValue(formatValue, controlContext, controlRule)\r\n } else {\r\n text.clearValue(controlContext, controlRule)\r\n }\r\n } else if (type === ControlType.SELECT) {\r\n if (Array.isArray(value)) continue\r\n const select = new SelectControl(element, this)\r\n this.activeControl = select\r\n if (value) {\r\n select.setSelect(value, controlContext, controlRule)\r\n } else {\r\n select.clearSelect(controlContext, controlRule)\r\n }\r\n } else if (type === ControlType.CHECKBOX) {\r\n if (Array.isArray(value)) continue\r\n const checkbox = new CheckboxControl(element, this)\r\n this.activeControl = checkbox\r\n const codes = value ? value.split(',') : []\r\n checkbox.setSelect(codes, controlContext, controlRule)\r\n } else if (type === ControlType.RADIO) {\r\n if (Array.isArray(value)) continue\r\n const radio = new RadioControl(element, this)\r\n this.activeControl = radio\r\n const codes = value ? [value] : []\r\n radio.setSelect(codes, controlContext, controlRule)\r\n } else if (type === ControlType.DATE) {\r\n const date = new DateControl(element, this)\r\n this.activeControl = date\r\n if (isArray(value)) {\r\n if (value.length) {\r\n formatElementList(value, {\r\n isHandleFirstElement: false,\r\n editorOptions: this.options\r\n })\r\n }\r\n date.setValue(value, controlContext, controlRule)\r\n } else if (isString(value)) {\r\n date.setSelect(value, controlContext, controlRule)\r\n } else {\r\n date.clearSelect(controlContext, controlRule)\r\n }\r\n } else if (type === ControlType.NUMBER) {\r\n const formatValue = Array.isArray(value)\r\n ? value\r\n : value\r\n ? [{ value }]\r\n : []\r\n if (formatValue.length) {\r\n formatElementList(formatValue, {\r\n isHandleFirstElement: false,\r\n editorOptions: this.options\r\n })\r\n }\r\n const text = new NumberControl(element, this)\r\n this.activeControl = text\r\n if (formatValue.length) {\r\n text.setValue(formatValue, controlContext, controlRule)\r\n } else {\r\n text.clearValue(controlContext, controlRule)\r\n }\r\n }\r\n // 控件值变更事件\r\n this.emitControlContentChange({\r\n context: controlContext\r\n })\r\n // 模拟控件激活后销毁\r\n this.activeControl = null\r\n // 修改后控件结束索引\r\n let newEndIndex = i\r\n while (newEndIndex < elementList.length) {\r\n const nextElement = elementList[newEndIndex]\r\n if (nextElement.controlId !== element.controlId) break\r\n newEndIndex++\r\n }\r\n i = newEndIndex\r\n }\r\n }\r\n // 销毁旧控件\r\n this.destroyControl({\r\n isEmitEvent: false\r\n })\r\n // 页眉、内容区、页脚同时处理\r\n const data = [\r\n this.draw.getHeaderElementList(),\r\n this.draw.getOriginalMainElementList(),\r\n this.draw.getFooterElementList()\r\n ]\r\n for (const elementList of data) {\r\n setValue(elementList)\r\n }\r\n if (isExistSet) {\r\n // 不保存历史时需清空之前记录,避免还原\r\n if (!isExistSubmitHistory) {\r\n this.draw.getHistoryManager().recovery()\r\n }\r\n this.draw.render({\r\n isSubmitHistory: isExistSubmitHistory,\r\n isSetCursor: false\r\n })\r\n }\r\n }\r\n\r\n public setExtensionListById(payload: ISetControlExtensionOption[]) {\r\n if (!payload.length) return\r\n const setExtension = (elementList: IElement[]) => {\r\n let i = 0\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n i++\r\n // 表格下钻处理\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n setExtension(td.value)\r\n }\r\n }\r\n }\r\n if (!element.control) continue\r\n // 获取设置值优先id、conceptId、areaId\r\n const payloadItem = payload.find(\r\n p =>\r\n (p.id && element.controlId === p.id) ||\r\n (p.conceptId && element.control!.conceptId === p.conceptId) ||\r\n (p.areaId && element.areaId === p.areaId)\r\n )\r\n if (!payloadItem) continue\r\n const { extension } = payloadItem\r\n // 设置值\r\n this.setControlProperties(\r\n {\r\n extension\r\n },\r\n {\r\n elementList,\r\n range: { startIndex: i, endIndex: i }\r\n }\r\n )\r\n // 修改后控件结束索引\r\n let newEndIndex = i\r\n while (newEndIndex < elementList.length) {\r\n const nextElement = elementList[newEndIndex]\r\n if (nextElement.controlId !== element.controlId) break\r\n newEndIndex++\r\n }\r\n i = newEndIndex\r\n }\r\n }\r\n const data = [\r\n this.draw.getHeaderElementList(),\r\n this.draw.getOriginalMainElementList(),\r\n this.draw.getFooterElementList()\r\n ]\r\n for (const elementList of data) {\r\n setExtension(elementList)\r\n }\r\n }\r\n\r\n public setPropertiesListById(payload: ISetControlProperties[]) {\r\n if (!payload.length) return\r\n let isExistUpdate = false\r\n let isExistSubmitHistory = false\r\n const setProperties = (elementList: IElement[]) => {\r\n let i = 0\r\n while (i < elementList.length) {\r\n const element = elementList[i]\r\n i++\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n setProperties(td.value)\r\n }\r\n }\r\n }\r\n if (!element.control) continue\r\n // 获取设置值优先id、conceptId、areaId\r\n const payloadItem = payload.find(\r\n p =>\r\n (p.id && element.controlId === p.id) ||\r\n (p.conceptId && element.control!.conceptId === p.conceptId) ||\r\n (p.areaId && element.areaId === p.areaId)\r\n )\r\n if (!payloadItem) continue\r\n const { properties, isSubmitHistory = true } = payloadItem\r\n isExistUpdate = true\r\n if (isSubmitHistory) {\r\n isExistSubmitHistory = true\r\n }\r\n // 设置属性\r\n this.setControlProperties(\r\n {\r\n ...element.control,\r\n ...properties,\r\n value: element.control.value\r\n },\r\n {\r\n elementList,\r\n range: { startIndex: i, endIndex: i }\r\n }\r\n )\r\n // 控件默认样式\r\n CONTROL_STYLE_ATTR.forEach(key => {\r\n const controlStyleProperty = properties[key]\r\n if (controlStyleProperty) {\r\n Reflect.set(element, key, controlStyleProperty)\r\n }\r\n })\r\n // 修改后控件结束索引\r\n let newEndIndex = i\r\n while (newEndIndex < elementList.length) {\r\n const nextElement = elementList[newEndIndex]\r\n if (nextElement.controlId !== element.controlId) break\r\n newEndIndex++\r\n }\r\n i = newEndIndex\r\n }\r\n }\r\n // 页眉页脚正文启动搜索\r\n const pageComponentData: IEditorData = {\r\n header: this.draw.getHeaderElementList(),\r\n main: this.draw.getOriginalMainElementList(),\r\n footer: this.draw.getFooterElementList()\r\n }\r\n for (const key in pageComponentData) {\r\n const elementList = pageComponentData[<keyof IEditorData>key]!\r\n setProperties(elementList)\r\n }\r\n if (!isExistUpdate) return\r\n // 强制更新\r\n for (const key in pageComponentData) {\r\n const pageComponentKey = <keyof IEditorData>key\r\n const elementList = zipElementList(pageComponentData[pageComponentKey]!, {\r\n isClassifyArea: true,\r\n extraPickAttrs: ['id']\r\n })\r\n pageComponentData[pageComponentKey] = elementList\r\n formatElementList(elementList, {\r\n editorOptions: this.options,\r\n isForceCompensation: true\r\n })\r\n }\r\n this.draw.setEditorData(pageComponentData)\r\n // 不保存历史时需清空之前记录,避免还原\r\n if (!isExistSubmitHistory) {\r\n this.draw.getHistoryManager().recovery()\r\n }\r\n this.draw.render({\r\n isSubmitHistory: isExistSubmitHistory,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public getList(): IElement[] {\r\n const controlElementList: IElement[] = []\r\n function getControlElementList(elementList: IElement[]) {\r\n for (let e = 0; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const tdElement = td.value\r\n getControlElementList(tdElement)\r\n }\r\n }\r\n }\r\n if (element.controlId) {\r\n // 移除控件所在标题及列表上下文信息\r\n const controlElement = omitObject(element, [\r\n ...TITLE_CONTEXT_ATTR,\r\n ...LIST_CONTEXT_ATTR\r\n ])\r\n controlElementList.push(controlElement)\r\n }\r\n }\r\n }\r\n const data = [\r\n this.draw.getHeader().getElementList(),\r\n this.draw.getOriginalMainElementList(),\r\n this.draw.getFooter().getElementList()\r\n ]\r\n for (const elementList of data) {\r\n getControlElementList(elementList)\r\n }\r\n return zipElementList(controlElementList, {\r\n extraPickAttrs: ['controlId']\r\n })\r\n }\r\n\r\n public recordBorderInfo(x: number, y: number, width: number, height: number) {\r\n this.controlBorder.recordBorderInfo(x, y, width, height)\r\n }\r\n\r\n public drawBorder(ctx: CanvasRenderingContext2D) {\r\n this.controlBorder.render(ctx)\r\n }\r\n\r\n public getPreControlContext(): INextControlContext | null {\r\n if (!this.activeControl) return null\r\n const position = this.draw.getPosition()\r\n const positionContext = position.getPositionContext()\r\n if (!positionContext) return null\r\n const controlElement = this.activeControl.getElement()\r\n // 获取上一个控件上下文本信息\r\n function getPreContext(\r\n elementList: IElement[],\r\n start: number\r\n ): INextControlContext | null {\r\n for (let e = start; e > 0; e--) {\r\n const element = elementList[e]\r\n // 表格元素\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList || []\r\n for (let r = trList.length - 1; r >= 0; r--) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList\r\n for (let d = tdList.length - 1; d >= 0; d--) {\r\n const td = tdList[d]\r\n const context = getPreContext(td.value, td.value.length - 1)\r\n if (context) {\r\n return {\r\n positionContext: {\r\n isTable: true,\r\n index: e,\r\n trIndex: r,\r\n tdIndex: d,\r\n tdId: td.id,\r\n trId: tr.id,\r\n tableId: element.id\r\n },\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (\r\n !element.controlId ||\r\n element.controlId === controlElement.controlId\r\n ) {\r\n continue\r\n }\r\n // 找到尾部第一个非占位符元素\r\n let nextIndex = e\r\n while (nextIndex > 0) {\r\n const nextElement = elementList[nextIndex]\r\n if (\r\n nextElement.controlComponent === ControlComponent.VALUE ||\r\n nextElement.controlComponent === ControlComponent.PREFIX ||\r\n nextElement.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n break\r\n }\r\n nextIndex--\r\n }\r\n return {\r\n positionContext: {\r\n isTable: false\r\n },\r\n nextIndex\r\n }\r\n }\r\n return null\r\n }\r\n // 当前上下文控件信息\r\n const { startIndex } = this.range.getRange()\r\n const elementList = this.getElementList()\r\n const context = getPreContext(elementList, startIndex)\r\n if (context) {\r\n return {\r\n positionContext: positionContext.isTable\r\n ? positionContext\r\n : context.positionContext,\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n // 控件在单元内时继续循环\r\n if (controlElement.tableId) {\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const { index, trIndex, tdIndex } = positionContext\r\n const trList = originalElementList[index!].trList!\r\n for (let r = trIndex!; r >= 0; r--) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList\r\n for (let d = tdList.length - 1; d >= 0; d--) {\r\n if (trIndex === r && d >= tdIndex!) continue\r\n const td = tdList[d]\r\n const context = getPreContext(td.value, td.value.length - 1)\r\n if (context) {\r\n return {\r\n positionContext: {\r\n isTable: true,\r\n index: positionContext.index,\r\n trIndex: r,\r\n tdIndex: d,\r\n tdId: td.id,\r\n trId: tr.id,\r\n tableId: controlElement.tableId\r\n },\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n }\r\n }\r\n // 跳出表格继续循环\r\n const context = getPreContext(originalElementList, index! - 1)\r\n if (context) {\r\n return {\r\n positionContext: {\r\n isTable: false\r\n },\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n }\r\n return null\r\n }\r\n\r\n public getNextControlContext(): INextControlContext | null {\r\n if (!this.activeControl) return null\r\n const position = this.draw.getPosition()\r\n const positionContext = position.getPositionContext()\r\n if (!positionContext) return null\r\n const controlElement = this.activeControl.getElement()\r\n // 获取下一个控件上下文本信息\r\n function getNextContext(\r\n elementList: IElement[],\r\n start: number\r\n ): INextControlContext | null {\r\n for (let e = start; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n // 表格元素\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList || []\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n const context = getNextContext(td.value!, 0)\r\n if (context) {\r\n return {\r\n positionContext: {\r\n isTable: true,\r\n index: e,\r\n trIndex: r,\r\n tdIndex: d,\r\n tdId: td.id,\r\n trId: tr.id,\r\n tableId: element.id\r\n },\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (\r\n !element.controlId ||\r\n element.controlId === controlElement.controlId ||\r\n elementList[e + 1]?.controlComponent === ControlComponent.PREFIX ||\r\n elementList[e + 1]?.controlComponent === ControlComponent.PRE_TEXT\r\n ) {\r\n continue\r\n }\r\n return {\r\n positionContext: {\r\n isTable: false\r\n },\r\n nextIndex: e\r\n }\r\n }\r\n return null\r\n }\r\n // 当前上下文控件信息\r\n const { endIndex } = this.range.getRange()\r\n const elementList = this.getElementList()\r\n const context = getNextContext(elementList, endIndex)\r\n if (context) {\r\n return {\r\n positionContext: positionContext.isTable\r\n ? positionContext\r\n : context.positionContext,\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n // 控件在单元内时继续循环\r\n if (controlElement.tableId) {\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const { index, trIndex, tdIndex } = positionContext\r\n const trList = originalElementList[index!].trList!\r\n for (let r = trIndex!; r < trList.length; r++) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n if (trIndex === r && d <= tdIndex!) continue\r\n const td = tdList[d]\r\n const context = getNextContext(td.value, 0)\r\n if (context) {\r\n return {\r\n positionContext: {\r\n isTable: true,\r\n index: positionContext.index,\r\n trIndex: r,\r\n tdIndex: d,\r\n tdId: td.id,\r\n trId: tr.id,\r\n tableId: controlElement.tableId\r\n },\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n }\r\n }\r\n // 跳出表格继续循环\r\n const context = getNextContext(originalElementList, index! + 1)\r\n if (context) {\r\n return {\r\n positionContext: {\r\n isTable: false\r\n },\r\n nextIndex: context.nextIndex\r\n }\r\n }\r\n }\r\n return null\r\n }\r\n\r\n public initNextControl(option: IInitNextControlOption = {}) {\r\n const { direction = MoveDirection.DOWN } = option\r\n let context: INextControlContext | null = null\r\n if (direction === MoveDirection.UP) {\r\n context = this.getPreControlContext()\r\n } else {\r\n context = this.getNextControlContext()\r\n }\r\n if (!context) return\r\n const { nextIndex, positionContext } = context\r\n const position = this.draw.getPosition()\r\n // 设置上下文\r\n position.setPositionContext(positionContext)\r\n this.draw.getRange().replaceRange({\r\n startIndex: nextIndex,\r\n endIndex: nextIndex\r\n })\r\n // 重新渲染并定位\r\n this.draw.render({\r\n curIndex: nextIndex,\r\n isCompute: false,\r\n isSetCursor: true,\r\n isSubmitHistory: false\r\n })\r\n const positionList = position.getPositionList()\r\n this.draw.getCursor().moveCursorToVisible({\r\n cursorPosition: positionList[nextIndex],\r\n direction\r\n })\r\n }\r\n\r\n public setMinWidthControlInfo(option: ISetControlRowFlexOption) {\r\n const { row, rowElement, controlRealWidth, availableWidth } = option\r\n if (!rowElement.control?.minWidth) return\r\n const { scale } = this.options\r\n const controlMinWidth = rowElement.control.minWidth * scale\r\n // 设置首字符偏移量:如果控件内设置对齐方式&&存在设置最小宽度\r\n let controlFirstElement: IRowElement | null = null\r\n if (\r\n rowElement.control?.minWidth &&\r\n (rowElement.control?.rowFlex === RowFlex.CENTER ||\r\n rowElement.control?.rowFlex === RowFlex.RIGHT)\r\n ) {\r\n // 计算当前控件内容宽度是否超出最小宽度设置\r\n let controlContentWidth = rowElement.metrics.width\r\n let controlElementIndex = row.elementList.length - 1\r\n while (controlElementIndex >= 0) {\r\n const controlRowElement = row.elementList[controlElementIndex]\r\n controlContentWidth += controlRowElement.metrics.width\r\n // 找到首字符结束循环\r\n if (\r\n row.elementList[controlElementIndex - 1]?.controlComponent ===\r\n ControlComponent.PREFIX\r\n ) {\r\n controlFirstElement = controlRowElement\r\n break\r\n }\r\n controlElementIndex--\r\n }\r\n // 计算首字符偏移量\r\n if (controlFirstElement) {\r\n if (controlContentWidth < controlMinWidth) {\r\n if (rowElement.control.rowFlex === RowFlex.CENTER) {\r\n controlFirstElement.left =\r\n (controlMinWidth - controlContentWidth) / 2\r\n } else if (rowElement.control.rowFlex === RowFlex.RIGHT) {\r\n // 最小宽度 - 实际宽度 - 后缀元素宽度\r\n controlFirstElement.left =\r\n controlMinWidth - controlContentWidth - rowElement.metrics.width\r\n }\r\n }\r\n }\r\n }\r\n // 设置后缀偏移量:消费小于实际最小宽度\r\n const extraWidth = controlMinWidth - controlRealWidth\r\n if (extraWidth > 0) {\r\n const controlFirstElementLeft = controlFirstElement?.left || 0\r\n // 超出行宽时截断\r\n const rowRemainingWidth =\r\n availableWidth - row.width - rowElement.metrics.width\r\n const left = Math.min(rowRemainingWidth, extraWidth)\r\n // 后缀偏移量需减去首字符的偏移量,避免重复偏移\r\n rowElement.left = left - controlFirstElementLeft\r\n row.width += left - controlFirstElementLeft\r\n }\r\n }\r\n}\r\n","import { NBSP, ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { VerticalAlign } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { IRow, IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\ninterface ICheckboxRenderOption {\r\n ctx: CanvasRenderingContext2D\r\n x: number\r\n y: number\r\n row: IRow\r\n index: number\r\n}\r\n\r\nexport class CheckboxParticle {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public setSelect(element: IElement) {\r\n const { checkbox } = element\r\n if (checkbox) {\r\n checkbox.value = !checkbox.value\r\n } else {\r\n element.checkbox = {\r\n value: true\r\n }\r\n }\r\n this.draw.render({\r\n isCompute: false,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public render(payload: ICheckboxRenderOption) {\r\n const { ctx, x, index, row } = payload\r\n let { y } = payload\r\n const {\r\n checkbox: { gap, lineWidth, fillStyle, strokeStyle, verticalAlign },\r\n scale\r\n } = this.options\r\n const { metrics, checkbox } = row.elementList[index]\r\n // 垂直布局设置\r\n if (\r\n verticalAlign === VerticalAlign.TOP ||\r\n verticalAlign === VerticalAlign.MIDDLE\r\n ) {\r\n let nextIndex = index + 1\r\n let nextElement: IRowElement | null = null\r\n while (nextIndex < row.elementList.length) {\r\n nextElement = row.elementList[nextIndex]\r\n if (nextElement.value !== ZERO && nextElement.value !== NBSP) break\r\n nextIndex++\r\n }\r\n // 以后一个非空格元素为基准\r\n if (nextElement) {\r\n const {\r\n metrics: { boundingBoxAscent, boundingBoxDescent }\r\n } = nextElement\r\n const textHeight = boundingBoxAscent + boundingBoxDescent\r\n if (textHeight > metrics.height) {\r\n if (verticalAlign === VerticalAlign.TOP) {\r\n y -= boundingBoxAscent - metrics.height\r\n } else if (verticalAlign === VerticalAlign.MIDDLE) {\r\n y -= (textHeight - metrics.height) / 2\r\n }\r\n }\r\n }\r\n }\r\n // left top 四舍五入避免1像素问题\r\n const left = Math.round(x + gap * scale)\r\n const top = Math.round(y - metrics.height + lineWidth)\r\n const width = metrics.width - gap * 2 * scale\r\n const height = metrics.height\r\n ctx.save()\r\n ctx.beginPath()\r\n ctx.translate(0.5, 0.5)\r\n // 绘制勾选状态\r\n if (checkbox?.value) {\r\n // 边框\r\n ctx.lineWidth = lineWidth\r\n ctx.strokeStyle = fillStyle\r\n ctx.rect(left, top, width, height)\r\n ctx.stroke()\r\n // 背景色\r\n ctx.beginPath()\r\n ctx.fillStyle = fillStyle\r\n ctx.fillRect(left, top, width, height)\r\n // 勾选对号\r\n ctx.beginPath()\r\n ctx.strokeStyle = strokeStyle\r\n ctx.lineWidth = lineWidth * 2 * scale\r\n ctx.moveTo(left + 2 * scale, top + height / 2)\r\n ctx.lineTo(left + width / 2, top + height - 3 * scale)\r\n ctx.lineTo(left + width - 2 * scale, top + 3 * scale)\r\n ctx.stroke()\r\n } else {\r\n ctx.lineWidth = lineWidth\r\n ctx.rect(left, top, width, height)\r\n ctx.stroke()\r\n }\r\n ctx.closePath()\r\n ctx.restore()\r\n }\r\n}\r\n","import { NBSP, ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { VerticalAlign } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { IRow, IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\ninterface IRadioRenderOption {\r\n ctx: CanvasRenderingContext2D\r\n x: number\r\n y: number\r\n row: IRow\r\n index: number\r\n}\r\n\r\nexport class RadioParticle {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public setSelect(element: IElement) {\r\n const { radio } = element\r\n if (radio) {\r\n radio.value = !radio.value\r\n } else {\r\n element.radio = {\r\n value: true\r\n }\r\n }\r\n this.draw.render({\r\n isCompute: false,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public render(payload: IRadioRenderOption) {\r\n const { ctx, x, index, row } = payload\r\n let { y } = payload\r\n const {\r\n radio: { gap, lineWidth, fillStyle, strokeStyle, verticalAlign },\r\n scale\r\n } = this.options\r\n const { metrics, radio } = row.elementList[index]\r\n // 垂直布局设置\r\n if (\r\n verticalAlign === VerticalAlign.TOP ||\r\n verticalAlign === VerticalAlign.MIDDLE\r\n ) {\r\n let nextIndex = index + 1\r\n let nextElement: IRowElement | null = null\r\n while (nextIndex < row.elementList.length) {\r\n nextElement = row.elementList[nextIndex]\r\n if (nextElement.value !== ZERO && nextElement.value !== NBSP) break\r\n nextIndex++\r\n }\r\n // 以后一个非空格元素为基准\r\n if (nextElement) {\r\n const {\r\n metrics: { boundingBoxAscent, boundingBoxDescent }\r\n } = nextElement\r\n const textHeight = boundingBoxAscent + boundingBoxDescent\r\n if (textHeight > metrics.height) {\r\n if (verticalAlign === VerticalAlign.TOP) {\r\n y -= boundingBoxAscent - metrics.height\r\n } else if (verticalAlign === VerticalAlign.MIDDLE) {\r\n y -= (textHeight - metrics.height) / 2\r\n }\r\n }\r\n }\r\n }\r\n // left top 四舍五入避免1像素问题\r\n const left = Math.round(x + gap * scale)\r\n const top = Math.round(y - metrics.height + lineWidth)\r\n const width = metrics.width - gap * 2 * scale\r\n const height = metrics.height\r\n ctx.save()\r\n ctx.beginPath()\r\n ctx.translate(0.5, 0.5)\r\n // 边框\r\n ctx.strokeStyle = radio?.value ? fillStyle : strokeStyle\r\n ctx.lineWidth = lineWidth\r\n ctx.arc(left + width / 2, top + height / 2, width / 2, 0, Math.PI * 2)\r\n ctx.stroke()\r\n // 填充选中色\r\n if (radio?.value) {\r\n ctx.beginPath()\r\n ctx.fillStyle = fillStyle\r\n ctx.arc(left + width / 2, top + height / 2, width / 3, 0, Math.PI * 2)\r\n ctx.fill()\r\n }\r\n ctx.closePath()\r\n ctx.restore()\r\n }\r\n}\r\n","import { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { EditorMode } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { EventBusMap } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IPreviewerCreateResult,\r\n IPreviewerDrawOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { downloadFile } from '@vervedoc/docx-editor-schema'\r\nimport { EventBus } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../../draw/Draw'\r\n\r\nexport class Previewer {\r\n private container: HTMLDivElement\r\n private canvas: HTMLCanvasElement\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n private curElement: IElement | null\r\n private curElementSrc: string\r\n private previewerDrawOption: IPreviewerDrawOption\r\n private curPosition: IElementPosition | null\r\n private eventBus: EventBus<EventBusMap>\r\n // 图片列表\r\n private imageList: IElement[]\r\n private curShowElement: IElement | null\r\n private imageCount: HTMLSpanElement | null\r\n private imagePre: HTMLElement | null\r\n private imageNext: HTMLElement | null\r\n // 拖拽改变尺寸\r\n private resizerSelection: HTMLDivElement\r\n private resizerHandleList: HTMLDivElement[]\r\n private resizerImageContainer: HTMLDivElement\r\n private resizerImage: HTMLImageElement\r\n private resizerSize: HTMLSpanElement\r\n private width: number\r\n private height: number\r\n private mousedownX: number\r\n private mousedownY: number\r\n private curHandleIndex: number\r\n // 预览选区\r\n private previewerContainer: HTMLDivElement | null\r\n private previewerImage: HTMLImageElement | null\r\n\r\n constructor(draw: Draw) {\r\n this.container = draw.getContainer()\r\n this.canvas = draw.getPage()\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.curElement = null\r\n this.curElementSrc = ''\r\n this.previewerDrawOption = {}\r\n this.curPosition = null\r\n this.eventBus = draw.getEventBus()\r\n this.imageList = []\r\n this.curShowElement = null\r\n this.imageCount = null\r\n this.imagePre = null\r\n this.imageNext = null\r\n // 图片尺寸缩放\r\n const {\r\n resizerSelection,\r\n resizerHandleList,\r\n resizerImageContainer,\r\n resizerImage,\r\n resizerSize\r\n } = this._createResizerDom()\r\n this.resizerSelection = resizerSelection\r\n this.resizerHandleList = resizerHandleList\r\n this.resizerImageContainer = resizerImageContainer\r\n this.resizerImage = resizerImage\r\n this.resizerSize = resizerSize\r\n this.width = 0\r\n this.height = 0\r\n this.mousedownX = 0\r\n this.mousedownY = 0\r\n this.curHandleIndex = 0 // 默认右下角\r\n this.previewerContainer = null\r\n this.previewerImage = null\r\n }\r\n\r\n private _getElementPosition(\r\n element: IElement,\r\n position: IElementPosition | null = null\r\n ): { x: number; y: number } {\r\n const { scale } = this.options\r\n let x = 0\r\n let y = 0\r\n const height = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const pageNo = position?.pageNo ?? this.draw.getPageNo()\r\n const preY = pageNo * (height + pageGap)\r\n // 优先使用浮动位置\r\n if (element.imgFloatPosition) {\r\n x = element.imgFloatPosition.x! * scale\r\n y = element.imgFloatPosition.y * scale + preY\r\n } else if (position) {\r\n const {\r\n coordinate: {\r\n leftTop: [left, top]\r\n },\r\n ascent\r\n } = position\r\n x = left\r\n y = top + preY + ascent\r\n }\r\n return { x, y }\r\n }\r\n\r\n private _createResizerDom(): IPreviewerCreateResult {\r\n const { scale } = this.options\r\n // 拖拽边框\r\n const resizerSelection = document.createElement('div')\r\n resizerSelection.classList.add(`${EDITOR_PREFIX}-resizer-selection`)\r\n resizerSelection.style.display = 'none'\r\n resizerSelection.style.borderColor = this.options.resizerColor\r\n resizerSelection.style.borderWidth = `${scale}px`\r\n // 拖拽点\r\n const resizerHandleList: HTMLDivElement[] = []\r\n for (let i = 0; i < 8; i++) {\r\n const handleDom = document.createElement('div')\r\n handleDom.style.background = this.options.resizerColor\r\n handleDom.classList.add(`resizer-handle`)\r\n handleDom.classList.add(`handle-${i}`)\r\n handleDom.setAttribute('data-index', String(i))\r\n handleDom.onmousedown = this._mousedown.bind(this)\r\n resizerSelection.append(handleDom)\r\n resizerHandleList.push(handleDom)\r\n }\r\n this.container.append(resizerSelection)\r\n // 尺寸查看\r\n const resizerSizeView = document.createElement('div')\r\n resizerSizeView.classList.add(`${EDITOR_PREFIX}-resizer-size-view`)\r\n const resizerSize = document.createElement('span')\r\n resizerSizeView.append(resizerSize)\r\n resizerSelection.append(resizerSizeView)\r\n // 拖拽镜像\r\n const resizerImageContainer = document.createElement('div')\r\n resizerImageContainer.classList.add(`${EDITOR_PREFIX}-resizer-image`)\r\n resizerImageContainer.style.display = 'none'\r\n const resizerImage = document.createElement('img')\r\n resizerImage.setAttribute('crossOrigin', 'Anonymous')\r\n resizerImageContainer.append(resizerImage)\r\n this.container.append(resizerImageContainer)\r\n return {\r\n resizerSelection,\r\n resizerHandleList,\r\n resizerImageContainer,\r\n resizerImage,\r\n resizerSize\r\n }\r\n }\r\n\r\n private _keydown = () => {\r\n // 有键盘事件触发时,主动销毁拖拽选区\r\n if (this.resizerSelection.style.display === 'block') {\r\n this.clearResizer()\r\n document.removeEventListener('keydown', this._keydown)\r\n }\r\n }\r\n\r\n private _mousedown(evt: MouseEvent) {\r\n this.canvas = this.draw.getPage()\r\n if (!this.curElement) return\r\n const { scale } = this.options\r\n this.mousedownX = evt.x\r\n this.mousedownY = evt.y\r\n const target = evt.target as HTMLDivElement\r\n this.curHandleIndex = Number(target.dataset.index)\r\n // 改变光标\r\n const cursor = window.getComputedStyle(target).cursor\r\n document.body.style.cursor = cursor\r\n this.canvas.style.cursor = cursor\r\n // 拖拽图片镜像\r\n this.resizerImage.src = this.curElementSrc\r\n this.resizerImageContainer.style.display = 'block'\r\n // 优先使用浮动位置信息\r\n const { x: resizerLeft, y: resizerTop } = this._getElementPosition(\r\n this.curElement,\r\n this.curPosition\r\n )\r\n this.resizerImageContainer.style.left = `${resizerLeft}px`\r\n this.resizerImageContainer.style.top = `${resizerTop}px`\r\n this.resizerImage.style.width = `${this.curElement.width! * scale}px`\r\n this.resizerImage.style.height = `${this.curElement.height! * scale}px`\r\n // 追加全局事件\r\n const mousemoveFn = this._mousemove.bind(this)\r\n document.addEventListener('mousemove', mousemoveFn)\r\n document.addEventListener(\r\n 'mouseup',\r\n () => {\r\n // 改变尺寸\r\n if (this.curElement && !this.previewerDrawOption.dragDisable) {\r\n this.curElement.width = this.width\r\n this.curElement.height = this.height\r\n this.draw.render({\r\n isSetCursor: true,\r\n curIndex: this.curPosition?.index\r\n })\r\n }\r\n // 还原副作用\r\n this.resizerImageContainer.style.display = 'none'\r\n document.removeEventListener('mousemove', mousemoveFn)\r\n document.body.style.cursor = ''\r\n this.canvas.style.cursor = 'text'\r\n },\r\n {\r\n once: true\r\n }\r\n )\r\n evt.preventDefault()\r\n }\r\n\r\n private _mousemove(evt: MouseEvent) {\r\n if (!this.curElement || this.previewerDrawOption.dragDisable) return\r\n const { scale } = this.options\r\n let dx = 0\r\n let dy = 0\r\n switch (this.curHandleIndex) {\r\n case 0:\r\n {\r\n const offsetX = this.mousedownX - evt.x\r\n const offsetY = this.mousedownY - evt.y\r\n dx = Math.cbrt(offsetX ** 3 + offsetY ** 3)\r\n dy = (this.curElement.height! * dx) / this.curElement.width!\r\n }\r\n break\r\n case 1:\r\n dy = this.mousedownY - evt.y\r\n break\r\n case 2:\r\n {\r\n const offsetX = evt.x - this.mousedownX\r\n const offsetY = this.mousedownY - evt.y\r\n dx = Math.cbrt(offsetX ** 3 + offsetY ** 3)\r\n dy = (this.curElement.height! * dx) / this.curElement.width!\r\n }\r\n break\r\n case 4:\r\n {\r\n const offsetX = evt.x - this.mousedownX\r\n const offsetY = evt.y - this.mousedownY\r\n dx = Math.cbrt(offsetX ** 3 + offsetY ** 3)\r\n dy = (this.curElement.height! * dx) / this.curElement.width!\r\n }\r\n break\r\n case 3:\r\n dx = evt.x - this.mousedownX\r\n break\r\n case 5:\r\n dy = evt.y - this.mousedownY\r\n break\r\n case 6:\r\n {\r\n const offsetX = this.mousedownX - evt.x\r\n const offsetY = evt.y - this.mousedownY\r\n dx = Math.cbrt(offsetX ** 3 + offsetY ** 3)\r\n dy = (this.curElement.height! * dx) / this.curElement.width!\r\n }\r\n break\r\n case 7:\r\n dx = this.mousedownX - evt.x\r\n break\r\n }\r\n // 图片实际宽高(变化大小除掉缩放比例)\r\n const dw = this.curElement.width! + dx / scale\r\n const dh = this.curElement.height! + dy / scale\r\n if (dw <= 0 || dh <= 0) return\r\n this.width = dw\r\n this.height = dh\r\n // 图片显示宽高\r\n const elementWidth = dw * scale\r\n const elementHeight = dh * scale\r\n // 更新影子图片尺寸\r\n this.resizerImage.style.width = `${elementWidth}px`\r\n this.resizerImage.style.height = `${elementHeight}px`\r\n // 更新预览包围框尺寸\r\n this._updateResizerRect(elementWidth, elementHeight)\r\n // 尺寸预览\r\n this._updateResizerSizeView(elementWidth, elementHeight)\r\n evt.preventDefault()\r\n // 图片尺寸发生改变事件\r\n if (this.eventBus.hasSubscribers('imageSizeChange')) {\r\n this.eventBus.emit('imageSizeChange', {\r\n element: this.curElement\r\n })\r\n }\r\n }\r\n\r\n private _drawPreviewer() {\r\n const previewerContainer = document.createElement('div')\r\n previewerContainer.classList.add(`${EDITOR_PREFIX}-image-previewer`)\r\n // 关闭按钮\r\n const closeBtn = document.createElement('i')\r\n closeBtn.classList.add('image-close')\r\n closeBtn.onclick = () => {\r\n this._clearPreviewer()\r\n }\r\n previewerContainer.append(closeBtn)\r\n // 图片\r\n const imgContainer = document.createElement('div')\r\n imgContainer.classList.add(`${EDITOR_PREFIX}-image-container`)\r\n const img = document.createElement('img')\r\n img.setAttribute('crossOrigin', 'Anonymous')\r\n img.src = this.curElementSrc\r\n img.draggable = false\r\n imgContainer.append(img)\r\n this.previewerImage = img\r\n previewerContainer.append(imgContainer)\r\n // 操作栏\r\n let x = 0\r\n let y = 0\r\n let scaleSize = 1\r\n let rotateSize = 0\r\n const menuContainer = document.createElement('div')\r\n menuContainer.classList.add(`${EDITOR_PREFIX}-image-menu`)\r\n // 切换上下张图片\r\n const navigateContainer = document.createElement('div')\r\n navigateContainer.classList.add('image-navigate')\r\n const imagePre = document.createElement('i')\r\n imagePre.classList.add('image-pre')\r\n imagePre.onclick = () => {\r\n const curIndex = this.imageList.findIndex(\r\n el => el.id === this.curShowElement?.id\r\n )\r\n if (curIndex <= 0) return\r\n this.curShowElement = this.imageList[curIndex - 1]\r\n img.src = this.curShowElement.value\r\n this._updateImageNavigate()\r\n }\r\n navigateContainer.append(imagePre)\r\n this.imagePre = imagePre\r\n const imageCount = document.createElement('span')\r\n imageCount.classList.add('image-count')\r\n this.imageCount = imageCount\r\n navigateContainer.append(imageCount)\r\n const imageNext = document.createElement('i')\r\n imageNext.classList.add('image-next')\r\n imageNext.onclick = () => {\r\n const curIndex = this.imageList.findIndex(\r\n el => el.id === this.curShowElement?.id\r\n )\r\n if (curIndex >= this.imageList.length - 1) return\r\n this.curShowElement = this.imageList[curIndex + 1]\r\n img.src = this.curShowElement.value\r\n this._updateImageNavigate()\r\n }\r\n this.imageNext = imageNext\r\n navigateContainer.append(imageNext)\r\n menuContainer.append(navigateContainer)\r\n // 缩放\r\n const zoomIn = document.createElement('i')\r\n zoomIn.classList.add('zoom-in')\r\n zoomIn.onclick = () => {\r\n scaleSize += 0.1\r\n this._setPreviewerTransform(scaleSize, rotateSize, x, y)\r\n }\r\n menuContainer.append(zoomIn)\r\n const zoomOut = document.createElement('i')\r\n zoomOut.onclick = () => {\r\n if (scaleSize - 0.1 <= 0.1) return\r\n scaleSize -= 0.1\r\n this._setPreviewerTransform(scaleSize, rotateSize, x, y)\r\n }\r\n zoomOut.classList.add('zoom-out')\r\n menuContainer.append(zoomOut)\r\n // 旋转\r\n const rotate = document.createElement('i')\r\n rotate.classList.add('rotate')\r\n rotate.onclick = () => {\r\n rotateSize += 1\r\n this._setPreviewerTransform(scaleSize, rotateSize, x, y)\r\n }\r\n menuContainer.append(rotate)\r\n // 恢复原始大小\r\n const originalSize = document.createElement('i')\r\n originalSize.classList.add('original-size')\r\n originalSize.onclick = () => {\r\n x = 0\r\n y = 0\r\n scaleSize = 1\r\n rotateSize = 0\r\n this._setPreviewerTransform(scaleSize, rotateSize, x, y)\r\n }\r\n menuContainer.append(originalSize)\r\n // 下载图片\r\n const imageDownload = document.createElement('i')\r\n imageDownload.classList.add('image-download')\r\n imageDownload.onclick = () => {\r\n const { mime } = this.previewerDrawOption\r\n downloadFile(img.src, `${this.curElement?.id}.${mime || 'png'}`)\r\n }\r\n menuContainer.append(imageDownload)\r\n previewerContainer.append(menuContainer)\r\n this.previewerContainer = previewerContainer\r\n document.body.append(previewerContainer)\r\n // 拖拽调整位置\r\n let startX = 0\r\n let startY = 0\r\n let isAllowDrag = false\r\n img.onmousedown = evt => {\r\n isAllowDrag = true\r\n startX = evt.x\r\n startY = evt.y\r\n previewerContainer.style.cursor = 'move'\r\n }\r\n previewerContainer.onmousemove = (evt: MouseEvent) => {\r\n if (!isAllowDrag) return\r\n x += evt.x - startX\r\n y += evt.y - startY\r\n startX = evt.x\r\n startY = evt.y\r\n this._setPreviewerTransform(scaleSize, rotateSize, x, y)\r\n }\r\n previewerContainer.onmouseup = () => {\r\n isAllowDrag = false\r\n previewerContainer.style.cursor = 'auto'\r\n }\r\n previewerContainer.onwheel = evt => {\r\n evt.preventDefault()\r\n evt.stopPropagation()\r\n if (evt.deltaY < 0) {\r\n // 放大\r\n scaleSize += 0.1\r\n } else {\r\n // 缩小\r\n if (scaleSize - 0.1 <= 0.1) return\r\n scaleSize -= 0.1\r\n }\r\n this._setPreviewerTransform(scaleSize, rotateSize, x, y)\r\n }\r\n // 更新图片索引信息\r\n this._updateImageNavigate()\r\n }\r\n\r\n private _updateImageNavigate() {\r\n // 更新当前图片位置索引\r\n const currentIndex = this.imageList.findIndex(\r\n el => el.id === this.curShowElement?.id\r\n )\r\n this.imageCount!.innerText = `${currentIndex + 1} / ${\r\n this.imageList.length\r\n }`\r\n // 更新按钮权限\r\n if (currentIndex <= 0) {\r\n this.imagePre!.classList.add('disabled')\r\n } else {\r\n this.imagePre!.classList.remove('disabled')\r\n }\r\n if (currentIndex >= this.imageList.length - 1) {\r\n this.imageNext!.classList.add('disabled')\r\n } else {\r\n this.imageNext!.classList.remove('disabled')\r\n }\r\n }\r\n\r\n public _setPreviewerTransform(\r\n scale: number,\r\n rotate: number,\r\n x: number,\r\n y: number\r\n ) {\r\n if (!this.previewerImage) return\r\n this.previewerImage.style.left = `${x}px`\r\n this.previewerImage.style.top = `${y}px`\r\n this.previewerImage.style.transform = `scale(${scale}) rotate(${\r\n rotate * 90\r\n }deg)`\r\n }\r\n\r\n private _clearPreviewer() {\r\n this.previewerContainer?.remove()\r\n this.previewerContainer = null\r\n document.body.style.overflow = 'auto'\r\n }\r\n\r\n public _updateResizerRect(width: number, height: number) {\r\n const { resizerSize: handleSize, scale } = this.options\r\n const isReadonly = this.draw.isReadonly()\r\n this.resizerSelection.style.width = `${width}px`\r\n this.resizerSelection.style.height = `${height}px`\r\n // handle\r\n for (let i = 0; i < 8; i++) {\r\n const left =\r\n i === 0 || i === 6 || i === 7\r\n ? -handleSize\r\n : i === 1 || i === 5\r\n ? width / 2\r\n : width - handleSize\r\n const top =\r\n i === 0 || i === 1 || i === 2\r\n ? -handleSize\r\n : i === 3 || i === 7\r\n ? height / 2 - handleSize\r\n : height - handleSize\r\n this.resizerHandleList[i].style.transform = `scale(${scale})`\r\n this.resizerHandleList[i].style.left = `${left}px`\r\n this.resizerHandleList[i].style.top = `${top}px`\r\n this.resizerHandleList[i].style.display = isReadonly ? 'none' : 'block'\r\n }\r\n }\r\n\r\n public _updateResizerSizeView(width: number, height: number) {\r\n this.resizerSize.innerText = `${Math.round(width)} × ${Math.round(height)}`\r\n }\r\n\r\n public render() {\r\n // 图片工具配置禁用又非设计模式时不渲染\r\n const mode = this.draw.getMode()\r\n if (\r\n !this.curElement ||\r\n (this.curElement.imgToolDisabled && !this.draw.isDesignMode()) ||\r\n (mode === EditorMode.PRINT &&\r\n this.options.modeRule[EditorMode.PRINT]?.imagePreviewerDisabled) ||\r\n (mode === EditorMode.READONLY &&\r\n this.options.modeRule[EditorMode.READONLY]?.imagePreviewerDisabled)\r\n ) {\r\n return\r\n }\r\n // 获取所有图片\r\n this.imageList = this.draw.getImageParticle().getOriginalMainImageList()\r\n this.curShowElement = this.curElement\r\n // 渲染预览框\r\n this._drawPreviewer()\r\n document.body.style.overflow = 'hidden'\r\n }\r\n\r\n public drawResizer(\r\n element: IElement,\r\n position: IElementPosition | null = null,\r\n options: IPreviewerDrawOption = {}\r\n ) {\r\n // 图片工具配置禁用又非设计模式时不渲染\r\n const mode = this.draw.getMode()\r\n if (\r\n (element.imgToolDisabled && !this.draw.isDesignMode()) ||\r\n (mode === EditorMode.PRINT &&\r\n this.options.modeRule[EditorMode.PRINT]?.imagePreviewerDisabled) ||\r\n (mode === EditorMode.READONLY &&\r\n this.options.modeRule[EditorMode.READONLY]?.imagePreviewerDisabled)\r\n ) {\r\n return\r\n }\r\n // 缓存配置\r\n this.previewerDrawOption = options\r\n this.curElementSrc = element[options.srcKey || 'value'] || ''\r\n // 更新渲染尺寸及位置\r\n this.updateResizer(element, position)\r\n // 监听事件\r\n document.addEventListener('keydown', this._keydown)\r\n }\r\n\r\n public updateResizer(\r\n element: IElement,\r\n position: IElementPosition | null = null\r\n ) {\r\n const { scale } = this.options\r\n const elementWidth = element.width! * scale\r\n const elementHeight = element.height! * scale\r\n // 尺寸预览\r\n this._updateResizerSizeView(elementWidth, elementHeight)\r\n // 优先使用浮动位置信息\r\n const { x: resizerLeft, y: resizerTop } = this._getElementPosition(\r\n element,\r\n position\r\n )\r\n this.resizerSelection.style.left = `${resizerLeft}px`\r\n this.resizerSelection.style.top = `${resizerTop}px`\r\n this.resizerSelection.style.borderWidth = `${scale}px`\r\n // 更新预览包围框尺寸\r\n this._updateResizerRect(elementWidth, elementHeight)\r\n this.resizerSelection.style.display = 'block'\r\n // 缓存基础信息\r\n this.curElement = element\r\n this.curPosition = position\r\n this.width = elementWidth\r\n this.height = elementHeight\r\n }\r\n\r\n public clearResizer() {\r\n this.resizerSelection.style.display = 'none'\r\n document.removeEventListener('keydown', this._keydown)\r\n }\r\n}\r\n","export class ImageObserver {\r\n private promiseList: Promise<unknown>[]\r\n\r\n constructor() {\r\n this.promiseList = []\r\n }\r\n\r\n public add(payload: Promise<unknown>) {\r\n this.promiseList.push(payload)\r\n }\r\n\r\n public clearAll() {\r\n this.promiseList = []\r\n }\r\n\r\n public allSettled() {\r\n return Promise.allSettled(this.promiseList)\r\n }\r\n}\r\n","import { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { throttle } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { I18n } from '../plugin-stubs'\r\nimport { Zone } from './Zone'\r\n\r\nexport class ZoneTip {\r\n private draw: Draw\r\n private zone: Zone\r\n private i18n: I18n\r\n private container: HTMLDivElement\r\n private pageContainer: HTMLDivElement\r\n\r\n private isDisableMouseMove: boolean\r\n private tipContainer: HTMLDivElement\r\n private tipContent: HTMLSpanElement\r\n private currentMoveZone: EditorZone | undefined\r\n\r\n constructor(draw: Draw, zone: Zone) {\r\n this.draw = draw\r\n this.zone = zone\r\n this.i18n = draw.getI18n()\r\n this.container = draw.getContainer()\r\n this.pageContainer = draw.getPageContainer()\r\n\r\n const { tipContainer, tipContent } = this._drawZoneTip()\r\n this.tipContainer = tipContainer\r\n this.tipContent = tipContent\r\n this.isDisableMouseMove = true\r\n this.currentMoveZone = EditorZone.MAIN\r\n // 监听区域\r\n const watchZones: EditorZone[] = []\r\n const { header, footer } = draw.getOptions()\r\n if (!header.disabled) {\r\n watchZones.push(EditorZone.HEADER)\r\n }\r\n if (!footer.disabled) {\r\n watchZones.push(EditorZone.FOOTER)\r\n }\r\n if (watchZones.length) {\r\n this._watchMouseMoveZoneChange(watchZones)\r\n }\r\n }\r\n\r\n private _watchMouseMoveZoneChange(watchZones: EditorZone[]) {\r\n this.pageContainer.addEventListener(\r\n 'mousemove',\r\n throttle((evt: MouseEvent) => {\r\n if (this.isDisableMouseMove || !this.draw.getIsPagingMode()) return\r\n if (!evt.offsetY) return\r\n if (evt.target instanceof HTMLCanvasElement) {\r\n const mousemoveZone = this.zone.getZoneByY(evt.offsetY)\r\n if (!watchZones.includes(mousemoveZone)) {\r\n this._updateZoneTip(false)\r\n return\r\n }\r\n this.currentMoveZone = mousemoveZone\r\n // 激活区域是正文,移动区域是页眉、页脚时绘制\r\n this._updateZoneTip(\r\n this.zone.getZone() === EditorZone.MAIN &&\r\n (mousemoveZone === EditorZone.HEADER ||\r\n mousemoveZone === EditorZone.FOOTER),\r\n evt.x,\r\n evt.y\r\n )\r\n } else {\r\n this._updateZoneTip(false)\r\n }\r\n }, 250)\r\n )\r\n // mouseenter后mousemove有效,避免因节流导致的mouseleave后继续执行逻辑\r\n this.pageContainer.addEventListener('mouseenter', () => {\r\n this.isDisableMouseMove = false\r\n })\r\n this.pageContainer.addEventListener('mouseleave', () => {\r\n this.isDisableMouseMove = true\r\n this._updateZoneTip(false)\r\n })\r\n }\r\n\r\n private _drawZoneTip() {\r\n const tipContainer = document.createElement('div')\r\n tipContainer.classList.add(`${EDITOR_PREFIX}-zone-tip`)\r\n const tipContent = document.createElement('span')\r\n tipContainer.append(tipContent)\r\n this.container.append(tipContainer)\r\n return {\r\n tipContainer,\r\n tipContent\r\n }\r\n }\r\n\r\n private _updateZoneTip(visible: boolean, left?: number, top?: number) {\r\n if (visible) {\r\n this.tipContainer.classList.add('show')\r\n this.tipContainer.style.left = `${left}px`\r\n this.tipContainer.style.top = `${top}px`\r\n this.tipContent.innerText = this.i18n.t(\r\n `zone.${\r\n this.currentMoveZone === EditorZone.HEADER ? 'headerTip' : 'footerTip'\r\n }`\r\n )\r\n } else {\r\n this.tipContainer.classList.remove('show')\r\n }\r\n }\r\n}\r\n","import { EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { nextTick } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { I18n } from '../plugin-stubs'\r\nimport { ZoneTip } from './ZoneTip'\r\nimport { PAGE_NUMBER_STYLES } from '@vervedoc/docx-editor-schema'\r\n\r\nexport class Zone {\r\n private readonly INDICATOR_PADDING = 2\r\n private draw: Draw\r\n private options: Required<IEditorOption>\r\n private i18n: I18n\r\n private container: HTMLDivElement\r\n\r\n private currentZone: EditorZone\r\n private indicatorContainer: HTMLDivElement | null\r\n private pageNumberMenu: HTMLDivElement | null\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.i18n = draw.getI18n()\r\n this.options = draw.getOptions()\r\n this.container = draw.getContainer()\r\n this.currentZone = EditorZone.MAIN\r\n this.indicatorContainer = null\r\n this.pageNumberMenu = null\r\n // 区域提示\r\n if (!this.options.zone.tipDisabled) {\r\n new ZoneTip(draw, this)\r\n }\r\n }\r\n\r\n public isHeaderActive(): boolean {\r\n return this.getZone() === EditorZone.HEADER\r\n }\r\n\r\n public isMainActive(): boolean {\r\n return this.getZone() === EditorZone.MAIN\r\n }\r\n\r\n public isFooterActive(): boolean {\r\n return this.getZone() === EditorZone.FOOTER\r\n }\r\n\r\n public getZone(): EditorZone {\r\n return this.currentZone\r\n }\r\n\r\n public setZone(payload: EditorZone) {\r\n const { header, footer } = this.options\r\n if (\r\n (!header.editable && payload === EditorZone.HEADER) ||\r\n (!footer.editable && payload === EditorZone.FOOTER)\r\n ) {\r\n return\r\n }\r\n if (this.currentZone === payload) return\r\n this.currentZone = payload\r\n this.draw.getRange().clearRange()\r\n this.draw.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n // 指示器\r\n this.drawZoneIndicator()\r\n // 回调\r\n nextTick(() => {\r\n const listener = this.draw.getListener()\r\n if (listener.zoneChange) {\r\n listener.zoneChange(payload)\r\n }\r\n const eventBus = this.draw.getEventBus()\r\n if (eventBus.hasSubscribers('zoneChange')) {\r\n eventBus.emit('zoneChange', payload)\r\n }\r\n })\r\n }\r\n\r\n public getZoneByY(y: number): EditorZone {\r\n // 页眉底部距离页面顶部距离\r\n const header = this.draw.getHeader()\r\n const headerBottomY = header.getExtraHeight() + this.draw.getMargins()[0]\r\n // 页脚上部距离页面顶部距离\r\n const footer = this.draw.getFooter()\r\n const pageHeight = this.draw.getHeight()\r\n const footerTopY =\r\n pageHeight - (footer.getExtraHeight() + this.draw.getMargins()[2])\r\n // 页眉:当前位置小于页眉底部位置\r\n if (y < headerBottomY) {\r\n return EditorZone.HEADER\r\n }\r\n // 页脚:当前位置大于页脚顶部位置\r\n if (y > footerTopY) {\r\n return EditorZone.FOOTER\r\n }\r\n return EditorZone.MAIN\r\n }\r\n\r\n public drawZoneIndicator() {\r\n this._clearZoneIndicator()\r\n if (!this.isHeaderActive() && !this.isFooterActive()) return\r\n const { scale } = this.options\r\n const isHeaderActive = this.isHeaderActive()\r\n const pageList = this.draw.getPageList()\r\n const margins = this.draw.getMargins()\r\n const innerWidth = this.draw.getInnerWidth()\r\n const pageHeight = this.draw.getHeight()\r\n const pageGap = this.draw.getPageGap()\r\n const preY = pageHeight + pageGap\r\n // 创建指示器容器\r\n this.indicatorContainer = document.createElement('div')\r\n this.indicatorContainer.classList.add(`${EDITOR_PREFIX}-zone-indicator`)\r\n // 指示器位置\r\n const header = this.draw.getHeader()\r\n const footer = this.draw.getFooter()\r\n const indicatorHeight = isHeaderActive\r\n ? header.getHeight()\r\n : footer.getHeight()\r\n const indicatorTop = isHeaderActive\r\n ? header.getHeaderTop()\r\n : pageHeight - footer.getFooterBottom() - indicatorHeight\r\n for (let p = 0; p < pageList.length; p++) {\r\n const startY = preY * p + indicatorTop\r\n const indicatorLeftX = margins[3] - this.INDICATOR_PADDING\r\n const indicatorRightX = margins[3] + innerWidth + this.INDICATOR_PADDING\r\n const indicatorTopY = isHeaderActive\r\n ? startY - this.INDICATOR_PADDING\r\n : startY + indicatorHeight + this.INDICATOR_PADDING\r\n const indicatorBottomY = isHeaderActive\r\n ? startY + indicatorHeight + this.INDICATOR_PADDING\r\n : startY - this.INDICATOR_PADDING\r\n\r\n // 工具栏行\r\n const toolbar = document.createElement('div')\r\n toolbar.classList.add(`${EDITOR_PREFIX}-zone-toolbar`)\r\n toolbar.style.top = `${indicatorBottomY}px`\r\n toolbar.style.left = `${margins[3]}px`\r\n toolbar.style.width = `${innerWidth}px`\r\n toolbar.style.transform = `scale(${scale})`\r\n toolbar.style.transformOrigin = '0 0'\r\n\r\n // 左侧标签\r\n const labelLeft = document.createElement('div')\r\n labelLeft.classList.add(`${EDITOR_PREFIX}-zone-toolbar-label`)\r\n const zoneName = this._getZoneName(isHeaderActive)\r\n labelLeft.innerText = `${zoneName} - 第 ${p + 1} 节-`\r\n toolbar.append(labelLeft)\r\n\r\n // 右侧插入页码按钮\r\n const btnInsertPageNo = document.createElement('div')\r\n btnInsertPageNo.classList.add(`${EDITOR_PREFIX}-zone-toolbar-btn`)\r\n btnInsertPageNo.innerHTML = `<svg viewBox=\"0 0 1024 1024\" width=\"14\" height=\"14\"><path d=\"M896 896H128V128h576v64H192v640h640V448h64v448z\" fill=\"#0078d4\"></path><path d=\"M640 192h192v64H640zM704 128h64v192h-64z\" fill=\"#0078d4\"></path><path d=\"M352 448h320v64H352zM352 576h256v64H352zM352 320h192v64H352z\" fill=\"#0078d4\"></path></svg><span>插入页码</span><svg viewBox=\"0 0 1024 1024\" width=\"12\" height=\"12\"><path d=\"M512 714.667l-298.667-298.667h597.333z\" fill=\"currentColor\"></path></svg>`\r\n btnInsertPageNo.onclick = (e) => {\r\n e.stopPropagation()\r\n this._showPageNumberMenu(btnInsertPageNo)\r\n }\r\n toolbar.append(btnInsertPageNo)\r\n\r\n this.indicatorContainer.append(toolbar)\r\n\r\n // 上边线\r\n const lineTop = document.createElement('span')\r\n lineTop.classList.add(`${EDITOR_PREFIX}-zone-indicator-border__top`)\r\n lineTop.style.top = `${indicatorTopY}px`\r\n lineTop.style.width = `${innerWidth}px`\r\n lineTop.style.marginLeft = `${margins[3]}px`\r\n this.indicatorContainer.append(lineTop)\r\n\r\n // 左边线\r\n const lineLeft = document.createElement('span')\r\n lineLeft.classList.add(`${EDITOR_PREFIX}-zone-indicator-border__left`)\r\n lineLeft.style.top = `${startY}px`\r\n lineLeft.style.height = `${indicatorHeight}px`\r\n lineLeft.style.left = `${indicatorLeftX}px`\r\n this.indicatorContainer.append(lineLeft)\r\n\r\n // 下边线\r\n const lineBottom = document.createElement('span')\r\n lineBottom.classList.add(`${EDITOR_PREFIX}-zone-indicator-border__bottom`)\r\n lineBottom.style.top = `${indicatorBottomY}px`\r\n this.indicatorContainer.append(lineBottom)\r\n\r\n // 右边线\r\n const lineRight = document.createElement('span')\r\n lineRight.classList.add(`${EDITOR_PREFIX}-zone-indicator-border__right`)\r\n lineRight.style.top = `${startY}px`\r\n lineRight.style.height = `${indicatorHeight}px`\r\n lineRight.style.left = `${indicatorRightX}px`\r\n this.indicatorContainer.append(lineRight)\r\n }\r\n this.container.append(this.indicatorContainer)\r\n }\r\n\r\n private _showPageNumberMenu(target: HTMLElement) {\r\n // 移除已有菜单\r\n this._hidePageNumberMenu()\r\n\r\n const rect = target.getBoundingClientRect()\r\n const menu = document.createElement('div')\r\n menu.classList.add(`${EDITOR_PREFIX}-zone-pagenumber-menu`)\r\n menu.style.top = `${rect.bottom + 2}px`\r\n menu.style.left = `${rect.left}px`\r\n\r\n PAGE_NUMBER_STYLES.forEach(item => {\r\n const menuItem = document.createElement('div')\r\n menuItem.classList.add(`${EDITOR_PREFIX}-zone-pagenumber-menu-item`)\r\n menuItem.innerText = item.label\r\n menuItem.onclick = (e) => {\r\n e.stopPropagation()\r\n this._insertPageNumber(item.value, item.numberType)\r\n this._hidePageNumberMenu()\r\n }\r\n menu.append(menuItem)\r\n })\r\n\r\n document.body.append(menu)\r\n this.pageNumberMenu = menu\r\n\r\n // 滚动时关闭菜单\r\n const scrollHandler = () => this._hidePageNumberMenu()\r\n window.addEventListener('scroll', scrollHandler, true)\r\n ;(menu as any)._scrollHandler = scrollHandler\r\n\r\n // 点击其他地方关闭菜单\r\n const closeHandler = (e: MouseEvent) => {\r\n if (!menu.contains(e.target as Node)) {\r\n this._hidePageNumberMenu()\r\n }\r\n }\r\n setTimeout(() => {\r\n document.addEventListener('click', closeHandler)\r\n }, 0)\r\n ;(menu as any)._closeHandler = closeHandler\r\n }\r\n\r\n private _hidePageNumberMenu() {\r\n if (this.pageNumberMenu) {\r\n // 移除滚动监听\r\n const scrollHandler = (this.pageNumberMenu as any)._scrollHandler\r\n if (scrollHandler) {\r\n window.removeEventListener('scroll', scrollHandler, true)\r\n }\r\n // 移除点击监听\r\n const closeHandler = (this.pageNumberMenu as any)._closeHandler\r\n if (closeHandler) {\r\n document.removeEventListener('click', closeHandler)\r\n }\r\n this.pageNumberMenu.remove()\r\n this.pageNumberMenu = null\r\n }\r\n }\r\n\r\n private _insertPageNumber(format: string, numberType?: any) {\r\n const options = this.draw.getOptions()\r\n // 设置页码格式\r\n options.pageNumber = options.pageNumber || {}\r\n const pageNumberOptions = options.pageNumber as any\r\n pageNumberOptions.format = format\r\n if (numberType) {\r\n pageNumberOptions.numberType = numberType\r\n }\r\n // 重新渲染\r\n this.draw.render({\r\n isSubmitHistory: true,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n private _getZoneName(isHeader: boolean) {\r\n const key = `frame.${isHeader ? 'header' : 'footer'}`\r\n const zoneName = this.i18n.t(key)\r\n if (zoneName && zoneName !== key) {\r\n return zoneName\r\n }\r\n return isHeader ? '页眉' : '页脚'\r\n }\r\n\r\n private _clearZoneIndicator() {\r\n this.indicatorContainer?.remove()\r\n this.indicatorContainer = null\r\n this._hidePageNumberMenu()\r\n }\r\n}\r\n","import { maxHeightRadioMapping } from '@vervedoc/docx-editor-schema'\r\nimport { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { IRow } from '@vervedoc/docx-editor-schema'\r\nimport { Position } from '../position/Position'\r\nimport { Zone } from '../zone/Zone'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Footer {\r\n private draw: Draw\r\n private position: Position\r\n private zone: Zone\r\n private options: DeepRequired<IEditorOption>\r\n\r\n private elementList: IElement[]\r\n private rowList: IRow[]\r\n private positionList: IElementPosition[]\r\n\r\n constructor(draw: Draw, data?: IElement[]) {\r\n this.draw = draw\r\n this.position = draw.getPosition()\r\n this.zone = draw.getZone()\r\n this.options = draw.getOptions()\r\n\r\n this.elementList = data || []\r\n this.rowList = []\r\n this.positionList = []\r\n }\r\n\r\n public getRowList(): IRow[] {\r\n return this.rowList\r\n }\r\n\r\n public setElementList(elementList: IElement[]) {\r\n this.elementList = elementList\r\n }\r\n\r\n public getElementList(): IElement[] {\r\n return this.elementList\r\n }\r\n\r\n public getPositionList(): IElementPosition[] {\r\n return this.positionList\r\n }\r\n\r\n public compute() {\r\n this.recovery()\r\n this._computeRowList()\r\n this._computePositionList()\r\n }\r\n\r\n public recovery() {\r\n this.rowList = []\r\n this.positionList = []\r\n }\r\n\r\n private _computeRowList() {\r\n const innerWidth = this.draw.getInnerWidth()\r\n this.rowList = this.draw.computeRowList({\r\n innerWidth,\r\n elementList: this.elementList\r\n })\r\n }\r\n\r\n private _computePositionList() {\r\n const footerBottom = this.getFooterBottom()\r\n const innerWidth = this.draw.getInnerWidth()\r\n const margins = this.draw.getMargins()\r\n const startX = margins[3]\r\n // 页面高度 - 页脚顶部距离页面底部高度\r\n const pageHeight = this.draw.getHeight()\r\n const footerHeight = this.getHeight()\r\n const startY = pageHeight - footerBottom - footerHeight\r\n this.position.computePageRowPosition({\r\n positionList: this.positionList,\r\n rowList: this.rowList,\r\n pageNo: 0,\r\n startRowIndex: 0,\r\n startIndex: 0,\r\n startX,\r\n startY,\r\n innerWidth,\r\n zone: EditorZone.FOOTER\r\n })\r\n }\r\n\r\n public getFooterBottom(): number {\r\n const {\r\n footer: { bottom, disabled },\r\n scale\r\n } = this.options\r\n if (disabled) return 0\r\n return Math.floor(bottom * scale)\r\n }\r\n\r\n public getMaxHeight(): number {\r\n const {\r\n footer: { maxHeightRadio }\r\n } = this.options\r\n const height = this.draw.getHeight()\r\n return Math.floor(height * maxHeightRadioMapping[maxHeightRadio])\r\n }\r\n\r\n public getHeight(): number {\r\n const maxHeight = this.getMaxHeight()\r\n const rowHeight = this.getRowHeight()\r\n return rowHeight > maxHeight ? maxHeight : rowHeight\r\n }\r\n\r\n public getRowHeight(): number {\r\n return this.rowList.reduce((pre, cur) => pre + cur.height, 0)\r\n }\r\n\r\n public getExtraHeight(): number {\r\n // 页脚下边距 + 实际高 - 页面上边距\r\n const margins = this.draw.getMargins()\r\n const footerHeight = this.getHeight()\r\n const footerBottom = this.getFooterBottom()\r\n const extraHeight = footerBottom + footerHeight - margins[2]\r\n return extraHeight <= 0 ? 0 : extraHeight\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n ctx.save()\r\n ctx.globalAlpha = this.zone.isFooterActive()\r\n ? 1\r\n : this.options.footer.inactiveAlpha\r\n const innerWidth = this.draw.getInnerWidth()\r\n const maxHeight = this.getMaxHeight()\r\n // 超出最大高度不渲染\r\n const rowList: IRow[] = []\r\n let curRowHeight = 0\r\n for (let r = 0; r < this.rowList.length; r++) {\r\n const row = this.rowList[r]\r\n if (curRowHeight + row.height > maxHeight) {\r\n break\r\n }\r\n rowList.push(row)\r\n curRowHeight += row.height\r\n }\r\n this.draw.drawRow(ctx, {\r\n elementList: this.elementList,\r\n positionList: this.positionList,\r\n rowList,\r\n pageNo,\r\n startIndex: 0,\r\n innerWidth,\r\n zone: EditorZone.FOOTER,\r\n isDrawLineBreak: false\r\n })\r\n ctx.restore()\r\n }\r\n}\r\n","import { UlStyle } from '@vervedoc/docx-editor-schema'\r\n\r\nexport class ListSymbolDrawer {\r\n public drawSymbol(\r\n ctx: CanvasRenderingContext2D,\r\n style: UlStyle,\r\n x: number,\r\n y: number,\r\n fontSize: number,\r\n color: string\r\n ): void {\r\n ctx.save()\r\n ctx.fillStyle = color\r\n ctx.strokeStyle = color\r\n ctx.lineWidth = Math.max(1.5, fontSize * 0.08)\r\n\r\n const size = fontSize * 0.6\r\n const centerY = y\r\n\r\n switch (style) {\r\n case UlStyle.DISC:\r\n this.drawDisc(ctx, x, centerY, size)\r\n break\r\n case UlStyle.CIRCLE:\r\n this.drawCircle(ctx, x, centerY, size)\r\n break\r\n case UlStyle.SQUARE:\r\n this.drawSquare(ctx, x, centerY, size, true)\r\n break\r\n case UlStyle.DIAMOND:\r\n case UlStyle.DIAMOND_SOLID:\r\n this.drawDiamond(ctx, x, centerY, size, true)\r\n break\r\n case UlStyle.DASH:\r\n this.drawDash(ctx, x, centerY, size)\r\n break\r\n case UlStyle.CHECK:\r\n this.drawCheck(ctx, x, centerY, size)\r\n break\r\n case UlStyle.TRIANGLE:\r\n case UlStyle.TRIANGLE_SOLID:\r\n this.drawTriangle(ctx, x, centerY, size, true)\r\n break\r\n case UlStyle.STAR:\r\n case UlStyle.STAR_SOLID:\r\n this.drawStar(ctx, x, centerY, size, true)\r\n break\r\n case UlStyle.ARROW:\r\n this.drawArrow(ctx, x, centerY, size)\r\n break\r\n case UlStyle.ANGLE:\r\n this.drawAngle(ctx, x, centerY, size)\r\n break\r\n case UlStyle.HOLLOW_CIRCLE:\r\n this.drawCircle(ctx, x, centerY, size)\r\n break\r\n case UlStyle.HOLLOW_SQUARE:\r\n this.drawSquare(ctx, x, centerY, size, false)\r\n break\r\n case UlStyle.HEART_HOLLOW:\r\n this.drawHeart(ctx, x, centerY, size, false)\r\n break\r\n case UlStyle.HASH:\r\n this.drawHash(ctx, x, centerY, size)\r\n break\r\n case UlStyle.HEART_SOLID:\r\n this.drawHeart(ctx, x, centerY, size, true)\r\n break\r\n case UlStyle.FLOWER:\r\n this.drawFlower(ctx, x, centerY, size)\r\n break\r\n case UlStyle.ASTERISK:\r\n this.drawAsterisk(ctx, x, centerY, size)\r\n break\r\n case UlStyle.HOLLOW_DIAMOND:\r\n this.drawDiamond(ctx, x, centerY, size, false)\r\n break\r\n case UlStyle.HOLLOW_TRIANGLE:\r\n this.drawTriangle(ctx, x, centerY, size, false)\r\n break\r\n default:\r\n this.drawDisc(ctx, x, centerY, size)\r\n }\r\n\r\n ctx.restore()\r\n }\r\n\r\n private drawDisc(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n ctx.beginPath()\r\n ctx.arc(x, y, size * 0.5, 0, Math.PI * 2)\r\n ctx.fill()\r\n }\r\n\r\n private drawCircle(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n ctx.beginPath()\r\n ctx.arc(x, y, size * 0.5, 0, Math.PI * 2)\r\n ctx.stroke()\r\n }\r\n\r\n private drawSquare(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number,\r\n filled: boolean\r\n ): void {\r\n const half = size * 0.5\r\n ctx.beginPath()\r\n ctx.rect(x - half, y - half, size, size)\r\n if (filled) {\r\n ctx.fill()\r\n } else {\r\n ctx.stroke()\r\n }\r\n }\r\n\r\n private drawDiamond(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number,\r\n filled: boolean\r\n ): void {\r\n const half = size * 0.6\r\n ctx.beginPath()\r\n ctx.moveTo(x, y - half)\r\n ctx.lineTo(x + half, y)\r\n ctx.lineTo(x, y + half)\r\n ctx.lineTo(x - half, y)\r\n ctx.closePath()\r\n if (filled) {\r\n ctx.fill()\r\n } else {\r\n ctx.stroke()\r\n }\r\n }\r\n\r\n private drawDash(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const half = size * 0.6\r\n ctx.beginPath()\r\n ctx.moveTo(x - half, y)\r\n ctx.lineTo(x + half, y)\r\n ctx.stroke()\r\n }\r\n\r\n private drawCheck(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const scale = size * 0.04\r\n ctx.beginPath()\r\n ctx.moveTo(x - size * 0.3, y)\r\n ctx.lineTo(x - size * 0.1, y + size * 0.25)\r\n ctx.lineTo(x + size * 0.35, y - size * 0.25)\r\n ctx.lineWidth = Math.max(1.5, scale * 4)\r\n ctx.stroke()\r\n }\r\n\r\n private drawTriangle(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number,\r\n filled: boolean\r\n ): void {\r\n const half = size * 0.55\r\n ctx.beginPath()\r\n ctx.moveTo(x - half, y - half * 0.6)\r\n ctx.lineTo(x + half, y)\r\n ctx.lineTo(x - half, y + half * 0.6)\r\n ctx.closePath()\r\n if (filled) {\r\n ctx.fill()\r\n } else {\r\n ctx.stroke()\r\n }\r\n }\r\n\r\n private drawStar(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number,\r\n filled: boolean\r\n ): void {\r\n const outerRadius = size * 0.55\r\n const innerRadius = outerRadius * 0.4\r\n const points = 5\r\n const step = Math.PI / points\r\n\r\n ctx.beginPath()\r\n for (let i = 0; i < 2 * points; i++) {\r\n const radius = i % 2 === 0 ? outerRadius : innerRadius\r\n const angle = i * step - Math.PI / 2\r\n const px = x + radius * Math.cos(angle)\r\n const py = y + radius * Math.sin(angle)\r\n if (i === 0) {\r\n ctx.moveTo(px, py)\r\n } else {\r\n ctx.lineTo(px, py)\r\n }\r\n }\r\n ctx.closePath()\r\n if (filled) {\r\n ctx.fill()\r\n } else {\r\n ctx.stroke()\r\n }\r\n }\r\n\r\n private drawArrow(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const half = size * 0.5\r\n ctx.beginPath()\r\n ctx.moveTo(x - half * 0.3, y - half)\r\n ctx.lineTo(x + half, y)\r\n ctx.lineTo(x - half * 0.3, y + half)\r\n ctx.lineTo(x - half * 0.3, y)\r\n ctx.closePath()\r\n ctx.fill()\r\n }\r\n\r\n private drawAngle(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const half = size * 0.5\r\n ctx.beginPath()\r\n ctx.moveTo(x - half, y - half * 0.8)\r\n ctx.lineTo(x + half * 0.3, y)\r\n ctx.lineTo(x - half, y + half * 0.8)\r\n ctx.lineWidth = Math.max(1.5, size * 0.08)\r\n ctx.stroke()\r\n }\r\n\r\n private drawHeart(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number,\r\n filled: boolean\r\n ): void {\r\n const scale = size * 0.025\r\n ctx.beginPath()\r\n ctx.moveTo(x, y + scale * 4)\r\n ctx.bezierCurveTo(\r\n x - scale * 5,\r\n y + scale * 1,\r\n x - scale * 6,\r\n y - scale * 4,\r\n x,\r\n y - scale * 2\r\n )\r\n ctx.bezierCurveTo(\r\n x + scale * 6,\r\n y - scale * 4,\r\n x + scale * 5,\r\n y + scale * 1,\r\n x,\r\n y + scale * 4\r\n )\r\n ctx.closePath()\r\n if (filled) {\r\n ctx.fill()\r\n } else {\r\n ctx.stroke()\r\n }\r\n }\r\n\r\n private drawHash(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const half = size * 0.5\r\n const offset = size * 0.2\r\n ctx.beginPath()\r\n ctx.moveTo(x - half * 0.5, y - half)\r\n ctx.lineTo(x + half * 0.5, y + half)\r\n ctx.moveTo(x + half * 0.5, y - half)\r\n ctx.lineTo(x - half * 0.5, y + half)\r\n ctx.moveTo(x - half, y - offset)\r\n ctx.lineTo(x + half, y - offset)\r\n ctx.moveTo(x - half, y + offset)\r\n ctx.lineTo(x + half, y + offset)\r\n ctx.lineWidth = Math.max(1, size * 0.06)\r\n ctx.stroke()\r\n }\r\n\r\n private drawFlower(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const petalRadius = size * 0.25\r\n const centerOffset = size * 0.2\r\n const petals = 5\r\n\r\n for (let i = 0; i < petals; i++) {\r\n const angle = (i * 2 * Math.PI) / petals - Math.PI / 2\r\n const px = x + centerOffset * Math.cos(angle)\r\n const py = y + centerOffset * Math.sin(angle)\r\n ctx.beginPath()\r\n ctx.arc(px, py, petalRadius, 0, Math.PI * 2)\r\n ctx.fill()\r\n }\r\n\r\n ctx.beginPath()\r\n ctx.arc(x, y, petalRadius * 0.6, 0, Math.PI * 2)\r\n ctx.fill()\r\n }\r\n\r\n private drawAsterisk(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n size: number\r\n ): void {\r\n const half = size * 0.5\r\n const lines = 4\r\n ctx.beginPath()\r\n for (let i = 0; i < lines; i++) {\r\n const angle = (i * Math.PI) / lines\r\n const dx = half * Math.cos(angle)\r\n const dy = half * Math.sin(angle)\r\n ctx.moveTo(x - dx, y - dy)\r\n ctx.lineTo(x + dx, y + dy)\r\n }\r\n ctx.lineWidth = Math.max(1.5, size * 0.08)\r\n ctx.stroke()\r\n }\r\n\r\n public getSymbolWidth(style: UlStyle, fontSize: number): number {\r\n const size = fontSize * 0.6\r\n switch (style) {\r\n case UlStyle.DISC:\r\n case UlStyle.CIRCLE:\r\n case UlStyle.HOLLOW_CIRCLE:\r\n return size\r\n case UlStyle.SQUARE:\r\n case UlStyle.HOLLOW_SQUARE:\r\n return size\r\n case UlStyle.DIAMOND:\r\n case UlStyle.DIAMOND_SOLID:\r\n case UlStyle.HOLLOW_DIAMOND:\r\n return size * 1.2\r\n case UlStyle.DASH:\r\n return size * 1.2\r\n case UlStyle.CHECK:\r\n return size * 0.7\r\n case UlStyle.TRIANGLE:\r\n case UlStyle.TRIANGLE_SOLID:\r\n case UlStyle.HOLLOW_TRIANGLE:\r\n return size * 1.1\r\n case UlStyle.STAR:\r\n case UlStyle.STAR_SOLID:\r\n return size * 1.1\r\n case UlStyle.ARROW:\r\n return size * 1.5\r\n case UlStyle.ANGLE:\r\n return size * 1.3\r\n case UlStyle.HEART_HOLLOW:\r\n case UlStyle.HEART_SOLID:\r\n return size * 1.2\r\n case UlStyle.HASH:\r\n return size\r\n case UlStyle.FLOWER:\r\n return size * 0.9\r\n case UlStyle.ASTERISK:\r\n return size\r\n default:\r\n return size\r\n }\r\n }\r\n}\r\n","import { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { KeyMap } from '@vervedoc/docx-editor-schema'\r\nimport { ListStyle, ListType, OlStyle, UlStyle } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement, IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { IRow, IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { getUUID } from '@vervedoc/docx-editor-schema'\r\nimport { isParagraphSeparator } from '@vervedoc/docx-editor-schema'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../draw/Draw'\r\nimport { ListSymbolDrawer } from './ListSymbolDrawer'\r\n\r\nexport class ListParticle {\r\n private draw: Draw\r\n private range: RangeManager\r\n private options: DeepRequired<IEditorOption>\r\n private symbolDrawer: ListSymbolDrawer\r\n\r\n private readonly MEASURE_BASE_TEXT = '0'\r\n private readonly LIST_GAP = 10\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.range = draw.getRange()\r\n this.options = draw.getOptions()\r\n this.symbolDrawer = new ListSymbolDrawer()\r\n }\r\n\r\n public setList(listType: ListType | null, listStyle?: ListStyle) {\r\n const isReadonly = this.draw.isReadonly()\r\n if (isReadonly) return\r\n const { startIndex, endIndex } = this.range.getRange()\r\n if (!~startIndex && !~endIndex) return\r\n // 需要改变的元素列表\r\n const changeElementList = this.range.getRangeParagraphElementList()\r\n if (!changeElementList || !changeElementList.length) return\r\n // 如果包含列表则设置为取消列表\r\n const isUnsetList = changeElementList.find(\r\n el => el.listType === listType && el.listStyle === listStyle\r\n )\r\n if (isUnsetList || !listType) {\r\n this.unsetList()\r\n return\r\n }\r\n // 设置值\r\n const listId = getUUID()\r\n changeElementList.forEach(el => {\r\n el.listId = listId\r\n el.listType = listType\r\n el.listStyle = listStyle\r\n })\r\n // 光标定位\r\n const isSetCursor = startIndex === endIndex\r\n const curIndex = isSetCursor ? endIndex : startIndex\r\n this.draw.render({ curIndex, isSetCursor })\r\n }\r\n\r\n public unsetList() {\r\n const isReadonly = this.draw.isReadonly()\r\n if (isReadonly) return\r\n const { startIndex, endIndex } = this.range.getRange()\r\n if (!~startIndex && !~endIndex) return\r\n // 需要改变的元素列表\r\n const changeElementList = this.range\r\n .getRangeParagraphElementList()\r\n ?.filter(el => el.listId)\r\n if (!changeElementList || !changeElementList.length) return\r\n // 如果列表最后字符不是换行符则需插入换行符\r\n const elementList = this.draw.getElementList()\r\n const endElement = elementList[endIndex]\r\n if (endElement.listId) {\r\n let start = endIndex + 1\r\n while (start < elementList.length) {\r\n const element = elementList[start]\r\n if (isParagraphSeparator(element)) break\r\n if (element.listId !== endElement.listId) {\r\n this.draw.spliceElementList(elementList, start, 0, [\r\n {\r\n value: ZERO\r\n }\r\n ])\r\n break\r\n }\r\n start++\r\n }\r\n }\r\n // 取消设置\r\n changeElementList.forEach(el => {\r\n delete el.listId\r\n delete el.listType\r\n delete el.listStyle\r\n delete el.listWrap\r\n })\r\n // 光标定位\r\n const isSetCursor = startIndex === endIndex\r\n const curIndex = isSetCursor ? endIndex : startIndex\r\n this.draw.render({ curIndex, isSetCursor })\r\n }\r\n\r\n public computeListStyle(\r\n ctx: CanvasRenderingContext2D,\r\n elementList: IElement[]\r\n ): Map<string, number> {\r\n const listStyleMap = new Map<string, number>()\r\n let start = 0\r\n let curListId = elementList[start].listId\r\n let curElementList: IElement[] = []\r\n const elementLength = elementList.length\r\n while (start < elementLength) {\r\n const curElement = elementList[start]\r\n if (curListId && curListId === curElement.listId) {\r\n curElementList.push(curElement)\r\n } else {\r\n if (curElement.listId && curElement.listId !== curListId) {\r\n // 列表结束\r\n if (curElementList.length) {\r\n const width = this.getListStyleWidth(ctx, curElementList)\r\n listStyleMap.set(curListId!, width)\r\n }\r\n curListId = curElement.listId\r\n curElementList = curListId ? [curElement] : []\r\n }\r\n }\r\n start++\r\n }\r\n if (curElementList.length) {\r\n const width = this.getListStyleWidth(ctx, curElementList)\r\n listStyleMap.set(curListId!, width)\r\n }\r\n return listStyleMap\r\n }\r\n\r\n public getListStyleWidth(\r\n ctx: CanvasRenderingContext2D,\r\n listElementList: IElement[]\r\n ): number {\r\n const { scale, checkbox, defaultSize, defaultFont } = this.options\r\n const startElement = listElementList[0]\r\n // 获取元素实际字号和字体(优先从第一个非换行符元素获取)\r\n let referenceElement = startElement\r\n for (let i = 1; i < listElementList.length; i++) {\r\n const el = listElementList[i]\r\n if (el.value !== ZERO && el.value !== '\\t') {\r\n referenceElement = el\r\n break\r\n }\r\n }\r\n const elementSize = referenceElement.actualSize || referenceElement.size || defaultSize\r\n const elementFont = referenceElement.font || defaultFont\r\n const fontSize = elementSize * scale\r\n // 非递增样式(UL项目符号等)基于字号计算宽度\r\n if (\r\n startElement.listStyle &&\r\n startElement.listStyle !== ListStyle.DECIMAL\r\n ) {\r\n if (startElement.listStyle === ListStyle.CHECKBOX) {\r\n return (checkbox.width + this.LIST_GAP) * scale\r\n }\r\n if (startElement.listType === ListType.UL) {\r\n const symbolWidth = this.symbolDrawer.getSymbolWidth(\r\n <UlStyle>(<unknown>startElement.listStyle),\r\n fontSize\r\n )\r\n return Math.ceil(symbolWidth + this.LIST_GAP * scale)\r\n }\r\n // 有序列表固定样式\r\n ctx.save()\r\n ctx.font = `${fontSize}px ${elementFont}`\r\n const symbolText = this.getOlValue(<OlStyle>(<unknown>startElement.listStyle), 1)\r\n const symbolMetrics = ctx.measureText(symbolText)\r\n ctx.restore()\r\n return Math.ceil((symbolMetrics.width + this.LIST_GAP) * scale)\r\n }\r\n // 计算列表数量\r\n const count = listElementList.reduce((pre, cur) => {\r\n if (cur.value === ZERO) {\r\n pre += 1\r\n }\r\n return pre\r\n }, 0)\r\n if (!count) return 0\r\n // 以递增样式最大宽度为准,使用元素字号测量\r\n const text = `${this.MEASURE_BASE_TEXT.repeat(String(count).length)}${\r\n KeyMap.PERIOD\r\n }`\r\n ctx.save()\r\n ctx.font = `${fontSize}px ${elementFont}`\r\n const textMetrics = ctx.measureText(text)\r\n ctx.restore()\r\n return Math.ceil((textMetrics.width + this.LIST_GAP) * scale)\r\n }\r\n\r\n public drawListStyle(\r\n ctx: CanvasRenderingContext2D,\r\n row: IRow,\r\n position: IElementPosition\r\n ) {\r\n const { elementList, offsetX, listIndex, ascent, height } = row\r\n const startElement = elementList[0]\r\n if (startElement.value !== ZERO || startElement.listWrap) return\r\n // tab width\r\n let tabWidth = 0\r\n const { defaultTabWidth, scale, defaultFont, defaultSize } = this.options\r\n for (let i = 1; i < elementList.length; i++) {\r\n const element = elementList[i]\r\n if (element?.type !== ElementType.TAB) break\r\n tabWidth += defaultTabWidth * scale\r\n }\r\n // 列表样式渲染\r\n const {\r\n coordinate: {\r\n leftTop: [startX, startY]\r\n }\r\n } = position\r\n const x =\r\n startX - offsetX! + tabWidth - (startElement.listHanging || 0) * this.options.scale\r\n // 复选框样式特殊处理\r\n if (startElement.listStyle === ListStyle.CHECKBOX) {\r\n const { width, height: checkboxHeight, gap } = this.options.checkbox\r\n const checkboxRowElement: IRowElement = {\r\n ...startElement,\r\n checkbox: {\r\n value: !!startElement.checkbox?.value\r\n },\r\n metrics: {\r\n ...startElement.metrics,\r\n width: (width + gap * 2) * scale,\r\n height: checkboxHeight * scale\r\n }\r\n }\r\n this.draw.getCheckboxParticle().render({\r\n ctx,\r\n x: x - gap * scale,\r\n y: startY + ascent,\r\n index: 0,\r\n row: {\r\n ...row,\r\n elementList: [checkboxRowElement, ...row.elementList]\r\n }\r\n })\r\n return\r\n }\r\n // 获取元素字号和颜色(优先从第一个非换行符元素获取)\r\n let referenceElement = startElement\r\n for (let i = 1; i < elementList.length; i++) {\r\n const el = elementList[i]\r\n if (el.value !== ZERO && el.value !== '\\t') {\r\n referenceElement = el\r\n break\r\n }\r\n }\r\n const elementSize = referenceElement.actualSize || referenceElement.size || defaultSize\r\n const fontSize = elementSize * scale\r\n const color = referenceElement.color || this.options.defaultColor\r\n // 计算垂直居中位置:使用行高的一半作为垂直中心\r\n const baselineY = startY + ascent\r\n const rowCenterY = startY + height / 2\r\n // 无序列表使用 Canvas Path 绘制符号\r\n if (startElement.listType === ListType.UL) {\r\n const style = <UlStyle>(<unknown>startElement.listStyle) || UlStyle.DISC\r\n const symbolWidth = this.symbolDrawer.getSymbolWidth(style, fontSize)\r\n const symbolX = x + symbolWidth / 2\r\n this.symbolDrawer.drawSymbol(ctx, style, symbolX, rowCenterY, fontSize, color)\r\n } else {\r\n // 有序列表使用文字绘制\r\n const elementFont = referenceElement.font || defaultFont\r\n const text = this.getOlValue(\r\n <OlStyle>(<unknown>startElement.listStyle),\r\n listIndex! + 1\r\n )\r\n if (!text) return\r\n ctx.save()\r\n ctx.font = `${referenceElement.italic ? 'italic ' : ''}${referenceElement.bold ? 'bold ' : ''}${fontSize}px ${elementFont}`\r\n ctx.fillStyle = color\r\n ctx.fillText(text, x, baselineY)\r\n ctx.restore()\r\n }\r\n }\r\n\r\n private getOlValue(style: OlStyle, n: number): string {\r\n switch (style) {\r\n case OlStyle.CHINESE:\r\n return `${this.chineseFromNumber(n)}、`\r\n case OlStyle.CHINESE_BRACKET:\r\n return `(${this.chineseFromNumber(n)})`\r\n case OlStyle.DECIMAL_DOT:\r\n case OlStyle.DECIMAL:\r\n return `${n}${KeyMap.PERIOD}`\r\n case OlStyle.DECIMAL_PAREN:\r\n return `(${n})`\r\n case OlStyle.DECIMAL_BRACKET:\r\n return `${n})`\r\n case OlStyle.DECIMAL_CIRCLE:\r\n return this.circleFromNumber(n)\r\n case OlStyle.UPPER_ALPHA:\r\n return this.alphaFromNumber(n, true)\r\n case OlStyle.LOWER_ALPHA_DOT:\r\n return `${this.alphaFromNumber(n, false)}${KeyMap.PERIOD}`\r\n default:\r\n return `${n}${KeyMap.PERIOD}`\r\n }\r\n }\r\n\r\n private chineseFromNumber(n: number): string {\r\n const chineseNumbers = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']\r\n const chineseUnits = ['', '十', '百', '千']\r\n if (n === 0) return chineseNumbers[0]\r\n if (n < 10) return chineseNumbers[n]\r\n if (n === 10) return '十'\r\n if (n < 20) return `十${chineseNumbers[n % 10]}`\r\n\r\n let result = ''\r\n let unitIndex = 0\r\n while (n > 0) {\r\n const digit = n % 10\r\n if (digit !== 0) {\r\n result = chineseNumbers[digit] + chineseUnits[unitIndex] + result\r\n } else if (result !== '' && !result.startsWith(chineseNumbers[0])) {\r\n result = chineseNumbers[0] + result\r\n }\r\n n = Math.floor(n / 10)\r\n unitIndex++\r\n }\r\n return result.replace(/零+$/, '')\r\n }\r\n\r\n private circleFromNumber(n: number): string {\r\n const circles = [\r\n '①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩',\r\n '⑪', '⑫', '⑬', '⑭', '⑮', '⑯', '⑰', '⑱', '⑲', '⑳'\r\n ]\r\n return circles[n - 1] || String(n)\r\n }\r\n\r\n private alphaFromNumber(n: number, isUpper: boolean): string {\r\n let result = ''\r\n const base = isUpper ? 65 : 97\r\n while (n > 0) {\r\n n--\r\n result = String.fromCharCode(base + (n % 26)) + result\r\n n = Math.floor(n / 26)\r\n }\r\n return result\r\n }\r\n}\r\n","import { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class LineBreakParticle {\r\n private options: DeepRequired<IEditorOption>\r\n public static readonly WIDTH = 12\r\n public static readonly HEIGHT = 9\r\n public static readonly GAP = 3 // 距离左边间隙\r\n\r\n constructor(draw: Draw) {\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n element: IRowElement,\r\n x: number,\r\n y: number\r\n ) {\r\n const {\r\n scale,\r\n lineBreak: { color, lineWidth }\r\n } = this.options\r\n ctx.save()\r\n ctx.beginPath()\r\n // 换行符尺寸设置为9像素\r\n const top = y - (LineBreakParticle.HEIGHT * scale) / 2\r\n const left = x + element.metrics.width\r\n // 移动位置并设置缩放\r\n ctx.translate(left, top)\r\n ctx.scale(scale, scale)\r\n // 样式设置\r\n ctx.strokeStyle = color\r\n ctx.lineWidth = lineWidth\r\n ctx.lineCap = 'round'\r\n ctx.lineJoin = 'round'\r\n ctx.beginPath()\r\n // 回车折线\r\n ctx.moveTo(8, 0)\r\n ctx.lineTo(12, 0)\r\n ctx.lineTo(12, 6)\r\n ctx.lineTo(3, 6)\r\n // 箭头向上\r\n ctx.moveTo(3, 6)\r\n ctx.lineTo(6, 3)\r\n // 箭头向下\r\n ctx.moveTo(3, 6)\r\n ctx.lineTo(6, 9)\r\n ctx.stroke()\r\n ctx.closePath()\r\n ctx.restore()\r\n }\r\n}\r\n","import { IEditorOption, IElement } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { IPlaceholder } from '@vervedoc/docx-editor-schema'\r\nimport { IRow } from '@vervedoc/docx-editor-schema'\r\nimport { formatElementList } from '@vervedoc/docx-editor-schema'\r\nimport { Position } from '../position/Position'\r\nimport { Draw } from '../draw/Draw'\r\nimport { LineBreakParticle } from '../particle/LineBreakParticle'\r\n\r\nexport interface IPlaceholderRenderOption {\r\n placeholder: Required<IPlaceholder>\r\n startY?: number\r\n}\r\n\r\nexport class Placeholder {\r\n private draw: Draw\r\n private position: Position\r\n private options: DeepRequired<IEditorOption>\r\n\r\n private elementList: IElement[]\r\n private rowList: IRow[]\r\n private positionList: IElementPosition[]\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.position = draw.getPosition()\r\n this.options = <DeepRequired<IEditorOption>>draw.getOptions()\r\n\r\n this.elementList = []\r\n this.rowList = []\r\n this.positionList = []\r\n }\r\n\r\n private _recovery() {\r\n this.elementList = []\r\n this.rowList = []\r\n this.positionList = []\r\n }\r\n\r\n public _compute(options?: IPlaceholderRenderOption) {\r\n this._computeRowList()\r\n this._computePositionList(options)\r\n }\r\n\r\n private _computeRowList() {\r\n const innerWidth = this.draw.getInnerWidth()\r\n this.rowList = this.draw.computeRowList({\r\n innerWidth,\r\n elementList: this.elementList\r\n })\r\n }\r\n\r\n private _computePositionList(options?: IPlaceholderRenderOption) {\r\n const { lineBreak, scale } = this.options\r\n const headerExtraHeight = this.draw.getHeader().getExtraHeight()\r\n const innerWidth = this.draw.getInnerWidth()\r\n const margins = this.draw.getMargins()\r\n let startX = margins[3]\r\n // 换行符绘制开启时,移动起始位置\r\n if (!lineBreak.disabled) {\r\n startX += (LineBreakParticle.WIDTH + LineBreakParticle.GAP) * scale\r\n }\r\n const startY = options?.startY || margins[0] + headerExtraHeight\r\n this.position.computePageRowPosition({\r\n positionList: this.positionList,\r\n rowList: this.rowList,\r\n pageNo: 0,\r\n startRowIndex: 0,\r\n startIndex: 0,\r\n startX,\r\n startY,\r\n innerWidth\r\n })\r\n }\r\n\r\n public render(\r\n ctx: CanvasRenderingContext2D,\r\n options?: IPlaceholderRenderOption\r\n ) {\r\n const { placeholder = this.options.placeholder } = options || {}\r\n const { data, font, size, color, opacity } = placeholder\r\n this._recovery()\r\n // 构建元素列表并格式化\r\n this.elementList = [\r\n {\r\n value: data,\r\n font,\r\n size,\r\n color\r\n }\r\n ]\r\n formatElementList(this.elementList, {\r\n editorOptions: this.options,\r\n isForceCompensation: true\r\n })\r\n // 计算\r\n this._compute(options)\r\n const innerWidth = this.draw.getInnerWidth()\r\n // 绘制\r\n ctx.save()\r\n ctx.globalAlpha = opacity\r\n this.draw.drawRow(ctx, {\r\n elementList: this.elementList,\r\n positionList: this.positionList,\r\n rowList: this.rowList,\r\n pageNo: 0,\r\n startIndex: 0,\r\n innerWidth,\r\n isDrawLineBreak: false\r\n })\r\n ctx.restore()\r\n }\r\n}\r\n","import { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { IPositionContext } from '@vervedoc/docx-editor-schema'\r\nimport { IRange } from '@vervedoc/docx-editor-schema'\r\nimport { getUUID } from '@vervedoc/docx-editor-schema'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../draw/Draw'\r\n\r\ninterface IGroupLineRange {\r\n x: number\r\n y: number\r\n width: number\r\n height: number\r\n}\r\n\r\ninterface IGroupFillRect {\r\n lineRanges: IGroupLineRange[]\r\n}\r\n\r\nexport class Group {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n private range: RangeManager\r\n private fillRectMap: Map<string, IGroupFillRect>\r\n private groupIndexMap: Map<string, number> // 批注序号映射\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.range = draw.getRange()\r\n this.fillRectMap = new Map()\r\n this.groupIndexMap = new Map()\r\n }\r\n\r\n public setGroup(): string | null {\r\n if (\r\n this.draw.isReadonly() ||\r\n this.draw.getZone().getZone() !== EditorZone.MAIN\r\n ) {\r\n return null\r\n }\r\n const selection = this.range.getSelection()\r\n if (!selection) return null\r\n const groupId = getUUID()\r\n selection.forEach(el => {\r\n if (!Array.isArray(el.groupIds)) {\r\n el.groupIds = []\r\n }\r\n el.groupIds.push(groupId)\r\n })\r\n this.draw.render({\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n return groupId\r\n }\r\n\r\n public getElementListByGroupId(\r\n elementList: IElement[],\r\n groupId: string\r\n ): IElement[] {\r\n const groupElementList: IElement[] = []\r\n for (let e = 0; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const tdGroupElementList = this.getElementListByGroupId(\r\n td.value,\r\n groupId\r\n )\r\n if (tdGroupElementList.length) {\r\n groupElementList.push(...tdGroupElementList)\r\n return groupElementList\r\n }\r\n }\r\n }\r\n }\r\n if (element?.groupIds?.includes(groupId)) {\r\n groupElementList.push(element)\r\n const nextElement = elementList[e + 1]\r\n if (!nextElement?.groupIds?.includes(groupId)) break\r\n }\r\n }\r\n return groupElementList\r\n }\r\n\r\n public deleteGroup(groupId: string) {\r\n if (this.draw.isReadonly()) return\r\n // 仅主体内容可以成组\r\n const elementList = this.draw.getOriginalMainElementList()\r\n const groupElementList = this.getElementListByGroupId(elementList, groupId)\r\n if (!groupElementList.length) return\r\n for (let e = 0; e < groupElementList.length; e++) {\r\n const element = groupElementList[e]\r\n const groupIds = element.groupIds!\r\n const groupIndex = groupIds.findIndex(id => id === groupId)\r\n groupIds.splice(groupIndex, 1)\r\n // 不包含成组时删除字段,减少存储及内存占用\r\n if (!groupIds.length) {\r\n delete element.groupIds\r\n }\r\n }\r\n this.draw.render({\r\n isSetCursor: false,\r\n isCompute: false\r\n })\r\n }\r\n\r\n public getContextByGroupId(\r\n elementList: IElement[],\r\n groupId: string\r\n ): (IRange & IPositionContext) | null {\r\n let groupStartIndex = -1\r\n let groupEndIndex = -1\r\n for (let e = 0; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n if (element.type === ElementType.TABLE) {\r\n const trList = element.trList!\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const range = this.getContextByGroupId(td.value, groupId)\r\n if (range) {\r\n return {\r\n ...range,\r\n isTable: true,\r\n index: e,\r\n trIndex: r,\r\n tdIndex: d,\r\n tdId: td.id,\r\n trId: tr.id,\r\n tableId: element.tableId\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (element.groupIds?.includes(groupId)) {\r\n if (groupStartIndex === -1) groupStartIndex = e\r\n groupEndIndex = e\r\n }\r\n }\r\n if (groupStartIndex !== -1) {\r\n return {\r\n isTable: false,\r\n startIndex: groupStartIndex,\r\n endIndex: groupEndIndex\r\n }\r\n }\r\n return null\r\n }\r\n\r\n public clearFillInfo() {\r\n this.fillRectMap.clear()\r\n this.groupIndexMap.clear()\r\n }\r\n\r\n public recordFillInfo(\r\n element: IElement,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number\r\n ) {\r\n const groupIds = element.groupIds\r\n if (!groupIds) return\r\n for (const groupId of groupIds) {\r\n const fillRect = this.fillRectMap.get(groupId)\r\n if (!fillRect) {\r\n this.fillRectMap.set(groupId, {\r\n lineRanges: [{ x, y, width, height }]\r\n })\r\n if (!this.groupIndexMap.has(groupId)) {\r\n this.groupIndexMap.set(groupId, this.groupIndexMap.size + 1)\r\n }\r\n } else {\r\n const lastLine = fillRect.lineRanges[fillRect.lineRanges.length - 1]\r\n if (lastLine && Math.abs(lastLine.y - y) < 1) {\r\n lastLine.width += width\r\n } else {\r\n fillRect.lineRanges.push({ x, y, width, height })\r\n }\r\n }\r\n }\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D) {\r\n if (!this.fillRectMap.size) return\r\n\r\n const range = this.range.getRange()\r\n const elementList = this.draw.getElementList()\r\n const anchorGroupIds = elementList[range.endIndex]?.groupIds\r\n const {\r\n group: { backgroundColor, opacity, activeOpacity, activeBackgroundColor }\r\n } = this.options\r\n\r\n ctx.save()\r\n \r\n this.fillRectMap.forEach((fillRect, groupId) => {\r\n const { lineRanges } = fillRect\r\n const isActive = anchorGroupIds?.includes(groupId)\r\n \r\n if (isActive) {\r\n ctx.globalAlpha = activeOpacity\r\n ctx.fillStyle = activeBackgroundColor\r\n } else {\r\n ctx.globalAlpha = opacity\r\n ctx.fillStyle = backgroundColor\r\n }\r\n for (const line of lineRanges) {\r\n ctx.fillRect(line.x, line.y, line.width, line.height)\r\n }\r\n\r\n })\r\n \r\n ctx.restore()\r\n this.clearFillInfo()\r\n }\r\n \r\n // 获取批注序号\r\n public getCommentIndex(groupId: string): number {\r\n return this.groupIndexMap.get(groupId) || 0\r\n }\r\n \r\n // 获取所有批注的 groupId 列表(按序号排序)\r\n public getAllGroupIds(): string[] {\r\n const groups = Array.from(this.groupIndexMap.entries())\r\n groups.sort((a, b) => a[1] - b[1])\r\n return groups.map(g => g[0])\r\n }\r\n}\r\n","import { EventBusMap } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { EventBus } from '@vervedoc/docx-editor-state'\r\n\r\nexport class MouseObserver {\r\n private draw: Draw\r\n private eventBus: EventBus<EventBusMap>\r\n private pageContainer: HTMLDivElement\r\n private _mousemoveHandler: (evt: MouseEvent) => void\r\n private _mouseenterHandler: (evt: MouseEvent) => void\r\n private _mouseleaveHandler: (evt: MouseEvent) => void\r\n private _mousedownHandler: (evt: MouseEvent) => void\r\n private _mouseupHandler: (evt: MouseEvent) => void\r\n private _clickHandler: (evt: MouseEvent) => void\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.eventBus = this.draw.getEventBus()\r\n this.pageContainer = this.draw.getPageContainer()\r\n this._mousemoveHandler = this._mousemove.bind(this)\r\n this._mouseenterHandler = this._mouseenter.bind(this)\r\n this._mouseleaveHandler = this._mouseleave.bind(this)\r\n this._mousedownHandler = this._mousedown.bind(this)\r\n this._mouseupHandler = this._mouseup.bind(this)\r\n this._clickHandler = this._click.bind(this)\r\n this.pageContainer.addEventListener('mousemove', this._mousemoveHandler)\r\n this.pageContainer.addEventListener('mouseenter', this._mouseenterHandler)\r\n this.pageContainer.addEventListener('mouseleave', this._mouseleaveHandler)\r\n this.pageContainer.addEventListener('mousedown', this._mousedownHandler)\r\n this.pageContainer.addEventListener('mouseup', this._mouseupHandler)\r\n this.pageContainer.addEventListener('click', this._clickHandler)\r\n }\r\n\r\n public removeEvent() {\r\n this.pageContainer.removeEventListener('mousemove', this._mousemoveHandler)\r\n this.pageContainer.removeEventListener('mouseenter', this._mouseenterHandler)\r\n this.pageContainer.removeEventListener('mouseleave', this._mouseleaveHandler)\r\n this.pageContainer.removeEventListener('mousedown', this._mousedownHandler)\r\n this.pageContainer.removeEventListener('mouseup', this._mouseupHandler)\r\n this.pageContainer.removeEventListener('click', this._clickHandler)\r\n }\r\n\r\n private _mousemove(evt: MouseEvent) {\r\n if (!this.eventBus.hasSubscribers('mousemove')) return\r\n this.eventBus.emit('mousemove', evt)\r\n }\r\n\r\n private _mouseenter(evt: MouseEvent) {\r\n if (!this.eventBus.hasSubscribers('mouseenter')) return\r\n this.eventBus.emit('mouseenter', evt)\r\n }\r\n\r\n private _mouseleave(evt: MouseEvent) {\r\n if (!this.eventBus.hasSubscribers('mouseleave')) return\r\n this.eventBus.emit('mouseleave', evt)\r\n }\r\n\r\n private _mousedown(evt: MouseEvent) {\r\n if (!this.eventBus.hasSubscribers('mousedown')) return\r\n this.eventBus.emit('mousedown', evt)\r\n }\r\n\r\n private _mouseup(evt: MouseEvent) {\r\n if (!this.eventBus.hasSubscribers('mouseup')) return\r\n this.eventBus.emit('mouseup', evt)\r\n }\r\n\r\n private _click(evt: MouseEvent) {\r\n if (!this.eventBus.hasSubscribers('click')) return\r\n this.eventBus.emit('click', evt)\r\n }\r\n}\r\n","import { LineNumberType } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class LineNumber {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n const {\r\n scale,\r\n lineNumber: { color, size, font, right, type }\r\n } = this.options\r\n const textParticle = this.draw.getTextParticle()\r\n const margins = this.draw.getMargins()\r\n const positionList = this.draw.getPosition().getOriginalMainPositionList()\r\n const pageRowList = this.draw.getPageRowList()\r\n const rowList = pageRowList[pageNo]\r\n ctx.save()\r\n ctx.fillStyle = color\r\n ctx.font = `${size * scale}px ${font}`\r\n for (let i = 0; i < rowList.length; i++) {\r\n const row = rowList[i]\r\n const {\r\n coordinate: { leftBottom }\r\n } = positionList[row.startIndex]\r\n const seq = type === LineNumberType.PAGE ? i + 1 : row.rowIndex + 1\r\n const textMetrics = textParticle.measureText(ctx, {\r\n value: `${seq}`\r\n })\r\n const x = margins[3] - (textMetrics.width + right) * scale\r\n const y = leftBottom[1] - textMetrics.actualBoundingBoxAscent * scale\r\n ctx.fillText(`${seq}`, x, y)\r\n }\r\n ctx.restore()\r\n }\r\n}\r\n","import { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\nimport { Footer } from './Footer'\r\nimport { Header } from './Header'\r\n\r\nexport class PageBorder {\r\n private draw: Draw\r\n private header: Header\r\n private footer: Footer\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.header = draw.getHeader()\r\n this.footer = draw.getFooter()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D) {\r\n const {\r\n scale,\r\n pageBorder: { color, lineWidth, padding }\r\n } = this.options\r\n ctx.save()\r\n ctx.translate(0.5, 0.5)\r\n ctx.strokeStyle = color\r\n ctx.lineWidth = lineWidth * scale\r\n const margins = this.draw.getMargins()\r\n // x:左边距 - 左距离正文距离\r\n const x = margins[3] - padding[3] * scale\r\n // y:页眉上边距 + 页眉高度 - 上距离正文距离\r\n const y = margins[0] + this.header.getExtraHeight() - padding[0] * scale\r\n // width:页面宽度 + 左右距离正文距离\r\n const width = this.draw.getInnerWidth() + (padding[1] + padding[3]) * scale\r\n // height:页面高度 - 正文起始位置 - 页脚高度 - 下边距 - 下距离正文距离\r\n const height =\r\n this.draw.getHeight() -\r\n y -\r\n this.footer.getExtraHeight() -\r\n margins[2] +\r\n padding[2] * scale\r\n ctx.rect(x, y, width, height)\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n}\r\n","import { ElementType, IElement, TableBorder, VerticalAlign } from '@vervedoc/docx-editor-schema'\r\nimport { ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { TABLE_CONTEXT_ATTR } from '@vervedoc/docx-editor-schema'\r\nimport { TdBorder, TdSlash } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IColgroup } from '@vervedoc/docx-editor-schema'\r\nimport { ITd } from '@vervedoc/docx-editor-schema'\r\nimport { ITr } from '@vervedoc/docx-editor-schema'\r\nimport { cloneProperty, getUUID } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n formatElementContext,\r\n formatElementList\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { Position } from '../../position/Position'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Draw } from '../../draw/Draw'\r\nimport { TableParticle } from './TableParticle'\r\nimport { TableTool } from './TableTool'\r\n\r\nexport class TableOperate {\r\n private draw: Draw\r\n private range: RangeManager\r\n private position: Position\r\n private tableTool: TableTool\r\n private tableParticle: TableParticle\r\n private options: DeepRequired<IEditorOption>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.range = draw.getRange()\r\n this.position = draw.getPosition()\r\n this.tableTool = draw.getTableTool()\r\n this.tableParticle = draw.getTableParticle()\r\n this.options = draw.getOptions()\r\n }\r\n\r\n public insertTable(row: number, col: number) {\r\n const { startIndex, endIndex } = this.range.getRange()\r\n if (!~startIndex && !~endIndex) return\r\n const { defaultTrHeight, defaultTrMinHeight, tdPadding, defaultBorderColor } =\r\n this.options.table\r\n const elementList = this.draw.getElementList()\r\n let offsetX = 0\r\n if (elementList[startIndex]?.listId) {\r\n const positionList = this.position.getPositionList()\r\n const { rowIndex } = positionList[startIndex]\r\n const rowList = this.draw.getRowList()\r\n const row = rowList[rowIndex]\r\n offsetX = row?.offsetX || 0\r\n }\r\n const innerWidth = this.draw.getContextInnerWidth() - offsetX\r\n const tdPaddingHeight = tdPadding[0] + tdPadding[2]\r\n const baseTrHeight =\r\n Number.isFinite(Number(defaultTrHeight)) && Number(defaultTrHeight) > 0\r\n ? Number(defaultTrHeight)\r\n : 0\r\n const autoTrMinHeight = Math.max(\r\n defaultTrMinHeight,\r\n baseTrHeight,\r\n Math.ceil(this.options.defaultSize * 1.4 + tdPaddingHeight)\r\n )\r\n // colgroup\r\n const colgroup: IColgroup[] = []\r\n const colWidth = innerWidth / col\r\n for (let c = 0; c < col; c++) {\r\n colgroup.push({\r\n width: colWidth\r\n })\r\n }\r\n // trlist\r\n const trList: ITr[] = []\r\n for (let r = 0; r < row; r++) {\r\n const tdList: ITd[] = []\r\n const tr: ITr = {\r\n height: autoTrMinHeight,\r\n tdList\r\n }\r\n for (let c = 0; c < col; c++) {\r\n tdList.push({\r\n colspan: 1,\r\n rowspan: 1,\r\n value: []\r\n })\r\n }\r\n trList.push(tr)\r\n }\r\n const element: IElement = {\r\n type: ElementType.TABLE,\r\n value: '',\r\n colgroup,\r\n trList,\r\n borderType: TableBorder.ALL,\r\n borderColor: defaultBorderColor,\r\n borderWidth: 0.5\r\n }\r\n // 格式化element\r\n formatElementList([element], {\r\n editorOptions: this.options\r\n })\r\n formatElementContext(elementList, [element], startIndex, {\r\n editorOptions: this.options\r\n })\r\n const curIndex = startIndex + 1\r\n this.draw.spliceElementList(\r\n elementList,\r\n curIndex,\r\n startIndex === endIndex ? 0 : endIndex - startIndex,\r\n [element]\r\n )\r\n this.range.setRange(curIndex, curIndex)\r\n this.draw.render({ curIndex, isSetCursor: false })\r\n }\r\n\r\n public insertTableTopRow() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, trIndex, tableId } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTr = curTrList[trIndex!]\r\n // 之前跨行的增加跨行数\r\n if (curTr.tdList.length < element.colgroup!.length) {\r\n const curTrNo = curTr.tdList[0].rowIndex!\r\n for (let t = 0; t < trIndex!; t++) {\r\n const tr = curTrList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n if (td.rowspan > 1 && td.rowIndex! + td.rowspan >= curTrNo + 1) {\r\n td.rowspan += 1\r\n }\r\n }\r\n }\r\n }\r\n // 增加当前行\r\n const newTrId = getUUID()\r\n const newTr: ITr = {\r\n height: curTr.height,\r\n id: newTrId,\r\n tdList: []\r\n }\r\n for (let t = 0; t < curTr.tdList.length; t++) {\r\n const curTd = curTr.tdList[t]\r\n const newTdId = getUUID()\r\n newTr.tdList.push({\r\n id: newTdId,\r\n rowspan: 1,\r\n colspan: curTd.colspan,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId,\r\n trId: newTrId,\r\n tdId: newTdId\r\n }\r\n ]\r\n })\r\n }\r\n curTrList.splice(trIndex!, 0, newTr)\r\n // 重新设置上下文\r\n this.position.setPositionContext({\r\n isTable: true,\r\n index,\r\n trIndex,\r\n tdIndex: 0,\r\n tdId: newTr.tdList[0].id,\r\n trId: newTr.id,\r\n tableId\r\n })\r\n this.range.setRange(0, 0)\r\n // 重新渲染\r\n this.draw.render({ curIndex: 0 })\r\n this.tableTool.render()\r\n }\r\n\r\n public insertTableBottomRow() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, trIndex, tableId } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTr = curTrList[trIndex!]\r\n const anchorTr =\r\n curTrList.length - 1 === trIndex ? curTr : curTrList[trIndex! + 1]\r\n // 之前/当前行跨行的增加跨行数\r\n if (anchorTr.tdList.length < element.colgroup!.length) {\r\n const curTrNo = anchorTr.tdList[0].rowIndex!\r\n for (let t = 0; t < trIndex! + 1; t++) {\r\n const tr = curTrList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n if (td.rowspan > 1 && td.rowIndex! + td.rowspan >= curTrNo + 1) {\r\n td.rowspan += 1\r\n }\r\n }\r\n }\r\n }\r\n // 增加当前行\r\n const newTrId = getUUID()\r\n const newTr: ITr = {\r\n height: anchorTr.height,\r\n id: newTrId,\r\n tdList: []\r\n }\r\n for (let t = 0; t < anchorTr.tdList.length; t++) {\r\n const curTd = anchorTr.tdList[t]\r\n const newTdId = getUUID()\r\n newTr.tdList.push({\r\n id: newTdId,\r\n rowspan: 1,\r\n colspan: curTd.colspan,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId,\r\n trId: newTrId,\r\n tdId: newTdId\r\n }\r\n ]\r\n })\r\n }\r\n curTrList.splice(trIndex! + 1, 0, newTr)\r\n // 重新设置上下文\r\n this.position.setPositionContext({\r\n isTable: true,\r\n index,\r\n trIndex: trIndex! + 1,\r\n tdIndex: 0,\r\n tdId: newTr.tdList[0].id,\r\n trId: newTr.id,\r\n tableId: element.id\r\n })\r\n this.range.setRange(0, 0)\r\n // 重新渲染\r\n this.draw.render({ curIndex: 0 })\r\n }\r\n\r\n public adjustColWidth(element: IElement) {\r\n if (element.type !== ElementType.TABLE) return\r\n const { defaultColMinWidth } = this.options.table\r\n const colgroup = element.colgroup!\r\n const colgroupWidth = colgroup.reduce((pre, cur) => pre + cur.width, 0)\r\n const width = this.draw.getOriginalInnerWidth()\r\n if (colgroupWidth > width) {\r\n // 过滤大于最小宽度的列(可能减少宽度的列)\r\n const greaterMinWidthCol = colgroup.filter(\r\n col => col.width > defaultColMinWidth\r\n )\r\n // 均分多余宽度\r\n const adjustWidth = (colgroupWidth - width) / greaterMinWidthCol.length\r\n for (let g = 0; g < colgroup.length; g++) {\r\n const group = colgroup[g]\r\n // 小于最小宽度的列不处理\r\n if (group.width - adjustWidth >= defaultColMinWidth) {\r\n group.width -= adjustWidth\r\n }\r\n }\r\n }\r\n }\r\n\r\n public insertTableLeftCol() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, tdIndex, tableId } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTdIndex = tdIndex!\r\n // 增加列\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n const tdId = getUUID()\r\n tr.tdList.splice(curTdIndex, 0, {\r\n id: tdId,\r\n rowspan: 1,\r\n colspan: 1,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId,\r\n trId: tr.id,\r\n tdId\r\n }\r\n ]\r\n })\r\n }\r\n // 重新计算宽度\r\n const { defaultColMinWidth } = this.options.table\r\n const colgroup = element.colgroup!\r\n colgroup.splice(curTdIndex, 0, {\r\n width: defaultColMinWidth\r\n })\r\n this.adjustColWidth(element)\r\n // 重新设置上下文\r\n this.position.setPositionContext({\r\n isTable: true,\r\n index,\r\n trIndex: 0,\r\n tdIndex: curTdIndex,\r\n tdId: curTrList[0].tdList[curTdIndex].id,\r\n trId: curTrList[0].id,\r\n tableId\r\n })\r\n this.range.setRange(0, 0)\r\n // 重新渲染\r\n this.draw.render({ curIndex: 0 })\r\n this.tableTool.render()\r\n }\r\n\r\n public insertTableRightCol() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, tdIndex, tableId } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTdIndex = tdIndex! + 1\r\n // 增加列\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n const tdId = getUUID()\r\n tr.tdList.splice(curTdIndex, 0, {\r\n id: tdId,\r\n rowspan: 1,\r\n colspan: 1,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId,\r\n trId: tr.id,\r\n tdId\r\n }\r\n ]\r\n })\r\n }\r\n // 重新计算宽度\r\n const { defaultColMinWidth } = this.options.table\r\n const colgroup = element.colgroup!\r\n colgroup.splice(curTdIndex, 0, {\r\n width: defaultColMinWidth\r\n })\r\n this.adjustColWidth(element)\r\n // 重新设置上下文\r\n this.position.setPositionContext({\r\n isTable: true,\r\n index,\r\n trIndex: 0,\r\n tdIndex: curTdIndex,\r\n tdId: curTrList[0].tdList[curTdIndex].id,\r\n trId: curTrList[0].id,\r\n tableId: element.id\r\n })\r\n this.range.setRange(0, 0)\r\n // 重新渲染\r\n this.draw.render({ curIndex: 0 })\r\n }\r\n\r\n public deleteTableRow() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, trIndex, tdIndex } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const trList = element.trList!\r\n const curTr = trList[trIndex!]\r\n const curTdRowIndex = curTr.tdList[tdIndex!].rowIndex!\r\n // 如果是最后一行,直接删除整个表格(如果是拆分表格按照正常逻辑走)\r\n if (trList.length <= 1 && element.pagingIndex === 0) {\r\n this.deleteTable()\r\n return\r\n }\r\n // 之前行缩小rowspan\r\n for (let r = 0; r < curTdRowIndex; r++) {\r\n const tr = trList[r]\r\n const tdList = tr.tdList\r\n for (let d = 0; d < tdList.length; d++) {\r\n const td = tdList[d]\r\n if (td.rowIndex! + td.rowspan > curTdRowIndex) {\r\n td.rowspan--\r\n }\r\n }\r\n }\r\n // 补跨行\r\n for (let d = 0; d < curTr.tdList.length; d++) {\r\n const td = curTr.tdList[d]\r\n if (td.rowspan > 1) {\r\n const tdId = getUUID()\r\n const nextTr = trList[trIndex! + 1]\r\n nextTr.tdList.splice(d, 0, {\r\n id: tdId,\r\n rowspan: td.rowspan - 1,\r\n colspan: td.colspan,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId: element.id,\r\n trId: nextTr.id,\r\n tdId\r\n }\r\n ]\r\n })\r\n }\r\n }\r\n // 删除当前行\r\n trList.splice(trIndex!, 1)\r\n // 重新设置上下文\r\n this.position.setPositionContext({\r\n isTable: false\r\n })\r\n this.range.clearRange()\r\n // 重新渲染\r\n this.draw.render({\r\n curIndex: positionContext.index\r\n })\r\n this.tableTool.dispose()\r\n }\r\n\r\n public deleteTableCol() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, tdIndex, trIndex } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTd = curTrList[trIndex!].tdList[tdIndex!]\r\n const curColIndex = curTd.colIndex!\r\n // 如果是最后一列,直接删除整个表格\r\n const moreTdTr = curTrList.find(tr => tr.tdList.length > 1)\r\n if (!moreTdTr) {\r\n this.deleteTable()\r\n return\r\n }\r\n // 缩小colspan或删除与当前列重叠的单元格\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n if (\r\n td.colIndex! <= curColIndex &&\r\n td.colIndex! + td.colspan > curColIndex\r\n ) {\r\n if (td.colspan > 1) {\r\n td.colspan--\r\n } else {\r\n tr.tdList.splice(d, 1)\r\n }\r\n }\r\n }\r\n }\r\n element.colgroup?.splice(curColIndex, 1)\r\n // 重新设置上下文\r\n this.position.setPositionContext({\r\n isTable: false\r\n })\r\n this.range.setRange(0, 0)\r\n // 重新渲染\r\n this.draw.render({\r\n curIndex: positionContext.index\r\n })\r\n this.tableTool.dispose()\r\n }\r\n\r\n public deleteTable() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const tableElement = originalElementList[positionContext.index!]\r\n // 需要删除的表格数量(拆分表格)及位置\r\n let deleteCount = 1\r\n let deleteStartIndex = positionContext.index!\r\n if (tableElement.pagingId) {\r\n // 开始删除的下标位置\r\n deleteStartIndex = positionContext.index! - tableElement.pagingIndex!\r\n // 计算删除的表格数量\r\n for (let i = deleteStartIndex + 1; i < originalElementList.length; i++) {\r\n if (originalElementList[i].pagingId === tableElement.pagingId) {\r\n deleteCount++\r\n } else {\r\n break\r\n }\r\n }\r\n }\r\n // 删除\r\n originalElementList.splice(deleteStartIndex, deleteCount)\r\n const curIndex = deleteStartIndex - 1\r\n this.position.setPositionContext({\r\n isTable: false,\r\n index: curIndex\r\n })\r\n this.range.setRange(curIndex, curIndex)\r\n this.draw.render({ curIndex })\r\n this.tableTool.dispose()\r\n }\r\n\r\n public mergeTableCell() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const {\r\n isCrossRowCol,\r\n startTdIndex,\r\n endTdIndex,\r\n startTrIndex,\r\n endTrIndex\r\n } = this.range.getRange()\r\n if (!isCrossRowCol) return\r\n const { index } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n let startTd = curTrList[startTrIndex!].tdList[startTdIndex!]\r\n let endTd = curTrList[endTrIndex!].tdList[endTdIndex!]\r\n // 交换起始位置\r\n if (startTd.x! > endTd.x! || startTd.y! > endTd.y!) {\r\n // prettier-ignore\r\n [startTd, endTd] = [endTd, startTd]\r\n }\r\n const startColIndex = startTd.colIndex!\r\n const endColIndex = endTd.colIndex! + (endTd.colspan - 1)\r\n const startRowIndex = startTd.rowIndex!\r\n const endRowIndex = endTd.rowIndex! + (endTd.rowspan - 1)\r\n // 选区行列\r\n const rowCol: ITd[][] = []\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n const tdList: ITd[] = []\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const tdColIndex = td.colIndex!\r\n const tdRowIndex = td.rowIndex!\r\n if (\r\n tdColIndex >= startColIndex &&\r\n tdColIndex <= endColIndex &&\r\n tdRowIndex >= startRowIndex &&\r\n tdRowIndex <= endRowIndex\r\n ) {\r\n tdList.push(td)\r\n }\r\n }\r\n if (tdList.length) {\r\n rowCol.push(tdList)\r\n }\r\n }\r\n if (!rowCol.length) return\r\n // 是否是矩形\r\n const lastRow = rowCol[rowCol.length - 1]\r\n const leftTop = rowCol[0][0]\r\n const rightBottom = lastRow[lastRow.length - 1]\r\n const startX = leftTop.x!\r\n const startY = leftTop.y!\r\n const endX = rightBottom.x! + rightBottom.width!\r\n const endY = rightBottom.y! + rightBottom.height!\r\n for (let t = 0; t < rowCol.length; t++) {\r\n const tr = rowCol[t]\r\n for (let d = 0; d < tr.length; d++) {\r\n const td = tr[d]\r\n const tdStartX = td.x!\r\n const tdStartY = td.y!\r\n const tdEndX = tdStartX + td.width!\r\n const tdEndY = tdStartY + td.height!\r\n // 存在不符合项\r\n if (\r\n startX > tdStartX ||\r\n startY > tdStartY ||\r\n endX < tdEndX ||\r\n endY < tdEndY\r\n ) {\r\n return\r\n }\r\n }\r\n }\r\n // 合并单元格\r\n const mergeTdIdList: string[] = []\r\n const anchorTd = rowCol[0][0]\r\n const isPlaceholder = (el: IElement | undefined) =>\r\n !!el && el.value === ZERO && !el.type\r\n const anchorContextElement =\r\n anchorTd.value.find(el => !isPlaceholder(el)) ||\r\n anchorTd.value[0] ||\r\n ({\r\n value: ZERO,\r\n tableId: element.id,\r\n trId: curTrList[anchorTd.trIndex!]?.id,\r\n tdId: anchorTd.id\r\n } as IElement)\r\n for (let t = 0; t < rowCol.length; t++) {\r\n const tr = rowCol[t]\r\n for (let d = 0; d < tr.length; d++) {\r\n const td = tr[d]\r\n const isAnchorTd = t === 0 && d === 0\r\n // 缓存待删除单元id并合并单元格内容\r\n if (!isAnchorTd) {\r\n mergeTdIdList.push(td.id!)\r\n let startTdValueIndex = 0\r\n while (isPlaceholder(td.value[startTdValueIndex])) {\r\n startTdValueIndex++\r\n }\r\n const isAnchorAllPlaceholder =\r\n anchorTd.value.length > 0 && anchorTd.value.every(isPlaceholder)\r\n if (isAnchorAllPlaceholder && startTdValueIndex < td.value.length) {\r\n anchorTd.value.length = 0\r\n }\r\n for (let d = startTdValueIndex; d < td.value.length; d++) {\r\n const tdElement = td.value[d]\r\n if (isPlaceholder(tdElement)) continue\r\n cloneProperty<IElement>(\r\n TABLE_CONTEXT_ATTR,\r\n anchorContextElement,\r\n tdElement\r\n )\r\n anchorTd.value.push(tdElement)\r\n }\r\n }\r\n // 列合并\r\n if (t === 0 && d !== 0) {\r\n anchorTd.colspan += td.colspan\r\n }\r\n // 行合并\r\n if (t !== 0) {\r\n if (anchorTd.colIndex === td.colIndex) {\r\n anchorTd.rowspan += td.rowspan\r\n }\r\n }\r\n }\r\n }\r\n if (!anchorTd.value.length || !isPlaceholder(anchorTd.value[0])) {\r\n const placeholder: IElement = { value: ZERO }\r\n cloneProperty<IElement>(TABLE_CONTEXT_ATTR, anchorContextElement, placeholder)\r\n anchorTd.value.unshift(placeholder)\r\n } else {\r\n const i = 1\r\n while (i < anchorTd.value.length) {\r\n if (isPlaceholder(anchorTd.value[i])) {\r\n anchorTd.value.splice(i, 1)\r\n continue\r\n }\r\n break\r\n }\r\n }\r\n // 移除多余单元格\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n let d = 0\r\n while (d < tr.tdList.length) {\r\n const td = tr.tdList[d]\r\n if (mergeTdIdList.includes(td.id!)) {\r\n tr.tdList.splice(d, 1)\r\n d--\r\n }\r\n d++\r\n }\r\n }\r\n // 设置上下文信息\r\n this.position.setPositionContext({\r\n ...positionContext,\r\n trIndex: anchorTd.trIndex,\r\n tdIndex: anchorTd.tdIndex\r\n })\r\n const curIndex = anchorTd.value.length - 1\r\n this.range.setRange(curIndex, curIndex)\r\n // 重新渲染\r\n this.draw.render()\r\n this.tableTool.render()\r\n }\r\n\r\n public cancelMergeTableCell() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index, tdIndex, trIndex } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTr = curTrList[trIndex!]!\r\n const curTd = curTr.tdList[tdIndex!]\r\n if (curTd.rowspan === 1 && curTd.colspan === 1) return\r\n const colspan = curTd.colspan\r\n // 设置跨列\r\n if (curTd.colspan > 1) {\r\n for (let c = 1; c < curTd.colspan; c++) {\r\n const tdId = getUUID()\r\n curTr.tdList.splice(tdIndex! + c, 0, {\r\n id: tdId,\r\n rowspan: 1,\r\n colspan: 1,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId: element.id,\r\n trId: curTr.id,\r\n tdId\r\n }\r\n ]\r\n })\r\n }\r\n curTd.colspan = 1\r\n }\r\n // 设置跨行\r\n if (curTd.rowspan > 1) {\r\n for (let r = 1; r < curTd.rowspan; r++) {\r\n const tr = curTrList[trIndex! + r]\r\n for (let c = 0; c < colspan; c++) {\r\n const tdId = getUUID()\r\n tr.tdList.splice(curTd.colIndex!, 0, {\r\n id: tdId,\r\n rowspan: 1,\r\n colspan: 1,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId: element.id,\r\n trId: tr.id,\r\n tdId\r\n }\r\n ]\r\n })\r\n }\r\n }\r\n curTd.rowspan = 1\r\n }\r\n // 重新渲染\r\n const curIndex = curTd.value.length - 1\r\n this.range.setRange(curIndex, curIndex)\r\n this.draw.render()\r\n this.tableTool.render()\r\n }\r\n\r\n public splitVerticalTableCell() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n // 暂时忽略跨行列选择\r\n const range = this.range.getRange()\r\n if (range.isCrossRowCol) return\r\n const { index, tdIndex, trIndex } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTr = curTrList[trIndex!]!\r\n const curTd = curTr.tdList[tdIndex!]\r\n // 增加列属性\r\n element.colgroup!.splice(tdIndex! + 1, 0, {\r\n width: this.options.table.defaultColMinWidth\r\n })\r\n // 同行增加td,非同行增加跨列数\r\n for (let t = 0; t < curTrList.length; t++) {\r\n const tr = curTrList[t]\r\n let d = 0\r\n while (d < tr.tdList.length) {\r\n const td = tr.tdList[d]\r\n // 非同行:存在交叉时增加跨列数\r\n if (td.rowIndex !== curTd.rowIndex) {\r\n if (\r\n td.colIndex! <= curTd.colIndex! &&\r\n td.colIndex! + td.colspan > curTd.colIndex!\r\n ) {\r\n td.colspan++\r\n }\r\n } else {\r\n // 当前单元格:往右插入td\r\n if (td.id === curTd.id) {\r\n const tdId = getUUID()\r\n curTr.tdList.splice(d + curTd.colspan, 0, {\r\n id: tdId,\r\n rowspan: curTd.rowspan,\r\n colspan: 1,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId: element.id,\r\n trId: tr.id,\r\n tdId\r\n }\r\n ]\r\n })\r\n d++\r\n }\r\n }\r\n d++\r\n }\r\n }\r\n // 重新渲染\r\n this.draw.render()\r\n this.tableTool.render()\r\n }\r\n\r\n public splitHorizontalTableCell() {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n // 暂时忽略跨行列选择\r\n const range = this.range.getRange()\r\n if (range.isCrossRowCol) return\r\n const { index, tdIndex, trIndex } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const curTrList = element.trList!\r\n const curTr = curTrList[trIndex!]!\r\n const curTd = curTr.tdList[tdIndex!]\r\n // 追加的行跳出循环\r\n let appendTrIndex = -1\r\n // 交叉行增加rowspan,当前单元格往下追加一行tr\r\n let t = 0\r\n while (t < curTrList.length) {\r\n if (t === appendTrIndex) {\r\n t++\r\n continue\r\n }\r\n const tr = curTrList[t]\r\n let d = 0\r\n while (d < tr.tdList.length) {\r\n const td = tr.tdList[d]\r\n if (td.id === curTd.id) {\r\n const trId = getUUID()\r\n const tdId = getUUID()\r\n curTrList.splice(t + curTd.rowspan, 0, {\r\n id: trId,\r\n height: this.options.table.defaultTrMinHeight,\r\n tdList: [\r\n {\r\n id: tdId,\r\n rowspan: 1,\r\n colspan: curTd.colspan,\r\n value: [\r\n {\r\n value: ZERO,\r\n size: 16,\r\n tableId: element.id,\r\n trId,\r\n tdId\r\n }\r\n ]\r\n }\r\n ]\r\n })\r\n appendTrIndex = t + curTd.rowspan\r\n } else if (\r\n td.rowIndex! >= curTd.rowIndex! &&\r\n td.rowIndex! < curTd.rowIndex! + curTd.rowspan &&\r\n td.rowIndex! + td.rowspan >= curTd.rowIndex! + curTd.rowspan\r\n ) {\r\n // 1. 循环td上方大于等于当前td上方 && 小于当前td的下方=>存在交叉\r\n // 2. 循环td下方大于或等于当前td下方\r\n td.rowspan++\r\n }\r\n d++\r\n }\r\n t++\r\n }\r\n // 重新渲染\r\n this.draw.render()\r\n this.tableTool.render()\r\n }\r\n\r\n public tableTdVerticalAlign(payload: VerticalAlign) {\r\n const rowCol = this.tableParticle.getRangeRowCol()\r\n if (!rowCol) return\r\n for (let r = 0; r < rowCol.length; r++) {\r\n const row = rowCol[r]\r\n for (let c = 0; c < row.length; c++) {\r\n const td = row[c]\r\n if (\r\n !td ||\r\n td.verticalAlign === payload ||\r\n (!td.verticalAlign && payload === VerticalAlign.TOP)\r\n ) {\r\n continue\r\n }\r\n // 重设垂直对齐方式\r\n td.verticalAlign = payload\r\n }\r\n }\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex\r\n })\r\n }\r\n\r\n public tableBorderType(payload: TableBorder) {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n if (\r\n (!element.borderType && payload === TableBorder.ALL) ||\r\n element.borderType === payload\r\n ) {\r\n return\r\n }\r\n element.borderType = payload\r\n if (payload === TableBorder.EMPTY) {\r\n const trList = element.trList\r\n if (trList) {\r\n for (let t = 0; t < trList.length; t++) {\r\n const tr = trList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n if (td.borderTypes) delete td.borderTypes\r\n if (td.borderStyle) delete td.borderStyle\r\n }\r\n }\r\n }\r\n }\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex\r\n })\r\n }\r\n\r\n public tableBorderColor(payload: string) {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n if (\r\n (!element.borderColor &&\r\n payload === this.options.table.defaultBorderColor) ||\r\n element.borderColor === payload\r\n ) {\r\n return\r\n }\r\n element.borderColor = payload\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex,\r\n isCompute: false\r\n })\r\n }\r\n\r\n public tableBorderWidth(payload: number) {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const nextWidth = Number(payload)\r\n if (!Number.isFinite(nextWidth)) return\r\n if (nextWidth <= 0) {\r\n if (element.borderWidth === undefined) return\r\n delete element.borderWidth\r\n } else {\r\n if (element.borderWidth === nextWidth) return\r\n element.borderWidth = nextWidth\r\n if (\r\n element.borderExternalWidth !== undefined &&\r\n element.borderExternalWidth <= 0\r\n ) {\r\n delete element.borderExternalWidth\r\n }\r\n if (\r\n element.borderExternalWidth !== undefined &&\r\n element.borderExternalWidth === nextWidth\r\n ) {\r\n delete element.borderExternalWidth\r\n }\r\n }\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex,\r\n isCompute: false\r\n })\r\n }\r\n\r\n public tableBorderExternalWidth(payload: number) {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const nextWidth = Number(payload)\r\n if (!Number.isFinite(nextWidth)) return\r\n const baseWidth = element.borderWidth ?? 1\r\n if (nextWidth <= 0 || nextWidth === baseWidth) {\r\n if (element.borderExternalWidth === undefined) return\r\n delete element.borderExternalWidth\r\n } else {\r\n if (element.borderExternalWidth === nextWidth) return\r\n element.borderExternalWidth = nextWidth\r\n }\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex,\r\n isCompute: false\r\n })\r\n }\r\n\r\n public tableTdBorderType(payload: TdBorder) {\r\n const positionContext = this.position.getPositionContext()\r\n if (!positionContext.isTable) return\r\n const { index } = positionContext\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const element = originalElementList[index!]\r\n const rowCol = this.tableParticle.getRangeRowCol()\r\n if (!rowCol) return\r\n const tdList = rowCol.flat()\r\n // 存在则设置边框类型,否则取消设置\r\n const isSetBorderType = tdList.some(\r\n td => !td.borderTypes?.includes(payload)\r\n )\r\n tdList.forEach(td => {\r\n if (!td.borderTypes) {\r\n td.borderTypes = []\r\n }\r\n const borderTypeIndex = td.borderTypes.findIndex(type => type === payload)\r\n if (isSetBorderType) {\r\n if (!~borderTypeIndex) {\r\n td.borderTypes.push(payload)\r\n }\r\n if (!td.borderStyle) {\r\n td.borderStyle = {}\r\n }\r\n td.borderStyle[payload] = {\r\n width: element.borderWidth ?? 0.5,\r\n color: element.borderColor || this.options.table.defaultBorderColor,\r\n style: element.borderType === TableBorder.DASH ? 'dashed' : 'solid'\r\n }\r\n } else {\r\n if (~borderTypeIndex) {\r\n td.borderTypes.splice(borderTypeIndex, 1)\r\n }\r\n if (td.borderStyle && td.borderStyle[payload]) {\r\n delete td.borderStyle[payload]\r\n if (!Object.keys(td.borderStyle).length) {\r\n delete td.borderStyle\r\n }\r\n }\r\n }\r\n // 不存在边框设置时删除字段\r\n if (!td.borderTypes.length) {\r\n delete td.borderTypes\r\n }\r\n })\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex\r\n })\r\n }\r\n\r\n public tableTdSlashType(payload: TdSlash) {\r\n const rowCol = this.tableParticle.getRangeRowCol()\r\n if (!rowCol) return\r\n const tdList = rowCol.flat()\r\n // 存在则设置单元格斜线类型,否则取消设置\r\n const isSetTdSlashType = tdList.some(\r\n td => !td.slashTypes?.includes(payload)\r\n )\r\n tdList.forEach(td => {\r\n if (!td.slashTypes) {\r\n td.slashTypes = []\r\n }\r\n const slashTypeIndex = td.slashTypes.findIndex(type => type === payload)\r\n if (isSetTdSlashType) {\r\n if (!~slashTypeIndex) {\r\n td.slashTypes.push(payload)\r\n }\r\n } else {\r\n if (~slashTypeIndex) {\r\n td.slashTypes.splice(slashTypeIndex, 1)\r\n }\r\n }\r\n // 不存在斜线设置时删除字段\r\n if (!td.slashTypes.length) {\r\n delete td.slashTypes\r\n }\r\n })\r\n const { endIndex } = this.range.getRange()\r\n this.draw.render({\r\n curIndex: endIndex\r\n })\r\n }\r\n\r\n public tableTdBackgroundColor(payload: string) {\r\n const rowCol = this.tableParticle.getRangeRowCol()\r\n if (!rowCol) return\r\n for (let r = 0; r < rowCol.length; r++) {\r\n const row = rowCol[r]\r\n for (let c = 0; c < row.length; c++) {\r\n const col = row[c]\r\n col.backgroundColor = payload\r\n }\r\n }\r\n const { endIndex } = this.range.getRange()\r\n this.range.setRange(endIndex, endIndex)\r\n this.draw.render({\r\n isCompute: false\r\n })\r\n }\r\n\r\n public tableSelectAll() {\r\n const positionContext = this.position.getPositionContext()\r\n const { index, tableId, isTable } = positionContext\r\n if (!isTable || !tableId) return\r\n const { startIndex, endIndex } = this.range.getRange()\r\n const originalElementList = this.draw.getOriginalElementList()\r\n const trList = originalElementList[index!].trList!\r\n // 最后单元格位置\r\n const endTrIndex = trList.length - 1\r\n const endTdIndex = trList[endTrIndex].tdList.length - 1\r\n this.range.replaceRange({\r\n startIndex,\r\n endIndex,\r\n tableId,\r\n startTdIndex: 0,\r\n endTdIndex,\r\n startTrIndex: 0,\r\n endTrIndex\r\n })\r\n this.draw.render({\r\n isCompute: false,\r\n isSubmitHistory: false\r\n })\r\n }\r\n}\r\n","import { Draw } from '../draw/Draw'\r\nimport { deepClone, getUUID, isNonValue } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IArea,\r\n IAreaInfo,\r\n IGetAreaValueOption,\r\n IGetAreaValueResult,\r\n IInsertAreaOption,\r\n ILocationAreaOption,\r\n ISetAreaPropertiesOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { EditorZone } from '@vervedoc/docx-editor-schema'\r\nimport { LocationPosition } from '@vervedoc/docx-editor-schema'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Zone } from '../zone/Zone'\r\nimport { Position } from '../position/Position'\r\nimport { zipElementList } from '@vervedoc/docx-editor-schema'\r\nimport { AreaMode } from '@vervedoc/docx-editor-schema'\r\nimport { IRange } from '@vervedoc/docx-editor-schema'\r\nimport { IElementPosition } from '@vervedoc/docx-editor-schema'\r\nimport { Placeholder } from '../frame/Placeholder'\r\nimport { defaultPlaceholderOption } from '@vervedoc/docx-editor-schema'\r\n\r\nexport class Area {\r\n private draw: Draw\r\n private zone: Zone\r\n private range: RangeManager\r\n private position: Position\r\n private areaInfoMap = new Map<string, IAreaInfo>()\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.zone = draw.getZone()\r\n this.range = draw.getRange()\r\n this.position = draw.getPosition()\r\n }\r\n\r\n public getAreaInfo(): Map<string, IAreaInfo> {\r\n return this.areaInfoMap\r\n }\r\n\r\n public getActiveAreaId(): string | null {\r\n if (!this.areaInfoMap.size) return null\r\n const { startIndex } = this.range.getRange()\r\n const elementList = this.draw.getElementList()\r\n const element = elementList[startIndex]\r\n return element?.areaId || null\r\n }\r\n\r\n public getActiveAreaInfo(): IAreaInfo | null {\r\n const activeAreaId = this.getActiveAreaId()\r\n if (!activeAreaId) return null\r\n return this.areaInfoMap.get(activeAreaId) || null\r\n }\r\n\r\n public isReadonly() {\r\n const activeAreaInfo = this.getActiveAreaInfo()\r\n if (!activeAreaInfo?.area) return false\r\n switch (activeAreaInfo.area.mode) {\r\n case AreaMode.EDIT:\r\n return false\r\n case AreaMode.READONLY:\r\n return true\r\n case AreaMode.FORM:\r\n return !this.draw.getControl().getIsRangeWithinControl()\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n public insertArea(payload: IInsertAreaOption): string | null {\r\n // 切换至正文\r\n if (this.zone.getZone() !== EditorZone.MAIN) {\r\n this.zone.setZone(EditorZone.MAIN)\r\n }\r\n // 跳出表格\r\n this.draw.getPosition().setPositionContext({\r\n isTable: false\r\n })\r\n // 设置插入位置\r\n const { id, value, area, position } = payload\r\n if (position === LocationPosition.BEFORE) {\r\n this.range.setRange(0, 0)\r\n } else {\r\n const elementList = this.draw.getOriginalMainElementList()\r\n const lastIndex = elementList.length - 1\r\n this.range.setRange(lastIndex, lastIndex)\r\n }\r\n const areaId = id || getUUID()\r\n this.draw.insertElementList([\r\n {\r\n type: ElementType.AREA,\r\n value: '',\r\n areaId,\r\n valueList: value,\r\n area: deepClone(area)\r\n }\r\n ])\r\n return areaId\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n if (!this.areaInfoMap.size) return\r\n ctx.save()\r\n const margins = this.draw.getMargins()\r\n const width = this.draw.getInnerWidth()\r\n for (const areaInfoItem of this.areaInfoMap) {\r\n const { area, positionList } = areaInfoItem[1]\r\n if (\r\n area?.hide ||\r\n (!area?.backgroundColor && !area?.borderColor && !area?.placeholder)\r\n ) {\r\n continue\r\n }\r\n const pagePositionList = positionList.filter(p => p.pageNo === pageNo)\r\n if (!pagePositionList.length) continue\r\n ctx.translate(0.5, 0.5)\r\n const firstPosition = pagePositionList[0]\r\n const lastPosition = pagePositionList[pagePositionList.length - 1]\r\n // 起始位置\r\n const x = margins[3]\r\n const y = Math.ceil(firstPosition.coordinate.leftTop[1])\r\n const height = Math.ceil(lastPosition.coordinate.rightBottom[1] - y)\r\n // 背景色\r\n if (area.backgroundColor) {\r\n ctx.fillStyle = area.backgroundColor\r\n ctx.fillRect(x, y, width, height)\r\n }\r\n // 边框\r\n if (area.borderColor) {\r\n ctx.strokeStyle = area.borderColor\r\n ctx.strokeRect(x, y, width, height)\r\n }\r\n // 提示词\r\n if (area.placeholder && positionList.length <= 1) {\r\n const placeholder = new Placeholder(this.draw)\r\n placeholder.render(ctx, {\r\n placeholder: {\r\n ...defaultPlaceholderOption,\r\n ...area.placeholder\r\n },\r\n startY: firstPosition.coordinate.leftTop[1]\r\n })\r\n }\r\n ctx.translate(-0.5, -0.5)\r\n }\r\n ctx.restore()\r\n }\r\n\r\n public compute() {\r\n this.areaInfoMap.clear()\r\n const elementList = this.draw.getOriginalMainElementList()\r\n const positionList = this.position.getOriginalMainPositionList()\r\n for (let e = 0; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n const areaId = element.areaId\r\n if (areaId) {\r\n const areaInfo = this.areaInfoMap.get(areaId)\r\n if (!areaInfo) {\r\n this.areaInfoMap.set(areaId, {\r\n id: areaId,\r\n area: element.area!,\r\n elementList: [element],\r\n positionList: [positionList[e]]\r\n })\r\n } else {\r\n areaInfo.elementList.push(element)\r\n areaInfo.positionList.push(positionList[e])\r\n }\r\n }\r\n }\r\n }\r\n\r\n public getAreaValue(\r\n options: IGetAreaValueOption = {}\r\n ): IGetAreaValueResult | null {\r\n const areaId = options.id || this.getActiveAreaId()\r\n if (!areaId) return null\r\n const areaInfo = this.areaInfoMap.get(areaId)\r\n if (!areaInfo) return null\r\n return {\r\n area: areaInfo.area,\r\n id: areaInfo.id,\r\n startPageNo: areaInfo.positionList[0].pageNo,\r\n endPageNo: areaInfo.positionList[areaInfo.positionList.length - 1].pageNo,\r\n value: zipElementList(areaInfo.elementList)\r\n }\r\n }\r\n\r\n public getContextByAreaId(\r\n areaId: string,\r\n options?: ILocationAreaOption\r\n ): { range: IRange; elementPosition: IElementPosition } | null {\r\n const elementList = this.draw.getOriginalMainElementList()\r\n for (let e = 0; e < elementList.length; e++) {\r\n const element = elementList[e]\r\n if (options?.position === LocationPosition.OUTER_BEFORE) {\r\n // 区域外面最前\r\n if (elementList[e + 1]?.areaId !== areaId) continue\r\n } else if (options?.position === LocationPosition.AFTER) {\r\n // 区域内部最后\r\n if (\r\n !(element.areaId === areaId && elementList[e + 1]?.areaId !== areaId)\r\n ) {\r\n continue\r\n }\r\n } else if (options?.position === LocationPosition.OUTER_AFTER) {\r\n // 区域外部最后\r\n if (\r\n !(element.areaId !== areaId && elementList[e - 1]?.areaId === areaId)\r\n ) {\r\n continue\r\n }\r\n } else {\r\n // 区域内部最前\r\n if (element.areaId !== areaId) continue\r\n }\r\n const positionList = this.position.getOriginalMainPositionList()\r\n return {\r\n range: {\r\n startIndex: e,\r\n endIndex: e\r\n },\r\n elementPosition: positionList[e]\r\n }\r\n }\r\n return null\r\n }\r\n\r\n public setAreaProperties(payload: ISetAreaPropertiesOption) {\r\n const areaId = payload.id || this.getActiveAreaId()\r\n if (!areaId) return\r\n const areaInfo = this.areaInfoMap.get(areaId)\r\n if (!areaInfo) return\r\n if (!areaInfo.area) {\r\n areaInfo.area = {}\r\n }\r\n // 需要计算的属性\r\n let isCompute = false\r\n const computeProps: Array<keyof IArea> = ['top', 'hide']\r\n // 循环设置\r\n Object.entries(payload.properties).forEach(([key, value]) => {\r\n if (isNonValue(value)) return\r\n const propKey = key as keyof IArea\r\n areaInfo.area[propKey] = value\r\n if (computeProps.includes(propKey)) {\r\n isCompute = true\r\n }\r\n })\r\n this.draw.render({\r\n isCompute,\r\n isSetCursor: false\r\n })\r\n }\r\n}\r\n","import { IAreaBadge, IBadge } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { Draw } from '../draw/Draw'\r\n\r\nexport class Badge {\r\n private draw: Draw\r\n private options: DeepRequired<IEditorOption>\r\n private imageCache: Map<string, HTMLImageElement>\r\n private mainBadge: IBadge | null\r\n private areaBadgeMap: Map<string, IBadge>\r\n\r\n constructor(draw: Draw) {\r\n this.draw = draw\r\n this.options = draw.getOptions()\r\n this.imageCache = new Map()\r\n this.mainBadge = null\r\n this.areaBadgeMap = new Map()\r\n }\r\n\r\n public setMainBadge(payload: IBadge | null) {\r\n this.mainBadge = payload\r\n }\r\n\r\n public setAreaBadgeMap(payload: IAreaBadge[]) {\r\n this.areaBadgeMap.clear()\r\n payload.forEach(areaBadge => {\r\n this.areaBadgeMap.set(areaBadge.areaId, areaBadge.badge)\r\n })\r\n }\r\n\r\n private _drawImage(\r\n ctx: CanvasRenderingContext2D,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n value: string\r\n ) {\r\n if (this.imageCache.has(value)) {\r\n const img = this.imageCache.get(value)!\r\n ctx.drawImage(img, x, y, width, height)\r\n } else {\r\n const img = new Image()\r\n img.setAttribute('crossOrigin', 'Anonymous')\r\n img.src = value\r\n img.onload = () => {\r\n this.imageCache.set(value, img)\r\n ctx.drawImage(img, x, y, width, height)\r\n }\r\n }\r\n }\r\n\r\n public render(ctx: CanvasRenderingContext2D, pageNo: number) {\r\n // 文档签章\r\n if (pageNo === 0 && this.mainBadge) {\r\n const { scale, badge } = this.options\r\n const { left, top, width, height, value } = this.mainBadge\r\n // 默认从页眉下开始\r\n const headerTop =\r\n this.draw.getMargins()[0] + this.draw.getHeader().getExtraHeight()\r\n const x = (left || badge.left) * scale\r\n const y = (top || badge.top) * scale + headerTop\r\n this._drawImage(ctx, x, y, width * scale, height * scale, value)\r\n }\r\n // 区域签章\r\n if (this.areaBadgeMap.size) {\r\n const areaInfo = this.draw.getArea().getAreaInfo()\r\n if (areaInfo.size) {\r\n const { scale, badge } = this.options\r\n for (const areaItem of areaInfo) {\r\n // 忽略非本页区域\r\n const { positionList } = areaItem[1]\r\n const firstPosition = positionList[0]\r\n if (firstPosition.pageNo !== pageNo) continue\r\n // 忽略未设置签章区域\r\n const badgeItem = this.areaBadgeMap.get(areaItem[0])\r\n if (!badgeItem) continue\r\n const { left, top, width, height, value } = badgeItem\r\n const x = (left || badge.left) * scale\r\n const y =\r\n (top || badge.top) * scale + firstPosition.coordinate.leftTop[1]\r\n this._drawImage(ctx, x, y, width * scale, height * scale, value)\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { version } from '../plugin-stubs'\r\nimport { DOCX_EDITOR_DATA_VERSION, ZERO } from '@vervedoc/docx-editor-schema'\r\nimport { RowFlex } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IAppendElementListOption,\r\n IComputeRowListPayload,\r\n IDrawFloatPayload,\r\n IDrawOption,\r\n IDrawPagePayload,\r\n IDrawRowPayload,\r\n IGetImageOption,\r\n IGetOriginValueOption,\r\n IGetValueOption,\r\n IPainterOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IEditorData,\r\n IEditorOption,\r\n IEditorResult,\r\n ISetValueOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport {\r\n IElement,\r\n IElementMetrics,\r\n IElementFillRect,\r\n IElementPosition,\r\n IElementStyle,\r\n ISpliceElementListOption,\r\n IInsertElementListOption\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { IRow, IRowElement } from '@vervedoc/docx-editor-schema'\r\nimport { deepClone, getUUID, nextTick } from '@vervedoc/docx-editor-schema'\r\nimport { Cursor } from '../cursor/Cursor'\r\nimport { CanvasEvent } from '../event/CanvasEvent'\r\nimport { GlobalEvent } from '../event/GlobalEvent'\r\nimport { HistoryManager } from '../plugin-stubs'\r\nimport { Listener } from '@vervedoc/docx-editor-state'\r\nimport { Position } from '../position/Position'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\nimport { Background } from '../frame/Background'\r\nimport { getSeparatorRenderHeight } from '../utils/separator'\r\nimport { Highlight } from '../richtext/Highlight'\r\nimport { ParagraphColor } from '../richtext/ParagraphColor'\r\nimport { Margin } from '../frame/Margin'\r\nimport { Search } from '../interactive/Search'\r\nimport { Strikeout } from '../richtext/Strikeout'\r\nimport { Underline } from '../richtext/Underline'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { ImageParticle } from '../particle/ImageParticle'\r\nimport { LaTexParticle } from '../plugin-stubs'\r\nimport { TextParticle } from '../particle/TextParticle'\r\nimport { PageNumber } from '../frame/PageNumber'\r\nimport { ScrollObserver } from '../observer/ScrollObserver'\r\nimport { SelectionObserver } from '../observer/SelectionObserver'\r\nimport { TableParticle } from '../particle/table/TableParticle'\r\nimport { TableTool } from '../particle/table/TableTool'\r\nimport { HyperlinkParticle } from '../particle/HyperlinkParticle'\r\nimport { Header } from '../frame/Header'\r\nimport { SuperscriptParticle } from '../particle/SuperscriptParticle'\r\nimport { SubscriptParticle } from '../particle/SubscriptParticle'\r\nimport { SeparatorParticle } from '../particle/SeparatorParticle'\r\nimport { PageBreakParticle } from '../particle/PageBreakParticle'\r\nimport { Watermark } from '../frame/Watermark'\r\nimport {\r\n EditorComponent,\r\n EditorMode,\r\n EditorZone,\r\n PageMode,\r\n PaperDirection,\r\n WordBreak\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { Control } from '../control/Control'\r\nimport {\r\n deleteSurroundElementList,\r\n getIsBlockElement,\r\n getSlimCloneElementList,\r\n pickSurroundElementList,\r\n zipElementList\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { CheckboxParticle } from '../particle/CheckboxParticle'\r\nimport { RadioParticle } from '../particle/RadioParticle'\r\nimport { DeepRequired, IPadding } from '@vervedoc/docx-editor-schema'\r\nimport {\r\n ControlComponent,\r\n ControlIndentation\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { formatElementList, isParagraphSeparator, isTableElement, isImageElement } from '@vervedoc/docx-editor-schema'\r\nimport { WorkerManager } from '../plugin-stubs'\r\nimport { Previewer } from '../particle/previewer/Previewer'\r\nimport { DateParticle } from '../plugin-stubs'\r\nimport { IMargin } from '@vervedoc/docx-editor-schema'\r\nimport { BlockParticle } from '../plugin-stubs'\r\nimport { EDITOR_COMPONENT, EDITOR_PREFIX } from '@vervedoc/docx-editor-schema'\r\nimport { I18n } from '../plugin-stubs'\r\nimport { ImageObserver } from '../observer/ImageObserver'\r\nimport { Zone } from '../zone/Zone'\r\nimport { Footer } from '../frame/Footer'\r\nimport {\r\n IMAGE_ELEMENT_TYPE,\r\n TEXTLIKE_ELEMENT_TYPE\r\n} from '@vervedoc/docx-editor-schema'\r\nimport { ListParticle } from '../particle/ListParticle'\r\nimport { Placeholder } from '../frame/Placeholder'\r\nimport { EventBus } from '@vervedoc/docx-editor-state'\r\nimport { EventBusMap } from '@vervedoc/docx-editor-schema'\r\nimport { Group } from '../interactive/Group'\r\n\r\nimport { Override } from '../plugin/override/Override'\r\nimport { FlexDirection, ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { PUNCTUATION_REG } from '@vervedoc/docx-editor-schema'\r\nimport { LineBreakParticle } from '../particle/LineBreakParticle'\r\nimport { MouseObserver } from '../observer/MouseObserver'\r\nimport { LineNumber } from '../frame/LineNumber'\r\nimport { PageBorder } from '../frame/PageBorder'\r\nimport { ITd } from '@vervedoc/docx-editor-schema'\r\nimport { Actuator } from '../plugin-stubs'\r\nimport { TableOperate } from '../particle/table/TableOperate'\r\nimport { Area } from '../interactive/Area'\r\nimport { Badge } from '../frame/Badge'\r\n\r\n\r\nexport class Draw {\r\n private container: HTMLDivElement\r\n private pageContainer: HTMLDivElement\r\n private pageList: HTMLCanvasElement[]\r\n private ctxList: CanvasRenderingContext2D[]\r\n private pageNo: number\r\n private renderCount: number\r\n private pagePixelRatio: number | null\r\n private mode: EditorMode\r\n private options: DeepRequired<IEditorOption>\r\n private position: Position\r\n private zone: Zone\r\n private elementList: IElement[]\r\n private listener: Listener\r\n private eventBus: EventBus<EventBusMap>\r\n private override: Override\r\n\r\n private i18n: I18n\r\n private canvasEvent: CanvasEvent\r\n private globalEvent: GlobalEvent\r\n private cursor: Cursor\r\n private range: RangeManager\r\n private margin: Margin\r\n private background: Background\r\n private badge: Badge\r\n private search: Search\r\n private group: Group\r\n\r\n private area: Area\r\n private underline: Underline\r\n private strikeout: Strikeout\r\n private highlight: Highlight\r\n private paragraphColor: ParagraphColor\r\n private historyManager: HistoryManager\r\n private previewer: Previewer\r\n private imageParticle: ImageParticle\r\n private laTexParticle: LaTexParticle\r\n private textParticle: TextParticle\r\n private tableParticle: TableParticle\r\n private tableTool: TableTool\r\n private tableOperate: TableOperate\r\n private pageNumber: PageNumber\r\n private lineNumber: LineNumber\r\n private waterMark: Watermark\r\n private placeholder: Placeholder\r\n private header: Header\r\n private footer: Footer\r\n private hyperlinkParticle: HyperlinkParticle\r\n private dateParticle: DateParticle\r\n private separatorParticle: SeparatorParticle\r\n private pageBreakParticle: PageBreakParticle\r\n private superscriptParticle: SuperscriptParticle\r\n private subscriptParticle: SubscriptParticle\r\n private checkboxParticle: CheckboxParticle\r\n private radioParticle: RadioParticle\r\n private blockParticle: BlockParticle\r\n private listParticle: ListParticle\r\n private lineBreakParticle: LineBreakParticle\r\n private control: Control\r\n private pageBorder: PageBorder\r\n private revisionOverlay: any | null\r\n private commentOverlay: any | null\r\n private workerManager: WorkerManager\r\n private scrollObserver: ScrollObserver\r\n private selectionObserver: SelectionObserver\r\n private imageObserver: ImageObserver\r\n private mouseObserver: MouseObserver\r\n\r\n private LETTER_REG: RegExp\r\n private WORD_LIKE_REG: RegExp\r\n private rowList: IRow[]\r\n private pageRowList: IRow[][]\r\n private painterStyle: IElementStyle | null\r\n private painterOptions: IPainterOption | null\r\n private visiblePageNoList: number[]\r\n private intersectionPageNo: number\r\n private lazyRenderIntersectionObserver: IntersectionObserver | null\r\n private printModeData: Required<IEditorData> | null\r\n private _register: any | null = null\r\n private readonly HEADER_DEFAULT_SIZE = 10\r\n\r\n constructor(\r\n rootContainer: HTMLElement,\r\n options: DeepRequired<IEditorOption>,\r\n data: IEditorData,\r\n listener: Listener,\r\n eventBus: EventBus<EventBusMap>,\r\n override: Override\r\n ) {\r\n this._normalizeHeaderElementList(data.header)\r\n this.container = this._wrapContainer(rootContainer)\r\n this.pageList = []\r\n this.ctxList = []\r\n this.pageNo = 0\r\n this.renderCount = 0\r\n this.pagePixelRatio = null\r\n this.mode = options.mode\r\n this.options = options\r\n this.elementList = data.main\r\n this.listener = listener\r\n this.eventBus = eventBus\r\n this.override = override\r\n\r\n this._formatContainer()\r\n this.pageContainer = this._createPageContainer()\r\n this._createPage(0)\r\n\r\n this.i18n = new I18n(options.locale)\r\n this.historyManager = new HistoryManager(this)\r\n this.position = new Position(this)\r\n this.zone = new Zone(this)\r\n this.range = new RangeManager(this)\r\n this.margin = new Margin(this)\r\n this.background = new Background(this)\r\n this.badge = new Badge(this)\r\n this.search = new Search(this)\r\n this.group = new Group(this)\r\n\r\n this.area = new Area(this)\r\n this.underline = new Underline(this)\r\n this.strikeout = new Strikeout(this)\r\n this.highlight = new Highlight(this)\r\n this.paragraphColor = new ParagraphColor()\r\n this.previewer = new Previewer(this)\r\n this.imageParticle = new ImageParticle(this)\r\n this.laTexParticle = new LaTexParticle(this)\r\n this.textParticle = new TextParticle(this)\r\n this.tableParticle = new TableParticle(this)\r\n this.tableTool = new TableTool(this)\r\n this.tableOperate = new TableOperate(this)\r\n this.pageNumber = new PageNumber(this)\r\n this.lineNumber = new LineNumber(this)\r\n this.waterMark = new Watermark(this)\r\n this.placeholder = new Placeholder(this)\r\n this.header = new Header(this, data.header)\r\n this.footer = new Footer(this, data.footer)\r\n this.hyperlinkParticle = new HyperlinkParticle(this)\r\n this.dateParticle = new DateParticle(this)\r\n this.separatorParticle = new SeparatorParticle(this)\r\n this.pageBreakParticle = new PageBreakParticle(this)\r\n this.superscriptParticle = new SuperscriptParticle()\r\n this.subscriptParticle = new SubscriptParticle()\r\n this.checkboxParticle = new CheckboxParticle(this)\r\n this.radioParticle = new RadioParticle(this)\r\n this.blockParticle = new BlockParticle(this)\r\n this.listParticle = new ListParticle(this)\r\n this.lineBreakParticle = new LineBreakParticle(this)\r\n this.control = new Control(this)\r\n this.pageBorder = new PageBorder(this)\r\n this.revisionOverlay = null\r\n\r\n this.scrollObserver = new ScrollObserver(this)\r\n this.selectionObserver = new SelectionObserver(this)\r\n this.imageObserver = new ImageObserver()\r\n this.mouseObserver = new MouseObserver(this)\r\n\r\n this.canvasEvent = new CanvasEvent(this)\r\n this.cursor = new Cursor(this, this.canvasEvent)\r\n this.canvasEvent.register()\r\n this.globalEvent = new GlobalEvent(this, this.canvasEvent)\r\n this.globalEvent.register()\r\n\r\n this.workerManager = new WorkerManager(this)\r\n new Actuator(this)\r\n\r\n const { letterClass } = options\r\n this.LETTER_REG = new RegExp(`[${letterClass.join('')}]`)\r\n this.WORD_LIKE_REG = new RegExp(\r\n `${letterClass.map(letter => `[^${letter}][${letter}]`).join('|')}`\r\n )\r\n this.rowList = []\r\n this.pageRowList = []\r\n this.painterStyle = null\r\n this.painterOptions = null\r\n this.visiblePageNoList = []\r\n this.intersectionPageNo = 0\r\n this.lazyRenderIntersectionObserver = null\r\n this.printModeData = null\r\n\r\n // 打印模式优先设置打印数据\r\n if (this.mode === EditorMode.PRINT) {\r\n this.setPrintData()\r\n }\r\n this.render({\r\n isInit: true,\r\n isSetCursor: false,\r\n isFirstRender: true\r\n })\r\n }\r\n\r\n // 设置打印数据\r\n public setPrintData() {\r\n this.printModeData = {\r\n header: this.header.getElementList(),\r\n main: this.elementList,\r\n footer: this.footer.getElementList()\r\n }\r\n // 过滤控件辅助元素\r\n const clonePrintModeData = deepClone(this.printModeData)\r\n const editorDataKeys: (keyof IEditorData)[] = ['header', 'main', 'footer']\r\n editorDataKeys.forEach(key => {\r\n clonePrintModeData[key] = this.control.filterAssistElement(\r\n clonePrintModeData[key]\r\n )\r\n })\r\n this.setEditorData(clonePrintModeData)\r\n }\r\n\r\n // 还原打印数据\r\n public clearPrintData() {\r\n if (this.printModeData) {\r\n this.setEditorData(this.printModeData)\r\n this.printModeData = null\r\n }\r\n }\r\n\r\n public getLetterReg(): RegExp {\r\n return this.LETTER_REG\r\n }\r\n\r\n public getMode(): EditorMode {\r\n return this.mode\r\n }\r\n\r\n public setRegister(register: any) {\r\n this._register = register\r\n }\r\n\r\n public getRegister(): any | null {\r\n return this._register\r\n }\r\n\r\n public setMode(payload: EditorMode) {\r\n if (this.mode === payload) return\r\n // 设置打印模式\r\n if (payload === EditorMode.PRINT) {\r\n this.setPrintData()\r\n }\r\n // 取消打印模式\r\n if (this.mode === EditorMode.PRINT) {\r\n this.clearPrintData()\r\n }\r\n this.clearSideEffect()\r\n this.range.clearRange()\r\n this.mode = payload\r\n this.options.mode = payload\r\n this.render({\r\n isSetCursor: false,\r\n isSubmitHistory: false\r\n })\r\n }\r\n\r\n public isReadonly() {\r\n if (this.area.getActiveAreaInfo()?.area?.mode) {\r\n return this.area.isReadonly()\r\n }\r\n switch (this.mode) {\r\n case EditorMode.DESIGN:\r\n return false\r\n case EditorMode.READONLY:\r\n case EditorMode.PRINT:\r\n return true\r\n case EditorMode.FORM:\r\n return !this.control.getIsRangeWithinControl()\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n public isDisabled() {\r\n if (this.mode === EditorMode.DESIGN) return false\r\n const { startIndex, endIndex } = this.range.getRange()\r\n const elementList = this.getElementList()\r\n // 优先判断表格单元格\r\n if (this.getTd()?.disabled) return true\r\n if (startIndex === endIndex) {\r\n const startElement = elementList[startIndex]\r\n const nextElement = elementList[startIndex + 1]\r\n return !!(\r\n (startElement?.title?.disabled &&\r\n nextElement?.title?.disabled &&\r\n startElement.titleId === nextElement.titleId) ||\r\n (startElement?.control?.disabled &&\r\n nextElement?.control?.disabled &&\r\n startElement.controlId === nextElement.controlId)\r\n )\r\n }\r\n const selectionElementList = elementList.slice(startIndex + 1, endIndex + 1)\r\n return selectionElementList.some(\r\n element => element.title?.disabled || element.control?.disabled\r\n )\r\n }\r\n\r\n public isDesignMode() {\r\n return this.mode === EditorMode.DESIGN\r\n }\r\n\r\n public isPrintMode() {\r\n return this.mode === EditorMode.PRINT\r\n }\r\n\r\n public getOriginalWidth(): number {\r\n const { paperDirection, width, height } = this.options\r\n return paperDirection === PaperDirection.VERTICAL ? width : height\r\n }\r\n\r\n public getOriginalHeight(): number {\r\n const { paperDirection, width, height } = this.options\r\n return paperDirection === PaperDirection.VERTICAL ? height : width\r\n }\r\n\r\n public getWidth(): number {\r\n return Math.floor(this.getOriginalWidth() * this.options.scale)\r\n }\r\n\r\n public getHeight(): number {\r\n return Math.floor(this.getOriginalHeight() * this.options.scale)\r\n }\r\n\r\n public getMainHeight(): number {\r\n const pageHeight = this.getHeight()\r\n return pageHeight - this.getMainOuterHeight()\r\n }\r\n\r\n public getMainOuterHeight(): number {\r\n const margins = this.getMargins()\r\n const headerExtraHeight = this.header.getExtraHeight()\r\n const footerExtraHeight = this.footer.getExtraHeight()\r\n return margins[0] + margins[2] + headerExtraHeight + footerExtraHeight\r\n }\r\n\r\n public getCanvasWidth(pageNo = -1): number {\r\n const page = this.getPage(pageNo)\r\n return page.width\r\n }\r\n\r\n public getCanvasHeight(pageNo = -1): number {\r\n const page = this.getPage(pageNo)\r\n return page.height\r\n }\r\n\r\n public getInnerWidth(): number {\r\n const width = this.getWidth()\r\n const margins = this.getMargins()\r\n return width - margins[1] - margins[3]\r\n }\r\n\r\n public getOriginalInnerWidth(): number {\r\n const width = this.getOriginalWidth()\r\n const margins = this.getOriginalMargins()\r\n return width - margins[1] - margins[3]\r\n }\r\n\r\n public getContextInnerWidth(): number {\r\n const positionContext = this.position.getPositionContext()\r\n if (positionContext.isTable) {\r\n const { index, trIndex, tdIndex } = positionContext\r\n const elementList = this.getOriginalElementList()\r\n const td = elementList[index!].trList![trIndex!].tdList[tdIndex!]\r\n const tdPadding = this.getTdPadding()\r\n return td!.width! - tdPadding[1] - tdPadding[3]\r\n }\r\n return this.getOriginalInnerWidth()\r\n }\r\n\r\n public getMargins(): IMargin {\r\n return <IMargin>this.getOriginalMargins().map(m => m * this.options.scale)\r\n }\r\n\r\n public getOriginalMargins(): number[] {\r\n const { margins, paperDirection } = this.options\r\n return paperDirection === PaperDirection.VERTICAL\r\n ? margins\r\n : [margins[1], margins[2], margins[3], margins[0]]\r\n }\r\n\r\n public getPageGap(): number {\r\n return this.options.pageGap * this.options.scale\r\n }\r\n\r\n public getOriginalPageGap(): number {\r\n return this.options.pageGap\r\n }\r\n\r\n public getPageNumberBottom(): number {\r\n const {\r\n pageNumber: { bottom },\r\n scale\r\n } = this.options\r\n return bottom * scale\r\n }\r\n\r\n public getMarginIndicatorSize(): number {\r\n return this.options.marginIndicatorSize * this.options.scale\r\n }\r\n\r\n public getDefaultBasicRowMarginHeight(): number {\r\n return this.options.defaultBasicRowMarginHeight * this.options.scale\r\n }\r\n\r\n public getHighlightMarginHeight(): number {\r\n return this.options.highlightMarginHeight * this.options.scale\r\n }\r\n\r\n public getTdPadding(): IPadding {\r\n const {\r\n table: { tdPadding },\r\n scale\r\n } = this.options\r\n const positionContext = this.position.getPositionContext()\r\n if (positionContext.isTable) {\r\n const { index, trIndex, tdIndex } = positionContext\r\n const elementList = this.getOriginalElementList()\r\n const element = elementList[index!]\r\n const td = element.trList?.[trIndex!]?.tdList?.[tdIndex!]\r\n const base = td?.padding || element.tdPadding || tdPadding\r\n return <IPadding>base.map(m => m * scale)\r\n }\r\n return <IPadding>tdPadding.map(m => m * scale)\r\n }\r\n\r\n public getContainer(): HTMLDivElement {\r\n return this.container\r\n }\r\n\r\n public getPageContainer(): HTMLDivElement {\r\n return this.pageContainer\r\n }\r\n\r\n public getVisiblePageNoList(): number[] {\r\n return this.visiblePageNoList\r\n }\r\n\r\n public setVisiblePageNoList(payload: number[]) {\r\n this.visiblePageNoList = payload\r\n if (this.listener.visiblePageNoListChange) {\r\n this.listener.visiblePageNoListChange(this.visiblePageNoList)\r\n }\r\n if (this.eventBus.hasSubscribers('visiblePageNoListChange')) {\r\n this.eventBus.emit('visiblePageNoListChange', this.visiblePageNoList)\r\n }\r\n }\r\n\r\n public getIntersectionPageNo(): number {\r\n return this.intersectionPageNo\r\n }\r\n\r\n public setIntersectionPageNo(payload: number) {\r\n this.intersectionPageNo = payload\r\n if (this.listener.intersectionPageNoChange) {\r\n this.listener.intersectionPageNoChange(this.intersectionPageNo)\r\n }\r\n if (this.eventBus.hasSubscribers('intersectionPageNoChange')) {\r\n this.eventBus.emit('intersectionPageNoChange', this.intersectionPageNo)\r\n }\r\n }\r\n\r\n public getPageNo(): number {\r\n return this.pageNo\r\n }\r\n\r\n public setPageNo(payload: number) {\r\n this.pageNo = payload\r\n }\r\n\r\n public getRenderCount(): number {\r\n return this.renderCount\r\n }\r\n\r\n public getPage(pageNo = -1): HTMLCanvasElement {\r\n return this.pageList[~pageNo ? pageNo : this.pageNo]\r\n }\r\n\r\n public getPageList(): HTMLCanvasElement[] {\r\n return this.pageList\r\n }\r\n\r\n public getPageCount(): number {\r\n return this.pageList.length\r\n }\r\n\r\n public getTableRowList(sourceElementList: IElement[]): IRow[] {\r\n const positionContext = this.position.getPositionContext()\r\n const { index, trIndex, tdIndex } = positionContext\r\n return sourceElementList[index!].trList![trIndex!].tdList[tdIndex!].rowList!\r\n }\r\n\r\n public getOriginalRowList() {\r\n const zoneManager = this.getZone()\r\n if (zoneManager.isHeaderActive()) {\r\n return this.header.getRowList()\r\n }\r\n if (zoneManager.isFooterActive()) {\r\n return this.footer.getRowList()\r\n }\r\n return this.rowList\r\n }\r\n\r\n public getRowList(): IRow[] {\r\n const positionContext = this.position.getPositionContext()\r\n return positionContext.isTable\r\n ? this.getTableRowList(this.getOriginalElementList())\r\n : this.getOriginalRowList()\r\n }\r\n\r\n public getPageRowList(): IRow[][] {\r\n return this.pageRowList\r\n }\r\n\r\n public getCtx(): CanvasRenderingContext2D {\r\n return this.ctxList[this.pageNo]\r\n }\r\n\r\n public getOptions(): DeepRequired<IEditorOption> {\r\n\r\n return this.options\r\n }\r\n\r\n public getSearch(): Search {\r\n return this.search\r\n }\r\n\r\n public getGroup(): Group {\r\n return this.group\r\n }\r\n\r\n public getArea(): Area {\r\n return this.area\r\n }\r\n\r\n public getBadge(): Badge {\r\n return this.badge\r\n }\r\n\r\n public getHistoryManager(): HistoryManager {\r\n return this.historyManager\r\n }\r\n\r\n public setHistoryManager(historyManager: HistoryManager) {\r\n this.historyManager = historyManager\r\n }\r\n\r\n public getPosition(): Position {\r\n return this.position\r\n }\r\n\r\n public getZone(): Zone {\r\n return this.zone\r\n }\r\n\r\n public getRange(): RangeManager {\r\n return this.range\r\n }\r\n\r\n public getLineBreakParticle(): LineBreakParticle {\r\n return this.lineBreakParticle\r\n }\r\n\r\n public getTextParticle(): TextParticle {\r\n return this.textParticle\r\n }\r\n\r\n public getHeaderElementList(): IElement[] {\r\n return this.header.getElementList()\r\n }\r\n\r\n public getTableElementList(sourceElementList: IElement[]): IElement[] {\r\n const positionContext = this.position.getPositionContext()\r\n const { index, trIndex, tdIndex } = positionContext\r\n return (\r\n sourceElementList[index!].trList?.[trIndex!].tdList[tdIndex!].value || []\r\n )\r\n }\r\n\r\n public getElementList(): IElement[] {\r\n const positionContext = this.position.getPositionContext()\r\n const elementList = this.getOriginalElementList()\r\n return positionContext.isTable\r\n ? this.getTableElementList(elementList)\r\n : elementList\r\n }\r\n\r\n public getMainElementList(): IElement[] {\r\n const positionContext = this.position.getPositionContext()\r\n return positionContext.isTable\r\n ? this.getTableElementList(this.elementList)\r\n : this.elementList\r\n }\r\n\r\n public getOriginalElementList() {\r\n const zoneManager = this.getZone()\r\n if (zoneManager.isHeaderActive()) {\r\n return this.getHeaderElementList()\r\n }\r\n if (zoneManager.isFooterActive()) {\r\n return this.getFooterElementList()\r\n }\r\n return this.elementList\r\n }\r\n\r\n public getOriginalMainElementList(): IElement[] {\r\n return this.elementList\r\n }\r\n\r\n public getFooterElementList(): IElement[] {\r\n return this.footer.getElementList()\r\n }\r\n\r\n public getTd(): ITd | null {\r\n const positionContext = this.position.getPositionContext()\r\n const { index, trIndex, tdIndex, isTable } = positionContext\r\n if (isTable) {\r\n const elementList = this.getOriginalElementList()\r\n return elementList[index!].trList![trIndex!].tdList[tdIndex!]\r\n }\r\n return null\r\n }\r\n\r\n public insertElementList(\r\n payload: IElement[],\r\n options: IInsertElementListOption = {}\r\n ) {\r\n if (!payload.length || !this.range.canInput()) return\r\n const { startIndex, endIndex } = this.range.getRange()\r\n if (!~startIndex && !~endIndex) return\r\n const { isSubmitHistory = true } = options\r\n formatElementList(payload, {\r\n isHandleFirstElement: false,\r\n editorOptions: this.options\r\n })\r\n let curIndex = -1\r\n // 判断是否在控件内\r\n let activeControl = this.control.getActiveControl()\r\n // 光标在控件内如果当前没有被激活,需要手动激活\r\n if (!activeControl && this.control.getIsRangeWithinControl()) {\r\n this.control.initControl()\r\n activeControl = this.control.getActiveControl()\r\n }\r\n if (activeControl && this.control.getIsRangeWithinControl()) {\r\n curIndex = activeControl.setValue(payload, undefined, {\r\n isIgnoreDisabledRule: true\r\n })\r\n this.control.emitControlContentChange()\r\n } else {\r\n const elementList = this.getElementList()\r\n const isCollapsed = startIndex === endIndex\r\n const start = startIndex + 1\r\n if (!isCollapsed) {\r\n this.spliceElementList(elementList, start, endIndex - startIndex)\r\n }\r\n this.spliceElementList(elementList, start, 0, payload)\r\n curIndex = startIndex + payload.length\r\n // 列表前如有换行符则删除-因为列表内已存在\r\n const preElement = elementList[start - 1]\r\n if (\r\n payload[0].listId &&\r\n preElement &&\r\n !preElement.listId &&\r\n preElement?.value === ZERO &&\r\n (!preElement.type || preElement.type === ElementType.TEXT)\r\n ) {\r\n elementList.splice(startIndex, 1)\r\n curIndex -= 1\r\n }\r\n }\r\n if (~curIndex) {\r\n this.range.setRange(curIndex, curIndex)\r\n this.render({\r\n curIndex,\r\n isSubmitHistory\r\n })\r\n }\r\n }\r\n\r\n public appendElementList(\r\n elementList: IElement[],\r\n options: IAppendElementListOption = {}\r\n ) {\r\n if (!elementList.length) return\r\n formatElementList(elementList, {\r\n isHandleFirstElement: false,\r\n editorOptions: this.options\r\n })\r\n let curIndex: number\r\n const { isPrepend, isSubmitHistory = true } = options\r\n if (isPrepend) {\r\n this.elementList.splice(1, 0, ...elementList)\r\n curIndex = elementList.length\r\n } else {\r\n this.elementList.push(...elementList)\r\n curIndex = this.elementList.length - 1\r\n }\r\n this.range.setRange(curIndex, curIndex)\r\n this.render({\r\n curIndex,\r\n isSubmitHistory\r\n })\r\n }\r\n\r\n public spliceElementList(\r\n elementList: IElement[],\r\n start: number,\r\n deleteCount: number,\r\n items?: IElement[],\r\n options?: ISpliceElementListOption\r\n ) {\r\n const { isIgnoreDeletedRule = false } = options || {}\r\n const { group, modeRule } = this.options\r\n if (deleteCount > 0) {\r\n // 当最后元素与开始元素列表信息不一致时:清除当前列表信息\r\n const endIndex = start + deleteCount\r\n const endElement = elementList[endIndex]\r\n const endElementListId = endElement?.listId\r\n if (\r\n endElementListId &&\r\n elementList[start - 1]?.listId !== endElementListId\r\n ) {\r\n let startIndex = endIndex\r\n while (startIndex < elementList.length) {\r\n const curElement = elementList[startIndex]\r\n if (\r\n curElement.listId !== endElementListId ||\r\n curElement.value === ZERO\r\n ) {\r\n break\r\n }\r\n delete curElement.listId\r\n delete curElement.listType\r\n delete curElement.listStyle\r\n startIndex++\r\n }\r\n }\r\n // 非明确忽略删除规则 && 非设计模式 && 非光标在控件内(控件内控制) =》 校验删除规则\r\n if (\r\n !isIgnoreDeletedRule &&\r\n !this.isDesignMode() &&\r\n !this.control.getIsRangeWithinControl()\r\n ) {\r\n const tdDeletable = this.getTd()?.deletable\r\n let deleteIndex = endIndex - 1\r\n while (deleteIndex >= start) {\r\n const deleteElement = elementList[deleteIndex]\r\n if (\r\n deleteElement?.control?.hide ||\r\n deleteElement?.area?.hide ||\r\n (tdDeletable !== false &&\r\n deleteElement?.control?.deletable !== false &&\r\n (!deleteElement.controlId ||\r\n this.mode !== EditorMode.FORM ||\r\n !modeRule[this.mode].controlDeletableDisabled) &&\r\n deleteElement?.title?.deletable !== false &&\r\n (group.deletable !== false || !deleteElement.groupIds?.length) &&\r\n (deleteElement?.area?.deletable !== false ||\r\n deleteElement?.areaIndex !== 0))\r\n ) {\r\n elementList.splice(deleteIndex, 1)\r\n }\r\n deleteIndex--\r\n }\r\n } else {\r\n elementList.splice(start, deleteCount)\r\n }\r\n }\r\n // 循环添加,避免使用解构影响性能\r\n if (items?.length) {\r\n for (let i = 0; i < items.length; i++) {\r\n elementList.splice(start + i, 0, items[i])\r\n }\r\n }\r\n }\r\n\r\n public getCanvasEvent(): CanvasEvent {\r\n return this.canvasEvent\r\n }\r\n\r\n public getGlobalEvent(): GlobalEvent {\r\n return this.globalEvent\r\n }\r\n\r\n public getListener(): Listener {\r\n return this.listener\r\n }\r\n\r\n public getEventBus(): EventBus<EventBusMap> {\r\n return this.eventBus\r\n }\r\n\r\n public getOverride(): Override {\r\n return this.override\r\n }\r\n\r\n public initRevisionOverlay(_callbacks?: { onAccept?: (id: string) => void; onReject?: (id: string) => void }) {\r\n if (!this.revisionOverlay) {\r\n this.revisionOverlay = { update: () => {} }\r\n }\r\n this.revisionOverlay.update()\r\n }\r\n\r\n public setRevisionOverlay(overlay: any) {\r\n this.revisionOverlay = overlay\r\n }\r\n\r\n public setCommentOverlay(overlay: any) {\r\n this.commentOverlay = overlay\r\n }\r\n\r\n public destroyRevisionOverlay() {\r\n if (this.revisionOverlay) {\r\n this.revisionOverlay.destroy()\r\n this.revisionOverlay = null\r\n this.commentOverlay = null\r\n }\r\n }\r\n\r\n public getRevisionOverlay(): any | null {\r\n return this.revisionOverlay\r\n }\r\n\r\n public getCursor(): Cursor {\r\n return this.cursor\r\n }\r\n\r\n public getPreviewer(): Previewer {\r\n return this.previewer\r\n }\r\n\r\n public getImageParticle(): ImageParticle {\r\n return this.imageParticle\r\n }\r\n\r\n public getLaTexParticle(): LaTexParticle {\r\n return this.laTexParticle\r\n }\r\n\r\n public setLaTexParticle(laTexParticle: LaTexParticle) {\r\n this.laTexParticle = laTexParticle\r\n }\r\n\r\n public getBlockParticle(): BlockParticle {\r\n return this.blockParticle\r\n }\r\n\r\n public setBlockParticle(blockParticle: BlockParticle) {\r\n this.blockParticle = blockParticle\r\n }\r\n\r\n public getTableTool(): TableTool {\r\n return this.tableTool\r\n }\r\n\r\n public getTableOperate(): TableOperate {\r\n return this.tableOperate\r\n }\r\n\r\n public getTableParticle(): TableParticle {\r\n return this.tableParticle\r\n }\r\n\r\n public getHeader(): Header {\r\n return this.header\r\n }\r\n\r\n public getFooter(): Footer {\r\n return this.footer\r\n }\r\n\r\n public getHyperlinkParticle(): HyperlinkParticle {\r\n return this.hyperlinkParticle\r\n }\r\n\r\n public getDateParticle(): DateParticle {\r\n return this.dateParticle\r\n }\r\n\r\n public setDateParticle(dateParticle: DateParticle) {\r\n this.dateParticle = dateParticle\r\n }\r\n\r\n public getListParticle(): ListParticle {\r\n return this.listParticle\r\n }\r\n\r\n public getCheckboxParticle(): CheckboxParticle {\r\n return this.checkboxParticle\r\n }\r\n\r\n public getRadioParticle(): RadioParticle {\r\n return this.radioParticle\r\n }\r\n\r\n public getControl(): Control {\r\n return this.control\r\n }\r\n\r\n public setControl(control: Control) {\r\n this.control = control\r\n }\r\n\r\n public getWorkerManager(): WorkerManager {\r\n return this.workerManager\r\n }\r\n\r\n public setWorkerManager(workerManager: WorkerManager) {\r\n this.workerManager = workerManager\r\n }\r\n\r\n public getImageObserver(): ImageObserver {\r\n return this.imageObserver\r\n }\r\n\r\n public getI18n(): I18n {\r\n return this.i18n\r\n }\r\n\r\n public getRowCount(): number {\r\n return this.getRowList().length\r\n }\r\n\r\n public async getDataURL(payload: IGetImageOption = {}): Promise<string[]> {\r\n const { pixelRatio, mode } = payload\r\n // 放大像素比\r\n if (pixelRatio) {\r\n this.setPagePixelRatio(pixelRatio)\r\n }\r\n // 不同模式\r\n const currentMode = this.mode\r\n const isSwitchMode = !!mode && currentMode !== mode\r\n if (isSwitchMode) {\r\n this.setMode(mode)\r\n }\r\n this.render({\r\n isLazy: false,\r\n isCompute: false,\r\n isSetCursor: false,\r\n isSubmitHistory: false\r\n })\r\n await this.imageObserver.allSettled()\r\n const dataUrlList = this.pageList.map(c => c.toDataURL())\r\n // 还原\r\n if (pixelRatio) {\r\n this.setPagePixelRatio(null)\r\n }\r\n if (isSwitchMode) {\r\n this.setMode(currentMode)\r\n }\r\n return dataUrlList\r\n }\r\n\r\n public getPainterStyle(): IElementStyle | null {\r\n return this.painterStyle && Object.keys(this.painterStyle).length\r\n ? this.painterStyle\r\n : null\r\n }\r\n\r\n public getPainterOptions(): IPainterOption | null {\r\n return this.painterOptions\r\n }\r\n\r\n public setPainterStyle(\r\n payload: IElementStyle | null,\r\n options?: IPainterOption\r\n ) {\r\n this.painterStyle = payload\r\n this.painterOptions = options || null\r\n if (this.getPainterStyle()) {\r\n this.pageList.forEach(c => (c.style.cursor = 'copy'))\r\n }\r\n }\r\n\r\n public setDefaultRange() {\r\n if (!this.elementList.length) return\r\n setTimeout(() => {\r\n const curIndex = this.elementList.length - 1\r\n this.range.setRange(curIndex, curIndex)\r\n this.range.setRangeStyle()\r\n })\r\n }\r\n\r\n public getIsPagingMode(): boolean {\r\n return this.options.pageMode === PageMode.PAGING\r\n }\r\n\r\n public setPageMode(payload: PageMode) {\r\n if (!payload || this.options.pageMode === payload) return\r\n this.options.pageMode = payload\r\n // 纸张大小重置\r\n if (payload === PageMode.PAGING) {\r\n const { height } = this.options\r\n const dpr = this.getPagePixelRatio()\r\n const canvas = this.pageList[0]\r\n canvas.style.height = `${height}px`\r\n canvas.height = height * dpr\r\n // canvas尺寸发生变化,上下文被重置\r\n this._initPageContext(this.ctxList[0])\r\n } else {\r\n // 连页模式:移除懒加载监听&清空页眉页脚计算数据\r\n this._disconnectLazyRender()\r\n this.header.recovery()\r\n this.footer.recovery()\r\n this.zone.setZone(EditorZone.MAIN)\r\n }\r\n const { startIndex } = this.range.getRange()\r\n const isCollapsed = this.range.getIsCollapsed()\r\n this.render({\r\n isSetCursor: true,\r\n curIndex: startIndex,\r\n isSubmitHistory: false\r\n })\r\n // 重新定位避免事件监听丢失\r\n if (!isCollapsed) {\r\n this.cursor.drawCursor({\r\n isShow: false\r\n })\r\n }\r\n // 回调\r\n setTimeout(() => {\r\n if (this.listener.pageModeChange) {\r\n this.listener.pageModeChange(payload)\r\n }\r\n if (this.eventBus.hasSubscribers('pageModeChange')) {\r\n this.eventBus.emit('pageModeChange', payload)\r\n }\r\n })\r\n }\r\n\r\n public setPageScale(payload: number) {\r\n const dpr = this.getPagePixelRatio()\r\n this.options.scale = payload\r\n const width = this.getWidth()\r\n const height = this.getHeight()\r\n this.container.style.width = `${width}px`\r\n this.pageList.forEach((p, i) => {\r\n p.width = width * dpr\r\n p.height = height * dpr\r\n p.style.width = `${width}px`\r\n p.style.height = `${height}px`\r\n p.style.marginBottom = `${this.getPageGap()}px`\r\n this._initPageContext(this.ctxList[i])\r\n })\r\n const cursorPosition = this.position.getCursorPosition()\r\n this.render({\r\n isSubmitHistory: false,\r\n isSetCursor: !!cursorPosition,\r\n curIndex: cursorPosition?.index\r\n })\r\n if (this.listener.pageScaleChange) {\r\n this.listener.pageScaleChange(payload)\r\n }\r\n if (this.eventBus.hasSubscribers('pageScaleChange')) {\r\n this.eventBus.emit('pageScaleChange', payload)\r\n }\r\n }\r\n\r\n public getPagePixelRatio(): number {\r\n return this.pagePixelRatio || window.devicePixelRatio\r\n }\r\n\r\n public setPagePixelRatio(payload: number | null) {\r\n if (\r\n (!this.pagePixelRatio && payload === window.devicePixelRatio) ||\r\n payload === this.pagePixelRatio\r\n ) {\r\n return\r\n }\r\n this.pagePixelRatio = payload\r\n this.setPageDevicePixel()\r\n }\r\n\r\n public setPageDevicePixel() {\r\n const dpr = this.getPagePixelRatio()\r\n const width = this.getWidth()\r\n const height = this.getHeight()\r\n this.pageList.forEach((p, i) => {\r\n p.width = width * dpr\r\n p.height = height * dpr\r\n this._initPageContext(this.ctxList[i])\r\n })\r\n this.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public setPaperSize(width: number, height: number) {\r\n this.options.width = width\r\n this.options.height = height\r\n const dpr = this.getPagePixelRatio()\r\n const realWidth = this.getWidth()\r\n const realHeight = this.getHeight()\r\n this.container.style.width = `${realWidth}px`\r\n this.pageList.forEach((p, i) => {\r\n p.width = realWidth * dpr\r\n p.height = realHeight * dpr\r\n p.style.width = `${realWidth}px`\r\n p.style.height = `${realHeight}px`\r\n this._initPageContext(this.ctxList[i])\r\n })\r\n this.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public setPaperDirection(payload: PaperDirection) {\r\n const dpr = this.getPagePixelRatio()\r\n this.options.paperDirection = payload\r\n const width = this.getWidth()\r\n const height = this.getHeight()\r\n this.container.style.width = `${width}px`\r\n this.pageList.forEach((p, i) => {\r\n p.width = width * dpr\r\n p.height = height * dpr\r\n p.style.width = `${width}px`\r\n p.style.height = `${height}px`\r\n this._initPageContext(this.ctxList[i])\r\n })\r\n this.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public setPaperMargin(payload: IMargin) {\r\n this.options.margins = payload\r\n this.render({\r\n isSubmitHistory: false,\r\n isSetCursor: false\r\n })\r\n }\r\n\r\n public getOriginValue(\r\n options: IGetOriginValueOption = {}\r\n ): Required<IEditorData> {\r\n const { pageNo } = options\r\n let mainElementList = this.elementList\r\n if (\r\n Number.isInteger(pageNo) &&\r\n pageNo! >= 0 &&\r\n pageNo! < this.pageRowList.length\r\n ) {\r\n mainElementList = this.pageRowList[pageNo!].flatMap(\r\n row => row.elementList\r\n )\r\n }\r\n const data: Required<IEditorData> = {\r\n header: this.getHeaderElementList(),\r\n main: mainElementList,\r\n footer: this.getFooterElementList()\r\n }\r\n return data\r\n }\r\n\r\n public getValue(options: IGetValueOption = {}): IEditorResult {\r\n const originData = this.getOriginValue(options)\r\n const { extraPickAttrs } = options\r\n const data: IEditorData = {\r\n header: zipElementList(originData.header, {\r\n extraPickAttrs\r\n }),\r\n main: zipElementList(originData.main, {\r\n extraPickAttrs,\r\n isClassifyArea: true\r\n }),\r\n footer: zipElementList(originData.footer, {\r\n extraPickAttrs\r\n })\r\n }\r\n return {\r\n dataVersion: DOCX_EDITOR_DATA_VERSION,\r\n schemaVersion: version,\r\n data,\r\n options: deepClone(this.options)\r\n }\r\n }\r\n\r\n public setValue(payload: Partial<IEditorData>, options?: ISetValueOption) {\r\n const { header, main, footer } = deepClone(payload)\r\n if (!header && !main && !footer) return\r\n const { isSetCursor = false } = options || {}\r\n const pageComponentData = [header, main, footer]\r\n pageComponentData.forEach(data => {\r\n if (!data) return\r\n formatElementList(data, {\r\n editorOptions: this.options,\r\n isForceCompensation: true\r\n })\r\n })\r\n this.setEditorData({\r\n header,\r\n main,\r\n footer\r\n })\r\n // 渲染&计算&清空历史记录\r\n this.historyManager.recovery()\r\n const curIndex = isSetCursor\r\n ? main?.length\r\n ? main.length - 1\r\n : 0\r\n : undefined\r\n if (curIndex !== undefined) {\r\n this.range.setRange(curIndex, curIndex)\r\n }\r\n this.render({\r\n curIndex,\r\n isSetCursor,\r\n isFirstRender: true\r\n })\r\n }\r\n\r\n public setEditorData(payload: Partial<IEditorData>) {\r\n const { header, main, footer } = payload\r\n if (header) {\r\n this._normalizeHeaderElementList(header)\r\n this.header.setElementList(header)\r\n }\r\n if (main) {\r\n this.elementList = main\r\n }\r\n if (footer) {\r\n this.footer.setElementList(footer)\r\n }\r\n }\r\n\r\n private _normalizeHeaderElementList(elementList?: IElement[]) {\r\n const firstElement = elementList?.[0]\r\n if (!firstElement) return\r\n // 空页眉首个补偿元素没有显式字号时,按八号作为默认字号。\r\n if (firstElement.value === ZERO && firstElement.size === undefined) {\r\n firstElement.size = this.HEADER_DEFAULT_SIZE\r\n }\r\n }\r\n\r\n private _wrapContainer(rootContainer: HTMLElement): HTMLDivElement {\r\n const container = document.createElement('div')\r\n rootContainer.append(container)\r\n return container\r\n }\r\n\r\n private _formatContainer() {\r\n // 容器宽度需跟随纸张宽度\r\n this.container.style.position = 'relative'\r\n this.container.style.width = `${this.getWidth()}px`\r\n this.container.setAttribute(EDITOR_COMPONENT, EditorComponent.MAIN)\r\n }\r\n\r\n private _createPageContainer(): HTMLDivElement {\r\n const pageContainer = document.createElement('div')\r\n pageContainer.classList.add(`${EDITOR_PREFIX}-page-container`)\r\n this.container.append(pageContainer)\r\n return pageContainer\r\n }\r\n\r\n private _createPage(pageNo: number) {\r\n const width = this.getWidth()\r\n const height = this.getHeight()\r\n const canvas = document.createElement('canvas')\r\n canvas.style.width = `${width}px`\r\n canvas.style.height = `${height}px`\r\n canvas.style.display = 'block'\r\n canvas.style.backgroundColor = '#ffffff'\r\n canvas.style.marginBottom = `${this.getPageGap()}px`\r\n canvas.setAttribute('data-index', String(pageNo))\r\n this.pageContainer.append(canvas)\r\n // 调整分辨率\r\n const dpr = this.getPagePixelRatio()\r\n canvas.width = width * dpr\r\n canvas.height = height * dpr\r\n canvas.style.cursor = 'text'\r\n const ctx = canvas.getContext('2d')!\r\n // 初始化上下文配置\r\n this._initPageContext(ctx)\r\n // 缓存上下文\r\n this.pageList.push(canvas)\r\n this.ctxList.push(ctx)\r\n }\r\n\r\n private _initPageContext(ctx: CanvasRenderingContext2D) {\r\n const dpr = this.getPagePixelRatio()\r\n ctx.scale(dpr, dpr)\r\n // 重置以下属性是因部分浏览器(chrome)会应用css样式\r\n ctx.letterSpacing = '0px'\r\n ctx.wordSpacing = '0px'\r\n ctx.direction = 'ltr'\r\n }\r\n\r\n public getElementFont(el: IElement, scale = 1): string {\r\n const { defaultSize, defaultFont } = this.options\r\n const expandFontFamily = (fontFamily: string) => {\r\n const f = (fontFamily || '').trim()\r\n if (!f) return f\r\n if (/^fangsong/i.test(f) || /仿宋/i.test(f)) {\r\n return 'FangSong,\"FangSong_GB2312\",\"仿宋\",SimSun,\"宋体\",serif'\r\n }\r\n if (/^kaiti/i.test(f) || /楷体/i.test(f)) {\r\n return 'KaiTi,\"KaiTi_GB2312\",\"楷体\",SimSun,\"宋体\",serif'\r\n }\r\n if (/^simsun/i.test(f) || /宋体/i.test(f)) {\r\n return 'SimSun,\"宋体\",serif'\r\n }\r\n if (/^simhei/i.test(f) || /黑体/i.test(f)) {\r\n return 'SimHei,\"黑体\",sans-serif'\r\n }\r\n if (/microsoft yahei|微软雅黑/i.test(f)) {\r\n return 'Microsoft YaHei,\"微软雅黑\",\"Microsoft YaHei UI\",\"微软雅黑 UI\",sans-serif'\r\n }\r\n if (/microsoft jhenghei|微軟正黑體/i.test(f)) {\r\n return 'Microsoft JhengHei,\"微軟正黑體\",sans-serif'\r\n }\r\n if (/^stxinwei/i.test(f) || /华文新魏/i.test(f)) {\r\n return '\"STXinwei\",\"华文新魏\",serif'\r\n }\r\n return f\r\n }\r\n const font = expandFontFamily(el.font || defaultFont)\r\n const size = el.actualSize || el.size || defaultSize\r\n return `${el.italic ? 'italic ' : ''}${el.bold ? 'bold ' : ''}${\r\n size * scale\r\n }px ${font}`\r\n }\r\n\r\n public getElementSize(el: IElement) {\r\n return el.actualSize || el.size || this.options.defaultSize\r\n }\r\n\r\n public getElementRowMargin(el: IElement) {\r\n const { defaultBasicRowMarginHeight, defaultRowMargin, scale } =\r\n this.options\r\n return (\r\n defaultBasicRowMarginHeight * (el.rowMargin ?? defaultRowMargin) * scale\r\n )\r\n }\r\n\r\n private isPageBreakElement(element?: IElement) {\r\n return element?.type === ElementType.PAGE_BREAK\r\n }\r\n\r\n private shouldForceWrapRow(\r\n element: IElement,\r\n preElement?: IElement\r\n ) {\r\n return (\r\n element.type === ElementType.SEPARATOR ||\r\n this.isPageBreakElement(element) ||\r\n isTableElement(element) ||\r\n this.isPageBreakElement(preElement) ||\r\n (preElement && isTableElement(preElement)) ||\r\n preElement?.type === ElementType.BLOCK ||\r\n element.type === ElementType.BLOCK ||\r\n preElement?.listId !== element.listId ||\r\n (preElement?.areaId !== element.areaId && !element.area?.hide) ||\r\n (element.control?.flexDirection === FlexDirection.COLUMN &&\r\n (element.controlComponent === ControlComponent.CHECKBOX ||\r\n element.controlComponent === ControlComponent.RADIO) &&\r\n preElement?.controlComponent === ControlComponent.VALUE) ||\r\n (element.value === ZERO && !element.area?.hide)\r\n )\r\n }\r\n\r\n private normalizeSpecialRow(row: IRow) {\r\n if (row.isPageBreak) {\r\n row.height = 0\r\n row.ascent = 0\r\n }\r\n }\r\n\r\n private shouldDrawLineBreakForRow(\r\n curRow: IRow,\r\n index: number,\r\n isDrawLineBreak: boolean,\r\n isPrintMode: boolean\r\n ) {\r\n return (\r\n isDrawLineBreak &&\r\n !isPrintMode &&\r\n this.mode !== EditorMode.CLEAN &&\r\n !curRow.isWidthNotEnough &&\r\n !curRow.isPageBreak &&\r\n index === curRow.elementList.length - 1\r\n )\r\n }\r\n\r\n public computeRowList(payload: IComputeRowListPayload) {\r\n const {\r\n innerWidth,\r\n elementList,\r\n isPagingMode = false,\r\n isFromTable = false,\r\n startX = 0,\r\n startY = 0,\r\n pageHeight = 0,\r\n mainOuterHeight = 0,\r\n surroundElementList = []\r\n } = payload\r\n const {\r\n defaultSize,\r\n defaultRowMargin,\r\n scale,\r\n table: { tdPadding, defaultTrMinHeight },\r\n defaultTabWidth\r\n } = this.options\r\n const defaultBasicRowMarginHeight = this.getDefaultBasicRowMarginHeight()\r\n // 使用 OffscreenCanvas 进行文本测量(性能更好)\r\n let ctx: CanvasRenderingContext2D\r\n if (typeof OffscreenCanvas !== 'undefined') {\r\n const offscreenCanvas = new OffscreenCanvas(1, 1)\r\n ctx = offscreenCanvas.getContext('2d') as unknown as CanvasRenderingContext2D\r\n } else {\r\n const canvas = document.createElement('canvas')\r\n ctx = canvas.getContext('2d') as CanvasRenderingContext2D\r\n }\r\n // 计算列表偏移宽度\r\n const listStyleMap = this.listParticle.computeListStyle(ctx, elementList)\r\n const rowList: IRow[] = []\r\n if (elementList.length) {\r\n rowList.push({\r\n width: 0,\r\n height: 0,\r\n ascent: 0,\r\n elementList: [],\r\n startIndex: 0,\r\n rowIndex: 0,\r\n rowFlex: elementList?.[0]?.rowFlex || elementList?.[1]?.rowFlex\r\n })\r\n }\r\n // 起始位置及页码计算\r\n let x = startX\r\n let y = startY\r\n let pageNo = 0\r\n // 列表位置\r\n let listId: string | undefined\r\n let listIndex = 0\r\n let paragraphFirstLineIndent = 0\r\n let paragraphIndentLeft = 0\r\n let isParagraphFirstRow = true\r\n // 控件最小宽度\r\n let controlRealWidth = 0\r\n for (let i = 0; i < elementList.length; i++) {\r\n const curRow: IRow = rowList[rowList.length - 1]\r\n const element = elementList[i]\r\n // 分栏区域检测:当遇到分栏标记元素时,收集整个分栏区域并生成分栏容器行\r\n if (\r\n element.columnId &&\r\n element.columnCount &&\r\n element.columnCount >= 2\r\n ) {\r\n const columnId = element.columnId\r\n const columnCount = element.columnCount\r\n const columnGap = (element.columnGap || 0) * scale\r\n const columnSeparator = element.columnSeparator || false\r\n const columnWidths = element.columnWidths || []\r\n // 收集分栏区域内所有元素(跳过起始标记本身)\r\n const columnElements: IElement[] = []\r\n let j = i + 1\r\n while (j < elementList.length) {\r\n const el = elementList[j]\r\n if (!el.columnId || el.columnId !== columnId) break\r\n columnElements.push(el)\r\n j++\r\n }\r\n // 按 COLUMN_BREAK 分组到各列\r\n const columnGroups: IElement[][] = [[]]\r\n for (const el of columnElements) {\r\n if (el.type === ElementType.COLUMN_BREAK) {\r\n if (columnGroups.length < columnCount) {\r\n columnGroups.push([])\r\n }\r\n } else {\r\n columnGroups[columnGroups.length - 1].push(el)\r\n }\r\n }\r\n // 计算各列宽度\r\n const scaledColumnWidths: number[] = []\r\n if (columnWidths.length >= columnCount) {\r\n for (let c = 0; c < columnCount; c++) {\r\n scaledColumnWidths.push(columnWidths[c] * scale)\r\n }\r\n } else {\r\n const totalGap = columnGap * (columnCount - 1)\r\n const colWidth = (innerWidth - totalGap) / columnCount\r\n for (let c = 0; c < columnCount; c++) {\r\n scaledColumnWidths.push(colWidth)\r\n }\r\n }\r\n // 对每列独立调用 computeRowList\r\n const columnRowLists: IRow[][] = []\r\n let maxColumnHeight = 0\r\n for (let c = 0; c < columnCount; c++) {\r\n const groupElements = columnGroups[c] || []\r\n if (groupElements.length === 0) {\r\n columnRowLists.push([])\r\n continue\r\n }\r\n const colRowList = this.computeRowList({\r\n innerWidth: scaledColumnWidths[c],\r\n elementList: groupElements,\r\n isFromTable,\r\n isPagingMode,\r\n columnContext: {\r\n columnId,\r\n columnIndex: c,\r\n totalColumns: columnCount\r\n }\r\n })\r\n columnRowLists.push(colRowList)\r\n const colHeight = colRowList.reduce(\r\n (sum, row) => sum + row.height, 0\r\n )\r\n if (colHeight > maxColumnHeight) {\r\n maxColumnHeight = colHeight\r\n }\r\n }\r\n // 生成分栏容器行\r\n const containerRow: IRow = {\r\n width: innerWidth,\r\n height: maxColumnHeight,\r\n ascent: 0,\r\n startIndex: i,\r\n elementList: [],\r\n rowIndex: curRow.rowIndex + (curRow.elementList.length > 0 ? 1 : 0),\r\n isColumnContainer: true,\r\n columnRowLists,\r\n columnWidths: scaledColumnWidths,\r\n columnGap,\r\n columnSeparator\r\n }\r\n // 如果当前行为空,替换;否则追加新行\r\n if (curRow.elementList.length <= 1) {\r\n rowList[rowList.length - 1] = containerRow\r\n } else {\r\n rowList.push(containerRow)\r\n }\r\n // 跳过分栏区域内的元素(包括结束标记)\r\n i = j // j 已指向分栏区域外第一个元素,for 循环会再 +1\r\n // 添加新的空行用于后续元素\r\n if (i < elementList.length) {\r\n rowList.push({\r\n width: 0,\r\n height: 0,\r\n ascent: 0,\r\n elementList: [],\r\n startIndex: i,\r\n rowIndex: containerRow.rowIndex + 1\r\n })\r\n }\r\n continue\r\n }\r\n if (element.paragraphFirstLineIndent !== undefined) {\r\n paragraphFirstLineIndent = element.paragraphFirstLineIndent\r\n }\r\n if (element.paragraphIndentLeft !== undefined) {\r\n paragraphIndentLeft = element.paragraphIndentLeft\r\n }\r\n const paragraphSpacingBefore = (element.paragraphSpacingBefore || 0) * scale\r\n const paragraphSpacingAfter = (element.paragraphSpacingAfter || 0) * scale\r\n const rowMargin =\r\n defaultBasicRowMarginHeight * (element.rowMargin ?? defaultRowMargin)\r\n const rowMarginTop = rowMargin + paragraphSpacingBefore\r\n const rowMarginBottom = rowMargin + paragraphSpacingAfter\r\n const metrics: IElementMetrics = {\r\n width: 0,\r\n height: 0,\r\n boundingBoxAscent: 0,\r\n boundingBoxDescent: 0\r\n }\r\n // 实际可用宽度\r\n const listOffsetX = element.listId ? listStyleMap.get(element.listId) || 0 : 0\r\n const listIndentX = element.listId\r\n ? ((element.listIndent ?? (element.listLevel || 0) * defaultTabWidth) || 0) *\r\n scale\r\n : 0\r\n const paragraphIndentX = paragraphIndentLeft * scale\r\n if (curRow.offsetX === undefined && (listOffsetX || paragraphIndentX || paragraphFirstLineIndent)) {\r\n const isListParagraph = !!element.listId\r\n const firstIndent = isListParagraph\r\n ? 0\r\n : Math.max(0, isParagraphFirstRow ? paragraphFirstLineIndent : 0)\r\n curRow.offsetX =\r\n listOffsetX +\r\n listIndentX +\r\n paragraphIndentX +\r\n (isParagraphFirstRow ? firstIndent : 0)\r\n if (isParagraphFirstRow && !isListParagraph) {\r\n isParagraphFirstRow = false\r\n }\r\n }\r\n if (element.listId) {\r\n curRow.isList = true\r\n if (curRow.listIndex === undefined) {\r\n curRow.listIndex = listIndex\r\n }\r\n }\r\n const offsetX = curRow.offsetX || 0\r\n const availableWidth = innerWidth - offsetX\r\n // 增加起始位置坐标偏移量\r\n const isStartElement = curRow.elementList.length === 1\r\n x += isStartElement ? offsetX : 0\r\n y += isStartElement ? curRow.offsetY || 0 : 0\r\n if (\r\n (element.control?.hide || element.area?.hide) &&\r\n !this.isDesignMode()\r\n ) {\r\n metrics.height =\r\n curRow.elementList[curRow.elementList.length - 1]?.metrics.height ||\r\n this.options.defaultSize * scale\r\n } else if (element.revisionType === 'delete') {\r\n // 删除修订不占位,宽高设为0\r\n metrics.width = 0\r\n metrics.height = 0\r\n metrics.boundingBoxAscent = 0\r\n metrics.boundingBoxDescent = 0\r\n } else if (\r\n isImageElement(element) ||\r\n element.type === ElementType.LATEX\r\n ) {\r\n // 浮动图片无需计算数据\r\n if (\r\n element.imgDisplay === ImageDisplay.SURROUND ||\r\n element.imgDisplay === ImageDisplay.FLOAT_TOP ||\r\n element.imgDisplay === ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n metrics.width = 0\r\n metrics.height = 0\r\n metrics.boundingBoxDescent = 0\r\n } else {\r\n const elementWidth = element.width! * scale\r\n const elementHeight = element.height! * scale\r\n // 图片超出尺寸后自适应(图片大小大于可用宽度时)\r\n if (elementWidth > availableWidth) {\r\n const adaptiveHeight =\r\n (elementHeight * availableWidth) / elementWidth\r\n element.width = availableWidth / scale\r\n element.height = adaptiveHeight / scale\r\n metrics.width = availableWidth\r\n metrics.height = adaptiveHeight\r\n metrics.boundingBoxDescent = adaptiveHeight\r\n } else {\r\n metrics.width = elementWidth\r\n metrics.height = elementHeight\r\n metrics.boundingBoxDescent = elementHeight\r\n }\r\n }\r\n metrics.boundingBoxAscent = 0\r\n } else if (isTableElement(element)) {\r\n const tableTdPadding = element.tdPadding || tdPadding\r\n // 查看后续表格是否属于同一个源表格-存在即合并\r\n if (element.pagingId) {\r\n let tableIndex = i + 1\r\n let combineCount = 0\r\n while (tableIndex < elementList.length) {\r\n const nextElement = elementList[tableIndex]\r\n if (nextElement.pagingId === element.pagingId) {\r\n const nexTrList = nextElement.trList!.filter(\r\n tr => !tr.pagingRepeat\r\n )\r\n element.trList!.push(...nexTrList)\r\n element.height! += nextElement.height!\r\n tableIndex++\r\n combineCount++\r\n } else {\r\n break\r\n }\r\n }\r\n if (combineCount) {\r\n elementList.splice(i + 1, combineCount)\r\n }\r\n }\r\n element.pagingIndex = element.pagingIndex ?? 0\r\n const trList = element.trList!\r\n const getTrAutoMinHeight = (tr: any) => {\r\n let maxSize = defaultSize\r\n let maxTdPaddingHeight = (tableTdPadding[0] || 0) + (tableTdPadding[2] || 0)\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const curPad = td.padding || tableTdPadding\r\n const curPadH = (curPad[0] || 0) + (curPad[2] || 0)\r\n if (curPadH > maxTdPaddingHeight) maxTdPaddingHeight = curPadH\r\n const valueList = td.value || []\r\n for (let i = 0; i < valueList.length; i++) {\r\n const el = valueList[i]\r\n if (!el) continue\r\n if (el.value === ZERO || el.value === '\\n') continue\r\n const size = el.actualSize || el.size || defaultSize\r\n if (size > maxSize) maxSize = size\r\n }\r\n }\r\n return Math.ceil(maxSize * 1.4 + maxTdPaddingHeight)\r\n }\r\n // 计算前移除上一次的高度\r\n for (let t = 0; t < trList.length; t++) {\r\n const tr = trList[t]\r\n const { defaultTrHeight } = this.options.table\r\n const baseHeight = Number(defaultTrHeight)\r\n const hasBaseHeight = Number.isFinite(baseHeight) && baseHeight > 0\r\n const autoMinHeight = Math.max(\r\n defaultTrMinHeight,\r\n hasBaseHeight ? baseHeight : 0,\r\n getTrAutoMinHeight(tr)\r\n )\r\n const explicitHeight = Number(tr.height)\r\n const hasExplicitHeight = Number.isFinite(explicitHeight) && explicitHeight > 0\r\n const nextHeight = tr.minHeight ?? (hasExplicitHeight ? explicitHeight : autoMinHeight)\r\n tr.height = Math.max(defaultTrMinHeight, nextHeight)\r\n tr.minHeight = tr.height\r\n }\r\n // 计算表格行列\r\n this.tableParticle.computeRowColInfo(element)\r\n // 计算表格内元素信息\r\n for (let t = 0; t < trList.length; t++) {\r\n const tr = trList[t]\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const effectiveTdPadding = td.padding || tableTdPadding\r\n const tdPaddingWidth = effectiveTdPadding[1] + effectiveTdPadding[3]\r\n const tdPaddingHeight = effectiveTdPadding[0] + effectiveTdPadding[2]\r\n const rowList = this.computeRowList({\r\n innerWidth: (td.width! - tdPaddingWidth) * scale,\r\n elementList: td.value,\r\n isFromTable: true,\r\n isPagingMode\r\n })\r\n const rowHeight = rowList.reduce((pre, cur) => pre + cur.height, 0)\r\n td.rowList = rowList\r\n // 移除缩放导致的行高变化-渲染时会进行缩放调整\r\n const curTdHeight = rowHeight / scale + tdPaddingHeight\r\n // 内容高度大于当前单元格高度需增加\r\n if (td.height! < curTdHeight) {\r\n const extraHeight = curTdHeight - td.height!\r\n const changeTr = trList[t + td.rowspan - 1]\r\n changeTr.height += extraHeight\r\n changeTr.tdList.forEach(changeTd => {\r\n changeTd.height! += extraHeight\r\n if (!changeTd.realHeight) {\r\n changeTd.realHeight = changeTd.height!\r\n } else {\r\n changeTd.realHeight! += extraHeight\r\n }\r\n })\r\n }\r\n // 当前单元格最小高度及真实高度(包含跨列)\r\n let curTdMinHeight = 0\r\n let curTdRealHeight = 0\r\n let i = 0\r\n while (i < td.rowspan) {\r\n const curTr = trList[i + t] || trList[t]\r\n curTdMinHeight += curTr.minHeight!\r\n curTdRealHeight += curTr.height!\r\n i++\r\n }\r\n td.realMinHeight = curTdMinHeight\r\n td.realHeight = curTdRealHeight\r\n td.mainHeight = curTdHeight\r\n }\r\n }\r\n // 单元格高度大于实际内容高度需减少\r\n const reduceTrList = this.tableParticle.getTrListGroupByCol(trList)\r\n for (let t = 0; t < reduceTrList.length; t++) {\r\n const tr = reduceTrList[t]\r\n let reduceHeight = -1\r\n for (let d = 0; d < tr.tdList.length; d++) {\r\n const td = tr.tdList[d]\r\n const curTdRealHeight = td.realHeight!\r\n const curTdHeight = td.mainHeight!\r\n const curTdMinHeight = td.realMinHeight!\r\n // 获取最大可减少高度\r\n const curReduceHeight =\r\n curTdHeight < curTdMinHeight\r\n ? curTdRealHeight - curTdMinHeight\r\n : curTdRealHeight - curTdHeight\r\n if (!~reduceHeight || curReduceHeight < reduceHeight) {\r\n reduceHeight = curReduceHeight\r\n }\r\n }\r\n if (reduceHeight > 0) {\r\n const changeTr = trList[t]\r\n changeTr.height -= reduceHeight\r\n changeTr.tdList.forEach(changeTd => {\r\n changeTd.height! -= reduceHeight\r\n changeTd.realHeight! -= reduceHeight\r\n })\r\n }\r\n }\r\n // 需要重新计算表格内值\r\n this.tableParticle.computeRowColInfo(element)\r\n // 计算出表格高度\r\n const tableHeight = this.tableParticle.getTableHeight(element)\r\n const tableWidth = this.tableParticle.getTableWidth(element)\r\n element.width = tableWidth\r\n element.height = tableHeight\r\n const elementWidth = tableWidth * scale\r\n const elementHeight = tableHeight * scale\r\n metrics.width = elementWidth\r\n metrics.height = elementHeight\r\n metrics.boundingBoxDescent = elementHeight\r\n metrics.boundingBoxAscent = -rowMargin\r\n // 后一个元素也是表格则移除行间距\r\n if (elementList[i + 1]?.type === ElementType.TABLE) {\r\n metrics.boundingBoxAscent -= rowMargin\r\n }\r\n // 表格分页处理(拆分表格)\r\n if (isPagingMode) {\r\n const height = this.getHeight()\r\n const marginHeight = this.getMainOuterHeight()\r\n let curPagePreHeight = marginHeight\r\n for (let r = 0; r < rowList.length; r++) {\r\n const row = rowList[r]\r\n const rowOffsetY = row.offsetY || 0\r\n if (\r\n row.height + curPagePreHeight + rowOffsetY > height ||\r\n rowList[r - 1]?.isPageBreak\r\n ) {\r\n curPagePreHeight = marginHeight + row.height + rowOffsetY\r\n } else {\r\n curPagePreHeight += row.height + rowOffsetY\r\n }\r\n }\r\n // 当前剩余高度是否能容下当前表格第一行(可拆分)的高度,排除掉表头类型\r\n const rowMarginHeight = rowMargin * 2 * scale\r\n const firstTrHeight = element.trList![0].height! * scale\r\n if (\r\n curPagePreHeight + firstTrHeight + rowMarginHeight > height ||\r\n (element.pagingIndex !== 0 && element.trList![0].pagingRepeat)\r\n ) {\r\n // 无可拆分行则切换至新页\r\n curPagePreHeight = marginHeight\r\n }\r\n // 表格高度超过页面高度开始截断行\r\n if (curPagePreHeight + rowMarginHeight + elementHeight > height) {\r\n const trList = element.trList!\r\n // 计算需要移除的行数\r\n let deleteStart = 0\r\n let deleteCount = 0\r\n let preTrHeight = 0\r\n // 大于一行时再拆分避免循环\r\n if (trList.length > 1) {\r\n for (let r = 0; r < trList.length; r++) {\r\n const tr = trList[r]\r\n const trHeight = tr.height * scale\r\n if (\r\n curPagePreHeight + rowMarginHeight + preTrHeight + trHeight >\r\n height\r\n ) {\r\n // 当前行存在跨行中断-暂时忽略分页\r\n const rowColCount = tr.tdList.reduce(\r\n (pre, cur) => pre + cur.colspan,\r\n 0\r\n )\r\n if (element.colgroup?.length !== rowColCount) {\r\n deleteCount = 0\r\n }\r\n break\r\n } else {\r\n deleteStart = r + 1\r\n deleteCount = trList.length - deleteStart\r\n preTrHeight += trHeight\r\n }\r\n }\r\n }\r\n if (deleteCount) {\r\n const cloneTrList = trList.splice(deleteStart, deleteCount)\r\n const cloneTrHeight = cloneTrList.reduce(\r\n (pre, cur) => pre + cur.height,\r\n 0\r\n )\r\n const cloneTrRealHeight = cloneTrHeight * scale\r\n const pagingId = element.pagingId || getUUID()\r\n element.pagingId = pagingId\r\n element.height -= cloneTrHeight\r\n metrics.height -= cloneTrRealHeight\r\n metrics.boundingBoxDescent -= cloneTrRealHeight\r\n // 追加拆分表格\r\n const cloneElement = deepClone(element)\r\n cloneElement.pagingId = pagingId\r\n cloneElement.pagingIndex = element.pagingIndex! + 1\r\n // 处理分页重复表头\r\n const repeatTrList = trList.filter(tr => tr.pagingRepeat)\r\n if (repeatTrList.length) {\r\n const cloneRepeatTrList = deepClone(repeatTrList)\r\n cloneRepeatTrList.forEach(tr => (tr.id = getUUID()))\r\n cloneTrList.unshift(...cloneRepeatTrList)\r\n }\r\n cloneElement.trList = cloneTrList\r\n cloneElement.id = getUUID()\r\n this.spliceElementList(elementList, i + 1, 0, [cloneElement])\r\n }\r\n }\r\n // 表格经过分页处理-需要处理上下文\r\n if (element.pagingId) {\r\n const positionContext = this.position.getPositionContext()\r\n if (positionContext.isTable) {\r\n // 查找光标所在表格索引(根据trId搜索)\r\n let newPositionContextIndex = -1\r\n let newPositionContextTrIndex = -1\r\n let tableIndex = i\r\n while (tableIndex < elementList.length) {\r\n const curElement = elementList[tableIndex]\r\n if (curElement.pagingId !== element.pagingId) break\r\n const trIndex = curElement.trList!.findIndex(\r\n r => r.id === positionContext.trId\r\n )\r\n if (~trIndex) {\r\n newPositionContextIndex = tableIndex\r\n newPositionContextTrIndex = trIndex\r\n break\r\n }\r\n tableIndex++\r\n }\r\n if (~newPositionContextIndex) {\r\n positionContext.index = newPositionContextIndex\r\n positionContext.trIndex = newPositionContextTrIndex\r\n this.position.setPositionContext(positionContext)\r\n }\r\n }\r\n }\r\n }\r\n } else if (element.type === ElementType.SEPARATOR) {\r\n const {\r\n separator: { lineWidth }\r\n } = this.options\r\n element.width = availableWidth / scale\r\n metrics.width = availableWidth\r\n metrics.height = getSeparatorRenderHeight(element, lineWidth) * scale\r\n metrics.boundingBoxAscent = -rowMargin\r\n metrics.boundingBoxDescent = -rowMargin + metrics.height\r\n } else if (element.type === ElementType.PAGE_BREAK) {\r\n // 分页符禁用显示时,保留最小高度用于光标定位,但不占用水平空间\r\n if (this.options.pageBreak.disabled) {\r\n element.width = 0\r\n metrics.width = 0\r\n metrics.height = defaultSize * scale\r\n metrics.boundingBoxAscent = defaultSize * scale\r\n metrics.boundingBoxDescent = 0\r\n } else {\r\n element.width = availableWidth / scale\r\n metrics.width = availableWidth\r\n metrics.height = defaultSize\r\n }\r\n } else if (\r\n element.type === ElementType.RADIO ||\r\n element.controlComponent === ControlComponent.RADIO\r\n ) {\r\n const { width, height, gap } = this.options.radio\r\n const elementWidth = width + gap * 2\r\n element.width = elementWidth\r\n metrics.width = elementWidth * scale\r\n metrics.height = height * scale\r\n } else if (\r\n element.type === ElementType.CHECKBOX ||\r\n element.controlComponent === ControlComponent.CHECKBOX\r\n ) {\r\n const { width, height, gap } = this.options.checkbox\r\n const elementWidth = width + gap * 2\r\n element.width = elementWidth\r\n metrics.width = elementWidth * scale\r\n metrics.height = height * scale\r\n } else if (element.type === ElementType.TAB) {\r\n metrics.width = defaultTabWidth * scale\r\n metrics.height = defaultSize * scale\r\n metrics.boundingBoxDescent = 0\r\n metrics.boundingBoxAscent = metrics.height\r\n } else if (element.type === ElementType.BLOCK) {\r\n if (!element.width) {\r\n metrics.width = availableWidth\r\n } else {\r\n const elementWidth = element.width * scale\r\n metrics.width = Math.min(elementWidth, availableWidth)\r\n }\r\n metrics.height = element.height! * scale\r\n metrics.boundingBoxDescent = metrics.height\r\n metrics.boundingBoxAscent = 0\r\n } else {\r\n // 设置上下标真实字体尺寸\r\n const size = element.size || defaultSize\r\n if (\r\n element.type === ElementType.SUPERSCRIPT ||\r\n element.type === ElementType.SUBSCRIPT\r\n ) {\r\n element.actualSize = Math.ceil(size * 0.6)\r\n }\r\n metrics.height = (element.actualSize || size) * scale\r\n ctx.font = this.getElementFont(element)\r\n const fontMetrics = this.textParticle.measureText(ctx, element)\r\n const characterScaleRatio = TextParticle.getCharacterScaleRatio(\r\n element.characterScale\r\n )\r\n metrics.width = fontMetrics.width * scale * characterScaleRatio\r\n if (element.letterSpacing) {\r\n metrics.width += element.letterSpacing * scale\r\n }\r\n metrics.boundingBoxAscent =\r\n (element.value === ZERO\r\n ? element.size || defaultSize\r\n : fontMetrics.actualBoundingBoxAscent) * scale\r\n metrics.boundingBoxDescent =\r\n fontMetrics.actualBoundingBoxDescent * scale\r\n if (element.type === ElementType.SUPERSCRIPT) {\r\n metrics.boundingBoxAscent += metrics.height / 2\r\n } else if (element.type === ElementType.SUBSCRIPT) {\r\n metrics.boundingBoxDescent += metrics.height / 2\r\n }\r\n }\r\n const lineHeight = element.lineHeight ?? this.options.defaultLineHeight\r\n const ascent =\r\n isImageElement(element) ||\r\n element.type === ElementType.LATEX\r\n ? metrics.height + rowMarginTop\r\n : metrics.boundingBoxAscent +\r\n rowMarginTop +\r\n ((metrics.boundingBoxAscent + metrics.boundingBoxDescent) *\r\n (lineHeight - 1)) /\r\n 2\r\n const height =\r\n rowMarginTop +\r\n (metrics.boundingBoxAscent + metrics.boundingBoxDescent) * lineHeight +\r\n rowMarginBottom\r\n const rowElement: IRowElement = Object.assign(element, {\r\n metrics,\r\n left: 0,\r\n style: this.getElementFont(element, scale)\r\n })\r\n // 暂时只考虑非换行场景:控件开始时统计宽度,结束时消费宽度及还原\r\n if (rowElement.control?.minWidth) {\r\n if (rowElement.controlComponent) {\r\n controlRealWidth += metrics.width\r\n }\r\n if (rowElement.controlComponent === ControlComponent.POSTFIX) {\r\n // 设置最小宽度控件属性(字符偏移量)\r\n this.control.setMinWidthControlInfo({\r\n row: curRow,\r\n rowElement,\r\n availableWidth,\r\n controlRealWidth\r\n })\r\n controlRealWidth = 0\r\n }\r\n }\r\n // 超过限定宽度\r\n const preElement = elementList[i - 1]\r\n let nextElement = elementList[i + 1]\r\n // 累计行宽 + 当前元素宽度 + 排版宽度(英文单词整体宽度 + 后面标点符号宽度)\r\n let curRowWidth = curRow.width + metrics.width\r\n if (this.options.wordBreak === WordBreak.BREAK_WORD) {\r\n if (\r\n (!preElement?.type || preElement?.type === ElementType.TEXT) &&\r\n (!element.type || element.type === ElementType.TEXT)\r\n ) {\r\n // 英文单词\r\n const word = `${preElement?.value || ''}${element.value}`\r\n if (this.WORD_LIKE_REG.test(word)) {\r\n const { width, endElement } = this.textParticle.measureWord(\r\n ctx,\r\n elementList,\r\n i\r\n )\r\n // 单词宽度大于行可用宽度,无需折行\r\n const wordWidth = width * scale\r\n if (wordWidth <= availableWidth) {\r\n curRowWidth += wordWidth\r\n nextElement = endElement\r\n }\r\n }\r\n // 标点符号\r\n const punctuationWidth = this.textParticle.measurePunctuationWidth(\r\n ctx,\r\n nextElement\r\n )\r\n curRowWidth += punctuationWidth * scale\r\n }\r\n }\r\n // 列表信息\r\n if (element.listId) {\r\n if (element.listId !== listId) {\r\n listIndex = 0\r\n } else if (isParagraphSeparator(element)) {\r\n listIndex++\r\n }\r\n }\r\n listId = element.listId\r\n // 计算四周环绕导致的元素偏移量\r\n const surroundPosition = this.position.setSurroundPosition({\r\n pageNo,\r\n rowElement,\r\n row: curRow,\r\n rowElementRect: {\r\n x,\r\n y,\r\n height,\r\n width: metrics.width\r\n },\r\n availableWidth,\r\n surroundElementList\r\n })\r\n x = surroundPosition.x\r\n curRowWidth += surroundPosition.rowIncreaseWidth\r\n x += metrics.width\r\n // 是否强制换行\r\n const isForceBreak =\r\n i !== 0 &&\r\n this.shouldForceWrapRow(element, preElement)\r\n // 是否宽度不足导致换行\r\n const isWidthNotEnough = curRowWidth > availableWidth\r\n const isWrap = isForceBreak || isWidthNotEnough\r\n // 新行数据处理\r\n if (isWrap) {\r\n const resolveRowFlex = () => {\r\n const cur = elementList[i]\r\n if (cur?.value === ZERO) {\r\n return (\r\n elementList[i + 1]?.rowFlex ||\r\n elementList[i + 2]?.rowFlex ||\r\n cur.rowFlex\r\n )\r\n }\r\n return cur?.rowFlex || elementList[i + 1]?.rowFlex\r\n }\r\n const row: IRow = {\r\n width: metrics.width,\r\n height,\r\n startIndex: i,\r\n elementList: [rowElement],\r\n ascent,\r\n rowIndex: curRow.rowIndex + 1,\r\n rowFlex: resolveRowFlex(),\r\n isPageBreak: this.isPageBreakElement(element)\r\n }\r\n this.normalizeSpecialRow(row)\r\n // 控件缩进\r\n if (\r\n rowElement.controlComponent !== ControlComponent.PREFIX &&\r\n rowElement.control?.indentation === ControlIndentation.VALUE_START\r\n ) {\r\n // 查找到非前缀的第一个元素位置\r\n const preStartIndex = curRow.elementList.findIndex(\r\n el =>\r\n el.controlId === rowElement.controlId &&\r\n el.controlComponent !== ControlComponent.PREFIX\r\n )\r\n if (~preStartIndex) {\r\n const preRowPositionList = this.position.computeRowPosition({\r\n row: curRow,\r\n innerWidth: this.getInnerWidth()\r\n })\r\n const valueStartPosition = preRowPositionList[preStartIndex]\r\n if (valueStartPosition) {\r\n row.offsetX = valueStartPosition.coordinate.leftTop[0]\r\n }\r\n }\r\n }\r\n // 列表缩进\r\n if (element.listId) {\r\n row.isList = true\r\n row.offsetX =\r\n (row.offsetX || 0) + (listStyleMap.get(element.listId!) || 0) + listIndentX\r\n row.listIndex = listIndex\r\n }\r\n // Y轴偏移量\r\n row.offsetY =\r\n !isFromTable &&\r\n element.area?.top &&\r\n element.areaId !== elementList[i - 1]?.areaId\r\n ? element.area.top * scale\r\n : 0\r\n rowList.push(row)\r\n } else {\r\n curRow.width += metrics.width\r\n // 减小块元素前第一行空行行高\r\n if (\r\n i === 0 &&\r\n (getIsBlockElement(elementList[1]) || !!elementList[1]?.areaId)\r\n ) {\r\n curRow.height = defaultBasicRowMarginHeight\r\n curRow.ascent = defaultBasicRowMarginHeight\r\n } else if (curRow.height < height) {\r\n curRow.height = height\r\n curRow.ascent = ascent\r\n }\r\n curRow.elementList.push(rowElement)\r\n }\r\n // 行结束时逻辑\r\n if (isWrap || i === elementList.length - 1) {\r\n // 换行原因:宽度不足\r\n curRow.isWidthNotEnough = isWidthNotEnough && !isForceBreak\r\n // 两端对齐、分散对齐\r\n if (\r\n !curRow.isSurround &&\r\n (preElement?.rowFlex === RowFlex.JUSTIFY ||\r\n (preElement?.rowFlex === RowFlex.ALIGNMENT &&\r\n curRow.isWidthNotEnough))\r\n ) {\r\n // 忽略换行符及尾部元素间隔设置\r\n const rowElementList =\r\n curRow.elementList[0]?.value === ZERO\r\n ? curRow.elementList.slice(1)\r\n : curRow.elementList\r\n const gap =\r\n (availableWidth - curRow.width) / (rowElementList.length - 1)\r\n for (let e = 0; e < rowElementList.length - 1; e++) {\r\n const el = rowElementList[e]\r\n el.metrics.width += gap\r\n }\r\n curRow.width = availableWidth\r\n }\r\n }\r\n if (i !== 0 && element.value === ZERO && !element.area?.hide && !element.listWrap) {\r\n paragraphFirstLineIndent = 0\r\n paragraphIndentLeft = 0\r\n isParagraphFirstRow = true\r\n }\r\n // 重新计算坐标、页码、下一行首行元素环绕交叉\r\n if (isWrap) {\r\n x = startX\r\n y += curRow.height\r\n if (\r\n isPagingMode &&\r\n !isFromTable &&\r\n pageHeight &&\r\n (y - startY + mainOuterHeight + height > pageHeight ||\r\n this.isPageBreakElement(element))\r\n ) {\r\n y = startY\r\n // 删除多余四周环绕型元素\r\n deleteSurroundElementList(surroundElementList, pageNo)\r\n pageNo += 1\r\n }\r\n // 计算下一行第一个元素是否存在环绕交叉\r\n rowElement.left = 0\r\n const nextRow = rowList[rowList.length - 1]\r\n const surroundPosition = this.position.setSurroundPosition({\r\n pageNo,\r\n rowElement,\r\n row: nextRow,\r\n rowElementRect: {\r\n x,\r\n y,\r\n height,\r\n width: metrics.width\r\n },\r\n availableWidth,\r\n surroundElementList\r\n })\r\n x = surroundPosition.x\r\n x += metrics.width\r\n }\r\n }\r\n return rowList\r\n }\r\n\r\n private _computePageList(): IRow[][] {\r\n const pageRowList: IRow[][] = [[]]\r\n const {\r\n pageMode,\r\n pageNumber: { maxPageNo }\r\n } = this.options\r\n const height = this.getHeight()\r\n const marginHeight = this.getMainOuterHeight()\r\n let pageHeight = marginHeight\r\n let pageNo = 0\r\n if (pageMode === PageMode.CONTINUITY) {\r\n pageRowList[0] = this.rowList\r\n // 重置高度\r\n pageHeight += this.rowList.reduce(\r\n (pre, cur) => pre + cur.height + (cur.offsetY || 0),\r\n 0\r\n )\r\n const dpr = this.getPagePixelRatio()\r\n const pageDom = this.pageList[0]\r\n const pageDomHeight = Number(pageDom.style.height.replace('px', ''))\r\n if (pageHeight > pageDomHeight) {\r\n pageDom.style.height = `${pageHeight}px`\r\n pageDom.height = pageHeight * dpr\r\n } else {\r\n const reduceHeight = pageHeight < height ? height : pageHeight\r\n pageDom.style.height = `${reduceHeight}px`\r\n pageDom.height = reduceHeight * dpr\r\n }\r\n this._initPageContext(this.ctxList[0])\r\n } else {\r\n for (let i = 0; i < this.rowList.length; i++) {\r\n const row = this.rowList[i]\r\n const rowOffsetY = row.offsetY || 0\r\n if (\r\n row.height + rowOffsetY + pageHeight > height ||\r\n this.rowList[i - 1]?.isPageBreak\r\n ) {\r\n if (Number.isInteger(maxPageNo) && pageNo >= maxPageNo!) {\r\n this.elementList = this.elementList.slice(0, row.startIndex)\r\n break\r\n }\r\n pageHeight = marginHeight + row.height + rowOffsetY\r\n pageRowList.push([row])\r\n pageNo++\r\n } else {\r\n pageHeight += row.height + rowOffsetY\r\n pageRowList[pageNo].push(row)\r\n }\r\n }\r\n }\r\n return pageRowList\r\n }\r\n\r\n private _drawParagraphColor(\r\n ctx: CanvasRenderingContext2D,\r\n payload: IDrawRowPayload\r\n ) {\r\n const { rowList, positionList, innerWidth } = payload\r\n const margins = this.getMargins()\r\n for (let i = 0; i < rowList.length; i++) {\r\n const curRow = rowList[i]\r\n const firstElement = curRow.elementList[0]\r\n const paragraphColor = firstElement?.paragraphColor\r\n if (!paragraphColor) continue\r\n const {\r\n coordinate: {\r\n leftTop: [, y]\r\n }\r\n } = positionList[curRow.startIndex]\r\n const x = margins[3]\r\n this.paragraphColor.recordFillInfo(\r\n ctx,\r\n x,\r\n y,\r\n innerWidth,\r\n curRow.height,\r\n paragraphColor\r\n )\r\n this.paragraphColor.render(ctx)\r\n }\r\n }\r\n\r\n private _drawHighlight(\r\n ctx: CanvasRenderingContext2D,\r\n payload: IDrawRowPayload\r\n ) {\r\n const { rowList, positionList, elementList } = payload\r\n const marginHeight = this.getDefaultBasicRowMarginHeight()\r\n const highlightMarginHeight = this.getHighlightMarginHeight()\r\n for (let i = 0; i < rowList.length; i++) {\r\n const curRow = rowList[i]\r\n for (let j = 0; j < curRow.elementList.length; j++) {\r\n const element = curRow.elementList[j]\r\n const preElement = curRow.elementList[j - 1]\r\n // 高亮配置:元素 > 控件配置\r\n const highlight =\r\n element.highlight ||\r\n this.control.getControlHighlight(elementList, curRow.startIndex + j)\r\n if (highlight) {\r\n // 高亮元素相连需立即绘制,并记录下一元素坐标\r\n if (\r\n preElement &&\r\n preElement.highlight &&\r\n preElement.highlight !== element.highlight\r\n ) {\r\n this.highlight.render(ctx)\r\n }\r\n // 当前元素位置信息记录\r\n const {\r\n coordinate: {\r\n leftTop: [x, y]\r\n }\r\n } = positionList[curRow.startIndex + j]\r\n // 元素向左偏移量\r\n const offsetX = element.left || 0\r\n this.highlight.recordFillInfo(\r\n ctx,\r\n x - offsetX,\r\n y + marginHeight - highlightMarginHeight, // 先减去行margin,再加上高亮margin\r\n element.metrics.width + offsetX,\r\n curRow.height - 2 * marginHeight + 2 * highlightMarginHeight,\r\n highlight\r\n )\r\n } else if (preElement?.highlight) {\r\n // 之前是高亮元素,当前不是需立即绘制\r\n this.highlight.render(ctx)\r\n }\r\n }\r\n this.highlight.render(ctx)\r\n }\r\n }\r\n\r\n public drawRow(ctx: CanvasRenderingContext2D, payload: IDrawRowPayload) {\r\n // 优先绘制段落背景色(最底层)\r\n this._drawParagraphColor(ctx, payload)\r\n // 绘制高亮元素\r\n this._drawHighlight(ctx, payload)\r\n // 绘制元素、下划线、删除线、选区\r\n const {\r\n scale,\r\n table: { tdPadding },\r\n group,\r\n lineBreak\r\n } = this.options\r\n const {\r\n rowList,\r\n pageNo,\r\n elementList,\r\n positionList,\r\n startIndex,\r\n zone,\r\n isDrawLineBreak = !lineBreak.disabled\r\n } = payload\r\n const isPrintMode = this.mode === EditorMode.PRINT\r\n const { isCrossRowCol, tableId } = this.range.getRange()\r\n let index = startIndex\r\n for (let i = 0; i < rowList.length; i++) {\r\n const curRow = rowList[i]\r\n // 分栏容器行:绘制各列内容及可选分隔线\r\n if (curRow.isColumnContainer && curRow.columnRowLists) {\r\n const { scale } = this.options\r\n const colWidths = curRow.columnWidths || []\r\n const colGap = curRow.columnGap || 0\r\n const colSeparator = curRow.columnSeparator || false\r\n // 获取分栏容器行的 Y 坐标\r\n const containerPos = positionList[curRow.startIndex]\r\n const containerY = containerPos\r\n ? containerPos.coordinate.leftTop[1]\r\n : 0\r\n let colX = containerPos\r\n ? containerPos.coordinate.leftTop[0]\r\n : 0\r\n for (let c = 0; c < curRow.columnRowLists.length; c++) {\r\n const colRowList = curRow.columnRowLists[c]\r\n if (colRowList.length > 0) {\r\n // 计算列内元素的位置列表\r\n const colPositionList: IElementPosition[] = []\r\n this.position.computePageRowPosition({\r\n positionList: colPositionList,\r\n rowList: colRowList,\r\n pageNo,\r\n startX: colX,\r\n startY: containerY,\r\n startRowIndex: 0,\r\n startIndex: 0,\r\n innerWidth: colWidths[c] || 0\r\n })\r\n // 构建列内元素列表\r\n const colElementList: IElement[] = []\r\n for (const colRow of colRowList) {\r\n for (const el of colRow.elementList) {\r\n colElementList.push(el)\r\n }\r\n }\r\n // 绘制列内容\r\n this.drawRow(ctx, {\r\n elementList: colElementList,\r\n positionList: colPositionList,\r\n rowList: colRowList,\r\n pageNo,\r\n startIndex: 0,\r\n innerWidth: colWidths[c] || 0,\r\n zone\r\n })\r\n }\r\n // 绘制列间分隔线\r\n if (colSeparator && c < curRow.columnRowLists.length - 1) {\r\n const separatorX = colX + (colWidths[c] || 0) + colGap / 2\r\n ctx.save()\r\n ctx.beginPath()\r\n ctx.moveTo(separatorX, containerY)\r\n ctx.lineTo(separatorX, containerY + curRow.height)\r\n ctx.strokeStyle = '#DCDFE6'\r\n ctx.lineWidth = 0.5 * scale\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n colX += (colWidths[c] || 0) + colGap\r\n }\r\n continue\r\n }\r\n // 选区绘制记录\r\n const rangeRecord: IElementFillRect = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0\r\n }\r\n let tableRangeElement: IElement | null = null\r\n for (let j = 0; j < curRow.elementList.length; j++) {\r\n const element = curRow.elementList[j]\r\n const metrics = element.metrics\r\n // 当前元素位置信息\r\n const {\r\n ascent: offsetY,\r\n coordinate: {\r\n leftTop: [x, y]\r\n }\r\n } = positionList[curRow.startIndex + j]\r\n const preElement = curRow.elementList[j - 1]\r\n // 元素绘制\r\n if (\r\n element.revisionType === 'delete'\r\n ) {\r\n // 删除修订内容不在正文渲染,由右侧气泡显示\r\n this.textParticle.complete()\r\n } else if (\r\n (element.control?.hide || element.area?.hide) &&\r\n !this.isDesignMode()\r\n ) {\r\n // 控件隐藏时不绘制\r\n this.textParticle.complete()\r\n } else if (element.type === ElementType.IMAGE) {\r\n this.textParticle.complete()\r\n // 浮动图片单独绘制\r\n if (\r\n element.imgDisplay !== ImageDisplay.SURROUND &&\r\n element.imgDisplay !== ImageDisplay.FLOAT_TOP &&\r\n element.imgDisplay !== ImageDisplay.FLOAT_BOTTOM\r\n ) {\r\n this.imageParticle.render(ctx, element, x, y + offsetY)\r\n }\r\n } else if (element.type === ElementType.LATEX) {\r\n this.textParticle.complete()\r\n this.laTexParticle.render(ctx, element, x, y + offsetY)\r\n } else if (element.type === ElementType.TABLE) {\r\n if (isCrossRowCol) {\r\n rangeRecord.x = x\r\n rangeRecord.y = y\r\n tableRangeElement = element\r\n }\r\n this.tableParticle.render(ctx, element, x, y)\r\n } else if (element.type === ElementType.HYPERLINK) {\r\n this.textParticle.complete()\r\n this.hyperlinkParticle.render(ctx, element, x, y + offsetY)\r\n } else if (element.type === ElementType.DATE) {\r\n const nextElement = curRow.elementList[j + 1]\r\n // 释放之前的\r\n if (!preElement || preElement.dateId !== element.dateId) {\r\n this.textParticle.complete()\r\n }\r\n this.textParticle.record(ctx, element, x, y + offsetY)\r\n if (!nextElement || nextElement.dateId !== element.dateId) {\r\n // 手动触发渲染\r\n this.textParticle.complete()\r\n }\r\n } else if (element.type === ElementType.SUPERSCRIPT) {\r\n this.textParticle.complete()\r\n this.superscriptParticle.render(ctx, element, x, y + offsetY)\r\n } else if (element.type === ElementType.SUBSCRIPT) {\r\n this.underline.render(ctx)\r\n this.textParticle.complete()\r\n this.subscriptParticle.render(ctx, element, x, y + offsetY)\r\n } else if (element.type === ElementType.SEPARATOR) {\r\n this.separatorParticle.render(ctx, element, x, y)\r\n } else if (this.isPageBreakElement(element)) {\r\n if (\r\n this.mode !== EditorMode.CLEAN &&\r\n !isPrintMode &&\r\n this.options.pageBreak.disabled === false\r\n ) {\r\n this.pageBreakParticle.render(ctx, element, x, y)\r\n }\r\n } else if (\r\n element.type === ElementType.CHECKBOX ||\r\n element.controlComponent === ControlComponent.CHECKBOX\r\n ) {\r\n this.textParticle.complete()\r\n this.checkboxParticle.render({\r\n ctx,\r\n x,\r\n y: y + offsetY,\r\n index: j,\r\n row: curRow\r\n })\r\n } else if (\r\n element.type === ElementType.RADIO ||\r\n element.controlComponent === ControlComponent.RADIO\r\n ) {\r\n this.textParticle.complete()\r\n this.radioParticle.render({\r\n ctx,\r\n x,\r\n y: y + offsetY,\r\n index: j,\r\n row: curRow\r\n })\r\n } else if (element.type === ElementType.TAB) {\r\n this.textParticle.complete()\r\n } else if (\r\n element.rowFlex === RowFlex.ALIGNMENT ||\r\n element.rowFlex === RowFlex.JUSTIFY\r\n ) {\r\n // 如果是两端对齐,因canvas目前不支持letterSpacing需单独绘制文本\r\n this.textParticle.record(ctx, element, x, y + offsetY)\r\n this.textParticle.complete()\r\n } else if (element.type === ElementType.BLOCK) {\r\n this.textParticle.complete()\r\n this.blockParticle.render(pageNo, element, x, y + offsetY)\r\n } else if (element.type === ElementType.PLACEHOLDER) {\r\n // 占位符元素按普通文本绘制\r\n this.textParticle.record(ctx, element, x, y + offsetY)\r\n this.textParticle.complete()\r\n } else {\r\n // 如果当前元素设置左偏移,则上一元素立即绘制\r\n const hasCustomCharacterScale =\r\n (element.characterScale ?? 100) !== 100\r\n if (element.left || hasCustomCharacterScale) {\r\n this.textParticle.complete()\r\n }\r\n this.textParticle.record(ctx, element, x, y + offsetY)\r\n // 如果设置字宽、字间距、标点符号(避免浏览器排版缩小间距)需单独绘制\r\n if (\r\n element.width ||\r\n element.letterSpacing ||\r\n hasCustomCharacterScale ||\r\n PUNCTUATION_REG.test(element.value)\r\n ) {\r\n this.textParticle.complete()\r\n }\r\n }\r\n // 换行符绘制\r\n if (\r\n this.shouldDrawLineBreakForRow(\r\n curRow,\r\n j,\r\n isDrawLineBreak,\r\n isPrintMode\r\n )\r\n ) {\r\n this.lineBreakParticle.render(ctx, element, x, y + curRow.height / 2)\r\n }\r\n // 边框绘制(目前仅支持控件)\r\n if (element.control?.border) {\r\n // 不同控件边框立刻绘制\r\n if (\r\n preElement?.control?.border &&\r\n preElement.controlId !== element.controlId\r\n ) {\r\n this.control.drawBorder(ctx)\r\n }\r\n // 当前元素位置信息记录\r\n const rowMargin = this.getElementRowMargin(element)\r\n this.control.recordBorderInfo(\r\n x,\r\n y + rowMargin,\r\n element.metrics.width,\r\n curRow.height - 2 * rowMargin\r\n )\r\n } else if (preElement?.control?.border) {\r\n this.control.drawBorder(ctx)\r\n }\r\n // 下划线记录\r\n if (element.underline || element.control?.underline) {\r\n // 下标元素下划线单独绘制\r\n if (\r\n preElement?.type === ElementType.SUBSCRIPT &&\r\n element.type !== ElementType.SUBSCRIPT\r\n ) {\r\n this.underline.render(ctx)\r\n }\r\n // 行间距\r\n const rowMargin = this.getElementRowMargin(element)\r\n // 元素向左偏移量\r\n const offsetX = element.left || 0\r\n // 下标元素y轴偏移值\r\n let offsetY = 0\r\n if (element.type === ElementType.SUBSCRIPT) {\r\n offsetY = this.subscriptParticle.getOffsetY(element)\r\n }\r\n // 占位符不参与颜色计算\r\n const color = element.control?.underline\r\n ? this.options.underlineColor\r\n : element.color\r\n this.underline.recordFillInfo(\r\n ctx,\r\n x - offsetX,\r\n y + curRow.height - rowMargin + offsetY,\r\n metrics.width + offsetX,\r\n 0,\r\n color,\r\n element.textDecoration?.style\r\n )\r\n } else if (preElement?.underline || preElement?.control?.underline) {\r\n this.underline.render(ctx)\r\n }\r\n // 删除线记录\r\n if (element.strikeout) {\r\n // 仅文本类元素支持删除线\r\n if (!element.type || TEXTLIKE_ELEMENT_TYPE.includes(element.type)) {\r\n // 字体大小不同时需立即绘制\r\n if (\r\n preElement &&\r\n ((preElement.type === ElementType.SUBSCRIPT &&\r\n element.type !== ElementType.SUBSCRIPT) ||\r\n (preElement.type === ElementType.SUPERSCRIPT &&\r\n element.type !== ElementType.SUPERSCRIPT) ||\r\n this.getElementSize(preElement) !==\r\n this.getElementSize(element))\r\n ) {\r\n this.strikeout.render(ctx)\r\n }\r\n // 基线文字测量信息\r\n const standardMetrics = this.textParticle.measureBasisWord(\r\n ctx,\r\n this.getElementFont(element)\r\n )\r\n // 文字渲染位置 + 基线文字下偏移量 - 一半文字高度\r\n let adjustY =\r\n y +\r\n offsetY +\r\n standardMetrics.actualBoundingBoxDescent * scale -\r\n metrics.height / 2\r\n // 上下标位置调整\r\n if (element.type === ElementType.SUBSCRIPT) {\r\n adjustY += this.subscriptParticle.getOffsetY(element)\r\n } else if (element.type === ElementType.SUPERSCRIPT) {\r\n adjustY += this.superscriptParticle.getOffsetY(element)\r\n }\r\n this.strikeout.recordFillInfo(ctx, x, adjustY, metrics.width)\r\n }\r\n } else if (preElement?.strikeout) {\r\n this.strikeout.render(ctx)\r\n }\r\n // 插入修订:蓝色下划线\r\n if (element.revisionType === 'insert') {\r\n const revColor = this.options.revisionInsertColor || '#1a73e8'\r\n const rowMargin = this.getElementRowMargin(element)\r\n const offsetX = element.left || 0\r\n const lineY = y + curRow.height - rowMargin\r\n ctx.save()\r\n ctx.strokeStyle = revColor\r\n ctx.lineWidth = this.options.scale\r\n const adjustY = Math.floor(lineY + 2 * ctx.lineWidth) + 0.5\r\n ctx.beginPath()\r\n ctx.moveTo(x - offsetX, adjustY)\r\n ctx.lineTo(x - offsetX + metrics.width + offsetX, adjustY)\r\n ctx.stroke()\r\n ctx.restore()\r\n }\r\n // 选区记录\r\n const {\r\n zone: currentZone,\r\n startIndex,\r\n endIndex\r\n } = this.range.getRange()\r\n if (\r\n currentZone === zone &&\r\n startIndex !== endIndex &&\r\n startIndex <= index &&\r\n index <= endIndex\r\n ) {\r\n const positionContext = this.position.getPositionContext()\r\n // 表格需限定上下文\r\n if (\r\n (!positionContext.isTable && !element.tdId) ||\r\n positionContext.tdId === element.tdId\r\n ) {\r\n // 从行尾开始-绘制最小宽度\r\n if (startIndex === index) {\r\n const nextElement = elementList[startIndex + 1]\r\n if (nextElement && nextElement.value === ZERO) {\r\n rangeRecord.x = x + metrics.width\r\n rangeRecord.y = y\r\n rangeRecord.height = curRow.height\r\n rangeRecord.width += this.options.rangeMinWidth\r\n }\r\n } else {\r\n let rangeWidth = metrics.width\r\n // 最小选区宽度\r\n if (rangeWidth === 0 && curRow.elementList.length === 1) {\r\n rangeWidth = this.options.rangeMinWidth\r\n }\r\n // 记录第一次位置、行高\r\n if (!rangeRecord.width) {\r\n rangeRecord.x = x\r\n rangeRecord.y = y\r\n rangeRecord.height = curRow.height\r\n }\r\n rangeRecord.width += rangeWidth\r\n }\r\n }\r\n }\r\n // 组信息记录\r\n if (!group.disabled && element.groupIds) {\r\n this.group.recordFillInfo(element, x, y, metrics.width, curRow.height)\r\n }\r\n\r\n index++\r\n // 绘制表格内元素\r\n if (element.type === ElementType.TABLE) {\r\n const tdPaddingWidth = tdPadding[1] + tdPadding[3]\r\n for (let t = 0; t < element.trList!.length; t++) {\r\n const tr = element.trList![t]\r\n for (let d = 0; d < tr.tdList!.length; d++) {\r\n const td = tr.tdList[d]\r\n this.drawRow(ctx, {\r\n elementList: td.value,\r\n positionList: td.positionList!,\r\n rowList: td.rowList!,\r\n pageNo,\r\n startIndex: 0,\r\n innerWidth: (td.width! - tdPaddingWidth) * scale,\r\n zone,\r\n isDrawLineBreak: false\r\n })\r\n }\r\n }\r\n }\r\n }\r\n // 绘制列表样式\r\n if (curRow.isList) {\r\n this.listParticle.drawListStyle(\r\n ctx,\r\n curRow,\r\n positionList[curRow.startIndex]\r\n )\r\n }\r\n // 绘制文字、边框、下划线、删除线\r\n this.textParticle.complete()\r\n this.control.drawBorder(ctx)\r\n this.underline.render(ctx)\r\n this.strikeout.render(ctx)\r\n // 绘制批注样式\r\n this.group.render(ctx)\r\n\r\n // 绘制选区\r\n if (!isPrintMode) {\r\n if (rangeRecord.width && rangeRecord.height) {\r\n const { x, y, width, height } = rangeRecord\r\n this.range.render(ctx, x, y, width, height)\r\n }\r\n if (\r\n isCrossRowCol &&\r\n tableRangeElement &&\r\n tableRangeElement.id === tableId\r\n ) {\r\n const {\r\n coordinate: {\r\n leftTop: [x, y]\r\n }\r\n } = positionList[curRow.startIndex]\r\n this.tableParticle.drawRange(ctx, tableRangeElement, x, y)\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _drawFloat(\r\n ctx: CanvasRenderingContext2D,\r\n payload: IDrawFloatPayload\r\n ) {\r\n const { scale } = this.options\r\n const floatPositionList = this.position.getFloatPositionList()\r\n const { imgDisplays, pageNo } = payload\r\n for (let e = 0; e < floatPositionList.length; e++) {\r\n const floatPosition = floatPositionList[e]\r\n const element = floatPosition.element\r\n if (\r\n (pageNo === floatPosition.pageNo ||\r\n floatPosition.zone === EditorZone.HEADER ||\r\n floatPosition.zone == EditorZone.FOOTER) &&\r\n element.imgDisplay &&\r\n imgDisplays.includes(element.imgDisplay) &&\r\n element.type === ElementType.IMAGE\r\n ) {\r\n const imgFloatPosition = element.imgFloatPosition!\r\n this.imageParticle.render(\r\n ctx,\r\n element,\r\n imgFloatPosition.x * scale,\r\n imgFloatPosition.y * scale\r\n )\r\n }\r\n }\r\n }\r\n\r\n private _clearPage(pageNo: number) {\r\n const ctx = this.ctxList[pageNo]\r\n const pageDom = this.pageList[pageNo]\r\n ctx.clearRect(\r\n 0,\r\n 0,\r\n Math.max(pageDom.width, this.getWidth()),\r\n Math.max(pageDom.height, this.getHeight())\r\n )\r\n this.blockParticle.clear()\r\n }\r\n\r\n private _drawPage(payload: IDrawPagePayload) {\r\n const { elementList, positionList, rowList, pageNo } = payload\r\n\r\n const {\r\n inactiveAlpha,\r\n pageMode,\r\n header,\r\n footer,\r\n pageNumber,\r\n lineNumber,\r\n pageBorder\r\n } = this.options\r\n const isPrintMode = this.mode === EditorMode.PRINT\r\n const innerWidth = this.getInnerWidth()\r\n const ctx = this.ctxList[pageNo]\r\n // 判断当前激活区域-非正文区域时元素透明度降低\r\n ctx.globalAlpha = !this.zone.isMainActive() ? inactiveAlpha : 1\r\n this._clearPage(pageNo)\r\n // 绘制背景\r\n this.background.render(ctx, pageNo)\r\n // 绘制区域\r\n if (!isPrintMode) {\r\n this.area.render(ctx, pageNo)\r\n }\r\n // 绘制水印\r\n if (pageMode !== PageMode.CONTINUITY && this.options.watermark.data) {\r\n this.waterMark.render(ctx, pageNo)\r\n }\r\n // 绘制页边距\r\n if (!isPrintMode) {\r\n this.margin.render(ctx, pageNo)\r\n }\r\n // 渲染衬于文字下方元素\r\n this._drawFloat(ctx, {\r\n pageNo,\r\n imgDisplays: [ImageDisplay.FLOAT_BOTTOM]\r\n })\r\n // 控件高亮\r\n if (!isPrintMode) {\r\n this.control.renderHighlightList(ctx, pageNo)\r\n }\r\n // 渲染元素\r\n const index = rowList[0]?.startIndex\r\n this.drawRow(ctx, {\r\n elementList,\r\n positionList,\r\n rowList,\r\n pageNo,\r\n startIndex: index,\r\n innerWidth,\r\n zone: EditorZone.MAIN\r\n })\r\n if (this.getIsPagingMode()) {\r\n // 绘制页眉\r\n if (!header.disabled) {\r\n this.header.render(ctx, pageNo)\r\n }\r\n // 绘制页码\r\n if (!pageNumber.disabled) {\r\n this.pageNumber.render(ctx, pageNo)\r\n }\r\n // 绘制页脚\r\n if (!footer.disabled) {\r\n this.footer.render(ctx, pageNo)\r\n }\r\n }\r\n // 渲染浮于文字上方元素\r\n this._drawFloat(ctx, {\r\n pageNo,\r\n imgDisplays: [ImageDisplay.FLOAT_TOP, ImageDisplay.SURROUND]\r\n })\r\n // 搜索匹配绘制\r\n if (!isPrintMode && this.search.getSearchKeyword()) {\r\n this.search.render(ctx, pageNo)\r\n }\r\n // 绘制空白占位符\r\n if (this.elementList.length <= 1 && !this.elementList[0]?.listId) {\r\n this.placeholder.render(ctx)\r\n }\r\n // 渲染行数\r\n if (!lineNumber.disabled) {\r\n this.lineNumber.render(ctx, pageNo)\r\n }\r\n // 绘制页面边框\r\n if (!pageBorder.disabled) {\r\n this.pageBorder.render(ctx)\r\n }\r\n // 绘制签章\r\n this.badge.render(ctx, pageNo)\r\n }\r\n\r\n private _disconnectLazyRender() {\r\n this.lazyRenderIntersectionObserver?.disconnect()\r\n }\r\n\r\n // 局部渲染 - 只渲染当前页面和相邻页面\r\n private _renderVisiblePages(currentPageNo?: number) {\r\n const positionList = this.position.getOriginalMainPositionList()\r\n const elementList = this.getOriginalMainElementList()\r\n const pageCount = this.pageRowList.length\r\n \r\n // 确定需要渲染的页面范围\r\n let pagesToRender: number[] = []\r\n \r\n if (currentPageNo !== undefined && currentPageNo >= 0) {\r\n // 只渲染当前页和前后各一页\r\n const startPage = Math.max(0, currentPageNo - 1)\r\n const endPage = Math.min(pageCount - 1, currentPageNo + 1)\r\n for (let i = startPage; i <= endPage; i++) {\r\n pagesToRender.push(i)\r\n }\r\n } else {\r\n // 渲染所有可见页面\r\n pagesToRender = [...this.visiblePageNoList]\r\n // 如果没有可见页面信息,渲染第一页\r\n if (pagesToRender.length === 0) {\r\n pagesToRender = [0]\r\n }\r\n }\r\n \r\n // 只渲染指定的页面\r\n for (const pageNo of pagesToRender) {\r\n if (pageNo < pageCount && this.pageRowList[pageNo]) {\r\n this._drawPage({\r\n elementList,\r\n positionList,\r\n rowList: this.pageRowList[pageNo],\r\n pageNo\r\n })\r\n }\r\n }\r\n }\r\n\r\n private _lazyRender() {\r\n const positionList = this.position.getOriginalMainPositionList()\r\n const elementList = this.getOriginalMainElementList()\r\n this._disconnectLazyRender()\r\n this.lazyRenderIntersectionObserver = new IntersectionObserver(entries => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n const index = Number((<HTMLCanvasElement>entry.target).dataset.index)\r\n this._drawPage({\r\n elementList,\r\n positionList,\r\n rowList: this.pageRowList[index],\r\n pageNo: index\r\n })\r\n }\r\n })\r\n })\r\n this.pageList.forEach(el => {\r\n this.lazyRenderIntersectionObserver!.observe(el)\r\n })\r\n }\r\n\r\n private _immediateRender() {\r\n const positionList = this.position.getOriginalMainPositionList()\r\n const elementList = this.getOriginalMainElementList()\r\n for (let i = 0; i < this.pageRowList.length; i++) {\r\n this._drawPage({\r\n elementList,\r\n positionList,\r\n rowList: this.pageRowList[i],\r\n pageNo: i\r\n })\r\n }\r\n }\r\n\r\n public render(payload?: IDrawOption) {\r\n this.renderCount++\r\n const { header, footer } = this.options\r\n const {\r\n isSubmitHistory = true,\r\n isSetCursor = true,\r\n isCompute = true,\r\n isLazy = true,\r\n isInit = false,\r\n isSourceHistory = false,\r\n isFirstRender = false,\r\n isPartialRender = false,\r\n pageNo: targetPageNo\r\n } = payload || {}\r\n let { curIndex } = payload || {}\r\n const innerWidth = this.getInnerWidth()\r\n const isPagingMode = this.getIsPagingMode()\r\n // 缓存当前页数信息\r\n const oldPageSize = this.pageRowList.length\r\n // 计算文档信息\r\n if (isCompute) {\r\n // 清空浮动元素位置信息\r\n this.position.setFloatPositionList([])\r\n if (isPagingMode) {\r\n // 页眉信息\r\n if (!header.disabled) {\r\n this.header.compute()\r\n }\r\n // 页脚信息\r\n if (!footer.disabled) {\r\n this.footer.compute()\r\n }\r\n }\r\n // 行信息\r\n const margins = this.getMargins()\r\n const pageHeight = this.getHeight()\r\n const extraHeight = this.header.getExtraHeight()\r\n const mainOuterHeight = this.getMainOuterHeight()\r\n const startX = margins[3]\r\n const startY = margins[0] + extraHeight\r\n const surroundElementList = pickSurroundElementList(this.elementList)\r\n this.rowList = this.computeRowList({\r\n startX,\r\n startY,\r\n pageHeight,\r\n mainOuterHeight,\r\n isPagingMode,\r\n innerWidth,\r\n surroundElementList,\r\n elementList: this.elementList\r\n })\r\n // 页面信息\r\n this.pageRowList = this._computePageList()\r\n // 位置信息\r\n this.position.computePositionList()\r\n // 区域信息\r\n this.area.compute()\r\n if (this.mode !== EditorMode.PRINT) {\r\n // 搜索信息\r\n const searchKeyword = this.search.getSearchKeyword()\r\n if (searchKeyword) {\r\n this.search.compute(searchKeyword)\r\n }\r\n // 控件关键词高亮\r\n this.control.computeHighlightList()\r\n }\r\n }\r\n // 清除光标等副作用\r\n this.imageObserver.clearAll()\r\n this.cursor.recoveryCursor()\r\n // 创建纸张\r\n for (let i = 0; i < this.pageRowList.length; i++) {\r\n if (!this.pageList[i]) {\r\n this._createPage(i)\r\n }\r\n }\r\n // 移除多余页\r\n const curPageCount = this.pageRowList.length\r\n const prePageCount = this.pageList.length\r\n if (prePageCount > curPageCount) {\r\n const deleteCount = prePageCount - curPageCount\r\n this.ctxList.splice(curPageCount, deleteCount)\r\n this.pageList\r\n .splice(curPageCount, deleteCount)\r\n .forEach(page => page.remove())\r\n }\r\n // 绘制元素\r\n // 连续页因为有高度的变化会导致canvas渲染空白,需立即渲染,否则会出现闪动\r\n // 当页面数量变化时,需要完整渲染\r\n const pageCountChanged = oldPageSize !== this.pageRowList.length\r\n if (isPartialRender && isPagingMode && !pageCountChanged) {\r\n // 局部渲染 - 只渲染当前页面和相邻页面\r\n this._renderVisiblePages(targetPageNo ?? this.intersectionPageNo)\r\n } else if (isLazy && isPagingMode) {\r\n this._lazyRender()\r\n } else {\r\n this._immediateRender()\r\n }\r\n // 光标重绘\r\n if (isSetCursor) {\r\n curIndex = this.setCursor(curIndex)\r\n } else if (this.range.getIsSelection()) {\r\n // 存在选区时仅定位避免事件无法捕获\r\n this.cursor.focus()\r\n }\r\n // 历史记录用于undo、redo(非首次渲染内容变更 || 第一次存在光标时)\r\n if (\r\n (isSubmitHistory && !isFirstRender) ||\r\n (curIndex !== undefined && this.historyManager.isStackEmpty())\r\n ) {\r\n this.submitHistory(curIndex)\r\n }\r\n // 信息变动回调\r\n nextTick(() => {\r\n // 选区样式\r\n this.range.setRangeStyle()\r\n // 重新唤起弹窗类控件\r\n if (isCompute && this.control.getActiveControl()) {\r\n this.control.reAwakeControl()\r\n }\r\n // 表格工具重新渲染\r\n if (\r\n isCompute &&\r\n !this.isReadonly() &&\r\n this.position.getPositionContext().isTable\r\n ) {\r\n this.tableTool.render()\r\n }\r\n // 页眉指示器重新渲染\r\n if (isCompute && !this.zone.isMainActive()) {\r\n this.zone.drawZoneIndicator()\r\n }\r\n // 页数改变\r\n if (oldPageSize !== this.pageRowList.length) {\r\n if (this.listener.pageSizeChange) {\r\n this.listener.pageSizeChange(this.pageRowList.length)\r\n }\r\n if (this.eventBus.hasSubscribers('pageSizeChange')) {\r\n this.eventBus.emit('pageSizeChange', this.pageRowList.length)\r\n }\r\n }\r\n // 文档内容改变\r\n if ((isSubmitHistory || isSourceHistory) && !isInit) {\r\n if (this.listener.contentChange) {\r\n this.listener.contentChange()\r\n }\r\n if (this.eventBus.hasSubscribers('contentChange')) {\r\n this.eventBus.emit('contentChange')\r\n }\r\n }\r\n // 修订气泡更新\r\n if (isCompute && this.revisionOverlay) {\r\n this.revisionOverlay.update()\r\n }\r\n // 批注卡片位置更新(纸张大小/缩放变更等非编辑场景)\r\n if (isCompute && !isSubmitHistory && !isSourceHistory && this.commentOverlay) {\r\n this.commentOverlay.render()\r\n }\r\n })\r\n }\r\n\r\n public setCursor(curIndex: number | undefined) {\r\n const positionContext = this.position.getPositionContext()\r\n const positionList = this.position.getPositionList()\r\n if (positionContext.isTable) {\r\n const { index, trIndex, tdIndex } = positionContext\r\n const elementList = this.getOriginalElementList()\r\n const tablePositionList =\r\n elementList[index!].trList?.[trIndex!].tdList[tdIndex!].positionList\r\n if (curIndex === undefined && tablePositionList) {\r\n curIndex = tablePositionList.length - 1\r\n }\r\n const tablePosition = tablePositionList?.[curIndex!]\r\n this.position.setCursorPosition(tablePosition || null)\r\n } else {\r\n this.position.setCursorPosition(\r\n curIndex !== undefined ? positionList[curIndex] : null\r\n )\r\n }\r\n // 定位到图片元素并且位置发生变化\r\n let isShowCursor = true\r\n if (\r\n curIndex !== undefined &&\r\n positionContext.isImage &&\r\n positionContext.isDirectHit\r\n ) {\r\n const elementList = this.getElementList()\r\n const element = elementList[curIndex]\r\n if (IMAGE_ELEMENT_TYPE.includes(element.type!)) {\r\n isShowCursor = false\r\n const position = this.position.getCursorPosition()\r\n this.previewer.updateResizer(element, position)\r\n }\r\n }\r\n this.cursor.drawCursor({\r\n isShow: isShowCursor\r\n })\r\n return curIndex\r\n }\r\n\r\n public submitHistory(curIndex: number | undefined) {\r\n const positionContext = this.position.getPositionContext()\r\n const oldElementList = getSlimCloneElementList(this.elementList)\r\n const oldHeaderElementList = getSlimCloneElementList(\r\n this.header.getElementList()\r\n )\r\n const oldFooterElementList = getSlimCloneElementList(\r\n this.footer.getElementList()\r\n )\r\n const oldRange = deepClone(this.range.getRange())\r\n const pageNo = this.pageNo\r\n const oldPositionContext = deepClone(positionContext)\r\n const zone = this.zone.getZone()\r\n this.historyManager.execute(() => {\r\n this.zone.setZone(zone)\r\n this.setPageNo(pageNo)\r\n this.position.setPositionContext(deepClone(oldPositionContext))\r\n this.header.setElementList(deepClone(oldHeaderElementList))\r\n this.footer.setElementList(deepClone(oldFooterElementList))\r\n this.elementList = deepClone(oldElementList)\r\n this.range.replaceRange(deepClone(oldRange))\r\n this.render({\r\n curIndex,\r\n isSubmitHistory: false,\r\n isSourceHistory: true\r\n })\r\n })\r\n }\r\n\r\n public destroy() {\r\n this.container.remove()\r\n this.canvasEvent.removeEvent()\r\n this.globalEvent.removeEvent()\r\n this.mouseObserver.removeEvent()\r\n this.scrollObserver.removeEvent()\r\n this.selectionObserver.removeEvent()\r\n }\r\n\r\n public clearSideEffect() {\r\n // 预览工具组件\r\n this.getPreviewer().clearResizer()\r\n // 表格工具组件\r\n this.getTableTool().dispose()\r\n // 超链接弹窗\r\n this.getHyperlinkParticle().clearHyperlinkPopup()\r\n // 日期控件\r\n this.getDateParticle().clearDatePicker()\r\n }\r\n}\r\n","import { EDITOR_COMPONENT, EDITOR_FONT_OPTIONS, EDITOR_PREFIX, EDITOR_SIZE_OPTIONS } from '@vervedoc/docx-editor-schema'\r\nimport { EditorComponent } from '@vervedoc/docx-editor-schema'\r\nimport { ElementType } from '@vervedoc/docx-editor-schema'\r\nimport { ImageDisplay } from '@vervedoc/docx-editor-schema'\r\nimport { RowFlex } from '@vervedoc/docx-editor-schema'\r\nimport { DeepRequired } from '@vervedoc/docx-editor-schema'\r\nimport { IEditorOption } from '@vervedoc/docx-editor-schema'\r\nimport { IElement } from '@vervedoc/docx-editor-schema'\r\nimport { findParent } from '@vervedoc/docx-editor-schema'\r\nimport { Command } from '@vervedoc/docx-editor-transform'\r\nimport { Draw } from '../draw/Draw'\r\nimport { RangeManager } from '@vervedoc/docx-editor-state'\r\n\r\ninterface IFloatingBarContext {\r\n hasSelection: boolean\r\n isImageSelected: boolean\r\n imageElement: IElement | null\r\n}\r\n\r\nexport class FloatingBar {\r\n private draw: Draw\r\n private command: Command\r\n private range: RangeManager\r\n private options: DeepRequired<IEditorOption>\r\n private container: HTMLDivElement\r\n \r\n private textToolbar: HTMLDivElement | null = null\r\n private imageToolbar: HTMLDivElement | null = null\r\n \r\n private lastMousePosition = { x: 0, y: 0 }\r\n private currentImageElement: IElement | null = null\r\n\r\n constructor(draw: Draw, command: Command) {\r\n this.draw = draw\r\n this.command = command\r\n this.range = draw.getRange()\r\n this.options = draw.getOptions()\r\n this.container = draw.getContainer()\r\n \r\n if (this.options.floatingBar?.enabled !== false) {\r\n this._createToolbars()\r\n this._addEvents()\r\n }\r\n }\r\n\r\n private _createToolbars() {\r\n // 文字工具栏\r\n this.textToolbar = document.createElement('div')\r\n this.textToolbar.className = `${EDITOR_PREFIX}-floating-toolbar`\r\n this.textToolbar.setAttribute(EDITOR_COMPONENT, EditorComponent.COMPONENT)\r\n this.textToolbar.innerHTML = `\r\n <select class=\"fb-select fb-fontfamily\" title=\"字体\">\r\n ${this._createFontOptionsHtml()}\r\n </select>\r\n <select class=\"fb-select fb-fontsize\" title=\"字号\">\r\n ${this._createSizeOptionsHtml()}\r\n </select>\r\n <div class=\"fb-divider\"></div>\r\n <button class=\"fb-btn\" data-action=\"bold\" title=\"加粗\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M15.6 10.79c.97-.67 1.65-1.77 1.65-2.79 0-2.26-1.75-4-4-4H7v14h7.04c2.09 0 3.71-1.7 3.71-3.79 0-1.52-.86-2.82-2.15-3.42zM10 6.5h3c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-3v-3zm3.5 9H10v-3h3.5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"italic\" title=\"斜体\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"underline\" title=\"下划线\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\"/></svg>\r\n </button>\r\n <div class=\"fb-divider\"></div>\r\n <div class=\"fb-color-picker\" data-type=\"color\">\r\n <button class=\"fb-btn fb-color-btn\" title=\"文字颜色\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M11 2L5.5 16h2.25l1.12-3h6.25l1.12 3h2.25L13 2h-2zm-1.38 9L12 4.67 14.38 11H9.62z\"/></svg>\r\n <span class=\"fb-color-indicator\" style=\"background:#000000\"></span>\r\n </button>\r\n <input type=\"color\" class=\"fb-color-input\" value=\"#000000\">\r\n </div>\r\n <div class=\"fb-color-picker\" data-type=\"highlight\">\r\n <button class=\"fb-btn fb-color-btn\" title=\"高亮颜色\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M6 14l3 3v5h6v-5l3-3V9H6v5zm5-12h2v3h-2V2zM3.5 5.88l1.41-1.41 2.12 2.12L5.62 8 3.5 5.88zm13.46.71l2.12-2.12 1.41 1.41L18.38 8l-1.42-1.41z\"/></svg>\r\n <span class=\"fb-color-indicator\" style=\"background:#ffff00\"></span>\r\n </button>\r\n <input type=\"color\" class=\"fb-color-input\" value=\"#ffff00\">\r\n </div>\r\n <div class=\"fb-divider\"></div>\r\n <button class=\"fb-btn\" data-action=\"alignLeft\" title=\"左对齐\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"alignCenter\" title=\"居中\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"alignRight\" title=\"右对齐\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\"/></svg>\r\n </button>\r\n `\r\n this.container.appendChild(this.textToolbar)\r\n \r\n // 图片工具栏\r\n this.imageToolbar = document.createElement('div')\r\n this.imageToolbar.className = `${EDITOR_PREFIX}-floating-toolbar ${EDITOR_PREFIX}-image-toolbar`\r\n this.imageToolbar.setAttribute(EDITOR_COMPONENT, EditorComponent.COMPONENT)\r\n this.imageToolbar.innerHTML = `\r\n <span class=\"fb-label\">环绕</span>\r\n <button class=\"fb-btn\" data-action=\"imgInline\" data-display=\"INLINE\" title=\"嵌入文字\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M4 9h16v2H4V9zm0 4h10v2H4v-2z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"imgSurround\" data-display=\"SURROUND\" title=\"文字环绕\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M4 19h16v2H4v-2zm0-4h4v2H4v-2zm0-4h4v2H4v-2zm0-4h4v2H4V7zm0-4h16v2H4V3zm12 4h4v6h-4V7zm-2 10h8v2h-8v-2z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"imgFloatTop\" data-display=\"FLOAT_TOP\" title=\"浮于文字上方\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M3 5h2V3c-1.1 0-2 .9-2 2zm0 8h2v-2H3v2zm4 8h2v-2H7v2zM3 9h2V7H3v2zm10-6h-2v2h2V3zm6 0v2h2c0-1.1-.9-2-2-2zM5 21v-2H3c0 1.1.9 2 2 2zm-2-4h2v-2H3v2zM9 3H7v2h2V3zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2V7h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2V3h-2v2zM7 17h10V7H7v10z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"imgFloatBottom\" data-display=\"FLOAT_BOTTOM\" title=\"衬于文字下方\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M3 5h2V3c-1.1 0-2 .9-2 2zm0 8h2v-2H3v2zm4 8h2v-2H7v2zM3 9h2V7H3v2zm10-6h-2v2h2V3zm6 0v2h2c0-1.1-.9-2-2-2zM5 21v-2H3c0 1.1.9 2 2 2zm-2-4h2v-2H3v2zM9 3H7v2h2V3zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2V7h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2V3h-2v2z\"/></svg>\r\n </button>\r\n <div class=\"fb-divider\"></div>\r\n <button class=\"fb-btn\" data-action=\"rotateLeft\" title=\"向左旋转\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M7.11 8.53L5.7 7.11C4.8 8.27 4.24 9.61 4.07 11h2.02c.14-.87.49-1.72 1.02-2.47zM6.09 13H4.07c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61V17.9c-.87-.15-1.71-.49-2.46-1.03L7.1 18.32zM13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"rotateRight\" title=\"向右旋转\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M15.55 5.55L11 1v3.07C7.06 4.56 4 7.92 4 12s3.05 7.44 7 7.93v-2.02c-2.84-.48-5-2.94-5-5.91s2.16-5.43 5-5.91V10l4.55-4.45zM19.93 11c-.17-1.39-.72-2.73-1.62-3.89l-1.42 1.42c.54.75.88 1.6 1.02 2.47h2.02zM13 17.9v2.02c1.39-.17 2.74-.71 3.9-1.61l-1.44-1.44c-.75.54-1.59.89-2.46 1.03zm3.89-2.42l1.42 1.41c.9-1.16 1.45-2.5 1.62-3.89h-2.02c-.14.87-.48 1.72-1.02 2.48z\"/></svg>\r\n </button>\r\n <div class=\"fb-divider\"></div>\r\n <button class=\"fb-btn\" data-action=\"replaceImage\" title=\"替换图片\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"saveImage\" title=\"保存图片\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\"/></svg>\r\n </button>\r\n <button class=\"fb-btn\" data-action=\"deleteImage\" title=\"删除\">\r\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\"><path fill=\"currentColor\" d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\"/></svg>\r\n </button>\r\n `\r\n this.container.appendChild(this.imageToolbar)\r\n \r\n // 绑定事件\r\n this._bindToolbarEvents()\r\n }\r\n\r\n private _bindToolbarEvents() {\r\n // 文字工具栏事件\r\n if (this.textToolbar) {\r\n // 字体选择\r\n const fontFamilySelect = this.textToolbar.querySelector('.fb-fontfamily') as HTMLSelectElement\r\n fontFamilySelect.value = this._resolveFontValue(this.options.defaultFont)\r\n fontFamilySelect?.addEventListener('change', () => {\r\n this.command.executeFont(fontFamilySelect.value)\r\n })\r\n\r\n // 字号选择\r\n const fontSizeSelect = this.textToolbar.querySelector('.fb-fontsize') as HTMLSelectElement\r\n fontSizeSelect.value = this._resolveSizeValue(this.options.defaultSize)\r\n fontSizeSelect?.addEventListener('change', () => {\r\n this.command.executeSize(Number(fontSizeSelect.value))\r\n })\r\n \r\n // 按钮点击\r\n this.textToolbar.querySelectorAll('.fb-btn:not(.fb-color-btn)').forEach(btn => {\r\n btn.addEventListener('click', () => {\r\n const action = btn.getAttribute('data-action')\r\n this._executeTextAction(action)\r\n })\r\n })\r\n \r\n // 颜色选择器\r\n this.textToolbar.querySelectorAll('.fb-color-picker').forEach(picker => {\r\n const type = picker.getAttribute('data-type')\r\n const btn = picker.querySelector('.fb-color-btn') as HTMLButtonElement\r\n const input = picker.querySelector('.fb-color-input') as HTMLInputElement\r\n const indicator = picker.querySelector('.fb-color-indicator') as HTMLSpanElement\r\n \r\n // 点击按钮触发颜色选择器\r\n btn?.addEventListener('click', () => {\r\n input?.click()\r\n })\r\n \r\n // 颜色选择实时应用\r\n input?.addEventListener('input', () => {\r\n const value = input.value\r\n if (value) {\r\n if (type === 'color') {\r\n this.command.executeColor(value)\r\n } else if (type === 'highlight') {\r\n this.command.executeHighlight(value)\r\n }\r\n if (indicator) {\r\n indicator.style.background = value\r\n }\r\n }\r\n })\r\n })\r\n }\r\n \r\n // 图片工具栏事件\r\n if (this.imageToolbar) {\r\n this.imageToolbar.querySelectorAll('.fb-btn').forEach(btn => {\r\n btn.addEventListener('click', () => {\r\n const action = btn.getAttribute('data-action')\r\n this._executeImageAction(action)\r\n })\r\n })\r\n }\r\n }\r\n\r\n private _createFontOptionsHtml() {\r\n const defaultFont = this.options.defaultFont?.trim()\r\n const hasDefaultFont = defaultFont && EDITOR_FONT_OPTIONS.some(\r\n option => option.value === defaultFont || option.label === defaultFont\r\n )\r\n const fontOptions = hasDefaultFont\r\n ? [...EDITOR_FONT_OPTIONS]\r\n : [\r\n ...EDITOR_FONT_OPTIONS,\r\n {\r\n label: defaultFont || '',\r\n value: defaultFont || ''\r\n }\r\n ].filter(option => option.label && option.value)\r\n\r\n return fontOptions\r\n .map(option => `<option value=\"${option.value}\" style=\"font-family:${option.value}\">${option.label}</option>`)\r\n .join('')\r\n }\r\n\r\n private _createSizeOptionsHtml() {\r\n const defaultSize = this.options.defaultSize\r\n const hasDefaultSize = EDITOR_SIZE_OPTIONS.some(option => option.value === defaultSize)\r\n const sizeOptions = hasDefaultSize\r\n ? [...EDITOR_SIZE_OPTIONS]\r\n : [\r\n ...EDITOR_SIZE_OPTIONS,\r\n {\r\n label: String(defaultSize),\r\n value: defaultSize\r\n }\r\n ]\r\n\r\n return sizeOptions\r\n .map(option => `<option value=\"${option.value}\">${option.label}</option>`)\r\n .join('')\r\n }\r\n\r\n private _resolveFontValue(font: string) {\r\n const normalizedFont = font.trim().toLowerCase()\r\n const match = EDITOR_FONT_OPTIONS.find(option => {\r\n const optionValue = option.value.trim().toLowerCase()\r\n const optionLabel = option.label.trim().toLowerCase()\r\n const primaryFamily = option.value\r\n .split(',')\r\n .map(item => item.replace(/['\"]/g, '').trim().toLowerCase())\r\n .find(Boolean)\r\n\r\n return optionValue === normalizedFont\r\n || optionLabel === normalizedFont\r\n || primaryFamily === normalizedFont\r\n })\r\n\r\n return match?.value || font\r\n }\r\n\r\n private _resolveSizeValue(size: number) {\r\n const normalizedSize = Number(size)\r\n const match = EDITOR_SIZE_OPTIONS.find(option => option.value === normalizedSize)\r\n return String(match?.value ?? normalizedSize)\r\n }\r\n\r\n private _executeTextAction(action: string | null) {\r\n if (!action) return\r\n switch (action) {\r\n case 'bold':\r\n this.command.executeBold()\r\n break\r\n case 'italic':\r\n this.command.executeItalic()\r\n break\r\n case 'underline':\r\n this.command.executeUnderline()\r\n break\r\n case 'alignLeft':\r\n this.command.executeRowFlex(RowFlex.LEFT)\r\n break\r\n case 'alignCenter':\r\n this.command.executeRowFlex(RowFlex.CENTER)\r\n break\r\n case 'alignRight':\r\n this.command.executeRowFlex(RowFlex.RIGHT)\r\n break\r\n }\r\n }\r\n\r\n private _executeImageAction(action: string | null) {\r\n if (!action || !this.currentImageElement) return\r\n \r\n switch (action) {\r\n case 'imgInline':\r\n this.command.executeChangeImageDisplay(this.currentImageElement, ImageDisplay.INLINE)\r\n this._updateImageToolbarState()\r\n break\r\n case 'imgSurround':\r\n this.command.executeChangeImageDisplay(this.currentImageElement, ImageDisplay.SURROUND)\r\n this._updateImageToolbarState()\r\n break\r\n case 'imgFloatTop':\r\n this.command.executeChangeImageDisplay(this.currentImageElement, ImageDisplay.FLOAT_TOP)\r\n this._updateImageToolbarState()\r\n break\r\n case 'imgFloatBottom':\r\n this.command.executeChangeImageDisplay(this.currentImageElement, ImageDisplay.FLOAT_BOTTOM)\r\n this._updateImageToolbarState()\r\n break\r\n case 'rotateLeft':\r\n this._rotateImage(-90)\r\n break\r\n case 'rotateRight':\r\n this._rotateImage(90)\r\n break\r\n case 'replaceImage':\r\n this._replaceImage()\r\n break\r\n case 'saveImage':\r\n this.command.executeSaveAsImageElement()\r\n break\r\n case 'deleteImage':\r\n this.command.executeBackspace()\r\n this.dispose()\r\n break\r\n }\r\n }\r\n\r\n private _rotateImage(angle: number) {\r\n if (!this.currentImageElement) return\r\n const currentValue = this.currentImageElement.value\r\n const img = new Image()\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas')\r\n const ctx = canvas.getContext('2d')!\r\n \r\n // 90度旋转时交换宽高\r\n if (Math.abs(angle) === 90) {\r\n canvas.width = img.height\r\n canvas.height = img.width\r\n } else {\r\n canvas.width = img.width\r\n canvas.height = img.height\r\n }\r\n \r\n ctx.translate(canvas.width / 2, canvas.height / 2)\r\n ctx.rotate(angle * Math.PI / 180)\r\n ctx.drawImage(img, -img.width / 2, -img.height / 2)\r\n \r\n const newDataUrl = canvas.toDataURL()\r\n this.command.executeReplaceImageElement(newDataUrl)\r\n \r\n // 旋转后重新获取图片元素引用以支持连续旋转\r\n setTimeout(() => {\r\n const context = this._getContext()\r\n if (context.isImageSelected && context.imageElement) {\r\n this.currentImageElement = context.imageElement\r\n }\r\n }, 50)\r\n }\r\n img.src = currentValue\r\n }\r\n\r\n private _replaceImage() {\r\n const input = document.createElement('input')\r\n input.type = 'file'\r\n input.accept = 'image/*'\r\n input.onchange = (e: Event) => {\r\n const file = (e.target as HTMLInputElement).files?.[0]\r\n if (file) {\r\n const reader = new FileReader()\r\n reader.onload = (event) => {\r\n this.command.executeReplaceImageElement(event.target?.result as string)\r\n }\r\n reader.readAsDataURL(file)\r\n }\r\n }\r\n input.click()\r\n }\r\n\r\n private _updateImageToolbarState() {\r\n if (!this.imageToolbar || !this.currentImageElement) return\r\n \r\n const displayBtns = this.imageToolbar.querySelectorAll('[data-display]')\r\n displayBtns.forEach(btn => {\r\n const display = btn.getAttribute('data-display')\r\n const imgDisplay = this.currentImageElement?.imgDisplay || ImageDisplay.INLINE\r\n if (display && ImageDisplay[display as keyof typeof ImageDisplay] === imgDisplay) {\r\n btn.classList.add('active')\r\n } else {\r\n btn.classList.remove('active')\r\n }\r\n })\r\n }\r\n\r\n private _addEvents() {\r\n const pageContainer = this.draw.getPageContainer()\r\n \r\n // 监听鼠标抬起\r\n pageContainer.addEventListener('mouseup', this._handleMouseUp)\r\n \r\n // 监听点击外部隐藏\r\n document.addEventListener('mousedown', this._handleClickOutside)\r\n \r\n // 禁用右键菜单\r\n pageContainer.addEventListener('contextmenu', this._handleContextMenu)\r\n }\r\n\r\n private _handleMouseUp = (e: MouseEvent) => {\r\n this.lastMousePosition = { x: e.clientX, y: e.clientY }\r\n \r\n setTimeout(() => {\r\n const context = this._getContext()\r\n \r\n if (context.isImageSelected && context.imageElement) {\r\n this.currentImageElement = context.imageElement\r\n this._hideTextToolbar()\r\n this._showImageToolbar()\r\n this._updateImageToolbarState()\r\n } else if (context.hasSelection) {\r\n this.currentImageElement = null\r\n this._hideImageToolbar()\r\n this._showTextToolbar()\r\n } else {\r\n this.currentImageElement = null\r\n this._hideTextToolbar()\r\n this._hideImageToolbar()\r\n }\r\n }, 10)\r\n }\r\n\r\n private _handleClickOutside = (e: MouseEvent) => {\r\n const target = e.target as Element\r\n const isInToolbar = findParent(\r\n target,\r\n (node: Node & Element) => \r\n node?.classList?.contains(`${EDITOR_PREFIX}-floating-toolbar`),\r\n true\r\n )\r\n const isInContainer = this.container.contains(target)\r\n \r\n if (!isInToolbar && !isInContainer) {\r\n this.dispose()\r\n }\r\n }\r\n\r\n private _handleContextMenu = (e: MouseEvent) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n }\r\n\r\n private _getContext(): IFloatingBarContext {\r\n const range = this.range.getRange()\r\n const hasSelection = range.startIndex !== range.endIndex && range.startIndex >= 0\r\n \r\n const elementList = this.draw.getElementList()\r\n const startElement = elementList[range.startIndex]\r\n const endElement = elementList[range.endIndex]\r\n \r\n const isImageSelected = \r\n (startElement?.type === ElementType.IMAGE) ||\r\n (endElement?.type === ElementType.IMAGE)\r\n \r\n const imageElement = isImageSelected\r\n ? (startElement?.type === ElementType.IMAGE ? startElement : endElement)\r\n : null\r\n \r\n return { hasSelection, isImageSelected, imageElement }\r\n }\r\n\r\n private _showTextToolbar() {\r\n if (!this.textToolbar) return\r\n this.textToolbar.classList.add('show')\r\n this._positionToolbar(this.textToolbar)\r\n }\r\n\r\n private _hideTextToolbar() {\r\n this.textToolbar?.classList.remove('show')\r\n }\r\n\r\n private _showImageToolbar() {\r\n if (!this.imageToolbar) return\r\n this.imageToolbar.classList.add('show')\r\n this._positionToolbar(this.imageToolbar)\r\n }\r\n\r\n private _hideImageToolbar() {\r\n this.imageToolbar?.classList.remove('show')\r\n this.currentImageElement = null\r\n }\r\n\r\n private _positionToolbar(toolbar: HTMLDivElement) {\r\n const rect = toolbar.getBoundingClientRect()\r\n const width = rect.width || 400\r\n const height = rect.height || 40\r\n \r\n let left = this.lastMousePosition.x - width / 2\r\n let top = this.lastMousePosition.y - height - 10\r\n \r\n // 边界检查\r\n if (left < 10) left = 10\r\n if (left + width > window.innerWidth - 10) {\r\n left = window.innerWidth - width - 10\r\n }\r\n if (top < 10) {\r\n top = this.lastMousePosition.y + 20\r\n }\r\n \r\n toolbar.style.left = `${left}px`\r\n toolbar.style.top = `${top}px`\r\n }\r\n\r\n public removeEvent() {\r\n const pageContainer = this.draw.getPageContainer()\r\n pageContainer.removeEventListener('mouseup', this._handleMouseUp)\r\n document.removeEventListener('mousedown', this._handleClickOutside)\r\n pageContainer.removeEventListener('contextmenu', this._handleContextMenu)\r\n }\r\n\r\n public dispose() {\r\n this._hideTextToolbar()\r\n this._hideImageToolbar()\r\n }\r\n\r\n public destroy() {\r\n this.removeEvent()\r\n this.textToolbar?.remove()\r\n this.imageToolbar?.remove()\r\n }\r\n}\r\n","import { PluginFunction } from '@vervedoc/docx-editor-schema'\r\n\r\nexport type Editor = any\r\n\r\nexport class Plugin {\r\n private editor: Editor\r\n\r\n constructor(editor: Editor) {\r\n this.editor = editor\r\n }\r\n\r\n public use<Options>(\r\n pluginFunction: PluginFunction<Options>,\r\n options?: Options\r\n ) {\r\n pluginFunction(this.editor, options)\r\n }\r\n}\r\n","export interface IOverrideResult {\r\n preventDefault?: boolean\r\n}\r\n\r\nexport class Override {\r\n public paste:\r\n | ((evt?: ClipboardEvent) => unknown | IOverrideResult)\r\n | undefined\r\n public copy: (() => unknown | IOverrideResult) | undefined\r\n public drop: ((evt: DragEvent) => unknown | IOverrideResult) | undefined\r\n}\r\n","import { IRegisterShortcut } from '@vervedoc/docx-editor-schema'\r\nimport { Shortcut, I18n } from '../../plugin-stubs'\r\nimport { ILang } from '@vervedoc/docx-editor-schema'\r\nimport { DeepPartial } from '@vervedoc/docx-editor-schema'\r\nimport { IChartRenderer } from '@vervedoc/docx-editor-schema'\r\n\r\ninterface IRegisterPayload {\r\n shortcut: Shortcut\r\n i18n: I18n\r\n}\r\n\r\nexport class Register {\r\n public shortcutList: (payload: IRegisterShortcut[]) => void\r\n public langMap: (locale: string, lang: DeepPartial<ILang>) => void\r\n\r\n private chartRenderer: IChartRenderer | null = null\r\n\r\n constructor(payload: IRegisterPayload) {\r\n const { shortcut, i18n } = payload\r\n this.shortcutList = shortcut.registerShortcutList.bind(shortcut)\r\n this.langMap = i18n.registerLangMap.bind(i18n)\r\n }\r\n\r\n /**\r\n * 注册图表渲染器\r\n * @param renderer 图表渲染器实例\r\n */\r\n public registerChartRenderer(renderer: IChartRenderer): void {\r\n this.chartRenderer = renderer\r\n }\r\n\r\n /**\r\n * 获取图表渲染器\r\n * @returns 图表渲染器实例或 null\r\n */\r\n public getChartRenderer(): IChartRenderer | null {\r\n return this.chartRenderer\r\n }\r\n\r\n /**\r\n * 检查是否已注册图表渲染器\r\n * @returns 是否已注册\r\n */\r\n public hasChartRenderer(): boolean {\r\n return this.chartRenderer !== null\r\n }\r\n}\r\n"],"names":["Xu","u","vu","Iu","K","$","G","Cu","su","Mu","Y","m","zu","Wu","ju","Vu","fu","Yu","Ou","Lu","Ru","bu","f","Zu","qu","mu","q","b","Qu","N","Ju","P","Ku","ue","S","du","Su","tu","J","ee","te","De","re","vt","It","Ot","ne","Lt","lu","H","mt","Au","St","Nt","le","yt","Pt","uu","Ht","oe","ie","Nu","yu","ae","wt","Pu","Hu","wu","nu","_t","ce","se","kt","xt","Fe","Ut","Ee","Ce","Gt","Xt","Mt","zt","fe","de","pe","Wt","pu","Ae","he","ge","Fu","Te","Be","ve","Ie","Oe","Le","Re","be","me","Se","Ne","ye","Pe","He","we","_e","ke","xe","Ue","Ge","_u","Xe","e","n","r","o","c","l","Me","ze","We","Z","je","D","i","t","a","s","F","E","C","A","Ve","Ze","qe","Qe","Je","jt","Ke","Vt","ut","et","X","tt","Eu","ku","ou","Yt","j","$t","Zt","Dt","gu","qt","Qt","Kt","uD","iu","Du","rt","eD","tD","DD","rD","nD","lt","oD","iD","aD","ot","h","O","M","g","R","I","y","w","p","d","it","Tu","at","Q","Et","k","B","v","T","_","U","W","L","V","eu","Gu","z","ct","au","x","st","xu","Ft","Ct","ft","ru","dt","Uu","pt","At","ht","cu","Tt","gt","FD","ED","CD","Bt","dD","pD","AD","version","DOCX_EDITOR_SCHEMA_VERSION","HistoryManager","WorkerManager","I18n","key","_args","Actuator","LaTexParticle","DateParticle","BlockParticle","DatePicker","setClipboardData","data","EDITOR_CLIPBOARD","getClipboardData","clipboardText","clipboardData","getIsClipboardContainFile","item","removeClipboardData","fallbackWriteClipboardItem","html","fakeElement","selection","ranges","range","br","savedRange","writeClipboardItem","text","elementList","clipboard","_a","ClipboardItemCtor","plainText","htmlText","writeElementList","options","clipboardDom","createDomFromElementList","zipElementList","pasteElement","host","draw","rangeManager","startIndex","originalElementList","anchorElement","start","VIRTUAL_ELEMENT_TYPE","element","ZERO","formatElementContext","pasteHTML","getElementListByHTML","pasteImage","file","fileReader","image","value","imageElement","ElementType","pasteByEvent","evt","paste","overrideResult","editorClipboardData","normalizeLineBreak","isHTML","pasteByApi","type","imageBlob","CursorAgent","canvasEvent","__publicField","agentCursorDom","EDITOR_PREFIX","Cursor","isMobile","payload","cursorPosition","scale","cursor","color","width","isShow","isBlink","isFocus","hitLineStartIndex","height","pageGap","metrics","leftTop","rightTop","ascent","pageNo","preY","defaultOffsetHeight","CURSOR_AGENT_OFFSET_HEIGHT","increaseHeight","cursorHeight","descent","cursorTop","cursorLeft","isReadonly","direction","leftBottom","prePageY","isUp","MoveDirection","scrollContainer","findScrollContainer","rect","left","right","top","bottom","maskMargin","scrollLeft","scrollTop","CheckboxControl","control","startElement","preIndex","preElement","ControlComponent","nextIndex","nextElement","codes","context","checkbox","endIndex","KeyMap","RadioControl","radio","setRangeCache","position","deepClone","hitCheckbox","codeIndex","activeControl","hitRadio","mousedown","MouseEventButton","pageIndex","oldPositionContext","positionResult","index","isDirectHit","isCheckbox","isRadio","isImage","isTable","tdValueIndex","positionList","curIndex","curElement","isDirectHitImage","isDirectHitCheckbox","isDirectHitRadio","oldStartIndex","ControlType","_b","previewer","previewerDrawOption","EditorMode","ImageDisplay","eventBus","tableTool","hyperlinkParticle","isMod","dateParticle","createDragId","dragId","getUUID","getElementIndexByDragId","el","moveImgPosition","moveX","moveY","imgFloatPosition","mouseup","positionContext","cacheRange","cacheElementList","cachePositionList","cachePositionContext","isCacheRangeCollapsed","cacheStartIndex","cacheEndIndex","isSubmitHistory","isCompute","dragElement","cachePosition","dragElementList","isContainControl","cacheStartElement","cacheEndElement","isOmitControlAttr","editorOptions","replaceElementList","newElement","copyAttr","EDITOR_ELEMENT_STYLE_ATTR","CONTROL_CONTEXT_ATTR","attr","omitObject","formatElementList","cacheStartPosition","cacheRangeStartId","cacheRangeEndId","replaceLength","rangeStart","rangeEnd","rangeStartId","rangeEndId","cacheRangeStartIndex","cacheRangeEndIndex","_d","isTdElementDeletable","tableId","trIndex","tdIndex","_c","startPosition","positionContextIndex","rangeStartIndex","rangeEndIndex","imgElement","dragPosition","_f","mouseleave","pageContainer","mousemove","rightBottom","trId","tdId","startIsTable","startTdIndex","startTrIndex","startTableId","end","endElement","backspace","isTrackChanges","newIndex","isCrossRowCol","rowCol","isDeleted","row","col","isCollapsed","firstElement","rowFlexElementList","nextRevisionElement","del","enter","enterText","AREA_CONTEXT_ATTR","copyElement","EDITOR_ROW_ATTR","moveCount","LETTER_REG","moveStartIndex","anchorStartIndex","anchorEndIndex","trList","lastTrIndex","lastTr","lastTdIndex","lastTd","outer","tr","tdList","preTrIndex","preTdIndex","preTr","preTd","newElementList","getNonHideElementIndex","isAnchorCollapsed","nextTr","nextTd","nextTrIndex","nextTdIndex","maxElementListIndex","LocationPosition","tab","anchorStyle","tabElement","pickObject","getNextPositionIndex","rowNo","cursorX","probablePosition","nextPosition","nextLeftX","nextRightX","updown","curTdColIndex","td","nexTrIndex","anchorPosition","rowIndex","curRightX","margins","tdPositionIndex","tdX","tdWidth","tdPositionList","lastPosition","nextPositionIndex","keydown","zoneManager","EditorZone","inputDebounceTimer","pendingRender","input","isComposing","defaultStyle","removeComposingInput","TEXT","HYPERLINK","SUBSCRIPT","SUPERSCRIPT","DATE","TAB","isDesignMode","inputData","splitText","EDITOR_ELEMENT_COPY_ATTR","cut","curRowNo","curPageNo","cutElementIndexList","firstElementIndex","copy","copyElementList","tableElement","copyTableElement","firstRow","colStartIndex","lastCol","colEndIndex","coptTr","getTextFromElementList","drop","files","contextmenu","tableContextMenu","getWordRangeBySegmenter","paragraphInfo","paragraphText","TEXTLIKE_ELEMENT_TYPE","cursorStartIndex","offset","segments","segment","isWordLike","realSegmentStartIndex","getWordRangeByCursor","upCount","downCount","isNumber","NUMBER_LIKE_REG","upStartIndex","downStartIndex","dblclick","segmenterRange","handleTripleClick","isParagraphSeparator","newStartIndex","newEndIndex","click","compositionstart","compositionend","composition","dragover","findParent","node","dragColor","dragWidth","dragFloatImageDisabled","drag","CanvasEvent","painterStyle","painterStyleKeys","pKey","painterOptions","isIOS","GlobalEvent","target","pageList","EDITOR_COMPONENT","INTERNAL_SHORTCUT_KEY","nextScale","isSetCursor","Position","sourceElementList","rowList","startX","startY","startRowIndex","innerWidth","zone","tdPadding","curRow","colWidths","colGap","colX","colRowList","colRow","curRowWidth","RowFlex","tablePreX","tablePreY","offsetY","isImageElement","positionItem","prePosition","isTableElement","tableTdPadding","effectiveTdPadding","tdPaddingWidth","tdPaddingHeight","drawRowResult","VerticalAlign","rowsHeight","pre","cur","blankHeight","offsetHeight","tdPosition","pageRowList","extraHeight","isMainActive","positionNo","floatTopPosition","isFirstLetter","curPositionIndex","tablePosition","tdValueElement","ListStyle","valueWidth","floatBottomPosition","isLastArea","tdY","tdHeight","lastLetterList","headIndex","headElement","headPosition","headStartX","headerBottomY","footer","footerTopY","lastLetter","lastRowNo","currentPageNo","currentZone","floatElementZone","imgFloatPositionX","imgFloatPositionY","elementWidth","elementHeight","isControl","rowElement","rowElementRect","surroundElementList","availableWidth","rowIncreaseWidth","getIsBlockElement","surroundElement","floatPosition","surroundRect","isRectIntersect","translateX","Background","ctx","background","BackgroundSize","imageWidth","imageHeight","BackgroundRepeat","repeatXCount","repeatYCount","imageElementCache","img","applyPageNumbers","DEFAULT_SEPARATOR_TYPE","DEFAULT_DASH_ARRAY","getSeparatorType","getSeparatorLineWidth","defaultLineWidth","lineWidth","getSeparatorDashArray","getSeparatorRenderHeight","AbstractRichText","decorationStyle","isFirstRecord","Highlight","highlightAlpha","ParagraphColor","Margin","marginIndicatorColor","pageMode","PageMode","marginIndicatorSize","leftTopPoint","rightTopPoint","leftBottomPoint","rightBottomPoint","Search","isExistPre","searchNavigateId","match","isExistNext","anchor","ANCHOR_OVERFLOW_SIZE","navigate","count","groupId","keyword","searchMatchList","elementListGroup","originalElementListLength","tableIndexList","elementIndex","pageElement","EditorContext","searchClosure","restArgs","matchStartIndexList","group","searchMatchAlpha","searchMatchColor","searchNavigateMatchColor","searchMatch","tableIndex","preSearchMatch","option","matchList","replaceIndex","matchGroup","last","pageDiffCount","tableDiffCount","curGroupId","curTdId","firstMatchIndex","curTableIndex","tableElementList","firstMatch","firstIndex","Strikeout","strikeoutColor","adjustY","Underline","dashType","endX","DashType","endY","AMPLITUDE","FREQUENCY","underlineColor","TextDecorationStyle","ImageParticle","imageList","getImageList","floatImageContainer","floatImage","movementX","movementY","promise","svg","fallbackImage","convertStringToBase64","cacheRenderCount","imageLoadPromise","resolve","TextParticle","characterScale","nextCharacterScale","ratio","font","textMetrics","METRICS_BASIS_TEXT","PUNCTUATION_LIST","id","cacheTextMetrics","RenderMode","PageNumber","replaceReg","numberType","pageNoText","NumberType","convertNumberToChinese","size","rowFlex","format","startPageNo","fromPageNo","pageNoReg","FORMAT_PLACEHOLDER","pageCountReg","pageNumberBottom","textWidth","ScrollObserver","debounce","intersectionPageNo","visiblePageNoList","viewHeight","visibleHeight","intersectionMaxHeight","curPage","intersectionHeight","SelectionObserver","scrollContainerSelector","container","TableParticle","rowspan","colIndex","curRowIndex","changeTd","endTdIndex","endTrIndex","curTrList","startTd","endTd","startColIndex","endColIndex","endRowIndex","tdColIndex","tdRowIndex","TdSlash","colgroup","borderType","borderColor","borderWidth","borderExternalWidth","defaultBorderColor","colCount","rowCount","baseColor","baseWidth","outerWidth","baseStyle","TableBorder","isEmpty","isExternal","isInternal","drawOuter","drawInner","styleRank","normalizeLine","line","style","pickLine","segMap","addSeg","seg","exist","chosen","addH","x1","x2","sx1","sx2","addV","y1","y2","sy1","sy2","getImplicitLine","isOuterLine","getTdLine","side","implicit","styleLine","isLeftOuter","isRightOuter","isTopOuter","isBottomOuter","implicitTop","implicitBottom","implicitLeft","implicitRight","implicitInnerRight","implicitInnerBottom","topLine","TdBorder","bottomLine","leftLine","rightLine","groupKey","groups","arr","segs","widthStr","lw","scaledWidth","singleWidth","gap","isH","isV","min","max","colOffsetList","colOffset","rowOffsetList","rowOffset","occupiedRowSpan","canPlaceAt","colspan","isFound","maxStart","colItem","curTr","isLastRowTd","isLastColTd","isLastTd","rangeAlpha","rangeColor","TableTool","prePageHeight","tableX","tableY","tableHeight","tableWidth","tableSelectBtn","rowHeightList","rowContainer","rowHeight","rowItem","firstTd","rowItemAnchor","TableOrder","rowAddBtn","colWidthList","colContainer","colWidth","colItemAnchor","colAddBtn","borderContainer","rowBorder","colBorder","children","child","order","canvasRect","anchorLine","dx","dy","mousemoveFn","movePosition","isChangeSize","defaultTrMinHeight","curColWidth","nextColWidth","moveColWidth","moveTableWidth","tableOrder","HyperlinkParticle","hyperlinkPopupContainer","hyperlinkDom","url","parsed","lineHeight","newTab","Header","pickSurroundElementList","headerTop","disabled","maxHeightRadio","maxHeightRadioMapping","maxHeight","headerHeight","curRowHeight","SuperscriptParticle","SubscriptParticle","SeparatorParticle","alpha","normalizedAlpha","hex","fullHex","char","rgbMatch","dashArray","centerY","amplitude","wavelength","currentX","midX","nextX","strokeStyle","actualLineWidth","actualDashArray","renderHeight","gradient","PageBreakParticle","fontSize","lineDash","displayName","defaultRowMargin","textMeasure","halfX","Watermark","opacity","repeat","measureText","temporaryCanvas","temporaryCtx","textHeight","diagonalLength","patternWidth","patternHeight","pattern","docWidth","docHeight","WatermarkType","ControlSearch","activeBackgroundColor","disabledBackgroundColor","existValueBackgroundColor","noValueBackgroundColor","isPrintMode","activeControlElement","isActiveControlHighlight","isDisabledControlHighlight","isExitsValueControlHighlight","isNoValueControlHighlight","search","computeHighlight","currentControl","highlightIndex","highlight","controlElementList","ruleList","rule","searchResult","result","ControlBorder","SelectControl","multiSelectDelimiter","valueSets","valueList","code","valueSet","isNonValue","CONTROL_STYLE_ATTR","endNextElement","isIgnoreDisabledRule","isAddPlaceholder","leftIndex","rightIndex","newCodes","oldCode","oldCodes","isMultiSelect","isArrayEqual","prefixIndex","valueElement","styleElement","propertyElement","selectPopupContainer","EditorComponent","ul","li","TextControl","DateControl","date","dateFormat","NumberControl","Control","isExistValue","prefixCount","postfixCount","state","isSubscribeControlChange","activeElement","pickElementAttr","ControlState","controlElement","selectControl","dateControl","isEmitEvent","isSubscribeControlContentChange","controlValue","nonHideIndex","deletable","mode","isHasSubmitHistory","placeholderStrList","anchorElementStyleAttr","properties","conceptId","areaId","getValue","textControlValue","textControlElementList","innerText","selectCode","isExistSet","isExistSubmitHistory","setValue","payloadItem","currentEndIndex","controlContext","controlRule","formatValue","select","isArray","isString","setExtension","extension","isExistUpdate","setProperties","controlStyleProperty","pageComponentData","pageComponentKey","getControlElementList","tdElement","TITLE_CONTEXT_ATTR","LIST_CONTEXT_ATTR","getPreContext","getNextContext","controlRealWidth","controlMinWidth","controlFirstElement","controlContentWidth","controlElementIndex","controlRowElement","extraWidth","controlFirstElementLeft","rowRemainingWidth","CheckboxParticle","fillStyle","verticalAlign","NBSP","boundingBoxAscent","boundingBoxDescent","RadioParticle","Previewer","resizerSelection","resizerHandleList","resizerImageContainer","resizerImage","resizerSize","handleDom","resizerSizeView","resizerLeft","resizerTop","offsetX","dw","dh","previewerContainer","closeBtn","imgContainer","scaleSize","rotateSize","menuContainer","navigateContainer","imagePre","imageCount","imageNext","zoomIn","zoomOut","rotate","originalSize","imageDownload","mime","downloadFile","isAllowDrag","currentIndex","handleSize","ImageObserver","ZoneTip","tipContainer","tipContent","watchZones","header","throttle","mousemoveZone","visible","Zone","nextTick","listener","isHeaderActive","pageHeight","indicatorHeight","indicatorTop","indicatorLeftX","indicatorRightX","indicatorTopY","indicatorBottomY","toolbar","labelLeft","zoneName","btnInsertPageNo","lineTop","lineLeft","lineBottom","lineRight","menu","PAGE_NUMBER_STYLES","menuItem","scrollHandler","closeHandler","pageNumberOptions","isHeader","Footer","footerBottom","footerHeight","ListSymbolDrawer","UlStyle","filled","half","outerRadius","innerRadius","points","step","radius","angle","px","py","petalRadius","centerOffset","petals","lines","ListParticle","listType","listStyle","changeElementList","listId","listStyleMap","curListId","curElementList","elementLength","listElementList","defaultSize","defaultFont","referenceElement","elementSize","elementFont","ListType","symbolWidth","symbolText","symbolMetrics","listIndex","tabWidth","defaultTabWidth","checkboxHeight","checkboxRowElement","baselineY","rowCenterY","symbolX","OlStyle","chineseNumbers","chineseUnits","unitIndex","digit","isUpper","base","_LineBreakParticle","LineBreakParticle","Placeholder","lineBreak","headerExtraHeight","placeholder","Group","groupElementList","tdGroupElementList","groupIds","groupIndex","groupStartIndex","groupEndIndex","fillRect","lastLine","anchorGroupIds","backgroundColor","activeOpacity","lineRanges","MouseObserver","LineNumber","textParticle","seq","LineNumberType","PageBorder","padding","TableOperate","defaultTrHeight","baseTrHeight","autoTrMinHeight","curTrNo","newTrId","newTr","curTd","newTdId","anchorTr","defaultColMinWidth","colgroupWidth","greaterMinWidthCol","adjustWidth","curTdIndex","curTdRowIndex","curColIndex","deleteCount","deleteStartIndex","lastRow","tdStartX","tdStartY","tdEndX","tdEndY","mergeTdIdList","anchorTd","isPlaceholder","anchorContextElement","startTdValueIndex","cloneProperty","TABLE_CONTEXT_ATTR","appendTrIndex","nextWidth","isSetBorderType","borderTypeIndex","isSetTdSlashType","slashTypeIndex","Area","activeAreaId","activeAreaInfo","AreaMode","area","lastIndex","areaInfoItem","pagePositionList","firstPosition","defaultPlaceholderOption","areaInfo","computeProps","propKey","Badge","areaBadge","badge","areaItem","badgeItem","Draw","rootContainer","override","RangeManager","letterClass","letter","clonePrintModeData","register","paperDirection","PaperDirection","footerExtraHeight","historyManager","isPrepend","items","isIgnoreDeletedRule","modeRule","endElementListId","tdDeletable","deleteIndex","deleteElement","_g","_h","_callbacks","overlay","laTexParticle","blockParticle","workerManager","pixelRatio","currentMode","isSwitchMode","dataUrlList","dpr","canvas","realWidth","realHeight","mainElementList","originData","extraPickAttrs","DOCX_EDITOR_DATA_VERSION","main","fontFamily","defaultBasicRowMarginHeight","FlexDirection","isDrawLineBreak","isPagingMode","isFromTable","mainOuterHeight","paragraphFirstLineIndent","paragraphIndentLeft","isParagraphFirstRow","columnId","columnCount","columnGap","columnSeparator","columnWidths","columnElements","columnGroups","scaledColumnWidths","totalGap","columnRowLists","maxColumnHeight","groupElements","colHeight","sum","containerRow","paragraphSpacingBefore","paragraphSpacingAfter","rowMargin","rowMarginTop","rowMarginBottom","listOffsetX","listIndentX","paragraphIndentX","isListParagraph","firstIndent","isStartElement","adaptiveHeight","combineCount","nexTrList","getTrAutoMinHeight","maxSize","maxTdPaddingHeight","curPad","curPadH","baseHeight","hasBaseHeight","autoMinHeight","explicitHeight","hasExplicitHeight","nextHeight","curTdHeight","changeTr","curTdMinHeight","curTdRealHeight","reduceTrList","reduceHeight","curReduceHeight","marginHeight","curPagePreHeight","rowOffsetY","rowMarginHeight","firstTrHeight","deleteStart","preTrHeight","trHeight","rowColCount","cloneTrList","cloneTrHeight","cloneTrRealHeight","pagingId","cloneElement","repeatTrList","cloneRepeatTrList","newPositionContextIndex","newPositionContextTrIndex","fontMetrics","characterScaleRatio","_i","WordBreak","word","wordWidth","punctuationWidth","surroundPosition","isForceBreak","isWidthNotEnough","isWrap","resolveRowFlex","_j","ControlIndentation","preStartIndex","valueStartPosition","_k","_l","_m","rowElementList","_n","_o","deleteSurroundElementList","nextRow","maxPageNo","pageDom","pageDomHeight","paragraphColor","highlightMarginHeight","colSeparator","containerPos","containerY","colPositionList","colElementList","separatorX","rangeRecord","tableRangeElement","hasCustomCharacterScale","PUNCTUATION_REG","standardMetrics","revColor","lineY","rangeWidth","floatPositionList","imgDisplays","inactiveAlpha","pageNumber","lineNumber","pageBorder","pageCount","pagesToRender","startPage","endPage","entries","entry","isLazy","isInit","isSourceHistory","isFirstRender","isPartialRender","targetPageNo","oldPageSize","searchKeyword","curPageCount","prePageCount","page","pageCountChanged","tablePositionList","isShowCursor","IMAGE_ELEMENT_TYPE","oldElementList","getSlimCloneElementList","oldHeaderElementList","oldFooterElementList","oldRange","FloatingBar","command","isInToolbar","isInContainer","fontFamilySelect","fontSizeSelect","btn","action","picker","indicator","EDITOR_FONT_OPTIONS","EDITOR_SIZE_OPTIONS","normalizedFont","optionValue","optionLabel","primaryFamily","normalizedSize","currentValue","newDataUrl","reader","event","display","imgDisplay","hasSelection","isImageSelected","Plugin","editor","pluginFunction","Override","Register","shortcut","i18n","renderer"],"mappings":"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,QAASA,EAAE,OAAS,SAAUA,EAAE,KAAO,OAAQA,IAAIqC,IAAK,CAAA,CAAE,EAAGC,IAAuBtC,IAAOA,EAAE,QAAU,UAAWA,EAAE,KAAO,OAAQA,IAAIsC,IAAM,CAAA,CAAE,EAAGC,IAAuBvC,IAAOA,EAAE,IAAM,MAAOA,EAAE,IAAM,MAAOA,IAAIuC,IAAM,CAAA,CAAE,EACp1P,MAACC,GAAK,QAASC,GAAK,CACvB,QAASD,EACX,EAAGE,GAAK,QAASC,GAAK,OAAOF,GAAG,OAAO,EAAGG,GAAK,mBAAoBC,EAAK,KAAMC,GAAK,GAAGD,CAAE,aAAcE,GAAK,CACzG,MAAO,CACL,uBAAwB,EAC5B,EACE,SAAU,CACR,uBAAwB,EAC5B,EACE,KAAM,CACJ,yBAA0B,EAC9B,CACA,EAAGC,EAAI,IACMC,GAAK,IAAKC,GAAK,SAAUC,GAAK,CACzC,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACF,EAAGC,GAAK,CACN,CAAChD,GAAE,IAAI,EAAG,EAAI,EACd,CAACA,GAAE,SAAS,EAAG,EAAI,EACnB,CAACA,GAAE,OAAO,EAAG,EAAI,CACnB,EAAGiD,GAAK,CACN,QAAS,QAUX,EAAGC,GAAK,IAAKC,GAAK,CAChB,OACA,QACA,YACA,OACA,OACA,iBACA,SACA,YACA,YACA,gBACF,EAAGC,GAAK,CACN,UACA,YACA,iBACA,sBACA,2BACA,yBACA,uBACF,EAAGC,GAAK,CACN,OACA,OACA,OACA,iBACA,OACA,QACA,SACA,YACA,iBACA,YACA,YACA,UACA,MACA,SACA,cACA,SACA,aACA,WACA,YACA,iBACA,YACA,gBACA,qBACA,aACA,eACA,iBACA,cACF,EAAGC,GAAK,CACN,OACA,OACA,OACA,iBACA,OACA,QACA,SACA,YACA,iBACA,YACA,YACA,UACA,YACA,YACA,gBACA,qBACA,SACA,oBACA,aACA,cACA,cACA,sBACA,QACA,SACA,MACA,WACA,YACA,UACA,WACA,QACA,aACA,QACA,QACA,QACA,WACA,YACA,WACA,W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"}
|