using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;
public static class ClipboardFusionHelper
{
public static string ProcessText(string text)
{
//make sure all of the line breaks are the same type & remove tabs
// \0 = Null
// \a = Alert
// \b = Backspace
// \f = Form feed
// \n = New line
// \r = Carriage return
// \t = Horizontal tab
// \v = Vertical tab
text = text.Replace(Environment.NewLine, "\n")
.Replace("\r", "\n")
.Replace("\0", "")
.Replace("\a", "")
.Replace("\b", "")
.Replace("\f", "")
.Replace("\t", "")
.Replace("\v", "");
// replace instances of multiple line breaks with just one line break
text = Regex.Replace(text, @"\n{2,}", "\n", RegexOptions.Multiline).Trim();
// replace instances of multiple spaces with just one space
text = Regex.Replace(text, @"\s{2,}", " ", RegexOptions.Multiline).Trim();
//this will let us quickly build the string to return
StringBuilder builder = new StringBuilder();
//split the text up into its separate lines
foreach(string line in text.Split(new char[]{'\n'}, StringSplitOptions.RemoveEmptyEntries))
{
//this is probably redundant since we are removing empty entries
//if the line variable is null or empty, continue to the next line
if(string.IsNullOrEmpty(line))
continue;
//if the line is blank, ignore it
if(IsLineOnlyWhiteSpace(line))
continue;
// add a space to the builder if we already have some text in it, and the last character wasn't a dash
if((builder.Length > 0) &&
(builder[builder.Length - 1] != '-'))
{
builder.Append(" ");
}
//add the line to the StringBuilder
builder.Append(line);
}
//paste the StringBuilder
BFS.Clipboard.PasteText(builder.ToString());
//since we already set the clipboard with the PasteText function, there's no need to set it again
return null;
}
//this is a set of blank characters
private static readonly Dictionary<char, int> WhiteSpaceChars = new Dictionary<char, int>
{
{' ', 0},
{'\x0085', 0},
{' ', 0},
{' ', 0},
{' ', 0},
{' ', 0},
{' ', 0},
{' ', 0},
{' ', 0},
{' ', 0},
{' ', 0},
{' ', 0},
{' ', 0},
{' ', 0},
{' ', 0},
{'\x200B', 0},
{' ', 0},
{'\xFEFF', 0},
{'\v', 0},
{'\f', 0},
{'\x2028', 0},
{'\x2029', 0},
};
//this function returns true if a line is composed of only whitespace or blank characters
private static bool IsLineOnlyWhiteSpace(string line)
{
foreach(char c in line)
{
if(!WhiteSpaceChars.ContainsKey(c))
return false;
}
return true;
}
}