Changeset 31856

Show
Ignore:
Timestamp:
04/03/09 17:09:00 (4 years ago)
Author:
kiri_feather
Message:

APIリンク作成ずれ修正。不正XML暫定対応(ログ吐き)
スクレイピング2ページ目からしか取得できない問題修正
発言削除時のフォーカス位置調整

Location:
lang/vb2005/Tween/Tween
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • lang/vb2005/Tween/Tween/Resources/ChangeLog.txt

    r31846 r31856  
    11更新履歴 
    22 
    3 ***Ver0.3.9.1(Unreleased) 
     3***Ver0.3.9.2(Unreleased) 
     4-発言削除時のフォーカス位置調整 
     5-スクレイピング時に、新WebUiの場合に、1ページ目を取得しない問題を修正 
     6-API使用時に@idへのリンク付与がずれている問題を修正 
     7-API使用時に不正なXMLを取得した場合の暫定対処 
     8***Ver0.3.9.1(2009/04/03) 
    49-タブ切替のショートカット追加。a/sもしくはC-n/C-pで前後のタブに切り替えます。C-nでのタブ振り分けルール作成のショートカットを置き換えました。 
    510-英語版設定画面の項目名が日本語版と不一致だったものを修正。英語対応していなかった項目の英語対応 
  • lang/vb2005/Tween/Tween/Tween.vb

    r31844 r31856  
    20602060              MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then Exit Sub 
    20612061 
     2062        Dim fidx As Integer 
     2063        If _curList.FocusedItem IsNot Nothing Then 
     2064            fidx = _curList.FocusedItem.Index 
     2065        ElseIf _curList.TopItem IsNot Nothing Then 
     2066            fidx = _curList.TopItem.Index 
     2067        Else 
     2068            fidx = 0 
     2069        End If 
     2070 
    20622071        Try 
    20632072            Me.Cursor = Cursors.WaitCursor 
     
    20952104            For Each tb As TabPage In ListTab.TabPages 
    20962105                DirectCast(tb.Controls(0), DetailsListView).VirtualListSize = _statuses.Tabs(tb.Text).AllCount 
     2106                If _curTab.Equals(tb) Then 
     2107                    _curList.SelectedIndices.Clear() 
     2108                    If _statuses.Tabs(tb.Text).AllCount - 1 > fidx Then 
     2109                        _curList.SelectedIndices.Add(fidx) 
     2110                    Else 
     2111                        _curList.SelectedIndices.Add(_statuses.Tabs(tb.Text).AllCount - 1) 
     2112                    End If 
     2113                    _curList.EnsureVisible(_curList.SelectedIndices(0)) 
     2114                    _curList.FocusedItem = _curList.Items(_curList.SelectedIndices(0)) 
     2115                End If 
    20972116                If _statuses.Tabs(tb.Text).UnreadCount = 0 AndAlso tb.ImageIndex = 0 Then tb.ImageIndex = -1 
    20982117            Next 
  • lang/vb2005/Tween/Tween/Twitter.vb

    r31844 r31856  
    277277                    If resStatus.StartsWith("Found") Then 
    278278                        redirectToTimeline = resStatus.Substring(6) 
     279                        If redirectToTimeline.Contains("?") Then 
     280                            redirectToTimeline = redirectToTimeline.Remove(redirectToTimeline.IndexOf("?")) 
     281                        End If 
    279282                        GoTo RETRY 
    280283                    End If 
     
    287290                    If resStatus.StartsWith("Found") Then 
    288291                        redirectToReply = resStatus.Substring(6) 
     292                        If redirectToReply.Contains("?") Then 
     293                            redirectToReply = redirectToReply.Remove(redirectToReply.IndexOf("?")) 
     294                        End If 
    289295                        GoTo RETRY 
    290296                    End If 
     
    740746                    If resStatus.StartsWith("Found") Then 
    741747                        redirectToDmRcv = resStatus.Substring(6) 
     748                        If redirectToDmRcv.Contains("?") Then 
     749                            redirectToDmRcv = redirectToDmRcv.Remove(redirectToDmRcv.IndexOf("?")) 
     750                        End If 
    742751                        GoTo RETRY 
    743752                    End If 
     
    750759                    If resStatus.StartsWith("Found") Then 
    751760                        redirectToDmSnd = resStatus.Substring(6) 
     761                        If redirectToDmSnd.Contains("?") Then 
     762                            redirectToDmSnd = redirectToDmSnd.Remove(redirectToDmSnd.IndexOf("?")) 
     763                        End If 
    752764                        GoTo RETRY 
    753765                    End If 
     
    20362048        Dim ar(_countApi) As IAsyncResult              'countQueryに合わせる 
    20372049        Dim xdoc As New XmlDocument 
    2038         xdoc.LoadXml(retMsg) 
     2050        Try 
     2051            xdoc.LoadXml(retMsg) 
     2052        Catch ex As Exception 
     2053            ExceptionOut(ex) 
     2054            TraceOut(True, retMsg) 
     2055            MessageBox.Show("不正なXMLです。(TL-LoadXml)") 
     2056            Return "Invalid XML!" 
     2057        End Try 
    20392058 
    20402059        For Each xentryNode As XmlNode In xdoc.DocumentElement.SelectNodes("./status") 
    20412060            Dim xentry As XmlElement = CType(xentryNode, XmlElement) 
    20422061            Dim post As New PostClass 
    2043             post.PDate = DateTime.ParseExact(xentry.Item("created_at").InnerText, "ddd MMM dd HH:mm:ss zzzz yyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None) 
    2044             post.Id = Long.Parse(xentry.Item("id").InnerText) 
    2045             '二重取得回避 
    2046             SyncLock LockObj 
    2047                 If TabInformations.GetInstance.ContainsKey(post.Id) Then Continue For 
    2048             End SyncLock 
    2049             '本文 
    2050             post.Data = xentry.Item("text").InnerText 
    2051             post.Data = post.Data.Replace("<3", "♡") 
    2052             'HTMLに整形 
    2053             post.OriginalData = CreateHtmlAnchor(post.Data, post.ReplyToList) 
    2054             'Source取得(htmlの場合は、中身を取り出し) 
    2055             post.Source = xentry.Item("source").InnerText 
    2056             If post.Source.StartsWith("<") Then 
    2057                 Dim rgS As New Regex(">(?<source>.+)<") 
    2058                 Dim mS As Match = rgS.Match(post.Source) 
    2059                 If mS.Success Then 
    2060                     post.Source = mS.Result("${source}") 
     2062            Try 
     2063                post.PDate = DateTime.ParseExact(xentry.Item("created_at").InnerText, "ddd MMM dd HH:mm:ss zzzz yyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None) 
     2064                post.Id = Long.Parse(xentry.Item("id").InnerText) 
     2065                '二重取得回避 
     2066                SyncLock LockObj 
     2067                    If TabInformations.GetInstance.ContainsKey(post.Id) Then Continue For 
     2068                End SyncLock 
     2069                '本文 
     2070                post.Data = xentry.Item("text").InnerText 
     2071                post.Data = post.Data.Replace("<3", "♡") 
     2072                'HTMLに整形 
     2073                post.OriginalData = CreateHtmlAnchor(post.Data, post.ReplyToList) 
     2074                'Source取得(htmlの場合は、中身を取り出し) 
     2075                post.Source = xentry.Item("source").InnerText 
     2076                If post.Source.StartsWith("<") Then 
     2077                    Dim rgS As New Regex(">(?<source>.+)<") 
     2078                    Dim mS As Match = rgS.Match(post.Source) 
     2079                    If mS.Success Then 
     2080                        post.Source = mS.Result("${source}") 
     2081                    End If 
    20612082                End If 
    2062             End If 
    2063             Long.TryParse(xentry.Item("in_reply_to_status_id").InnerText, post.InReplyToId) 
    2064             post.InReplyToUser = xentry.Item("in_reply_to_screen_name").InnerText 
    2065             'in_reply_to_user_idを使うか? 
    2066             post.IsFav = Boolean.Parse(xentry.Item("favorited").InnerText) 
    2067  
    2068             '以下、ユーザー情報 
    2069             Dim xUentry As XmlElement = CType(xentry.SelectSingleNode("./user"), XmlElement) 
    2070             post.Uid = Long.Parse(xUentry.Item("id").InnerText) 
    2071             post.Name = xUentry.Item("screen_name").InnerText 
    2072             post.Nickname = xUentry.Item("name").InnerText 
    2073             post.ImageUrl = xUentry.Item("profile_image_url").InnerText 
    2074             post.IsProtect = Boolean.Parse(xUentry.Item("protected").InnerText) 
    2075             post.IsMe = post.Name.ToLower.Equals(_uid.ToLower) 
    2076             post.IsRead = read 
    2077             If gType = WORKERTYPE.Timeline Then 
    2078                 post.IsReply = post.ReplyToList.Contains(_uid.ToLower) 
    2079             Else 
    2080                 post.IsReply = True 
    2081             End If 
    2082  
    2083             If post.IsMe Then 
    2084                 post.IsOwl = False 
    2085             Else 
    2086                 post.IsOwl = Not followerId.Contains(post.Uid) 
    2087             End If 
    2088  
    2089             post.IsDm = False 
     2083                Long.TryParse(xentry.Item("in_reply_to_status_id").InnerText, post.InReplyToId) 
     2084                post.InReplyToUser = xentry.Item("in_reply_to_screen_name").InnerText 
     2085                'in_reply_to_user_idを使うか? 
     2086                post.IsFav = Boolean.Parse(xentry.Item("favorited").InnerText) 
     2087 
     2088                '以下、ユーザー情報 
     2089                Dim xUentry As XmlElement = CType(xentry.SelectSingleNode("./user"), XmlElement) 
     2090                post.Uid = Long.Parse(xUentry.Item("id").InnerText) 
     2091                post.Name = xUentry.Item("screen_name").InnerText 
     2092                post.Nickname = xUentry.Item("name").InnerText 
     2093                post.ImageUrl = xUentry.Item("profile_image_url").InnerText 
     2094                post.IsProtect = Boolean.Parse(xUentry.Item("protected").InnerText) 
     2095                post.IsMe = post.Name.ToLower.Equals(_uid.ToLower) 
     2096                post.IsRead = read 
     2097                If gType = WORKERTYPE.Timeline Then 
     2098                    post.IsReply = post.ReplyToList.Contains(_uid.ToLower) 
     2099                Else 
     2100                    post.IsReply = True 
     2101                End If 
     2102 
     2103                If post.IsMe Then 
     2104                    post.IsOwl = False 
     2105                Else 
     2106                    post.IsOwl = Not followerId.Contains(post.Uid) 
     2107                End If 
     2108 
     2109                post.IsDm = False 
     2110            Catch ex As Exception 
     2111                ExceptionOut(ex) 
     2112                TraceOut(True, retMsg) 
     2113                MessageBox.Show("不正なXMLです。(TL-Parse)") 
     2114                Continue For 
     2115            End Try 
    20902116 
    20912117            '非同期アイコン取得&StatusDictionaryに追加 
     
    21322158        Dim ar(GET_COUNT) As IAsyncResult              'countQueryに合わせる 
    21332159        Dim xdoc As New XmlDocument 
    2134         xdoc.LoadXml(retMsg) 
     2160        Try 
     2161            xdoc.LoadXml(retMsg) 
     2162        Catch ex As Exception 
     2163            ExceptionOut(ex) 
     2164            TraceOut(True, retMsg) 
     2165            MessageBox.Show("不正なXMLです。(DM-LoadXml)") 
     2166            Return "Invalid XML!" 
     2167        End Try 
    21352168 
    21362169        For Each xentryNode As XmlNode In xdoc.DocumentElement.SelectNodes("./direct_message") 
    21372170            Dim xentry As XmlElement = CType(xentryNode, XmlElement) 
    21382171            Dim post As New PostClass 
    2139             post.Id = Long.Parse(xentry.Item("id").InnerText) 
    2140             '二重取得回避 
    2141             SyncLock LockObj 
    2142                 If TabInformations.GetInstance.ContainsKey(post.Id) Then Continue For 
    2143             End SyncLock 
    2144             'sender_id 
    2145             'recipient_id 
    2146             post.PDate = DateTime.ParseExact(xentry.Item("created_at").InnerText, "ddd MMM dd HH:mm:ss zzzz yyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None) 
    2147             '本文 
    2148             post.Data = xentry.Item("text").InnerText 
    2149             post.Data = post.Data.Replace("<3", "♡") 
    2150             'HTMLに整形 
    2151             post.OriginalData = CreateHtmlAnchor(post.Data, post.ReplyToList) 
    2152             post.IsFav = False 
    2153             '受信DMかの判定で使用 
    2154             If gType = WORKERTYPE.DirectMessegeRcv Then 
    2155                 post.IsOwl = False 
    2156             Else 
    2157                 post.IsOwl = True 
    2158             End If 
    2159  
    2160             '以下、ユーザー情報 
    2161             Dim xUentry As XmlElement 
    2162             If gType = WORKERTYPE.DirectMessegeRcv Then 
    2163                 xUentry = CType(xentry.SelectSingleNode("./sender"), XmlElement) 
    2164                 post.IsMe = False 
    2165             Else 
    2166                 xUentry = CType(xentry.SelectSingleNode("./recipient"), XmlElement) 
    2167                 post.IsMe = True 
    2168             End If 
    2169             post.Uid = Long.Parse(xUentry.Item("id").InnerText) 
    2170             post.Name = xUentry.Item("screen_name").InnerText 
    2171             post.Nickname = xUentry.Item("name").InnerText 
    2172             post.ImageUrl = xUentry.Item("profile_image_url").InnerText 
    2173             post.IsProtect = Boolean.Parse(xUentry.Item("protected").InnerText) 
     2172            Try 
     2173                post.Id = Long.Parse(xentry.Item("id").InnerText) 
     2174                '二重取得回避 
     2175                SyncLock LockObj 
     2176                    If TabInformations.GetInstance.ContainsKey(post.Id) Then Continue For 
     2177                End SyncLock 
     2178                'sender_id 
     2179                'recipient_id 
     2180                post.PDate = DateTime.ParseExact(xentry.Item("created_at").InnerText, "ddd MMM dd HH:mm:ss zzzz yyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None) 
     2181                '本文 
     2182                post.Data = xentry.Item("text").InnerText 
     2183                post.Data = post.Data.Replace("<3", "♡") 
     2184                'HTMLに整形 
     2185                post.OriginalData = CreateHtmlAnchor(post.Data, post.ReplyToList) 
     2186                post.IsFav = False 
     2187                '受信DMかの判定で使用 
     2188                If gType = WORKERTYPE.DirectMessegeRcv Then 
     2189                    post.IsOwl = False 
     2190                Else 
     2191                    post.IsOwl = True 
     2192                End If 
     2193 
     2194                '以下、ユーザー情報 
     2195                Dim xUentry As XmlElement 
     2196                If gType = WORKERTYPE.DirectMessegeRcv Then 
     2197                    xUentry = CType(xentry.SelectSingleNode("./sender"), XmlElement) 
     2198                    post.IsMe = False 
     2199                Else 
     2200                    xUentry = CType(xentry.SelectSingleNode("./recipient"), XmlElement) 
     2201                    post.IsMe = True 
     2202                End If 
     2203                post.Uid = Long.Parse(xUentry.Item("id").InnerText) 
     2204                post.Name = xUentry.Item("screen_name").InnerText 
     2205                post.Nickname = xUentry.Item("name").InnerText 
     2206                post.ImageUrl = xUentry.Item("profile_image_url").InnerText 
     2207                post.IsProtect = Boolean.Parse(xUentry.Item("protected").InnerText) 
     2208            Catch ex As Exception 
     2209                ExceptionOut(ex) 
     2210                TraceOut(True, retMsg) 
     2211                MessageBox.Show("不正なXMLです。(DM-Parse)") 
     2212                Continue For 
     2213            End Try 
    21742214 
    21752215            post.IsRead = read 
     
    22332273        retStr = rgUrl.Replace(Text, "<a href=""$&"">$&</a>") 
    22342274        '@返信を抽出し、@先リスト作成 
    2235         Dim rg As New Regex("(^|[^a-zA-Z0-9_@])@[a-zA-Z0-9_]{1,20}") 
     2275        Dim rg As New Regex("(^|[ -/:-@[-^`{-~])@([a-zA-Z0-9_]{1,20})") 
    22362276        Dim m As Match = rg.Match(retStr) 
    22372277        While m.Success 
    2238             AtList.Add(m.Value.ToLower) 
     2278            AtList.Add(m.Result("$2")) 
    22392279            m = m.NextMatch 
    22402280        End While 
    22412281        '@先をリンクに置換 
    2242         retStr = rg.Replace(retStr, "<a href=""/$&"">$&</a>") 
     2282        retStr = rg.Replace(retStr, "$1@<a href=""/$2"">$2</a>") 
    22432283        retStr = AdjustHtml(ShortUrlResolve(PreProcessUrl(retStr))) 'IDN置換、短縮Uri解決、@リンクを相対→絶対にしてtarget属性付与 
    22442284        Return retStr