Contents
  1. 1. sketch資料檔案分析
    1. 1.1. sketch 資料解析
      1. 1.1.1. 1. 建立 sketch建立
      2. 1.1.2. 2. 解析.sketch檔案
      3. 1.1.3. 3.images & previews & pages 資料夾
      4. 1.1.4. 4. user.json
      5. 1.1.5. 5. document.json
      6. 1.1.6. 6. meta.json
      7. 1.1.7. 7. pages
      8. 1.1.8. 8. 小結

sketch資料檔案分析

近年來一些side project上非常頻繁使用mac上才有的 sketch的編輯器,漸漸變成自己塑模prototype的主要工具。優點有很多,一是相關套件很多方便討論,二是容易上手。相信不少設計為主的相關從業人員使用sketch上都有不錯的回饋。基本上使用sketch大概是現今UX主流的工具之一。

也因為從去年中開始,在工作專案上遇到不少問題,不容易操作的圖像與工控對於新技術較為保守,也不容易與設計人員有共鳴的討論。因此想在空閒的假日時間,開發一個類似 sketch的雲端原型工具 sketch-builder。

所以接下來會有一系列的開發文,主要還是技術傳道與資料結構的想法記錄為主。
也一併將這幾年的所學內化,開發成一個找到好方向就能推出的專案產品。

之後會陸續紀錄在
sketch-builder 雲端原型工具:
https://mike-zheng.github.io/sketch-builder


sketch 資料解析

進行之前我們來解析一下sketch的資料結構,
並做以之後開發的一個參考。

1. 建立 sketch建立

簡單完成一個這樣子有不同種類的物件與群組的sketch檔案
先開啟sketch建立一個些結構如

.sketch

  1. 文字
  2. 圖片
  3. 圖形 (圓形 三角形 線 矩形)
  4. 群組 與群組中群組

2. 解析.sketch檔案

官方文件: https://developer.sketch.com/file-format/

拆開.sketch檔案後可以得到檔案如下

.sketch

  1. 📁 images
  2. 📁 pages
  3. 📁 previews
  4. 🗄️ document.json
  5. 🗄️ meta.json
  6. 🗄️ user.json

3.images & previews & pages 資料夾

images 與previews裡面只有圖片

分別是

  1. 📁 images -> 專案用到的額外圖片資源檔案

    • 例如我加入一張圖片進去
  2. 📁 previews 裡面是我的page的縮圖

  3. 📁 pages 裡面有其他檔名為UUID的json檔案

    • 有幾個pages就會有幾個檔案他會被記錄在user.json,meta.json

將檔案打開後


4. user.json

user.json

{
    "document":
    {
        "pageListHeight": 85,
        "pageListCollapsed": 0
    },
    "與pages資料夾內的檔案同名的ID":
    {
        "scrollOrigin": "{62, 54}",
        "zoomValue": 1
    }
    ...
}

基本上打開user裡面紀錄的都是跟使用者針對軟體的設定有關係,
其中一些設定跟docment.jons設定又有點像,
但主要都是針對用戶操作卻與專案無關的部分。


5. document.json

而document是這樣紀錄

document.json


{
    "_class": "document",
    "do_objectID": "....",
    "colorSpace": 0,
    "currentPageIndex": 0,
    "assets": {...},
    "foreignLayerStyles": [],
    "foreignSymbols": [],
    "foreignTextStyles": [],
    "layerStyles": {...},
    "layerSymbols": {...},
    "layerTextStyles": {...},
    "pages": [...],
    ....
}

document 主要是紀錄整個專案裡面用到的全域紀錄區,
例如symbols,sketch常用的module組件,
或是pages列表,就像是整個workspace的紀錄區。


6. meta.json

meta.json


{
    
    "commit": "......",
    "pagesAndArtboards":
    {
        "....UUID":
        {
            "name": "Page 1",
            "artboards":
            {
                "....UUID":
                {
                    "name": "Artboard"
                }
            }
        }
    },
    "version": 121,
    "fonts": ["PingFangTC-Semibold"],
    "compatibilityVersion": 99,
    "app": "com.bohemiancoding.sketch3",
    "autosaved": 0,
    "variant": "NONAPPSTORE",
    "created": {...},
    "saveHistory": ["...."],
    "appVersion": "....",
    "build": ...

}

meta.json 就比較像是版本資訊,因為整體的sketch功能因為版本不停地推進,因此紀錄於此。
不過比較意外的是這邊紀錄了pagesAndArtboards

並且它的結構是KEY VALUE並不是我習慣使用的Array Object

{
  page: [
    {
      'type':'artboards',
      'name':'Artboard'
    }...
  ]
}


7. pages

主程式經由document.json, meta.json, user.json 將資料夾pages裡面命名為UUID的json檔案讀進來。

裡面就會是我主要的重點了,其Json file儲存整個sketch核心的畫布資料。

與檔案同名的UUID.json

第一層 page Object 結構

{
    "_class": "page",
    "do_objectID": "與檔案同名UUID" ,
    ...  // 一堆繁瑣項目
    "isLocked": false,   
    "isVisible": true,
    "rotation": 0,
    "name": "Page 1",
    ...  // 一堆繁瑣項目
    "frame": //整體框 的xywh
    {
        "_class": "rect",
        "constrainProportions": false,
        "height": 0,
        "width": 0,
        "x": 0,
        "y": 0
    },
    ...
    "style":   //page 的 style 設定項
    {
        "_class": "style",
        "do_objectID": "...",
        "endMarkerType": 0,
        "miterLimit": 10,
        "startMarkerType": 0,
        "windingRule": 1,
        "blur": {},
        "borderOptions": {},
        "borders": [],
        "colorControls": {},
        "contextSettings": {},
        "fills": [],
        "innerShadows": [],
        "shadows": []
    },
     ...  // 一堆繁瑣項目
    "layers": [....],
    "horizontalRulerData": {},  // 尺規對齊線的操作存檔
    "verticalRulerData": {},   // 尺規對齊線的操作存檔
}

上方節錄了root Object page的資料結構,
其中layers 裡面的樹形結構龐大,我就暫不收錄。

而layer 節點內的表示法為
分為兩種 folder型態的與 item型態的。

folder 型態:

  • 目前觀察到的是_class 為

    • artboard
    • group
  • 並且擁有

    • “layers”: []
{
  "_class": "group", // artboard
  "name": "group...",
  "layers": []
}

item型態節點

  • 目前觀察到的是_class 為
    • rectangle
    • shapePath
    • triangle
    • text
    • bitmap
{
  "_class": "rectangle", // rectangle shapePath triangle text bitmap
  "name": "rectangle"
}


8. 小結

經過簡單的拆包觀察,對於sketch的檔案結構有更深入的了解,
其中也觀察到一些有趣的地方

  1. rotation 沒有寫進去frame裡面
  2. 對於artboard來說自己也是rect
  3. style只記錄跟風格有關的東西
  4. 裡面還記錄了一堆感覺操作app也不知道會在哪的東西
  5. group屬性裡面的位置邏輯很特別,子節點的xywh是相對於父group的

陸續更新:
sketch-builder 雲端原型工具:
https://mike-zheng.github.io/sketch-builder


雲端原型工具開發筆記系列文

Comments