cloud-web-corejs 1.0.280 → 1.1.0-dev.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.
Files changed (159) hide show
  1. package/package.json +6 -2
  2. package/src/components/VabUpload/image-viewer.vue +442 -442
  3. package/src/components/VabUpload/index.vue +44 -2
  4. package/src/components/VabUpload/mixins.js +174 -34
  5. package/src/components/VabUpload/previewGroup.js +128 -0
  6. package/src/components/VabUpload/view.vue +247 -209
  7. package/src/components/baseTabs/mixins.js +181 -181
  8. package/src/components/bizTab/BizBillActions.vue +129 -0
  9. package/src/components/bizTab/BizTabListPage.vue +391 -0
  10. package/src/components/bizTab/README.md +378 -0
  11. package/src/components/bizTab/billTableUtil.js +48 -0
  12. package/src/components/bizTab/billValidators.js +136 -0
  13. package/src/components/bizTab/bizBillDetailMixin.js +705 -0
  14. package/src/components/bizTab/index.js +24 -0
  15. package/src/components/excelExport/exportFieldDialog.vue +23 -12
  16. package/src/components/excelExport/exportItemConfigUtil.js +30 -0
  17. package/src/components/excelExport/mixins.js +3 -3
  18. package/src/components/mobile/statusTag/mixins.js +1 -61
  19. package/src/components/mobile/wf/content.vue +1662 -1556
  20. package/src/components/mobile/wf/mixins/wfModifyDialogMixin.js +8 -6
  21. package/src/components/table/config.js +78 -78
  22. package/src/components/table/index.js +1276 -1276
  23. package/src/components/table/plugins/cell-area/index.js +1055 -0
  24. package/src/components/table/plugins/cell-area/index.scss +77 -0
  25. package/src/components/table/plugins/cell-area/util.js +224 -0
  26. package/src/components/table/tableForm.vue +330 -330
  27. package/src/components/table/tableFormMixin.js +318 -318
  28. package/src/components/table/vxeFilter/index.js +163 -163
  29. package/src/components/table/vxeFilter/mixin.js +316 -316
  30. package/src/components/wf/content.vue +1188 -1188
  31. package/src/components/wf/wf.js +40 -20
  32. package/src/components/wf/wfActionDropdown.vue +1 -1
  33. package/src/components/wf/wfActionItems.js +1 -1
  34. package/src/components/xform/docs/2026-08 xform H5 P0 /345/256/236/347/216/260/350/247/204/346/240/274.md" +528 -0
  35. package/src/components/xform/docs/2026-08 xform H5 P1 /345/256/236/347/216/260/350/247/204/346/240/274.md" +412 -0
  36. package/src/components/xform/docs/2026-08 xform H5 P2 /345/256/236/347/216/260/350/247/204/346/240/274.md" +287 -0
  37. package/src/components/xform/docs/2026-08 xform /347/247/273/345/212/250/347/253/257/345/270/203/345/261/200/345/257/271/351/275/220 bill_setting /346/226/271/346/241/210.md" +400 -0
  38. package/src/components/xform/form-designer/designer.js +15 -0
  39. package/src/components/xform/form-designer/form-widget/container-widget/data-table-widget.vue +269 -269
  40. package/src/components/xform/form-designer/form-widget/container-widget/detail-temp-widget.vue +132 -0
  41. package/src/components/xform/form-designer/form-widget/container-widget/detail-widget.vue +250 -250
  42. package/src/components/xform/form-designer/form-widget/dialog/fileReferenceDialog.vue +319 -320
  43. package/src/components/xform/form-designer/form-widget/dialog/formDialog.vue +365 -365
  44. package/src/components/xform/form-designer/form-widget/dialog/searchFormDialog.vue +554 -555
  45. package/src/components/xform/form-designer/form-widget/dialog/vabSearchDialog.vue +409 -409
  46. package/src/components/xform/form-designer/form-widget/field-widget/a-link-widget.vue +150 -132
  47. package/src/components/xform/form-designer/form-widget/field-widget/date-range-widget.vue +114 -114
  48. package/src/components/xform/form-designer/form-widget/field-widget/date-widget.vue +154 -154
  49. package/src/components/xform/form-designer/form-widget/field-widget/form-item-wrapper.vue +47 -1
  50. package/src/components/xform/form-designer/form-widget/field-widget/mixins/date-limit-mixin.js +178 -178
  51. package/src/components/xform/form-designer/form-widget/field-widget/mixins/time-limit-mixin.js +77 -77
  52. package/src/components/xform/form-designer/form-widget/field-widget/select-export-item-button-widget.vue +6 -0
  53. package/src/components/xform/form-designer/form-widget/field-widget/select-widget.vue +139 -139
  54. package/src/components/xform/form-designer/form-widget/field-widget/time-range-widget.vue +106 -106
  55. package/src/components/xform/form-designer/form-widget/field-widget/time-widget.vue +134 -134
  56. package/src/components/xform/form-designer/form-widget/field-widget/vabUpload-widget.vue +1 -0
  57. package/src/components/xform/form-designer/setting-panel/form-setting.vue +39 -39
  58. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/data-table-editor.vue +10 -10
  59. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/exportItemColumns-dialog.vue +438 -432
  60. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/table-column-dialog.vue +2103 -2103
  61. package/src/components/xform/form-designer/setting-panel/property-editor/container-detail/detail-temp-edito.vue +90 -0
  62. package/src/components/xform/form-designer/setting-panel/property-editor/container-grid/gutter-editor.vue +82 -82
  63. package/src/components/xform/form-designer/setting-panel/property-editor/container-list-h5/list-h5-editor.vue +19 -5
  64. package/src/components/xform/form-designer/setting-panel/property-editor/container-table/table-dynamicField-editor.vue +8 -8
  65. package/src/components/xform/form-designer/setting-panel/property-editor/dropdownFlag-editor.vue +137 -137
  66. package/src/components/xform/form-designer/setting-panel/property-editor/field-button/search-dialog-event-editor.vue +237 -237
  67. package/src/components/xform/form-designer/setting-panel/property-editor/field-date/date-defaultValue-editor.vue +43 -43
  68. package/src/components/xform/form-designer/setting-panel/property-editor/field-date-range/date-range-defaultValue-editor.vue +43 -43
  69. package/src/components/xform/form-designer/setting-panel/property-editor/field-import-button/import2-button-editor.vue +96 -96
  70. package/src/components/xform/form-designer/setting-panel/property-editor/field-table-export-button/select-export-item-button-editor.vue +51 -0
  71. package/src/components/xform/form-designer/setting-panel/property-editor/field-time/time-defaultValue-editor.vue +42 -42
  72. package/src/components/xform/form-designer/setting-panel/property-editor/field-time-range/time-range-defaultValue-editor.vue +43 -43
  73. package/src/components/xform/form-designer/setting-panel/property-editor/formScriptEnabled-editor.vue +158 -158
  74. package/src/components/xform/form-designer/setting-panel/property-editor/h5Span-editor.vue +51 -0
  75. package/src/components/xform/form-designer/setting-panel/property-editor/itemStyle-editor.vue +39 -0
  76. package/src/components/xform/form-designer/setting-panel/property-editor/name-editor.vue +188 -188
  77. package/src/components/xform/form-designer/setting-panel/property-editor/styleTempClass-editor.vue +51 -0
  78. package/src/components/xform/form-designer/setting-panel/property-editor/textFlag-editor.vue +347 -347
  79. package/src/components/xform/form-designer/setting-panel/propertyRegister.js +4 -0
  80. package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +59 -3
  81. package/src/components/xform/form-render/container-item/data-table-mixin.js +151 -93
  82. package/src/components/xform/form-render/container-item/detail-h5-item.vue +183 -32
  83. package/src/components/xform/form-render/container-item/detail-temp-item.vue +110 -0
  84. package/src/components/xform/form-render/container-item/h5-card-pane-item.vue +160 -140
  85. package/src/components/xform/form-render/container-item/list-h5-item.vue +1688 -1700
  86. package/src/components/xform/form-render/index.vue +153 -147
  87. package/src/components/xform/form-render/indexMixin.js +12 -0
  88. package/src/components/xform/lang/en-US.js +10 -0
  89. package/src/components/xform/lang/zh-CN.js +12 -0
  90. package/src/components/xform/mixins/defaultHandle.js +707 -707
  91. package/src/components/xform/styles/h5.scss +1992 -0
  92. package/src/components/xform/utils/textMaskUtil.js +182 -179
  93. package/src/components/xform/utils/treeTableUtil.js +1292 -1265
  94. package/src/components/xform/utils/util.js +56 -11
  95. package/src/index.js +9 -4
  96. package/src/layout/components/extractedCode/viewDialog.vue +7 -7
  97. package/src/router/index.js +21 -0
  98. package/src/router/modules/customer.js +71 -14
  99. package/src/store/modules/permission.js +17 -18
  100. package/src/utils/pdfUtil.js +429 -429
  101. package/src/utils/resolveViewComponent.js +142 -16
  102. package/src/views/bd/project/branch/bd_branch/edit.vue +145 -0
  103. package/src/views/bd/project/branch/bd_branch/list.vue +72 -0
  104. package/src/views/bd/project/branch/bd_branch/menuKindDialog.vue +106 -0
  105. package/src/views/bd/project/branch/bd_branch/mixins/edit.js +189 -0
  106. package/src/views/bd/project/branch/bd_branch/mixins/list.js +124 -0
  107. package/src/views/bd/project/branch/bd_branch/mixins/menuKindDialog.js +85 -0
  108. package/src/views/bd/project/branch/form_script/list.vue +31 -0
  109. package/src/views/bd/project/branch/form_template/list.vue +30 -0
  110. package/src/views/bd/project/branch/menu_kind/list.vue +31 -0
  111. package/src/views/bd/project/common/form_script/list.vue +16 -0
  112. package/src/views/bd/project/common/form_template/list.vue +15 -0
  113. package/src/views/bd/project/common/menu_kind/list.vue +15 -0
  114. package/src/views/bd/project/core/branchContext.js +100 -0
  115. package/src/views/bd/project/core/branchPage.js +78 -0
  116. package/src/views/bd/project/core/branchPageWrap.vue +225 -0
  117. package/src/views/bd/project/core/branchScope.js +44 -0
  118. package/src/views/bd/project/core/branchSearchPage.js +285 -0
  119. package/src/views/bd/project/core/branchSelect.vue +85 -0
  120. package/src/views/bd/project/core/branchTreeBar.vue +81 -0
  121. package/src/views/bd/project/core/httpBranchPatch.js +58 -0
  122. package/src/views/bd/project/datatable/menu_kind/list.vue +15 -0
  123. package/src/views/bd/project/datatable/table_model/list.vue +15 -0
  124. package/src/views/bd/setting/bd_company_env/dialog.vue +174 -174
  125. package/src/views/bd/setting/table_model/edit.vue +1066 -1066
  126. package/src/views/bd/setting/table_model/mixins/edit.js +1455 -1455
  127. package/src/views/bd/setting/table_model/mixins/zdDialog.js +148 -148
  128. package/src/views/demo/bizTab/bill/billConfig.js +41 -0
  129. package/src/views/demo/bizTab/bill/detail.vue +436 -0
  130. package/src/views/demo/bizTab/bill/list.vue +288 -0
  131. package/src/views/demo/bizTab/bill/productDialog.vue +176 -0
  132. package/src/views/demo/bizTab/simple/billApi.js +123 -0
  133. package/src/views/demo/bizTab/simple/detail.vue +407 -0
  134. package/src/views/demo/bizTab/simple/list.vue +217 -0
  135. package/src/views/demo/bizTab/standalone/index.vue +121 -0
  136. package/src/views/demo/bizTab/wf/billConfig.js +44 -0
  137. package/src/views/demo/bizTab/wf/detail.vue +661 -0
  138. package/src/views/demo/bizTab/wf/list.vue +242 -0
  139. package/src/views/support/form-dialog-demo/demoPickerDialog.vue +72 -0
  140. package/src/views/support/form-dialog-demo/index.vue +537 -0
  141. package/src/views/user/file_view_ins/list.vue +3 -3
  142. package/src/views/user/home/index.vue +8 -6
  143. package/src/views/user/home/wjl/content.vue +1569 -0
  144. package/src/views/user/notify_message/dialog.vue +7 -5
  145. package/src/views/user/outLink/cc_form_view.vue +188 -0
  146. package/src/views/user/outLink/form_view.vue +2 -2
  147. package/src/views/user/outLink/index.vue +4 -4
  148. package/src/views/user/outLink/view.vue +3 -3
  149. package/src/views/user/role/edit.vue +632 -632
  150. package/src/views/user/role/list.vue +260 -260
  151. package/src/views/user/wf/iframe/index.vue +3 -3
  152. package/src/views/user/wf/iframe/index2.vue +3 -3
  153. package/src/views/user/wf/wf_manage/list.vue +1112 -1116
  154. package/src/views/user/wf/wf_manage/list2.vue +9 -13
  155. package/src/views/user/wf/wf_manage/wfContentDialog.vue +8 -5
  156. package/src/components/xform/form-designer/form-widget/field-widget/dropdown-menu-widget.vue +0 -106
  157. package/src/components/xform/form-designer/form-widget/field-widget/tableexportbuttonwidget.vue +0 -99
  158. package/src/components/xform/form-render/container-item/list-h5-item2.vue +0 -1340
  159. package/src/utils/wf.js +0 -766
@@ -0,0 +1,77 @@
1
+ /**
2
+ * 自研区域选取的高亮样式。
3
+ *
4
+ * 高亮是把 class 直接打在 td 上(见同目录 index.js),而不是画绝对定位的遮罩:
5
+ * 业务表常配 row-config.height: auto + autosize 的 textarea,行高会在输入过程中变化,
6
+ * 遮罩会漂移;而且有固定列时同一个单元格在 left/main/right 三个 wrapper 里各有一份,
7
+ * 打 class 一次就能全覆盖。
8
+ *
9
+ * 边框走 ::after 伪元素而不是 border,避免占用盒模型把单元格内容挤动。
10
+ */
11
+ $vxe-cell-area-color: #409eff !default;
12
+ $vxe-cell-area-background-color: rgba(64, 158, 255, 0.12) !default;
13
+ $vxe-cell-area-border-width: 2px !default;
14
+
15
+ .vxe-table {
16
+ // 框选过程中禁掉文字选中,否则拖拽会连带选中单元格文本
17
+ &.drag--range {
18
+ .vxe-table--main-wrapper,
19
+ .vxe-table--fixed-left-wrapper,
20
+ .vxe-table--fixed-right-wrapper {
21
+ user-select: none;
22
+
23
+ * {
24
+ user-select: none;
25
+ }
26
+ }
27
+ }
28
+
29
+ .vxe-body--column {
30
+ &.col--area,
31
+ &.col--copy-area {
32
+ position: relative;
33
+
34
+ &::after {
35
+ content: "";
36
+ position: absolute;
37
+ top: 0;
38
+ right: 0;
39
+ bottom: 0;
40
+ left: 0;
41
+ pointer-events: none;
42
+ z-index: 1;
43
+ }
44
+ }
45
+
46
+ &.col--area {
47
+ background-color: $vxe-cell-area-background-color;
48
+ }
49
+
50
+ // 只有落在选区边界上的单元格画对应那条边,四条拼起来就是完整矩形
51
+ &.col--area-t::after {
52
+ border-top: $vxe-cell-area-border-width solid $vxe-cell-area-color;
53
+ }
54
+
55
+ &.col--area-b::after {
56
+ border-bottom: $vxe-cell-area-border-width solid $vxe-cell-area-color;
57
+ }
58
+
59
+ &.col--area-l::after {
60
+ border-left: $vxe-cell-area-border-width solid $vxe-cell-area-color;
61
+ }
62
+
63
+ &.col--area-r::after {
64
+ border-right: $vxe-cell-area-border-width solid $vxe-cell-area-color;
65
+ }
66
+
67
+ // 锚点格:shift 扩选与方向键移动的基准,不铺底色以示区别
68
+ &.col--area-active {
69
+ background-color: transparent;
70
+ }
71
+
72
+ // 复制源:虚线框,粘贴或取消后清除
73
+ &.col--copy-area::after {
74
+ border: 1px dashed $vxe-cell-area-color;
75
+ }
76
+ }
77
+ }
@@ -0,0 +1,224 @@
1
+ /**
2
+ * 区域选取插件的纯函数部分:可选列/行的口径、矩形运算、剪贴板 TSV 编解码。
3
+ * 抽出来是为了能脱离 vxe 实例单测,index.js 只负责跟 vxe 的钩子对接。
4
+ */
5
+
6
+ // 这些列没有业务值(复选框/单选/序号/展开),不参与区域选取与复制粘贴
7
+ const NOT_AREA_COLUMN_TYPES = ["checkbox", "radio", "seq", "expand"];
8
+
9
+ /**
10
+ * 参与区域选取的列。索引空间以本函数返回的数组为准,
11
+ * 复制粘贴的列对齐、方向键移动都按这个下标算。
12
+ */
13
+ export function getAreaColumns(columns, excludeFields) {
14
+ let excludes = excludeFields || [];
15
+ return (columns || []).filter((column) => {
16
+ if (!column) return false;
17
+ let field = column.property || column.field;
18
+ if (!field) return false;
19
+ if (NOT_AREA_COLUMN_TYPES.includes(column.type)) return false;
20
+ return !excludes.includes(field);
21
+ });
22
+ }
23
+
24
+ export function getColumnField(column) {
25
+ return column ? column.property || column.field : null;
26
+ }
27
+
28
+ /**
29
+ * 下标钳制到 [0, size - 1],size 为 0 时返回 -1 表示无可用格。
30
+ *
31
+ * 只接受**算术下标**(锚点 ± 偏移,越界钳回边界是对的,比如在第 0 行按 ↑ 得到 -1 应该停在 0)。
32
+ * **不要拿 indexOf 的结果喂它** —— 那里的 -1 是"找不到",钳成 0 会把查找失败
33
+ * 静默变成"第 0 行",选区反向铺开。
34
+ */
35
+ export function clampIndex(index, size) {
36
+ if (!size || size < 1) return -1;
37
+ if (index < 0) return 0;
38
+ if (index > size - 1) return size - 1;
39
+ return index;
40
+ }
41
+
42
+ /**
43
+ * 由锚点与焦点格构造矩形。锚点是 shift 扩选与方向键移动的基准,
44
+ * 始终保留在区域里,不随 start/end 归一化而丢失。
45
+ */
46
+ export function buildArea(anchorRow, anchorCol, focusRow, focusCol) {
47
+ return {
48
+ anchorRow: anchorRow,
49
+ anchorCol: anchorCol,
50
+ focusRow: focusRow,
51
+ focusCol: focusCol,
52
+ startRow: Math.min(anchorRow, focusRow),
53
+ endRow: Math.max(anchorRow, focusRow),
54
+ startCol: Math.min(anchorCol, focusCol),
55
+ endCol: Math.max(anchorCol, focusCol),
56
+ };
57
+ }
58
+
59
+ /** 折叠成单格 */
60
+ export function buildCellArea(rowIndex, colIndex) {
61
+ return buildArea(rowIndex, colIndex, rowIndex, colIndex);
62
+ }
63
+
64
+ /** 以现有锚点扩选到目标格;没有区域时退化为单格 */
65
+ export function extendArea(area, focusRow, focusCol) {
66
+ if (!area) return buildCellArea(focusRow, focusCol);
67
+ return buildArea(area.anchorRow, area.anchorCol, focusRow, focusCol);
68
+ }
69
+
70
+ /**
71
+ * 方向键移动。extend 为真时移动焦点边(Shift+方向键),
72
+ * 否则整体折叠成单格移动到新位置。
73
+ */
74
+ export function moveArea(area, offsetRow, offsetCol, rowSize, colSize, extend) {
75
+ if (!area) return null;
76
+ if (extend) {
77
+ let focusRow = clampIndex(area.focusRow + offsetRow, rowSize);
78
+ let focusCol = clampIndex(area.focusCol + offsetCol, colSize);
79
+ return buildArea(area.anchorRow, area.anchorCol, focusRow, focusCol);
80
+ }
81
+ let rowIndex = clampIndex(area.anchorRow + offsetRow, rowSize);
82
+ let colIndex = clampIndex(area.anchorCol + offsetCol, colSize);
83
+ return buildCellArea(rowIndex, colIndex);
84
+ }
85
+
86
+ /**
87
+ * Tab/Enter 的顺序移动:列走到头换行。越界则停在原地。
88
+ */
89
+ export function moveNextCell(area, isRowFirst, isBack, rowSize, colSize) {
90
+ if (!area) return null;
91
+ let rowIndex = area.anchorRow;
92
+ let colIndex = area.anchorCol;
93
+ let step = isBack ? -1 : 1;
94
+ if (isRowFirst) {
95
+ colIndex += step;
96
+ if (colIndex > colSize - 1) {
97
+ colIndex = 0;
98
+ rowIndex += 1;
99
+ } else if (colIndex < 0) {
100
+ colIndex = colSize - 1;
101
+ rowIndex -= 1;
102
+ }
103
+ } else {
104
+ rowIndex += step;
105
+ }
106
+ if (rowIndex < 0 || rowIndex > rowSize - 1) {
107
+ return area;
108
+ }
109
+ return buildCellArea(rowIndex, clampIndex(colIndex, colSize));
110
+ }
111
+
112
+ /**
113
+ * 粘贴时需要补几行:从 startRowIndex 起放下 pasteRowSize 行,超出当前行数的部分。
114
+ */
115
+ export function getIncrementRowSize(startRowIndex, pasteRowSize, rowSize) {
116
+ let need = startRowIndex + pasteRowSize - rowSize;
117
+ return need > 0 ? need : 0;
118
+ }
119
+
120
+ const NEED_QUOTE_RE = /[\t\r\n"]/;
121
+
122
+ /** 单元格文本 -> 剪贴板片段,按 Excel 约定转义 */
123
+ export function encodeClipCell(value) {
124
+ let text = value === null || value === undefined ? "" : "" + value;
125
+ if (NEED_QUOTE_RE.test(text)) {
126
+ return '"' + text.replace(/"/g, '""') + '"';
127
+ }
128
+ return text;
129
+ }
130
+
131
+ /** 二维数组 -> TSV 文本 */
132
+ export function encodeClipText(matrix) {
133
+ return (matrix || [])
134
+ .map((row) => (row || []).map(encodeClipCell).join("\t"))
135
+ .join("\n");
136
+ }
137
+
138
+ const HTML_ESCAPE_MAP = {
139
+ "&": "&amp;",
140
+ "<": "&lt;",
141
+ ">": "&gt;",
142
+ '"': "&quot;",
143
+ };
144
+
145
+ export function escapeClipHtml(value) {
146
+ let text = value === null || value === undefined ? "" : "" + value;
147
+ return text.replace(/[&<>"]/g, function (ch) {
148
+ return HTML_ESCAPE_MAP[ch];
149
+ });
150
+ }
151
+
152
+ /**
153
+ * 二维数组 -> HTML 表格片段。
154
+ * 官方 copyCellArea() 的返回值是 { text, html },只写 text/plain 的话
155
+ * 粘进 Word / 邮件 / 富文本编辑器会丢掉表格结构,塌成一行文本。
156
+ */
157
+ export function encodeClipHtml(matrix) {
158
+ let trList = (matrix || []).map(function (row) {
159
+ let tdList = (row || []).map(function (cell) {
160
+ // 格内换行要转 <br>,否则富文本里同样会被挤成一行
161
+ return "<td>" + escapeClipHtml(cell).replace(/\r?\n/g, "<br>") + "</td>";
162
+ });
163
+ return "<tr>" + tdList.join("") + "</tr>";
164
+ });
165
+ return "<table><tbody>" + trList.join("") + "</tbody></table>";
166
+ }
167
+
168
+ /**
169
+ * TSV 文本 -> 二维数组。走状态机而不是 split,
170
+ * 因为 Excel 会把含换行/制表符的单元格用引号包起来。
171
+ */
172
+ export function decodeClipText(text) {
173
+ let source = text === null || text === undefined ? "" : "" + text;
174
+ if (!source) return [];
175
+ let rows = [];
176
+ let row = [];
177
+ let cell = "";
178
+ let inQuote = false;
179
+ let cellStart = true; // 只有单元格开头的引号才算包裹符
180
+ for (let i = 0; i < source.length; i++) {
181
+ let ch = source[i];
182
+ if (inQuote) {
183
+ if (ch === '"') {
184
+ if (source[i + 1] === '"') {
185
+ cell += '"';
186
+ i++;
187
+ } else {
188
+ inQuote = false;
189
+ }
190
+ } else {
191
+ cell += ch;
192
+ }
193
+ continue;
194
+ }
195
+ if (ch === '"' && cellStart) {
196
+ inQuote = true;
197
+ cellStart = false;
198
+ continue;
199
+ }
200
+ if (ch === "\t") {
201
+ row.push(cell);
202
+ cell = "";
203
+ cellStart = true;
204
+ continue;
205
+ }
206
+ if (ch === "\n" || ch === "\r") {
207
+ if (ch === "\r" && source[i + 1] === "\n") i++;
208
+ row.push(cell);
209
+ rows.push(row);
210
+ row = [];
211
+ cell = "";
212
+ cellStart = true;
213
+ continue;
214
+ }
215
+ cell += ch;
216
+ cellStart = false;
217
+ }
218
+ // 末尾没有换行时收尾;有换行时不要多造一个空行
219
+ if (cell !== "" || row.length || inQuote) {
220
+ row.push(cell);
221
+ rows.push(row);
222
+ }
223
+ return rows;
224
+ }