Upgrade to Pro — share decks privately, control downloads, hide ads and more …

FigmaからTailwind HTMLを 生成するプラグインの開発

FigmaからTailwind HTMLを 生成するプラグインの開発

Ryohei Ikegami

September 07, 2022
Tweet

More Decks by Ryohei Ikegami

Other Decks in Programming

Transcript

  1. AST (抽象構文木) とは < = > < >Item1</ > <

    >Item2</ > < >Item3</ > </ > ul li li li li li li ul class ”text-black” { : , : { : }, : [ { : , : [ ] }, { : , : [ ] }, { : , : [ ] }, ], }; tag props class children tag children tag children tag children "ul" "text-black" "li" "Item 1" "li" "Item 2" "li" "Item 3" プログラミング言語などの内容を、ツリー構造のデータにしたもの 括弧、セミコロン、引用符などの 意味に直接関係しない内容は含まない (抽象)
  2. AST構築 + 文字列化 ) を使B ) ASTのフォーマット定義 + TS型ライブラ# )

    ) JSXで構築できたりもする ) でHTMLにする github.com/syntax-tree/hast エコシステムが充実してI hastscripx hast-util-to-html
  3. 各レイヤーのDOMへの変換 t Auto Layout → flexboV t それ以外のFrame/Group → position:

    absolutu t テキスト → テキストが入った<div& t fillが画像ひとつのRectangle → <img& t Pathなどの図形 → まとめて <svg> にする
  4. File siguatureでファイル種類判定 d 画像ファイルでは、最初の数byteがフォーマットごとの
 固有の値になっていることが多い ( — d PNG →

    89 50 4E 47 0D 0A 1A 05 d JPG → FF D8 F1 d Figmaプラグインでは画像データのバイナリは取れるが
 種類が取れないので、これを使って種類判定 File signature
  5. const const await if return else if return image =

    figma.getImageByHash(fill.imageHash); bytes = image.getBytesAsync() (bytes[ ] === && bytes[ ] === && bytes[ ] === ) { + Buffer.from(bytes).toString( ); } (bytes[ ] === && bytes[ ] === && bytes[ ] === ) { + Buffer.from(bytes).toString( ); } ... 0 0x89 1 0x50 2 0x4e 0 0xff 1 0xd8 2 0xff "data:image/png;base64," "base64" "data:image/jpeg;base64," "base64"
  6. 図形をまとめて <svg> にする  SVGっぽいレイヤーを判定して、まとめてSVGb  図形レイヤー (Triangle/Rectangle/Pathなど) はSV† 

    Frame → childrenが全てSVGっぽいレイヤーだったらSV†   node.exportAsync({ format: "SVG" }) でSVG化 メモ化再帰を使って高速h
  7. リアルタイムプレビュー iframe + でプレビュー Tailwind Play CDN JITのクラス名も ちゃんとプレビューしてくれる Inspect

    というプラグインに影響された ちゃんとしたコードが生成されているかの 不安に対処