/// <summary>
        /// Render twitter status from template and render it
        /// </summary>
        /// <param name="status"></param>
        /// <returns></returns>
        private string RenderStatus(TwitterStatus status)
        {
            // try search if contains any eval scripts
            var html = RenderEvalScripts(_twitter.StatusTemplate, status);

            // render control directly if template not contains eval scripts
            if (string.IsNullOrEmpty(html)) {
                var pHolder = new ListViewDataItem(0, 0) { DataItem = status };
                _twitter.StatusTemplate.InstantiateIn(pHolder);
                pHolder.DataBind();
                html = RenderControl(pHolder);
            }

            return html;
        }
        /// <summary>
        /// Search eval scripts in template and render it with appropriate values from status.
        /// If template doesn't contains eval scripts, it will returns null.
        /// </summary>
        /// <param name="template">Template Target</param>
        /// <param name="status">Twitter Status</param>
        /// <returns>Returns null if no eval scripts</returns>
        private string RenderEvalScripts(ITemplate template, TwitterStatus status)
        {
            // search is there any eval scripts
            var tempHtml = PersistTemplate(template);
            var r1 = new Regex(@"(<%#) ?.*eval?.*%>", RegexOptions.IgnoreCase);
            var matches = r1.Matches(tempHtml);

            _valCounter = 0;
            _values = new List<string>();

            // manualy extract eval scripts if any
            if (matches.Count > 0) {
                var r2 = new Regex(@"""(.*?)""");
                foreach (var match in matches) {
                    var evalData = r2.Match(match.ToString()).ToString();
                    evalData = evalData.Substring(1, evalData.Length - 2);

                    object value = null;
                    if (evalData.Contains(".")) {
                        var props = evalData.Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries);
                        var propVal1 = typeof(TwitterStatus).GetProperty(props[0]).GetValue(status, null);
                        if (propVal1 != null)
                            value = propVal1.GetType().GetProperty(props[1]).GetValue(propVal1, null);
                    } else {
                        value = typeof(TwitterStatus).GetProperty(evalData).GetValue(status, null);
                    }

                    if (value == null)
                        value = "[" + evalData + "]";

                    _values.Add(value.ToString());
                }

                var evaluator = new MatchEvaluator(FillStatusValue);
                return r1.Replace(tempHtml, evaluator);
            }

            return null;
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Executes search query against the Twitter API
        /// </summary>
        /// <param name="search">The search query</param>
        /// <param name="count">The number of results to return</param>
        /// <returns></returns>
        public IList<TwitterStatus> GetSearch(string search, int count)
        {
            // Build query URL
            var sb = new StringBuilder();
            sb.AppendFormat(
                "http://search.twitter.com/search.atom?q={0}&rpp={1}",
                HttpUtility.UrlEncode(search),
                count
            );
            var queryUrl = sb.ToString();

            // Execute query
            var results = this.Query(queryUrl);

            // Parse results
            var defaultNS = "{http://www.w3.org/2005/Atom}";

            var statuses = new List<TwitterStatus>();
            var entries = from e in results.Descendants(defaultNS + "entry")
                          select e;

            foreach (var entry in entries) {

                var newUser = new TwitterUser {
                    Name = entry.Descendants(defaultNS + "name").FirstOrDefault().Value,
                    ProfileImageUrl = entry.Elements(defaultNS + "link")
                      .Where(link => (string)link.Attribute("rel") == "image")
                      .Select(link => (string)link.Attribute("href"))
                      .First()
                };

                var newStatus = new TwitterStatus {
                    CreatedAt = DateTime.Parse(entry.Element(defaultNS + "published").Value),
                    Text = entry.Element(defaultNS + "content").Value,
                    User = newUser
                };

                statuses.Add(newStatus);

            }

            return statuses.ToList();
        }