先複習一下, [Day-11] 我們是如何分析狀態圖的 ?
輸入的文字 & 預期的輸出 Tokens
下面比照之前的步驟,來分析 HTML 加 attr 後的狀態圖 (‾◡◝)
<div id="app">
<p class="text-red">Vue</p>
<input type="text" id="username" placeholder="請輸入姓名" disabled />
<img src="https://ithelp.ithome.com.tw/storage/image/fight.svg"
alt='"圖片"' />
<p style="margin-top: 3px">Template</p>
</div>
const tokens = [
{ "type": "tagStart", "name": "div", attrStr:`id="app"` },
{ "type": "tagStart", "name": "p", attrStr:`class="text-red"` },
{ "type": "text", "content": "Vue" },
{ "type": "tagEnd", "name": "p" },
{ "type": "tagSelfClose", "name": "input",
attrStr:`type="text" id="username" placeholder="請輸入姓名" disabled` },
{ "type": "tagSelfClose", "name": "img",
attrStr:`src="https://ithelp.ithome.com.tw/storage/image/fight.svg" \n alt='"圖片"'` },
{ "type": "tagStart", "name": "p", attrStr:`style="margin-top: 3px"` },
{ "type": "text", "content": "Template" },
{ "type": "tagEnd", "name": "p" },
{ "type": "tagEnd", "name": "div" },
]
< 代表之後收集標籤名稱 , 直到遇到 > 為止/ 後面收集 tagEnd 的標籤名稱 , 直到遇到 > 為止> 之前收集的 char 是 tagStart 或 tagEnd 的標籤名稱 收集 tagStart 或 tagEnd 的 name 時,遇到空格代表 attr 的開始< 之後 )/ 之後 )> 之前 ) 之後 )? 前 4 個跟之前相同,只是多了一個 IN_ATTR
> 會將 collected 變數中的內容當作 tagStart 的標籤名稱,切換狀態成 INITIAL/ ,切換狀態為 IN_TAG_END> 會將 collected 變數中的內容當作 tagEnd 的標籤名稱,切換狀態成 INITIAL< ,切換狀態為 IN_TAG,並將 collected 變數中的內容當作 text content ,切換狀態為 IN_ATTR,並將 collected 變數中的內容當作 tagStart 的標籤名稱> ,切換狀態為 INITIAL,並將 collected 變數中的內容當作 attrStr 的值,對應的 tag 為 tagStart/> ,切換狀態為 INITIAL,並將 collected 變數中的內容當作 attrStr 的值,對應的 tag 為 tagSelfClose? 前 5 個跟之前相同,多了 IN_ATTR 相關的狀態轉換條件
[圖片繪製中]
明天我們根據 狀態圖 進行 HTML 追加 attr 的 Tokenizer 修改