Files
Umbraco-CMS/umbraco/presentation/umbraco_client/tinymce3/plugins/spellchecker/GoogleSpellChecker.cs
Shandem f6d0d043b5 DO NOT DOWNLOAD. DOWNLOAT LATEST STABLE FROM RELEASE TAB
Created 4.1.0 branch

[TFS Changeset #55082]
2009-06-19 07:39:16 +00:00

142 lines
5.5 KiB
C#

using System;
using System.Web;
using System.IO;
using System.Web.Script.Serialization;
using System.Net;
using System.Text;
using System.Xml;
namespace umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker
{
public class GoogleSpellChecker : SpellChecker, IHttpHandler
{
private static string SendRequest(string lang, string data)
{
string googleResponse;
string requestUriString = string.Format("https://www.google.com:443/tbproxy/spell?lang={0}&hl={0}", lang);
string s = string.Format("<?xml version=\"1.0\" encoding=\"utf-8\" ?><spellrequest textalreadyclipped=\"0\" ignoredups=\"0\" ignoredigits=\"1\" ignoreallcaps=\"1\"><text>{0}</text></spellrequest>", HttpContext.Current.Server.UrlEncode(data));
StreamReader reader = null;
HttpWebResponse response = null;
Stream requestStream = null;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUriString);
request.KeepAlive = false;
request.Method = "POST";
request.ContentType = "application/PTI26";
request.ContentLength = s.Length;
WebHeaderCollection headers = request.Headers;
headers.Add("MIME-Version: 1.0");
headers.Add("Request-number: 1");
headers.Add("Document-type: Request");
headers.Add("Interface-Version: Test 1.4");
requestStream = request.GetRequestStream();
byte[] bytes = new ASCIIEncoding().GetBytes(s);
requestStream.Write(bytes, 0, bytes.Length);
response = (HttpWebResponse)request.GetResponse();
reader = new StreamReader(response.GetResponseStream());
googleResponse = reader.ReadToEnd();
}
finally
{
if (requestStream != null)
{
requestStream.Close();
}
if (reader != null)
{
reader.Close();
}
if (response != null)
{
response.Close();
}
}
return googleResponse;
}
/// <summary>
/// Checks all the words submitted against Google for spelling
/// </summary>
/// <param name="language">The language code.</param>
/// <param name="words">The words to be checked.</param>
/// <returns></returns>
public override SpellCheckerResult CheckWords(string language, string[] words)
{
XmlDocument document = new XmlDocument();
string data = string.Join(" ", words); //turn them into a space-separated string as that's what google takes
string xml = SendRequest(language, data);
document.LoadXml(xml);
var res = new SpellCheckerResult();
foreach (XmlNode node in document.SelectNodes("//c")) //go through each of the incorrectly spelt words
{
XmlElement element = (XmlElement)node;
res.result.Add(data.Substring(Convert.ToInt32(element.GetAttribute("o")), Convert.ToInt32(element.GetAttribute("l"))));
}
return res;
}
/// <summary>
/// Gets the suggested spelling for a misspelt word
/// </summary>
/// <param name="language">The language the word is.</param>
/// <param name="word">The word that is misspelt.</param>
/// <returns></returns>
public override SpellCheckerResult GetSuggestions(string language, string word)
{
XmlDocument document = new XmlDocument();
string xml = SendRequest(language, word);
document.LoadXml(xml);
var res = new SpellCheckerResult();
foreach (XmlNode node in document.SelectNodes("//c")) //select each incorrectly spelt work
{
XmlElement element = (XmlElement)node;
foreach (string s in element.InnerText.Split(new char[] { '\t' })) //they are tab-separated for suggestions
{
if (!string.IsNullOrEmpty(s))
{
res.result.Add(s);
}
}
}
return res;
}
#region IHttpHandler Members
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
SpellCheckerInput input = SpellCheckerInput.Parse(new StreamReader(context.Request.InputStream));
SpellCheckerResult suggestions = null;
switch (input.Method)
{
case "checkWords":
suggestions = CheckWords(input.Language, input.Words.ToArray());
break;
case "getSuggestions":
suggestions = GetSuggestions(input.Language, input.Words[0]);
break;
default:
suggestions = new SpellCheckerResult();
break;
}
suggestions.id = input.Id;
JavaScriptSerializer ser = new JavaScriptSerializer();
var res = ser.Serialize(suggestions);
context.Response.Write(res);
}
#endregion
}
}