main(主體節點)用xml代碼寫,用于描述解析對象數據和app上顯示的樣式。 <br>
## 2.3.1 多多貓界面展示和插件之間的邏輯

如圖所示,插件的解析代碼部分主要就是提供給多多貓展示以下頁面
1. 首頁,它通過`hots標簽`里面的js解析函數返回的json數據來展現
2. 書籍頁面,它通過`book標簽`里面的js解析函數(book_parse)返回的json數據來展現
3. 漫畫(小說等)正文頁面,它通過`section標簽`里面的js解析函數返回的json數據來展現
4. 搜索頁面,它通過`search標簽`里面的js解析函數返回的json數據來展現
5. 圖中4個標簽就構成一個插件完整界面,如果要豐富界面給用戶使用,還可以加上updates、tags、tag標簽(節點),見下文2.3.2說明。
<br>
## 2.3.2 main節點內節點跳轉示意圖
1. main節點的dtype="1"為漫畫(或有目錄的圖片)插件;dtype2.輕小說、小說插件;dtype3.動畫(或有目錄的視頻、音頻)插件;dtype4.圖片(或無目錄的漫畫)插件;dtype5.商品插件(手辦周邊、漫畫書等可購買的商品);dtype6.資訊(或無目錄的輕小說、小說)插件;dtype7.視頻(或無目錄的直播)插件;dtype8.小工具、查詢插件。
2. main節點dtype選了其中一種情況下,有多個book、section節點的還可以設置每個為其他的dtype已適應源網站對象數據(不設置就默認繼承main節點的還是父節點的),組成混合插件。dtype為1、2、3的book節點即book[123]之間的xml屬性和js腳本節點輸出格式是一樣的,和book[4]、book[6]、book[7]、book[5]、book[8]都不同;section節點只有dtype1、2、3,book[4]的屬性和輸出格式類似section[1],book[6]的類似section[2],book[7]的類似section[3];book[123]通過expr+dtype進入section[123],book[4675]進入不了section[123],v32引擎支持book[8]expr+dtype進入section[123]但有bug一直實現不了。

3. 以main dtype="1"漫畫插件為例:hots向用戶展示熱門漫畫列表;updates展示最新漫畫列表;tags展示漫畫分類列表(是展示所有分類標簽如戀愛、體育,而不是一組漫畫);tag展示某一個分類的漫畫列表;subtag展示某一個二級分類的漫畫列表(很少寫該節點),tag與subtag關系類似前者是體育漫畫列表,后者是足球漫畫、籃球漫畫列表;search展示搜索結果列表;book[1]展示某一本漫畫書的介紹和目錄;section[1]展示漫畫某一話所有圖片。
4. 用戶在app正式版首頁輸入一本漫畫url打開,app會檢查官方插件中心上面所有插件的meta節點的expr是否和它匹配,然后app進入匹配的插件界面或者原網頁界面,前者的話還會瞬間檢查這個插件的book節點的expr是否和它匹配,是的話app就直接進入book節點,否則就進入home節點。所以meta節點expr屬性填好源網站域名的正則表達式比如`xxcomic\.com`,減少寫上www或wap開頭以兼容電腦版手機版網站,book節點expr寫類似`\/comic\/\d+`這種明顯特征的,有tag的也要tag節點寫expr因為hots、updates等也能通過expr進入tag。
<br>
## 2.3.3 main節點及其數據說明(?表示隨意可以不寫)
||下級|類型|官方說明|以漫畫插件為例的補充說明|
|:-|:-|:-|:-|:-|
|main節點|||||
|>home||Set|站點首頁數據|下一級節點包括hots、updates、tags節點,3個節點都寫才方便用戶隨意瀏覽,如果源網站沒有相應網頁可以刪去對應節點但一定要保留home節點標簽|
||>hots|Node|::熱門(可使用>item進行靜態配置,item支持跳轉到book或tag)|靜態配置(即預先在插件寫下有哪些漫畫)很少用,因為熱門列表是定時不定時變化的|
||>>updates?|Add|當hots與updates在同一個url里使用(只填寫parse)|這種寫成hots的下級節點是簡略寫法,不建議寫|
||>>tags?|Add|當hots與tags在同一個url里使用(只填寫parse)|這種寫成hots的下級節點是簡略寫法,不建議寫|
||>updates|Node|::更新(可使用>item進行靜態配置,item支持跳轉到book或tag)注:當showImg="1"時,使用有圖模板|靜態配置(即預先在插件寫下有哪些漫畫)很少用,因為最新列表是定時或不定時變化的|
||>tags|Node|::分類(可使用>item進行靜態配置)|靜態配置(即預先在插件寫下有哪些分類標簽)是常見的,因為源網站總共有的分類很少改動除非整個網站大改版。靜態配置時tags節點:xml部分只寫title屬性不寫非靜態配置時需要的其他屬性,xml部分增加下級節點item(有group?、title、url屬性),且不需要js部分代碼|
|>search||Node|::搜索|如果刪去該節點,app上該插件中搜索按鈕會消失。url用了@page也只有第一頁結果,是app限制,單個插件搜索結果數最多十幾個夠了,過多會影響多站(最近打開15個插件)搜索效果。|
|>tag||Node|::分類(處理某一個分類的數據)注:當showImg="0"時,使用無圖模板||
|>subtag||Node|::二級分類(處理某一個二級分類的數據)注:當showImg="0"時,使用無圖模板;注:必須要有expr;注:與tag節點的xml屬性和js輸出相同|tag與subtag關系類似前者是體育漫畫列表,后者是足球漫畫、籃球漫畫列表,很少寫subtag節點,因為會在tag界面后面增加一層分類界面要用戶點擊。|
|>book||Node|::書本(處理某一本書的數據)注:支持sited://的url接收|支持sited://是app層面的,插件者記得寫expr|
||>sections?|Add|book的數據與sections不在同一個url時使用|相當于某一本漫畫的全部目錄頁,當book節點接入url和源網站存放該漫畫目錄數據的網址不一樣時使用sections節點,sections節點必須含buildUrl和parse屬性|
|>section||Node|::章節(處理某一話的數據)|和sections節點不一樣哦|
<br>
## 2.3.4 漫畫插件main節點示例
以下是一個漫畫插件示例的main節點。
```xml
<main dtype="1" btag="漫畫">
<home>
<hots cache="1d" showImg="1" w="1" h="1" title="hots節點" method="get" parse="hots_parse" url="https://m.comic.naver.com/webtoon/weekday.nhn"/>
<updates cache="1d" showImg="1" w="1" h="1" title="updates節點" method="get" parse="updates_parse" url="https://m.comic.naver.com/webtoon/weekday.nhn"/>
<tags title="分類">
<tags cache="1d" method="get" parse="tags_parse1" url="https://m.comic.naver.com/webtoon/genre.nhn"/>
<tags cache="1d" method="get" parse="tags_parse_challenge" url="https://m.comic.naver.com/bestChallenge/genre.nhn"/>
</tags>
</home>
<search cache="1d" method="get" parse="search_parse1" url="https://m.comic.naver.com/search/result.nhn?keyword=@key&searchType=WEBTOON" >
<search cache="1d" method="get" parse="search_parse_challenge" url="https://m.comic.naver.com/search/result.nhn?keyword=@key&searchType=BEST_CHALLENGE" />
</search>
<tag>
<tag cache="10m" showImg="1" w="1" h="1" method="get" parse="tag_parse1" expr="webtoon\/genre.nhn"/>
<tag cache="10m" showImg="1" w="1" h="1" method="get" parse="tag_parse_challenge" expr="bestChallenge\/genre.nhn"/>
</tag>
<book cache="1d" method="get" buildUrl="book_buildUrl" parse="book_parse" expr="\/list\.nhn" >
<sections cache="1d" method="get" buildUrl="book_s_buildUrl" parseUrl="book_s_parseUrl" parse="book_s_parse" />
</book>
<section cache="1d" method="get" options="0,0,0,1" parseUrl="section_parseUrl" parse="section_parse" header="referer"/>
</main>
```
<br>
## 2.3.5 main節點主要格式說明
(?表示隨意可以不寫的屬性)
|屬性|類型|說明|
|:-|:-|:-|
|@dtype|[1,2,3,4,5,6,7,8]|2.3.2的第1、2、3段有講|
|@btag?|字符串|對插件業務類型的真實描述(3 個字以內),呼應meta節點intro標簽插件介紹,如漫畫、輕小說、小說、動畫、視頻、FM、音樂、圖片、商品、資訊、直播、小游戲、小工具、綜合。|
|@cache?|[1m,1d,1,0]|緩存(1分鐘,1天,永久、不緩存)。一般我是填1天,1天后再次進入該節點后即會刷新|
|@title?|字符串|節點標題,顯示在多多貓界面上|
|@ua?|字符串|節點請求HTTP時使用的UA,默認使用site或引擎給定的值|
|@expr|字符串|正則表達式,滿足條件的,由當前節點處理。請在book、tag、section節點填上。如果section節點只有一個,可以不用寫expr屬性|
|@showImg?|2/1/0|0無圖;1小圖;2大圖。不添加默認是1。僅在hots、updates和tag上可用,2/1/0在3個節點顯示標題圖效果都不一樣。|
|@w?|寬比重|和h搭配一起寫,都不寫就默認1比1。在同一節點搭配showImg使用|
|@h?|高比重|和w搭配一起寫,都不寫就默認1比1。在同一節點搭配showImg使用|
|@method?|get或post或@null|請求方式。@null表示節點不需請求,直接parse(url)|
|@args?|字符串|為post提供參數支持,格式如下:k1=v1;k2=v2(其它用途時不計格式)。支持@page,@key宏定義|
|@parseUrl?|fun(url,html)->url;url;CALL::url|通過url和它的html輸出新的url作為parse的目標網址,如果多個url以“;”隔開(CALL::url的請求結果仍由parseUrl處理)|
|@parse|fun(url,html)->參考輸出格式|解析函數。支持@null(表示不進行解析)|
|@buildUrl?|fun(url,key?,page?)或fun(url,str?)|通過url生成新的目標url。dtype=8時,是fun(url,str)|
|@url?|Uri|目標網址。直接get請求沒有buildUrl/parseUrl時支持@page宏定義|
|@style?|11/12|界面樣式風格:(dtype-section[3]book[7]節點專用屬性)11:視頻(默認),12:有封面的音樂|
main節點的其他屬性說明請見[插件開放平臺http://sited.noear.org/](http://sited.noear.org/) 里面的官方開發文檔PDF。
<br>
ps.開發文檔PDF中未說明:
- @update和@btn只用于dtype="8"的book節點;
- @buildArgs的function參數,在tag/subtag節點里有(url)和(url,page),在search節點里有(url)和(url,key),在dtype8的book節點里有(url)和(url,str),在其他節點只有(url)。@buildArgs的返回結果要符合@args格式;用了@buildArgs會使@args屬性(若有)失效;@args格式要符合k1=v1;k2=v2
- search節點里:@args格式里每組k=@key鍵值對中的@key能替換成用戶在search界面填寫的搜索詞,但@key左邊右邊多了任何字符時就不會替換如k1=123@key;k2=@key456,@key在等于號左邊時也不能替換。url中的@key能替換成用戶在search界面填寫的搜索詞,但限于get請求方式。
<br>
(本節完)
- 序言
- 第一章 基礎
- 1.1 Html基礎
- 1.2 CSS選擇器
- 1.2.1 標簽選擇器
- 1.2.2 class/id選擇器
- 1.2.3 屬性選擇器
- 1.3 JavaScript基礎
- 1.4 json基礎
- 第二章 中級
- 2.1 插件結構總覽
- 2.2 meta頭部節點講解
- 2.3 main主體節點講解
- 2.4 script腳本節點講解
- 2.5 插件的安裝調試與發布
- 第三章 高級
- 3.1 插件高級特性
- 3.2 常見內容保護突破方法
- 3.3 開發文檔所沒說的事
- 3.4 電腦js腳本測試插件
- 3.5 加login節點教程
- 3.6 使用yeoman生成器
- 3.7 自動化發布插件
- 第四章 附錄
- 4.1 markdown基本用法