]> git.kianting.info Git - clo/commitdiff
add cjk splitter
authorTan Kian-ting <chenjt30@gmail.com>
Fri, 27 Oct 2023 15:51:43 +0000 (23:51 +0800)
committerTan Kian-ting <chenjt30@gmail.com>
Fri, 27 Oct 2023 15:51:43 +0000 (23:51 +0800)
README.md
src/libclo/index.js
src/libclo/index.ts

index 4ae71cf057e08a938d03bb4f0a2cf352ea301d87..46dfc11a5ead18e67be6883476ce8c4f99cc627b 100644 (file)
--- a/README.md
+++ b/README.md
@@ -29,6 +29,8 @@ License: MIT
  - 20231012: clo->js converter successfully (maybe.)
  - 20231016:basic font guessing and `putText` function
  - 20231023-24:fix .ttc bug.
+ - 20231026-27 : clo basic interface, preprocessor of stream of text,
+  add cjk-english splitter, etc.
 
  ## 之後的做法
   - 先做一個前處理註冊器,註冊下列的前處理
index 5bcc3f1347e0783647066875446686bf9def5988..e5ae1bdcf4fb83f30629f92196360894a8e8b254 100644 (file)
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.a = exports.Clo = void 0;
-function foo(arr) {
+const canva_1 = require("../canva");
+/**
+ * TYPES
+ */
+/**
+ * text direction
+ * LTR - left to right
+ * TTB - top to bottom
+ * etc.
+ */
+var Direction;
+(function (Direction) {
+    Direction[Direction["LTR"] = 0] = "LTR";
+    Direction[Direction["RTL"] = 1] = "RTL";
+    Direction[Direction["TTB"] = 2] = "TTB";
+    Direction[Direction["BTT"] = 3] = "BTT";
+})(Direction || (Direction = {}));
+/**
+ * DEFAULT CONST PART
+ */
+const A4_IN_PX = { "width": 793.7,
+    "height": 1122.5 };
+const defaultTextStyle = {
+    family: "FreeSans",
+    size: 12,
+    textWeight: canva_1.TextWeight.REGULAR,
+    textStyle: canva_1.TextStyle.ITALIC,
+};
+const defaultFrameStyle = {
+    directionInsideLine: Direction.LTR,
+    direction: Direction.TTB,
+    baseLineskip: ptToPx(15),
+    fontStyle: defaultTextStyle,
+    x: A4_IN_PX.width * 0.10,
+    y: A4_IN_PX.height * 0.10,
+    width: A4_IN_PX.width * 0.80,
+    height: A4_IN_PX.height * 0.80,
+    content: null,
+};
+const cjkvBlocksInRegex = ["Hani"];
+const cjkvRegexPattern = new RegExp("((?:" +
+    cjkvBlocksInRegex.map((x) => "\\p{Script_Extensions=" + x + "}").join("|") + ")+)", "gu");
+/**
+ * FUNCTION PART
+ */
+/**
+ * convert from ptToPx
+ * @param pt pt size value
+ * @returns the corresponding px value
+ */
+function ptToPx(pt) {
+    return pt * 4 / 3.0;
+}
+/**
+ *  REGISTER PART
+ */
+/**
+ * split CJKV and non-CJKV
+ *
+ * @param arr : input tkTree
+ * @returns
+ */
+function splitCJKV(arr) {
+    console.log(arr);
+    var result = [];
     for (let i = 0; i < arr.length; i++) {
+        var item = arr[i];
+        if (!Array.isArray(item)) {
+            console.log(item.split(cjkvRegexPattern));
+            result = result.concat(item.split(cjkvRegexPattern));
+        }
+        else {
+            result.push(item);
+        }
     }
-    if (Array.isArray(arr)) {
-        arr.push("balabala");
-    }
-    return arr;
+    console.log(result);
+    return result;
 }
 class Clo {
     constructor() {
         this.preprocessors = [];
         this.mainStream = [];
-        this.attributes = { "page": [793.7, 1122.5] };
-        this.preprocessorRegister(foo);
+        this.attributes = { "page": A4_IN_PX };
+        // register the precessor functions
+        this.preprocessorRegister(splitCJKV);
+    }
+    setAttr(attr, val) {
+        Object.assign(this.attributes, attr, val);
+    }
+    getAttr(attr) {
+        if (Object.keys(this.attributes).length === 0) {
+            return this.attributes[attr];
+        }
+        else {
+            return undefined;
+        }
     }
     /**
      * register a function of preprocessor
index b83b050305552038ea26ff110718e30c75844891..7fd58c67868378a167ac574afca354868eaddaab 100644 (file)
+import { isKeyObject, isStringObject } from "util/types";
 import {tkTree} from "../parser";
+import {TextStyle, FontStyle, TextWeight} from "../canva";
+import { isString } from "util";
 
+/**
+ * TYPES
+ */
 
-function foo(arr : tkTree): tkTree{
+/**
+ * text direction
+ * LTR - left to right
+ * TTB - top to bottom
+ * etc.
+ */
+enum Direction{
+    LTR,
+    RTL,
+    TTB,
+    BTT,
+}
+
+/**
+ * frame box is a subclass of box
+ * - directionInsideLine : text direction inside a line
+ * - baselineskip : the distance between baselines in px
+ */
+interface FrameBox extends Box{
+    directionInsideLine : Direction,
+    baseLineskip : number | null,
+}
+
+/**
+ * a basic Box
+ */
+interface Box{
+    x : number | null,
+    y : number | null,
+    fontStyle : FontStyle | null,
+    direction : Direction,
+    width : number,
+    height : number,
+    content : string | Box[] | null,
+}
+
+
+/**
+ * DEFAULT CONST PART
+ */
+const A4_IN_PX = {"width" : 793.7,
+                  "height" : 1122.5};
+
+const defaultTextStyle : FontStyle = {
+        family : "FreeSans",
+        size : 12,
+        textWeight : TextWeight.REGULAR,
+        textStyle : TextStyle.ITALIC,
+}
+
+const defaultFrameStyle : FrameBox = {
+    directionInsideLine : Direction.LTR,
+    direction : Direction.TTB,
+    baseLineskip : ptToPx(15),
+    fontStyle : defaultTextStyle,
+    x : A4_IN_PX.width * 0.10,
+    y : A4_IN_PX.height * 0.10,
+    width : A4_IN_PX.width * 0.80,
+    height : A4_IN_PX.height * 0.80,
+    content : null,
+};
+
+const cjkvBlocksInRegex = ["Hani"];
+
+const cjkvRegexPattern = new RegExp("((?:" +
+    cjkvBlocksInRegex.map((x)=>"\\p{Script_Extensions="+x+"}").join("|") + ")+)", "gu");
+/**
+ * FUNCTION PART
+ */
+/**
+ * convert from ptToPx
+ * @param pt pt size value
+ * @returns the corresponding px value
+ */
+function ptToPx(pt : number) : number{
+    return pt * 4 / 3.0;
+}
+
+
+
+/**
+ *  REGISTER PART
+ */
+
+
+/**
+ * split CJKV and non-CJKV
+ *
+ * @param arr : input tkTree
+ * @returns 
+ */ 
+function splitCJKV(arr : tkTree): tkTree{
+    var result : tkTree = [];
     for (let i = 0; i < arr.length; i++) {
-        
-    }
-    if (Array.isArray(arr)){
-        arr.push("balabala");
+        var item = arr[i];
+        if (!Array.isArray(item)){
+            console.log(item.split(cjkvRegexPattern));
+            result = result.concat(item.split(cjkvRegexPattern));
+        }
+        else{
+            result.push(item);
+        }
     }
-    return arr;
+
+    return result;
 }
 
 export class Clo{
     mainStream : Array<string>;
     preprocessors : Array<Function>;
-    attributes: object ; // a4 size(x,y)
+    attributes: {[index: string]:any} ; // a4 size(x,y)
 
     
     constructor(){
         this.preprocessors = [];
         this.mainStream = [];
-        this.attributes = {"page" : [793.7, 1122.5]};
-        this.preprocessorRegister(foo);
+        this.attributes = {"page" : A4_IN_PX};
+
+        
+
+        // register the precessor functions
+        this.preprocessorRegister(splitCJKV);
+    }
+
+    public setAttr(attr : string, val : any):void{
+        Object.assign(this.attributes, attr, val);
+    }
+
+    public getAttr(attr:string) : any{
+        if (Object.keys(this.attributes).length === 0){
+            return this.attributes[attr];
+        }else{
+            return undefined;
+        }
+        
     }
 
     /**