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

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

Ryohei Ikegami
September 07, 2022

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

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