SlideShare a Scribd company logo
1 of 22
Download to read offline
React.jsで

CSS組版作業の効率化
@_tohashi
誰?
• @_tohashi / Takumi Ohashi
• freee という会社でエンジニア
• 確定申告とかやってます
確定申告はfreeeで!
会計ソフトならではの
機能
各種申告や手続き用の

書類をブラウザ上で確認

PDF形式で出力
一例
作成手順
1. CSS(SCSS)を書く
2. ブラウザで確認
3. インスペクタ見ながら調整
4. 完成するまで繰り返し
一連の工程を「CSS組版」と

呼んでいます
つらい
もっとこうGUI的なもので

ガーッとやってバーっと

できないものか
ツールを作ろう
CSS-Typesetter
• フロントで完結したWebアプリケーション
• GUIで書類などの画像上に直接文字を並べ、そ
の内容をHTML + CSSとして吐き出す
• 入力欄の自動検出
DEMO
フレームワークなど
• React + flux + Babel の最近よく見るやつ
• + 各種Reactプラグイン
• Redux移行中
• データはLSに突っ込むかJSONでインポート/エ
クスポート
矩形検出
• 幸いにして多くの書類の入力欄は矩形で囲ま
れている
• CanvasのgetImageDataを使ってピクセル
データ取得、走査して近似色の範囲を検出
UNDO / REDO
• fluxでデータフローが単一なのでAction毎に
Storeのデータを配列に突っ込んでいく
• undo/redo がdispatchされたらインデックス
をずらして取り出す
UNDO / REDO
instance.dispatchToken = Dispatcher.register((action) => {
case ActionTypes.UNDO:
historyIdx -= 1;
texts = _.cloneDeep(textsHistory[historyIdx]);
instance.emitChange();
break;
case ActionTypes.REDO:
historyIdx += 1;
texts = _.cloneDeep(textsHistory[historyIdx]);
instance.emitChange();
break;
default:
// Action毎に履歴を記録していく
textsHistory.push(_.cloneDeep(texts));
historyIdx = textsHistory.length - 1;
UNDO / REDO
• 現在の方法ではスケールしない
• Storeが増えてくると副作用の範囲を明示する
必要がある
• Redux移行したらreducerに組み込めないか
UNDO / REDO with reducer

(WIP)
import foo form './foo';
import bar form './bar';
import baz form './baz';
const rootReducer = combineReducers({
foo, bar, baz
});
// 副作用の範囲を登録
rootReducer.registerHistory({
foobar: [foo, bar],
foobaz: [foo, baz]
});
// 副作用の範囲 + 履歴に応じてundo
action.undo(‘foobar');
書類作りたい方お試しください
まだまだ改善していきます
• http://tohashi.github.io/css-typesetter/
• https://github.com/tohashi/css-typesetter
ありがとうございました

More Related Content

Recently uploaded

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 

Recently uploaded (7)

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 

React.jsで
CSS組版作業の効率化