浏览代码

Initial search refactoring

Zed 7 年之前
父节点
当前提交
f7c1c28368
共有 5 个文件被更改,包括 26 次插入24 次删除
  1. 4 4
      src/api.nim
  2. 3 3
      src/parser.nim
  3. 11 9
      src/types.nim
  4. 5 5
      src/views/status.nim
  5. 3 3
      src/views/timeline.nim

+ 4 - 4
src/api.nim

@@ -13,10 +13,10 @@ const
   apiBase = parseUri("https://api.twitter.com/1.1/")
 
   timelineUrl = "i/profiles/show/$1/timeline/tweets"
-  timelineSearchUrl = "i/search/timeline"
   timelineMediaUrl = "i/profiles/show/$1/media_timeline"
   profilePopupUrl = "i/profiles/popup"
   profileIntentUrl = "intent/user"
+  searchUrl = "i/search/timeline"
   tweetUrl = "status"
   videoUrl = "videos/tweet/config/$1.json"
   tokenUrl = "guest/activate.json"
@@ -40,7 +40,7 @@ macro genMediaGet(media: untyped; token=false) =
   quote do:
     proc `multi`(thread: Thread | Timeline; agent: string; token="") {.async.} =
       if thread == nil: return
-      var `media` = thread.tweets.filterIt(it.`media`.isSome)
+      var `media` = thread.content.filterIt(it.`media`.isSome)
       when `token`:
         var gToken = token
         if gToken.len == 0: gToken = await getGuestToken(agent)
@@ -299,7 +299,7 @@ proc finishTimeline(json: JsonNode; query: Option[Query]; after, agent: string):
     cardFut = getCards(thread, agent)
 
   await all(vidsFut, pollFut, cardFut)
-  result.tweets = thread.tweets
+  result.content = thread.content
 
 proc getTimeline*(username, after, agent: string): Future[Timeline] {.async.} =
   let headers = newHttpHeaders({
@@ -348,7 +348,7 @@ proc getTimelineSearch*(query: Query; after, agent: string): Future[Timeline] {.
     "reset_error_state": "false"
   }
 
-  let json = await fetchJson(base / timelineSearchUrl ? params, headers)
+  let json = await fetchJson(base / searchUrl ? params, headers)
   result = await finishTimeline(json, some(query), after, agent)
 
 proc getProfileAndTimeline*(username, agent, after: string): Future[(Profile, Timeline)] {.async.} =

+ 3 - 3
src/parser.nim

@@ -121,11 +121,11 @@ proc parseThread*(nodes: XmlNode): Thread =
   for n in nodes.filterIt(it.kind != xnText):
     let class = n.attr("class").toLower()
     if "tombstone" in class or "unavailable" in class or "withheld" in class:
-      result.tweets.add Tweet()
+      result.content.add Tweet()
     elif "morereplies" in class:
       result.more = getMoreReplies(n)
     else:
-      result.tweets.add parseTweet(n)
+      result.content.add parseTweet(n)
 
 proc parseConversation*(node: XmlNode): Conversation =
   result = Conversation(
@@ -150,7 +150,7 @@ proc parseConversation*(node: XmlNode): Conversation =
 proc parseTimeline*(node: XmlNode; after: string): Timeline =
   if node == nil: return
   result = Timeline(
-    tweets: parseThread(node.select(".stream > .stream-items")).tweets,
+    content: parseThread(node.select(".stream > .stream-items")).content,
     minId: node.attr("data-min-position"),
     maxId: node.attr("data-max-position"),
     hasMore: node.select(".has-more-items") != nil,

+ 11 - 9
src/types.nim

@@ -75,6 +75,14 @@ type
     fromUser*: seq[string]
     sep*: string
 
+  Result*[T] = ref object
+    content*: seq[T]
+    minId*: string
+    maxId*: string
+    hasMore*: bool
+    beginning*: bool
+    query*: Option[Query]
+
   Gif* = object
     url*: string
     thumb*: string
@@ -151,7 +159,7 @@ type
     poll*: Option[Poll]
 
   Thread* = ref object
-    tweets*: seq[Tweet]
+    content*: seq[Tweet]
     more*: int
 
   Conversation* = ref object
@@ -160,13 +168,7 @@ type
     after*: Thread
     replies*: seq[Thread]
 
-  Timeline* = ref object
-    tweets*: seq[Tweet]
-    minId*: string
-    maxId*: string
-    hasMore*: bool
-    beginning*: bool
-    query*: Option[Query]
+  Timeline* = Result[Tweet]
 
   Config* = ref object
     address*: string
@@ -178,4 +180,4 @@ type
     profileCacheTime*: int
 
 proc contains*(thread: Thread; tweet: Tweet): bool =
-  thread.tweets.anyIt(it.id == tweet.id)
+  thread.content.anyIt(it.id == tweet.id)

+ 5 - 5
src/views/status.nim

@@ -13,8 +13,8 @@ proc renderMoreReplies(thread: Thread): VNode =
 
 proc renderReplyThread(thread: Thread; prefs: Prefs): VNode =
   buildHtml(tdiv(class="reply thread thread-line")):
-    for i, tweet in thread.tweets:
-      let last = (i == thread.tweets.high and thread.more == 0)
+    for i, tweet in thread.content:
+      let last = (i == thread.content.high and thread.more == 0)
       renderTweet(tweet, prefs, index=i, last=last)
 
     if thread.more != 0:
@@ -26,7 +26,7 @@ proc renderConversation*(conversation: Conversation; prefs: Prefs): VNode =
     tdiv(class="main-thread"):
       if conversation.before != nil:
         tdiv(class="before-tweet thread-line"):
-          for i, tweet in conversation.before.tweets:
+          for i, tweet in conversation.before.content:
             renderTweet(tweet, prefs, index=i)
 
       tdiv(class="main-tweet"):
@@ -35,9 +35,9 @@ proc renderConversation*(conversation: Conversation; prefs: Prefs): VNode =
 
       if hasAfter:
         tdiv(class="after-tweet thread-line"):
-          let total = conversation.after.tweets.high
+          let total = conversation.after.content.high
           let more = conversation.after.more
-          for i, tweet in conversation.after.tweets:
+          for i, tweet in conversation.after.content:
             renderTweet(tweet, prefs, index=i, last=(i == total and more == 0))
 
           if more != 0:

+ 3 - 3
src/views/timeline.nim

@@ -65,9 +65,9 @@ proc threadFilter(it: Tweet; tweetThread: string): bool =
 proc renderTweets(timeline: Timeline; prefs: Prefs): VNode =
   buildHtml(tdiv(id="posts")):
     var threads: seq[string]
-    for tweet in timeline.tweets:
+    for tweet in timeline.content:
       if tweet.threadId in threads: continue
-      let thread = timeline.tweets.filterIt(threadFilter(it, tweet.threadId))
+      let thread = timeline.content.filterIt(threadFilter(it, tweet.threadId))
       if thread.len < 2:
         renderTweet(tweet, prefs, class="timeline-tweet")
       else:
@@ -88,7 +88,7 @@ proc renderTimeline*(timeline: Timeline; username: string; protected: bool;
 
     if protected:
       renderProtected(username)
-    elif timeline.tweets.len == 0:
+    elif timeline.content.len == 0:
       renderNoneFound()
     else:
       renderTweets(timeline, prefs)