Processing Ajax...

Title
Close Dialog

Message

Confirm
Close Dialog

Confirm
Close Dialog

Confirm
Close Dialog

Remove Outer Whitespaces and Replace Inner Ones With a Space

Description
This script will trim whitespace from the start and end of the copied text, and replace any whitespace within the text with a single space, and will auto-paste the results.
Language
C#.net
Minimum Version
Created By
Danail Branekov34799
Contributors
-
Date Created
May 7, 2020
Date Last Modified
May 7, 2020

Macro Code

using System;
using System.Text;
using System.Collections.Generic;

public static class ClipboardFusionHelper
{
	public static string ProcessText(string text)
	{
		//copy whatever is selected to the clipboard
		//this will allow this macro to be used more quickly
		text = BFS.Clipboard.CopyText();
		
		//make sure all of the line breaks are the same type
		text = text.Replace(Environment.NewLine, "\n");
		text = text.Replace("\r", "\n");
		text = text.Replace("\0", "\n");
		
		//this will let us quickly build the string to return
		StringBuilder builder = new StringBuilder();
		
		//split the text up into its separate lines
		string[] allLines = text.Split(new char[]{'\n'}, StringSplitOptions.RemoveEmptyEntries);
		
		// Filter out lines that only contain whitespaces
		List<string> nonEmptyLines = new List<string>();		
		foreach (string line in allLines)
		{
			//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;
			
			nonEmptyLines.Add(line);
		}
		
		for(int i = 0; i < nonEmptyLines.Count; i++)
		{
            string line = nonEmptyLines[i];
            
			//add the trimmed line to the StringBuilder
			builder.Append(line.Trim());
			
			// Append a space after each line, except after the last one
			if(i != allLines.Length)
			{
                builder.Append(" ");
			}
		}
		
		//paste the StringBuilder
		BFS.Clipboard.PasteText(builder.ToString());
		
		//tell ClipboardFusion to put the StringBuilder on the clipboard
		return builder.ToString();
	}
	
	//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;
	}
}