瀏覽代碼

Revert "Fix RTL text direction rendering (#1687)" (#1705)

This reverts commit a118bed82f.
vanilla_orig
David Luzar 5 年之前
父節點
當前提交
ff93d95998
沒有連結到貢獻者的電子郵件帳戶。
共有 4 個檔案被更改,包括 10 行新增41 行删除
  1. 1
    0
      src/data/index.ts
  2. 9
    29
      src/renderer/renderElement.ts
  3. 0
    2
      src/scene/export.ts
  4. 0
    10
      src/utils.ts

+ 1
- 0
src/data/index.ts 查看文件

330
     shouldAddWatermark,
330
     shouldAddWatermark,
331
   });
331
   });
332
   tempCanvas.style.display = "none";
332
   tempCanvas.style.display = "none";
333
+  document.body.appendChild(tempCanvas);
333
 
334
 
334
   if (type === "png") {
335
   if (type === "png") {
335
     const fileName = `${name}.png`;
336
     const fileName = `${name}.png`;

+ 9
- 29
src/renderer/renderElement.ts 查看文件

14
 import { RoughSVG } from "roughjs/bin/svg";
14
 import { RoughSVG } from "roughjs/bin/svg";
15
 import { RoughGenerator } from "roughjs/bin/generator";
15
 import { RoughGenerator } from "roughjs/bin/generator";
16
 import { SceneState } from "../scene/types";
16
 import { SceneState } from "../scene/types";
17
-import {
18
-  SVG_NS,
19
-  distance,
20
-  getFontString,
21
-  getFontFamilyString,
22
-  isRTL,
23
-} from "../utils";
17
+import { SVG_NS, distance, getFontString, getFontFamilyString } from "../utils";
24
 import { isPathALoop } from "../math";
18
 import { isPathALoop } from "../math";
25
 import rough from "roughjs/bin/rough";
19
 import rough from "roughjs/bin/rough";
26
 
20
 
44
   const canvas = document.createElement("canvas");
38
   const canvas = document.createElement("canvas");
45
   const context = canvas.getContext("2d")!;
39
   const context = canvas.getContext("2d")!;
46
 
40
 
47
-  // To be able to draw a nested element with RTL, we have to append it to the DOM
48
-  canvas.style.display = "none";
49
-  canvas.id = "nested-canvas-element";
50
-  document.body.appendChild(canvas);
51
-
52
   let canvasOffsetX = 0;
41
   let canvasOffsetX = 0;
53
   let canvasOffsetY = 0;
42
   let canvasOffsetY = 0;
54
 
43
 
111
     }
100
     }
112
     default: {
101
     default: {
113
       if (isTextElement(element)) {
102
       if (isTextElement(element)) {
114
-        context.canvas.setAttribute("dir", isRTL(element.text) ? "rtl" : "ltr");
115
         const font = context.font;
103
         const font = context.font;
116
         context.font = getFontString(element);
104
         context.font = getFontString(element);
117
         const fillStyle = context.fillStyle;
105
         const fillStyle = context.fillStyle;
118
         context.fillStyle = element.strokeColor;
106
         context.fillStyle = element.strokeColor;
119
         const textAlign = context.textAlign;
107
         const textAlign = context.textAlign;
120
         context.textAlign = element.textAlign as CanvasTextAlign;
108
         context.textAlign = element.textAlign as CanvasTextAlign;
121
-
122
         // Canvas does not support multiline text by default
109
         // Canvas does not support multiline text by default
123
         const lines = element.text.replace(/\r\n?/g, "\n").split("\n");
110
         const lines = element.text.replace(/\r\n?/g, "\n").split("\n");
124
         const lineHeight = element.height / lines.length;
111
         const lineHeight = element.height / lines.length;
132
         for (let i = 0; i < lines.length; i++) {
119
         for (let i = 0; i < lines.length; i++) {
133
           context.fillText(
120
           context.fillText(
134
             lines[i],
121
             lines[i],
135
-            horizontalOffset,
122
+            0 + horizontalOffset,
136
             (i + 1) * lineHeight - verticalOffset,
123
             (i + 1) * lineHeight - verticalOffset,
137
           );
124
           );
138
         }
125
         }
355
   context.rotate(-element.angle);
342
   context.rotate(-element.angle);
356
   context.translate(-cx, -cy);
343
   context.translate(-cx, -cy);
357
   context.scale(window.devicePixelRatio, window.devicePixelRatio);
344
   context.scale(window.devicePixelRatio, window.devicePixelRatio);
358
-
359
-  // Clear the nested element we appended to the DOM
360
-  const node = document.querySelector("#nested-canvas-element");
361
-  if (node && node.parentNode) {
362
-    node.parentNode.removeChild(node);
363
-  }
364
 };
345
 };
365
 
346
 
366
 export const renderElement = (
347
 export const renderElement = (
394
     case "draw":
375
     case "draw":
395
     case "arrow":
376
     case "arrow":
396
     case "text": {
377
     case "text": {
378
+      const elementWithCanvas = generateElement(element, generator, sceneState);
379
+
397
       if (renderOptimizations) {
380
       if (renderOptimizations) {
398
-        const elementWithCanvas = generateElement(
399
-          element,
400
-          generator,
401
-          sceneState,
402
-        );
403
         drawElementFromCanvas(elementWithCanvas, rc, context, sceneState);
381
         drawElementFromCanvas(elementWithCanvas, rc, context, sceneState);
404
       } else {
382
       } else {
405
         const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);
383
         const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);
509
         const lineHeight = element.height / lines.length;
487
         const lineHeight = element.height / lines.length;
510
         const verticalOffset = element.height - element.baseline;
488
         const verticalOffset = element.height - element.baseline;
511
         const horizontalOffset =
489
         const horizontalOffset =
512
-          element.textAlign === "center" ? element.width / 2 : element.width;
490
+          element.textAlign === "center"
491
+            ? element.width / 2
492
+            : element.textAlign === "right"
493
+            ? element.width
494
+            : 0;
513
         const textAnchor =
495
         const textAnchor =
514
           element.textAlign === "center"
496
           element.textAlign === "center"
515
             ? "middle"
497
             ? "middle"
516
             : element.textAlign === "right"
498
             : element.textAlign === "right"
517
             ? "end"
499
             ? "end"
518
             : "start";
500
             : "start";
519
-        const direction = isRTL(element.text) ? "rtl" : "ltr";
520
         for (let i = 0; i < lines.length; i++) {
501
         for (let i = 0; i < lines.length; i++) {
521
           const text = svgRoot.ownerDocument!.createElementNS(SVG_NS, "text");
502
           const text = svgRoot.ownerDocument!.createElementNS(SVG_NS, "text");
522
           text.textContent = lines[i];
503
           text.textContent = lines[i];
527
           text.setAttribute("fill", element.strokeColor);
508
           text.setAttribute("fill", element.strokeColor);
528
           text.setAttribute("text-anchor", textAnchor);
509
           text.setAttribute("text-anchor", textAnchor);
529
           text.setAttribute("style", "white-space: pre;");
510
           text.setAttribute("style", "white-space: pre;");
530
-          text.setAttribute("direction", direction);
531
           node.appendChild(text);
511
           node.appendChild(text);
532
         }
512
         }
533
         svgRoot.appendChild(node);
513
         svgRoot.appendChild(node);

+ 0
- 2
src/scene/export.ts 查看文件

32
     const tempCanvas = document.createElement("canvas");
32
     const tempCanvas = document.createElement("canvas");
33
     tempCanvas.width = width * scale;
33
     tempCanvas.width = width * scale;
34
     tempCanvas.height = height * scale;
34
     tempCanvas.height = height * scale;
35
-    // We append the canvas before drawing it to it for RTL to work
36
-    document.body.appendChild(tempCanvas);
37
     return tempCanvas;
35
     return tempCanvas;
38
   },
36
   },
39
 ) => {
37
 ) => {

+ 0
- 10
src/utils.ts 查看文件

227
 
227
 
228
 export const getGlobalCSSVariable = (name: string) =>
228
 export const getGlobalCSSVariable = (name: string) =>
229
   getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);
229
   getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);
230
-
231
-export const isRTL = (text: string) => {
232
-  const ltrChars =
233
-    "A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF" +
234
-    "\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF";
235
-  const rtlChars = "\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC";
236
-  const rtlDirCheck = new RegExp(`^[^${ltrChars}]*[${rtlChars}]`);
237
-
238
-  return rtlDirCheck.test(text);
239
-};

Loading…
取消
儲存