http://sourceforge.jp/projects/futonwriter/の旧リポジトリ
| Revision | 802591ffe47a4a82687c37924d485fcb2f47eb22 (tree) |
|---|---|
| Time | 2011-05-09 17:31:07 |
| Author | azyobuzin <azyobuzin@user...> |
| Commiter | azyobuzin |
・DateIdとかいうプロパティを追加
・記事をいじるメソッドを揃えた
| @@ -2,6 +2,7 @@ | ||
| 2 | 2 | using System.Collections.Generic; |
| 3 | 3 | using System.Linq; |
| 4 | 4 | using System.Text; |
| 5 | +using System.Text.RegularExpressions; | |
| 5 | 6 | using System.Xml.Linq; |
| 6 | 7 | |
| 7 | 8 | namespace Azyobuzi.HatenaDiaryClient.Models.Hatena |
| @@ -13,20 +14,22 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena | ||
| 13 | 14 | public string Title { set; get; } |
| 14 | 15 | public string Html { set; get; } |
| 15 | 16 | public string HatenaSyntax { set; get; } |
| 17 | + public string DateId { set; get; } | |
| 16 | 18 | |
| 17 | 19 | public BlogEntry() { } |
| 18 | 20 | public BlogEntry(XElement xml) |
| 19 | 21 | { |
| 20 | - Edited = DateTime.Parse(xml.Element(XmlNamespaces.AtomPub + "edited").Value); | |
| 21 | - BlogPage = xml.Elements(XmlNamespaces.Atom + "link") | |
| 22 | + this.Edited = DateTime.Parse(xml.Element(XmlNamespaces.AtomPub + "edited").Value); | |
| 23 | + this.BlogPage = xml.Elements(XmlNamespaces.Atom + "link") | |
| 22 | 24 | .Where(_ => _.Attribute("rel").Value == "alternate") |
| 23 | 25 | .Select(_ => _.Attribute("href").Value) |
| 24 | 26 | .FirstOrDefault(); |
| 25 | - Title = xml.Element(XmlNamespaces.Atom + "title").Value; | |
| 26 | - Html = xml.Element(XmlNamespaces.Atom + "content").Value; | |
| 27 | - HatenaSyntax = xml.Elements(XmlNamespaces.HatenaNs + "syntax") | |
| 27 | + this.Title = xml.Element(XmlNamespaces.Atom + "title").Value; | |
| 28 | + this.Html = xml.Element(XmlNamespaces.Atom + "content").Value; | |
| 29 | + this.HatenaSyntax = xml.Elements(XmlNamespaces.HatenaNs + "syntax") | |
| 28 | 30 | .Select(_ => _.Value) |
| 29 | 31 | .SingleOrDefault(); |
| 32 | + this.DateId = Regex.Match(this.BlogPage, @"\d+/\d+$").ToString(); | |
| 30 | 33 | } |
| 31 | 34 | } |
| 32 | 35 | } |
| @@ -17,7 +17,7 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena | ||
| 17 | 17 | this.password = password; |
| 18 | 18 | } |
| 19 | 19 | |
| 20 | - public Tuple<string, IEnumerable<BlogEntry>> GetEntrys(int page) | |
| 20 | + public Tuple<string, IEnumerable<BlogEntry>> GetEntrys(int page = 1) | |
| 21 | 21 | { |
| 22 | 22 | var xdoc = WsseAtomConnection.Get( |
| 23 | 23 | string.Format("http://d.hatena.ne.jp/{0}/atom/blog?page={1}", this.userName, page), |
| @@ -28,16 +28,21 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena | ||
| 28 | 28 | return Tuple.Create(title, entrys); |
| 29 | 29 | } |
| 30 | 30 | |
| 31 | - public BlogEntry PostEntry(string title, string content, DateTime? updated = null) | |
| 31 | + private static XDocument CreatePostEntryXml(string title, string content, DateTime? updated) | |
| 32 | 32 | { |
| 33 | 33 | var elm = new XElement(XmlNamespaces.Atom02Spec + "entry", |
| 34 | - new XElement(XmlNamespaces.Atom02Spec + "title", title), | |
| 35 | - new XElement(XmlNamespaces.Atom02Spec + "content", new XAttribute("type", "text/plain"), content)); | |
| 34 | + new XElement(XmlNamespaces.Atom02Spec + "title", title), | |
| 35 | + new XElement(XmlNamespaces.Atom02Spec + "content", new XAttribute("type", "text/plain"), content)); | |
| 36 | 36 | if (updated.HasValue) |
| 37 | 37 | elm.Add(new XElement(XmlNamespaces.Atom02Spec + "updated", updated.Value.ToString("o"))); |
| 38 | + return new XDocument(elm); | |
| 39 | + } | |
| 40 | + | |
| 41 | + public BlogEntry PostEntry(string title, string content, DateTime? updated = null) | |
| 42 | + { | |
| 38 | 43 | var reXml = WsseAtomConnection.Post( |
| 39 | 44 | string.Format("http://d.hatena.ne.jp/{0}/atom/blog", this.userName), |
| 40 | - new XDocument(elm), | |
| 45 | + CreatePostEntryXml(title, content, updated), | |
| 41 | 46 | this.userName, |
| 42 | 47 | this.password); |
| 43 | 48 | return new BlogEntry(reXml.Root) |
| @@ -45,5 +50,35 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena | ||
| 45 | 50 | HatenaSyntax = content |
| 46 | 51 | }; |
| 47 | 52 | } |
| 53 | + | |
| 54 | + public BlogEntry GetEntry(string dateId) | |
| 55 | + { | |
| 56 | + var xdoc = WsseAtomConnection.Get( | |
| 57 | + string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.userName, dateId), | |
| 58 | + this.userName, | |
| 59 | + this.password); | |
| 60 | + return new BlogEntry(xdoc.Root); | |
| 61 | + } | |
| 62 | + | |
| 63 | + public BlogEntry EditEntry(string dateId, string title, string content, DateTime? updated = null) | |
| 64 | + { | |
| 65 | + var reXml = WsseAtomConnection.Put( | |
| 66 | + string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.userName, dateId), | |
| 67 | + CreatePostEntryXml(title, content, updated), | |
| 68 | + this.userName, | |
| 69 | + this.password); | |
| 70 | + return new BlogEntry(reXml.Root) | |
| 71 | + { | |
| 72 | + HatenaSyntax = content | |
| 73 | + }; | |
| 74 | + } | |
| 75 | + | |
| 76 | + public void DeleteEntry(string dateId) | |
| 77 | + { | |
| 78 | + WsseAtomConnection.Delete( | |
| 79 | + string.Format("http://d.hatena.ne.jp/{0}/atom/blog/{1}", this.userName, dateId), | |
| 80 | + this.userName, | |
| 81 | + this.password); | |
| 82 | + } | |
| 48 | 83 | } |
| 49 | 84 | } |
| @@ -49,7 +49,7 @@ namespace Azyobuzi.HatenaDiaryClient.Models.Hatena | ||
| 49 | 49 | var req = WebRequest.Create(reqUri); |
| 50 | 50 | req.Method = method; |
| 51 | 51 | req.Headers.Add(CreateHeader(userName, password)); |
| 52 | - req.ContentType = "application/x.atom+xml"; | |
| 52 | + req.ContentType = "application/x.atom+xml; charset=utf-8"; | |
| 53 | 53 | var bs = Encoding.UTF8.GetBytes(reqData.ToString()); |
| 54 | 54 | req.ContentLength = bs.Length; |
| 55 | 55 | using (var stream = req.GetRequestStream()) |