--- /dev/null
+// OpenTween - Client of Twitter
+// Copyright (c) 2019 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
+// All rights reserved.
+//
+// This file is part of OpenTween.
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3 of the License, or (at your option)
+// any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program. If not, see <http://www.gnu.org/licenses/>, or write to
+// the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
+// Boston, MA 02110-1301, USA.
+
+using Xunit;
+
+namespace OpenTween.Api
+{
+ public class JsonUtilsTest
+ {
+ [Theory]
+ [InlineData("", "")]
+ [InlineData("123ABCabc", "123ABCabc")]
+ [InlineData(@"\", @"\\")]
+ [InlineData("\"", "\\\"")]
+ [InlineData("\n", @"\u000A")]
+ [InlineData("\U0001D11E", @"\uD834\uDD1E")]
+ public void EscapeJsonString_Test(string targetText, string expectedText)
+ => Assert.Equal(expectedText, JsonUtils.EscapeJsonString(targetText));
+ }
+}
mock.VerifyAll();
}
}
-
- [Theory]
- [InlineData("", "")]
- [InlineData("123ABCabc", "123ABCabc")]
- [InlineData(@"\", @"\\")]
- [InlineData("\"", "\\\"")]
- [InlineData("\n", @"\u000A")]
- [InlineData("\U0001D11E", @"\uD834\uDD1E")]
- public void EscapeJsonString_Test(string targetText, string expectedText)
- {
- Assert.Equal(expectedText, TwitterApi.EscapeJsonString(targetText));
- }
}
}
--- /dev/null
+// OpenTween - Client of Twitter
+// Copyright (c) 2019 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
+// All rights reserved.
+//
+// This file is part of OpenTween.
+//
+// This program is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3 of the License, or (at your option)
+// any later version.
+//
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this program. If not, see <http://www.gnu.org/licenses/>, or write to
+// the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
+// Boston, MA 02110-1301, USA.
+
+using System.Text;
+
+namespace OpenTween.Api
+{
+ internal static class JsonUtils
+ {
+ /// <summary>JSON に出力する文字列を ECMA-404 に従ってエスケープする</summary>
+ public static string EscapeJsonString(string rawText)
+ {
+ var builder = new StringBuilder(rawText.Length + 20);
+
+ foreach (var c in rawText)
+ {
+ if (c <= 0x1F || char.IsSurrogate(c))
+ builder.AppendFormat(@"\u{0:X4}", (int)c);
+ else if (c == '\\' || c == '\"')
+ builder.Append('\\').Append(c);
+ else
+ builder.Append(c);
+ }
+
+ return builder.ToString();
+ }
+ }
+}
""attachment"": {{
""type"": ""media"",
""media"": {{
- ""id"": ""{EscapeJsonString(mediaId.ToString())}""
+ ""id"": ""{JsonUtils.EscapeJsonString(mediaId.ToString())}""
}}
}}";
}
""type"": ""message_create"",
""message_create"": {{
""target"": {{
- ""recipient_id"": ""{EscapeJsonString(recipientId.ToString())}""
+ ""recipient_id"": ""{JsonUtils.EscapeJsonString(recipientId.ToString())}""
}},
""message_data"": {{
- ""text"": ""{EscapeJsonString(text)}""{attachment}
+ ""text"": ""{JsonUtils.EscapeJsonString(text)}""{attachment}
}}
}}
}}
{
var endpoint = new Uri("https://upload.twitter.com/1.1/media/metadata/create.json");
- var escapedAltText = EscapeJsonString(altText);
+ var escapedAltText = JsonUtils.EscapeJsonString(altText);
var json = $@"{{""media_id"": ""{mediaId}"", ""alt_text"": {{""text"": ""{escapedAltText}""}}}}";
return this.apiConnection.PostJsonAsync(endpoint, json);
public void Dispose()
=> this.apiConnection?.Dispose();
-
- /// <summary>JSON に出力する文字列を ECMA-404 に従ってエスケープする</summary>
- public static string EscapeJsonString(string rawText)
- {
- var builder = new StringBuilder(rawText.Length + 20);
-
- foreach (var c in rawText)
- {
- if (c <= 0x1F || char.IsSurrogate(c))
- builder.AppendFormat(@"\u{0:X4}", (int)c);
- else if (c == '\\' || c == '\"')
- builder.Append('\\').Append(c);
- else
- builder.Append(c);
- }
-
- return builder.ToString();
- }
}
}
<Compile Include="Api\DataModel\TwitterUploadMediaResult.cs" />
<Compile Include="Api\DataModel\TwitterUser.cs" />
<Compile Include="Api\DataModel\TwitterApiAccessLevel.cs" />
+ <Compile Include="Api\JsonUtils.cs" />
<Compile Include="Api\MicrosoftTranslatorApi.cs" />
<Compile Include="Api\TwitterApi.cs" />
<Compile Include="Api\TwitterApiException.cs" />