scala-news-reader

rss/atom news reader in scala

git clone https://9o.is/git/scala-news-reader.git

Search.scala

(6163B)


      1 package com.joereader.snippet
      2 
      3 
      4 import com.joereader._
      5 import lib._, rss._
      6 import config._
      7 import model._
      8 
      9 import scala.xml._
     10 
     11 import net.liftweb._
     12 import http._
     13 import util._, Helpers._
     14 
     15 
     16 class Search {
     17   /*
     18   val categories = Category.random(25)
     19   val usersByCategory = categories.map(c => (c.id.get, c.writers.randomWriters(9)))
     20 
     21   val minImages = 5 // per category
     22 
     23   val imagesByCategory = usersByCategory.par.map(c => (c._1, {
     24     (for{
     25       bwu <- c._2.headOption
     26       blogWriter <- bwu.blogWriter
     27       blog <- bwu.blog
     28       rss <- blog.urlRss.get.headOption
     29     } yield {
     30       rss.entries.filter(_.author.name == blogWriter.name.get).flatMap(_.images)
     31     }).getOrElse(Nil)
     32   })).seq
     33   */
     34 
     35 
     36   def categories: Seq[(String,List[String])] = Seq(
     37     ("technology", "http://www.theverge.com/rss/index.xml" :: Nil),
     38     ("fashion", "http://1010woodland.tumblr.com/rss" :: Nil),
     39     ("travel", "http://www.lonelyplanet.com/blog/feed/atom/" :: Nil),
     40     ("cooking", "http://www.blogger.com/feeds/12411922/posts/default" :: Nil),
     41     ("business", "http://feeds2.feedburner.com/businessinsider" :: Nil),
     42     ("music", "http://rapdose.com/feed" :: Nil),
     43     ("celebrities", "http://hollywoodlife.com/feed/" :: Nil),
     44     ("gaming", "http://feeds.feedburner.com/psblog" :: Nil)
     45   )
     46 
     47   def feeds = categories.map(f => (f._1, f._2.feed))
     48 
     49   def imagesByCategory: Seq[(String, List[FeedImage])] = feeds.map{f =>
     50 
     51     (f._1, f._2.entries.flatMap(_.nonAuthorImages.headOption))
     52   }
     53 
     54   def render: NodeSeq = {
     55     if(!TestUser.isLoggedIn) {
     56       return <div class="container text-center"><h1>Coming Soon!</h1></div>
     57     }
     58 
     59     imagesByCategory.flatMap { category =>
     60 
     61       val link = Site.searchWriters.url+"?category="+category._1
     62 
     63       <div>
     64         <div class="span4 offset0">
     65           <a href={link} class="bg-overlay" style="width:50%"></a>
     66           <div class="category-text"><a href={link}>{category._1}</a></div>
     67 
     68           <div style={"background:url("+category._2(0).src+") no-repeat center center;width:100%;height:300px;background-color: white"}></div>
     69         </div>
     70         <div class="span2 offset0">
     71           <div class="row-fluid">
     72             <div class="span12 offset0"><div style={"background:url("+category._2(1).src+") no-repeat center center;width:100%;height:200px;background-color: white"}></div></div>
     73             <div class="span6 offset0"><div style={"background:url("+category._2(2).src+") no-repeat center center;width:100%;height:100px;background-color: white"}></div></div>
     74             <div class="span6 offset0"><div style={"background:url("+category._2(3).src+") no-repeat center center;width:100%;height:100px;background-color: white"}></div></div>
     75           </div>
     76         </div>
     77       </div>
     78     }
     79 
     80   }
     81 }
     82 
     83 class SearchWriters {
     84 
     85   def goBack = {
     86     "a [href]" #> S.referer
     87   }
     88 
     89   def render: NodeSeq = {
     90 
     91     if(!TestUser.isLoggedIn) {
     92       return <div class="container text-center"><h1>Coming Soon!</h1></div>
     93     }
     94 
     95     val category = S.param("category")
     96 
     97     if(category.exists(_ == "technology")) {
     98 
     99       <div>
    100         <h1>Technology</h1>
    101         <div class="row-fluid up-separate">
    102           <div class="span3" style="background-color: #FFFACD">
    103             <img src="http://img.gawkerassets.com/img/18kch9l5mp9h8png/avt-large.png" />
    104             <label>Adam Dachis</label>
    105             <p>clever uses, diy</p>
    106             <button class="btn btn-primary btn-small">Follow</button>
    107             <button class="btn btn-info btn-small">Preview</button>
    108           </div>
    109           <div class="span3">
    110             <img src="http://img.gawkerassets.com/img/17zf8538pfi54jpg/avt-large.jpg" />
    111             <label>Walter Glenn</label>
    112             <p>reader poll, discussions of the week</p>
    113             <button class="btn btn-primary btn-small">Follow</button>
    114             <button class="btn btn-info btn-small">Preview</button>
    115           </div>
    116           <div class="span3">
    117             <img src="http://img.gawkerassets.com/img/18jasvke0nsy9jpg/avt-large.jpg" />
    118             <label>Eric Ravenscraft</label>
    119             <p>downloads, mind hacks</p>
    120             <button class="btn btn-primary btn-small">Follow</button>
    121             <button class="btn btn-info btn-small">Preview</button>
    122           </div>
    123           <div class="span3">
    124             <img src="http://img.gawkerassets.com/img/17rp9pzgs0jfypng/avt-large.png" />
    125             <label>Tessa Miller</label>
    126             <p>crowd hacker, how i work</p>
    127             <button class="btn btn-primary btn-small">Follow</button>
    128             <button class="btn btn-info btn-small">Preview</button>
    129           </div>
    130         </div>
    131         <div class="row-fluid up-separate">
    132           <div class="span3">
    133             <img src="http://img.gawkerassets.com/img/183aibc9tgpejjpg/avt-large.jpg" />
    134             <label>Alan Henry</label>
    135             <p>android, ask lifehacker</p>
    136             <button class="btn btn-primary btn-small">Follow</button>
    137             <button class="btn btn-info btn-small">Preview</button>
    138           </div>
    139           <div class="span3">
    140             <img src="http://img.gawkerassets.com/img/18j0it9qk2nn8jpg/avt-large.jpg" />
    141             <label>Thorin Klosowski</label>
    142             <p>productivity, diy</p>
    143             <button class="btn btn-primary btn-small">Follow</button>
    144             <button class="btn btn-info btn-small">Preview</button>
    145           </div>
    146           <div class="span3">
    147             <img src="http://img.gawkerassets.com/img/18l2h51ciwl1ajpg/avt-large.jpg" />
    148             <label>Shep McAllister</label>
    149             <p>downloads, mind hacks</p>
    150             <button class="btn btn-primary btn-small">Follow</button>
    151             <button class="btn btn-info btn-small">Preview</button>
    152           </div>
    153           <div class="span3">
    154             <img src="http://img.gawkerassets.com/img/17z00h8twlstpjpg/avt-large.jpg" />
    155             <label>Whitson Gordon</label>
    156             <p>linux downloads, lifehacker top 10</p>
    157             <button class="btn btn-primary btn-small">Follow</button>
    158             <button class="btn btn-info btn-small">Preview</button>
    159           </div>
    160         </div>
    161       </div>
    162     }
    163     else
    164       NodeSeq.Empty
    165   }
    166 }