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 }