New LBDocumentClass Properties:
string Ascii - Ascii of the entire document text - used for searching bool HasSymbolCharacters - Looks for symbol characters in the text Method ReplaceSymbolCharacters - Replaces any symbol characters with standard characters.
This commit is contained in:
parent
c5eb494668
commit
88fcff5852
@ -273,6 +273,154 @@ namespace LBWordLibrary
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public string Ascii
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
LBRange myRange = Range();
|
||||||
|
myRange = myRange.GoTo(LBWdGoToItem.wdGoToPercent, LBWdGoToDirection.wdGoToLast, 100);
|
||||||
|
myRange.Start = 0;
|
||||||
|
return ReplaceSymbolCharacters(GetRangeText(myRange));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Checks to see if the document contains symbol characters
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public bool HasSymbolCharacters
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
LBRange myRange = Range();
|
||||||
|
myRange = myRange.GoTo(LBWdGoToItem.wdGoToPercent, LBWdGoToDirection.wdGoToLast, 100);
|
||||||
|
myRange.Start = 0;
|
||||||
|
string myText = GetRangeText(myRange);
|
||||||
|
return _RegFindSymbol.IsMatch(myText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Regex _RegFindSymbol = new Regex("[\\uF000-\\uF0FF]+");
|
||||||
|
/// <summary>
|
||||||
|
/// FixSymbolCharacters - Fix any symbol characters in the document
|
||||||
|
/// </summary>
|
||||||
|
public void FixSymbolCharacters()
|
||||||
|
{
|
||||||
|
// Set up range object to be used to process text
|
||||||
|
LBRange myRange = Range();
|
||||||
|
myRange = myRange.GoTo(LBWdGoToItem.wdGoToPercent, LBWdGoToDirection.wdGoToLast, 100);
|
||||||
|
int end = myRange.End;
|
||||||
|
myRange.Start = 0;
|
||||||
|
string myText = GetRangeText(myRange);
|
||||||
|
MatchCollection problems = _RegFindSymbol.Matches(myText);
|
||||||
|
int offset = 0;
|
||||||
|
foreach (Match problem in problems)
|
||||||
|
{
|
||||||
|
myRange.Start = problem.Index + offset;
|
||||||
|
myRange.End = problem.Index + problem.Length + offset;
|
||||||
|
int newOffset = FindRangeOffset(myRange, problem, offset, end);
|
||||||
|
ReplaceSymbolCharacters(myRange);
|
||||||
|
offset = newOffset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Get the Range Text with error handling. myRange.Text sometimes will get a null reference exception.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="myRange"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
internal static string GetRangeText(LBRange myRange)
|
||||||
|
{
|
||||||
|
string text="";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
text = myRange.Text;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine("{0} - {1}", ex.GetType().Name, ex.Message);
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Looks for the problem string and adjusts the range as necessary
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="myRange"></param>
|
||||||
|
/// <param name="problem"></param>
|
||||||
|
/// <param name="offset"></param>
|
||||||
|
/// <param name="end"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private int FindRangeOffset(LBRange myRange, Match problem, int offset, int end)
|
||||||
|
{
|
||||||
|
// try to find the string
|
||||||
|
string text = GetRangeText(myRange);
|
||||||
|
if (text != problem.Value)
|
||||||
|
{
|
||||||
|
// Get the entire text starting at the offset of the first match
|
||||||
|
myRange.Start = problem.Index + offset;
|
||||||
|
myRange.End = end;
|
||||||
|
text = GetRangeText(myRange);
|
||||||
|
while (!text.StartsWith(problem.Value))
|
||||||
|
{
|
||||||
|
int newStart = text.IndexOf(problem.Value);// Find the string if it is not at the beginning
|
||||||
|
myRange.Start += myRange.Start == newStart ? newStart + 1 : newStart; // adjust the starting location
|
||||||
|
text = GetRangeText(myRange);// get the text to check
|
||||||
|
}
|
||||||
|
myRange.End = myRange.Start + problem.Length; // assume that the end should be the start plus the length
|
||||||
|
text = GetRangeText(myRange);
|
||||||
|
while (text.Length < problem.Length) // If the result is too short increase the length
|
||||||
|
{
|
||||||
|
myRange.End += (problem.Length - text.Length);
|
||||||
|
text = GetRangeText(myRange);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return myRange.Start - problem.Index;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// ReplaceSymbolCharacters Replaces any symbol characters in the specified range
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="myRange"></param>
|
||||||
|
private static void ReplaceSymbolCharacters(LBRange myRange)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string before = GetRangeText(myRange);
|
||||||
|
string updated = ReplaceSymbolCharacters(before);
|
||||||
|
myRange.Text = updated;
|
||||||
|
string after = GetRangeText(myRange);
|
||||||
|
if (after != updated) // If the Word text doesn't match try including a character before and after and do it again.
|
||||||
|
{
|
||||||
|
Console.WriteLine("'TryEntireRange Failed',{0},{1},'{2}','{3}','{4}'", myRange.Start, myRange.End, before, updated, after);
|
||||||
|
int end = myRange.End;
|
||||||
|
myRange.Start = myRange.Start - 1;
|
||||||
|
myRange.End = end + 1;
|
||||||
|
myRange.Text = ReplaceSymbolCharacters(GetRangeText(myRange));
|
||||||
|
Console.WriteLine("'TryEntireRange Failed',{0},{1},'{2}'", myRange.Start, myRange.End, GetRangeText(myRange));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine("'TryEntireRange Exception',{0},{1},'{2}'", myRange.Start, myRange.End, ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// ReplaceSymbolCharacters processes the string returned and changes any symbols (0xF0??) to normal characters
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static string ReplaceSymbolCharacters(string str)
|
||||||
|
{
|
||||||
|
StringBuilder results = new StringBuilder();
|
||||||
|
foreach (char c in str)
|
||||||
|
{
|
||||||
|
if ((c & 0xFF00) == 0xF000)
|
||||||
|
results.Append((char)(c & 0xFF));
|
||||||
|
else
|
||||||
|
results.Append((char)(c));
|
||||||
|
}
|
||||||
|
return results.ToString();
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Close the document
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="SaveChanges">Save Changes</param>
|
||||||
public void Close(bool SaveChanges)
|
public void Close(bool SaveChanges)
|
||||||
{
|
{
|
||||||
InvokeMethod("Close", SaveChanges, Missing.Value, Missing.Value);
|
InvokeMethod("Close", SaveChanges, Missing.Value, Missing.Value);
|
||||||
@ -334,9 +482,10 @@ namespace LBWordLibrary
|
|||||||
{
|
{
|
||||||
myRange.Start = start;
|
myRange.Start = start;
|
||||||
myRange.End = start + 1;
|
myRange.End = start + 1;
|
||||||
if (Regex.IsMatch(myRange.Text, "[A-Z]")) return true;
|
string previous = LBDocumentClass.GetRangeText(myRange);
|
||||||
if (Regex.IsMatch(myRange.Text, "[a-z]")) return false;
|
if (Regex.IsMatch(previous, "[A-Z]")) return true;
|
||||||
start = start - 1;
|
if (Regex.IsMatch(previous, "[a-z]")) return false;
|
||||||
|
start = start - 1;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user