先複習一下, [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 修改