跳至內容

Yesod Web 框架/檢視

100% developed
來自華夏公益教科書,開放的書籍,為開放的世界

Handler Monad 以多種格式之一返回內容,作為實現 HasReps 類的型別[1] 的元件 {RepHtml, RepJson, RepXml, RepPlain, the dual RepHtmlJson, a pair or list of pairs [(ContentType, Content)], ..}.[2][3] JSON 示例:[4][5][6]

HasRepschooseRep 預設實現根據客戶端 accept 頭部的首選內容型別列表選擇要返回的文件表示形式。[1]

小部件[7] 是由特定命令(例如 setTitle)或結構(HTML)/行為(JavaScript)/樣式(CSS)模板生成的 HTML DOM 程式碼片段,其型別例項化了類 ToWidget、ToWidgetHead 或 ToWidgetBody。

基於 Writer[9] 的 Widget Monad[8],以及對 defaultLayout 的引數,便於將小部件組合在一起。

模板插值 - 莎士比亞模板

[編輯 | 編輯原始碼]

參見參考[10]。這些是遵循程式碼表達式在帶不同字元字首的括號內進行替換的通用模式的內容檢視模板,以引用

模板表示式,使用 ^{...}
相同型別的其他模板,使用 ^{template params}
路由表示式,使用 @{...}
安全的(型別化的)URL,使用 @{HomeR}
訊息表示式,使用 _{...}
i18n 訊息渲染,使用 _{MsgMessage params}
其他 Haskell 表示式,使用 #{...}
Haskell 表示式渲染,使用 #{haskell_expression},其型別必須可轉換。
    • hamlet HTML 模板的情況下,表示式型別必須是 Text.Blaze.ToMarkup 的例項[11]
    • 在 CSS 模板的情況下,表示式型別必須是 Text.Cassius.ToCss 的例項[12]
    • 在 JavaScript 模板的情況下,表示式型別必須是 Text.Julius.ToJavascript 的例項[13]
    • 在具有引數插值的 i18n 訊息定義(在 "isoLang.msg" 檔案中)的情況下,表示式型別必須是 Text.Shakespeare.I18N.ToMessage 的例項[14]
    • 在純文字模板的情況下,表示式型別必須是 Text.Shakespeare.Text.ToText 的例項[15]

在表示式中使用非英語文字需要使用支援 Unicode 的型別 Text,因為 GHC 對型別 Stringshow 將非 ASCII 字元呈現為轉義的數字程式碼。

  • 外部檔案模板:模板內容可以使用編譯時 splice 呼叫(如 $(expr))從外部檔案載入。[16]
  • 外部檔案的過載模式:參見文件[10]
可本地化(i18n)訊息
[編輯 | 編輯原始碼]

參見參考[17]。對於每種支援的語言 ISO 名稱,messages 子資料夾中應該有一個檔案,如 <iso-language>.msg,其中包含以下條目

ArticleUnexistant param@Int64: unexistant article #{param}

對於 en.msg 中的每個條目,都會生成一個訊息建構函式,在訊息名稱前新增 "Msg" 字首,因此示例 msg 可以作為以下內容引用

-- in code
myMsg = MsgArticleUnexistant myArticleId 
     
-- in templates
  _{MsgArticleUnexistant myArticleId}

stack 應用程式模板中缺少實際的 i18n 支援。您需要將 mkMessage "MyApp" directory isoLangDefault 新增到 "Foundation.hs" 檔案中,才能例項化訊息。[18]

HTML 類模板
[編輯 | 編輯原始碼]
  • hamlet 準引用器(一個解析器,用於編譯時 Template Haskell 程式碼)[19][20] 指定在 T.H. 牛津括號語法 [qq| ... |] 中,它引入了一個基於縮排的結構化 HTML 模板,其中以 "$" 為字首的行是邏輯語句(參見文件[10])。[21] 僅為位於行首位置的標籤生成自動閉合標籤。
  • whamlet 準引用器返回一個 Widget 表示式。(在 [hamlet|..|] 之前儲存 toWidget)。
toWidget [hamlet|
$doctype 5
<html>
    <head>
        <title>#{pageTitle} - My Site
        <link rel=stylesheet href=@{Stylesheet_route}>
    <body>
        <div>
           ^{headerTemplate}
        <div>
          <p><span style="font-weight:bold;">_{MsgArticleListTitle}</span>
          $if null articles
            <p>_{MsgSorryNoArticles}
          $else
            <ul>
                $forall art <- articles
                    <li>#{articleNumber art} .- #{articleTitle art}
        <div>
          ^{footerHamletTemplate}
|]
JavaScript 模板
[編輯 | 編輯原始碼]
  • julius 準引用器:引入了一個 JavaScript 模板。[22] JavaScript 變體 CoffeeScript 和 Roy 語言[23] 也具有特定的 準引用器[19][22]
toWidgetHead [julius|

var myfunc = function(){document.location = "@{SomeRouteR}";}

^{extraJuliusTemplate}
|]
CSS 類模板
[編輯 | 編輯原始碼]
  • cassius 準引用器:引入了一個基於縮排結構化的 CSS 模板。[24]
toWidget [cassius|
.box
    border: 1px solid #{myColor}
    background-image: url(@{MyImageR})

^{extraCassiusTemplate}
|]
  • lucius 準引用器:引入了一個使用標準語法和莎士比亞模板樣式替換的 CSS 模板。[25]
toWidgetHead [lucius|
.box { border: 1px solid #{myColor} ;
       background-image: url(@{MyImageR}) ;
     }

^{extraLuciusTemplate}
|]
純文字模板
[編輯 | 編輯原始碼]
  • 用於電子郵件或 text/plain HTTP 內容型別。[26]
  1. 模板:lt:惰性文字,st:嚴格文字
  2. 帶有左邊界分隔符 "|" 的文字模板:lbt(惰性),sbt(嚴格)
[lt| Mr./Mrs. #{fullName} ... 
|]

特定檢視

[編輯 | 編輯原始碼]
  • 搜尋引擎 XML 網站地圖[27],其中 sitemap 返回一個 XML 網站地圖作為 HTTP 響應,其中包含我們希望搜尋引擎抓取的路由,以及用於指示抓取程式的屬性,這些屬性來自提供的 SitemapUrl 記錄列表。
  • 導航麵包屑。[28] 您需要為網站提供一個 YesodBreadcrumbs 例項,其中生成函式 breadcrumb 應該為每個麵包屑返回標題和父路由。然後,查詢函式 breadcrumbs 將返回當前路由標題和祖先(路由、標題)對。
  • 網頁提要檢視(RSS/Atom)。[29] 您擁有從給定的 Feed 結構中返回 RepRss、RepAtom 或雙重 RepAtomRss 內容(在 accept 頭部的首選內容型別列表中進行選擇)的處理程式。

參考文獻

[編輯 | 編輯原始碼]
  1. a b "HasReps 類". Hackage.haskell.org. 檢索於 2012-10-23.
  2. "RESTful 內容". Yesodweb.com. 檢索於 2012-10-23.
  3. "ToContent 類". Hackage.haskell.org. 檢索於 2012-10-23.
  4. "更多客戶端 Yesod:todo 示例". Yesodweb.com. 2012-04-23. 檢索於 2012-10-23.
  5. "JSON 網路服務". Yesodweb.com. 檢索於 2012-10-23.
  6. "yesod-json 包". Hackage.haskell.org. 檢索於 2012-10-23.
  7. "書 - 小部件". Yesodweb.com. 檢索於 2012-10-23.
  8. "小部件單子". Hackage.haskell.org. 檢索於 2012-10-23.
  9. "Writer 單子". Haskell.org. 檢索於 2012-10-23.
  10. a b c "書 - 莎士比亞模板". Yesodweb.com. 檢索於 2012-10-23.
  11. "Text.Blaze.ToMarkup 類". Hackage.haskell.org. 檢索於 2012-10-23.
  12. "Text.Cassius.ToCss 類". Hackage.haskell.org. 檢索於 2012-10-23.
  13. "Text.Julius.ToJavascript 類". Hackage.haskell.org. 檢索於 2012-10-23.
  14. "Text.Shakespeare.I18N.ToMessage 類". Hackage.haskell.org. 檢索於 2012-10-24.
  15. "Text.Shakespeare.Text.ToText 類". Hackage.haskell.org. 檢索於 2012-10-24.
  16. "模板 Haskell". haskell.org. 檢索於 2012-11-03.
  17. "書 - 國際化". Yesodweb.com. 檢索於 2012-10-23.
  18. mkMessage
  19. a b "HaskellWiki - QuasiQuotation". Haskell.org. 2012-05-26. 檢索於 2012-10-23.
  20. "模板 Haskell 準引用". Haskell.org. 檢索於 2012-11-02.
  21. "哈姆雷特模板模組". Hackage.haskell.org. 檢索於 2012-10-23.
  22. a b "尤利烏斯模板模組". Hackage.haskell.org. 檢索於 2012-10-23.
  23. "Roy 語言". Roy.brianmckenna.org. 檢索於 2012-10-23.
  24. "卡西烏斯模板模組". Hackage.haskell.org. 檢索於 2012-10-23.
  25. "盧修斯模板模組". Hackage.haskell.org. 檢索於 2012-10-23.
  26. "莎士比亞純文字模板模組". Hackage.haskell.org. 檢索於 2012-10-24.
  27. "yesod-sitemap 包". Hackage.haskell.org. 檢索於 2012-10-26.
  28. "YesodBreadcrumbs 類". Hackage.haskell.org. 檢索於 2012-11-05.
  29. "yesod-newsfeed 包,用於 RSS / Atom 檢視". Hackage.haskell.org. 檢索於 2012-10-26.


華夏公益教科書