0xDEADBEEF

RSS odkazy
««« »»»

Really simple RSS

21. 2. 2019 #RSS #Scala #kód

Není žádný důvod, proč by váš web neměl podporovat RSS a tady vám ukážu proč.

RSS (v současnosti) znamená really simple syndicationvelice jednoduchá syndikace. Název nelže, protože i když pracujete v jazyku, který umí jenom zapisovat znaky do StringBuilderu a kromě toho nezvládá nic komplikovanějšího, validní generátor RSS se stále vejde do méně než 40 řádek kódu.

class RSS(title: String, description: String, link: String) {
  val sb = new java.lang.StringBuilder

  sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
  sb.append("<rss version=\"2.0\">")
  sb.append("<channel>")
  element("title", "", title)
  element("description", "", description)
  element("link", "", link)

  def addItem(title: String, url: String, body: String = "") = {
    sb.append("<item>")
    element("title", "", title)
    element("guid", " isPermaLink=\"true\"", url)
    element("description", "", body)
    sb.append("</item>")
  }

  def result() = {
    sb.append("</channel>")
    sb.append("</rss>")
    sb.toString
  }

  private def element(name: String, attr: String, body: String) = {
    sb.append("<").append(name).append(attr).append(">")
    var i = 0; while (i < body.length) {
      body.charAt(i) match {
        case '&' => sb.append("&amp;")
        case '>' => sb.append("&gt;")
        case '<' => sb.append("&lt;")
        case ch  => sb.append(ch)
      }
      i += 1
    }
    sb.append("</").append(name).append(">")
  }
}

Nepoužívá žádnou knihovnu pro XML a s programovacím ekvivalentem provázku a naostřené plaňky je možné přidat vlastní RSS export. Použití není nic překvapivého:

val rss = new RSS("0xDEADBEEF", "programování & tak podobně", "https://deadbeef.k47.cz")
rss.addItem("Really simple RSS", "https://deadbeef.k47.cz/rss.html", "<p>lorem ipsum</p>")
rss.result()

Výsledný feed si můžete zkontrolovat na validátoru w3, projde bez chyb.


+1: O turbulentní historii a vývoji se píše v The Rise and Demise of RSS.

píše k47 (@kaja47, k47)