diff --git a/src/view/tools/text-diff.vue b/src/view/tools/text-diff.vue
index 4bd708e..916628a 100644
--- a/src/view/tools/text-diff.vue
+++ b/src/view/tools/text-diff.vue
@@ -2,42 +2,68 @@
-
- 新增 {{ stats.added }} 行
-
-
- 删除 {{ stats.removed }} 行
-
-
- 修改 {{ stats.changed }} 行
-
-
相同 {{ stats.unchanged }} 行
-
-
耗时 {{ elapsed }} ms
-
-
-
-
- {{ navIndex + 1 }} / {{ changeRows.length }}
-
+
+
+ 新增{{ stats.added }}
-
+
+ 删除{{ stats.removed }}
+
+
+ 修改{{ stats.changed }}
+
+ 相同{{ stats.unchanged }}
+
+
+
+
+
+
+ 定位
+
+ {{ navIndex + 1 }}/{{ changeRows.length }}
+
+
+
- 存在差异
- 完全一致
+
+
+ 耗时{{ elapsed }} ms
+ 存在差异
+ 完全一致
+
+
+
+
+
@@ -75,18 +101,14 @@
-
-
- 左侧为原始内容,右侧为对比内容
-
-
行号
-
行号
+
原
+
新
-
原始内容
-
对比内容
+
原始内容
+
对比内容
{{ row.leftNo > 0 ? row.leftNo : '' }}
-
{{ row.rightNo > 0 ? row.rightNo : '' }}
+
{{ row.rightNo > 0 ? row.rightNo : '' }}
-
+
—
-
+
{
+ if (row.type === 'insert') return 'txt side-right hit'
+ if (row.type === 'delete') return 'txt side-left hit'
+ if (row.type === 'replace') return 'txt hit'
+ return 'txt'
+ }
+ const renderParts = parts => {
+ if (!parts) return '—'
+ return parts.map(p => {
+ const text = escapeHtml(p.text)
+ return p.changed ? '' + text + '' : text
+ }).join('')
+ }
rows.forEach(row => {
const cls = this.rowClass(row)
- const left = row.leftParts ? row.leftParts.map(p => escapeHtml(p.text)).join('') : ''
- const right = row.rightParts ? row.rightParts.map(p => escapeHtml(p.text)).join('') : ''
body += ''
body += '| ' + (row.leftNo > 0 ? row.leftNo : '') + ' | '
body += '' + (row.rightNo > 0 ? row.rightNo : '') + ' | '
- body += '' + left + ' | '
- body += '' + right + ' | '
+ body += '' + renderParts(row.leftParts) + ' | '
+ body += '' + renderParts(row.rightParts) + ' | '
body += '
'
})
const html = ''
@@ -339,16 +374,19 @@
+ '.bar{padding:10px 12px;background:#f0f3fa;border-radius:6px;margin-bottom:12px}'
+ 'table{border-collapse:collapse;width:100%;table-layout:fixed}'
+ 'td{border:1px solid #e8eaec;padding:2px 6px;vertical-align:top;white-space:pre-wrap;word-break:break-all}'
- + 'td.no{width:48px;background:#f8f8f9;color:#808695;text-align:right;user-select:none}'
- + 'td.txt{width:40%}'
- + 'tr.row-insert td{background:#e8f8ee}'
- + 'tr.row-delete td{background:#fdecec}'
+ + 'td.no{width:44px;background:#f8f8f9;color:#808695;text-align:right;user-select:none;font-variant-numeric:tabular-nums}'
+ + 'td.txt{width:41%}'
+ + 'td.side-left{border-right:1px solid #dcdee2}'
+ + 'tr.row-insert td.side-right{background:#e8f8ee}'
+ + 'tr.row-delete td.side-left{background:#fdecec}'
+ 'tr.row-replace td{background:#fff8e1}'
+ + 'mark{background:#e6a23c;color:#fff;border-radius:2px;padding:0 1px}'
+ + 'span.ph{color:#c5c8ce}'
+ ''
+ '新增 ' + this.stats.added + ' 行 | 删除 ' + this.stats.removed
+ ' 行 | 修改 ' + this.stats.changed + ' 行 | 相同 ' + this.stats.unchanged + ' 行
'
- + '| 行 | 行 | 原始内容 | '
- + '对比内容 |
' + body + '
'
+ + '| 原 | 新 | 原始内容 | '
+ + '对比内容 |
' + body + '