mediawiki leading spaces converter tokenizes the results by default
diff --git a/conf/converter.mediawiki.properties b/conf/converter.mediawiki.properties
index 74ed352..1acf64f 100644
--- a/conf/converter.mediawiki.properties
+++ b/conf/converter.mediawiki.properties
@@ -197,8 +197,6 @@
 ## want content formatting plugin output, use ContentFormattingTableParser

 Mediawiki.1509.table.xmlevent={tag}table,tr,td{class}com.atlassian.uwc.converters.xml.SimpleTableParser

 #Mediawiki.1509.table.xmlevent={tag}table,tr,td,th{class}com.atlassian.uwc.converters.xml.ContentFormattingTableParser

-## HTML: Parse the xml document

-Mediawiki.1590.xmlconverter.class=com.atlassian.uwc.converters.xml.XmlConverter

 ## Leading Spaces -> panel or noformat macros

 ## Set leading-spaces-noformat property to true if you want the output 

 ## to be noformat lines instead of one big panel macro. 

@@ -208,6 +206,8 @@
 Mediawiki.1600.leading-spaces-noformat.property=false

 #Mediawiki.1600.leading-spaces-delim.property=code

 Mediawiki.1600-ws2panel.class=com.atlassian.uwc.converters.mediawiki.LeadingSpacesConverter

+## HTML: Parse the xml document - _after_ the Leading spaces conversion

+Mediawiki.1690.xmlconverter.class=com.atlassian.uwc.converters.xml.XmlConverter

 ## For any tokenizer regex above, strip out tokens

 Mediawiki.2000-detokenize.class=com.atlassian.uwc.converters.DetokenizerConverter

 ## Do math last, after math tags are detokenized

diff --git a/src/com/atlassian/uwc/converters/BaseConverter.java b/src/com/atlassian/uwc/converters/BaseConverter.java
index 508ce9f..e0d2a2a 100644
--- a/src/com/atlassian/uwc/converters/BaseConverter.java
+++ b/src/com/atlassian/uwc/converters/BaseConverter.java
@@ -4,7 +4,9 @@
 

 import org.apache.log4j.Logger;

 

+import com.atlassian.uwc.converters.twiki.JavaRegexAndTokenizerConverter;

 import com.atlassian.uwc.ui.ConverterErrors;

+import com.atlassian.uwc.ui.Page;

 import com.atlassian.uwc.ui.listeners.FeedbackHandler;

 

 /**

@@ -107,4 +109,23 @@
     public void setProperties(Properties properties) {

     	this.properties = properties;

     }

+    

+    /**

+     * convenience method for tokenizing content within a converter

+     * @param input content to be search/replaced 

+     * @param value tokenization property value, same as in properties file. Looks like: 

+     * (<math>.*?<\\/math>){replace-multiline-with}$1

+     * @param type text describing the type of token, used in debug log messages

+     * @return tokenized content

+     */

+    public String tokenize(String input, String value, String type) {

+		Converter converter = JavaRegexAndTokenizerConverter.getConverter(value);

+		Page page = new Page(null);

+		page.setOriginalText(input);

+		converter.convert(page);

+		if (input != null && !input.equals(page.getConvertedText())) {

+			log.debug("Tokenized " + type + " content");

+		}

+		return page.getConvertedText();

+	}

 }

diff --git a/src/com/atlassian/uwc/converters/LeadingSpacesBaseConverter.java b/src/com/atlassian/uwc/converters/LeadingSpacesBaseConverter.java
index a3de079..07dff02 100644
--- a/src/com/atlassian/uwc/converters/LeadingSpacesBaseConverter.java
+++ b/src/com/atlassian/uwc/converters/LeadingSpacesBaseConverter.java
@@ -16,7 +16,7 @@
 	protected String initialspacedelim = " ";
 	private String newline = "\n";
 	private String noNewlines = "[^\n]+";
-	private String optNoSpace = "([^ ]?)";
+	private String optNoSpace = "(?=[^ ]?)";
 	private String leadingSpaceLine = "(" + initialspacedelim + noNewlines + newline + ")";
 	private String manyLeadingSpaceLines = "(" + leadingSpaceLine + "+)";
 	private String regex = "(?:\n|^)" + manyLeadingSpaceLines + optNoSpace;
@@ -49,8 +49,9 @@
 	
 	public String getReplacement(String delim, String enddelim) {
 		return "\n" + delim +
-				"\n$1" + enddelim + 
-				"\n$3";
+				"\n$1" + enddelim +
+				"\n";
+//				"\n$3";
 	}
 	
 	public String getReplacementLoopUtil(String delim, String enddelim) {
diff --git a/src/com/atlassian/uwc/converters/mediawiki/EscapeBracesConverter.java b/src/com/atlassian/uwc/converters/mediawiki/EscapeBracesConverter.java
index b522d77..5d3d7a3 100644
--- a/src/com/atlassian/uwc/converters/mediawiki/EscapeBracesConverter.java
+++ b/src/com/atlassian/uwc/converters/mediawiki/EscapeBracesConverter.java
@@ -37,16 +37,6 @@
 	private String tokenize(String input, String value) {
 		return tokenize(input, value, "");
 	}
-	private String tokenize(String input, String value, String type) {
-		Converter converter = JavaRegexAndTokenizerConverter.getConverter(value);
-		Page page = new Page(null);
-		page.setOriginalText(input);
-		converter.convert(page);
-		if (input != null && !input.equals(page.getConvertedText())) {
-			log.debug("EscapeBraces: tokenized " + type + " content");
-		}
-		return page.getConvertedText();
-	}
 
 	protected String tokenizeMath(String input) {
 		return tokenize(input, "(<math>.*?<\\/math>){replace-multiline-with}$1", "math");
diff --git a/src/com/atlassian/uwc/converters/mediawiki/LeadingSpacesConverter.java b/src/com/atlassian/uwc/converters/mediawiki/LeadingSpacesConverter.java
index 1eea214..9b9aee4 100644
--- a/src/com/atlassian/uwc/converters/mediawiki/LeadingSpacesConverter.java
+++ b/src/com/atlassian/uwc/converters/mediawiki/LeadingSpacesConverter.java
@@ -29,6 +29,8 @@
  *
  */
 public class LeadingSpacesConverter extends LeadingSpacesBaseConverter {
+	public static final String PROPKEY_TOKENIZE = "leading-spaces-tokenize";
+	private static final String DEFAULTVAL_TOKENIZE = "true";
 	Logger log = Logger.getLogger(this.getClass());
 	private Pattern leadingspaces = Pattern.compile("" +
 			"(?<=\n|^) +[^\n]+");
@@ -61,16 +63,40 @@
 			log.debug("leading spaces -> panel");
 			converted = convertLeadingSpacesReplaceAll(input, leadingSpacesPattern, getReplacement());
 		}
-		
+		if (shouldTokenize()) {
+			converted = tokenize(converted, getTokenizeRegex(), "leading spaces");
+		}
 		page.setConvertedText(converted);
 		log.debug("Converting Leading Spaces - complete");
 	}
+
+
+	private String getTokenizeRegex() {
+		return "(" +
+					"\\Q" + getDelimiter() + "\\E" +
+					".*?" +
+					"\\Q" + getDelimiter() + "\\E" +
+				")" +
+				"{replace-multiline-with}$1";
+	}
+
+
+	protected boolean shouldTokenize() {
+		return Boolean.parseBoolean(getProperties().getProperty(PROPKEY_TOKENIZE, DEFAULTVAL_TOKENIZE));
+	}
 	
 	
 	private String getReplacement() {
-		String delim = getProperties().getProperty("leading-spaces-delim", "panel");
+		String delim = getDelimiter();
 		log.debug("Leading spaces replacement delim: " + delim);
-		return getReplacement("{"+delim+"}");
+		return getReplacement(delim);
+	}
+
+
+	protected String getDelimiter() {
+		String delim = getProperties().getProperty("leading-spaces-delim", "panel");
+		delim = "{"+delim+"}";
+		return delim;
 	}
 
 }
diff --git a/src/com/atlassian/uwc/converters/mediawiki/LeadingSpacesConverterTest.java b/src/com/atlassian/uwc/converters/mediawiki/LeadingSpacesConverterTest.java
index ab349ca..f8d571c 100644
--- a/src/com/atlassian/uwc/converters/mediawiki/LeadingSpacesConverterTest.java
+++ b/src/com/atlassian/uwc/converters/mediawiki/LeadingSpacesConverterTest.java
@@ -1,6 +1,7 @@
 package com.atlassian.uwc.converters.mediawiki;
 
 import java.util.Properties;
+import java.util.Stack;
 
 import junit.framework.TestCase;
 
@@ -9,6 +10,7 @@
 
 import com.atlassian.uwc.converters.LeadingSpacesBaseConverter;
 import com.atlassian.uwc.ui.Page;
+import com.atlassian.uwc.util.TokenMap;
 
 public class LeadingSpacesConverterTest extends TestCase {
 
@@ -17,6 +19,10 @@
 	protected void setUp() throws Exception {
 		tester = new LeadingSpacesConverter();
 		PropertyConfigurator.configure("log4j.properties");
+		Properties properties = new Properties();
+		//old behavior for purposes of not having to update the tests
+		properties.setProperty(LeadingSpacesConverter.PROPKEY_TOKENIZE, "false"); 
+		tester.setProperties(properties);
 	}
 
 	public void testConvertPage() {
@@ -40,7 +46,7 @@
 	}
 	
 	public void testConvertPage_codedelim() {
-		Properties props = new Properties();
+		Properties props = tester.getProperties();
 		props.setProperty("leading-spaces-delim", "code");
 		tester.setProperties(props);
 		String input, expected, actual;
@@ -64,7 +70,7 @@
 	
 
 	public void testConvertPage_startsatbeginning() {
-		Properties props = new Properties();
+		Properties props = tester.getProperties();
 		props.setProperty("leading-spaces-delim", "code");
 		tester.setProperties(props);
 		String input, expected, actual;
@@ -101,7 +107,7 @@
 	}
 	
 	public void testIgnoreListsWithBold() {
-		Properties props = new Properties();
+		Properties props = tester.getProperties();
 		props.setProperty("leading-spaces-delim", "code");
 		props.setProperty("leading-spaces-noformat", "false");
 		tester.setProperties(props);
@@ -122,4 +128,77 @@
 		assertEquals(expected, actual);
 	}
 	
+	public void testConvertPage_tokenized() {
+		tester.getProperties().clear(); //is same as: props.setProperty(LeadingSpacesConverter.PROPKEY_TOKENIZE, "true"); \
+		Properties props = tester.getProperties();
+		props.setProperty("leading-spaces-delim", "code");
+
+		tester.setProperties(props);
+		String input, expected, actual;
+		input = "  abc\n" +
+				"  def\n";
+		String startswith = "\n" + 
+						"~UWCTOKENSTART~";
+		String endswith = "~UWCTOKENEND~\n";
+		Page page = new Page(null);
+		page.setOriginalText(input);
+		page.setConvertedText(input);
+		tester.convert(page);
+		actual = page.getConvertedText();
+		assertNotNull(actual);
+		assertTrue(actual, actual.startsWith(startswith));
+		assertTrue(actual, actual.endsWith(endswith));
+		
+		expected = "\n" +
+				"{code}\n" +
+				"  abc\n" +
+				"  def\n" +
+				"{code}\n";
+		Stack<String> keys = TokenMap.getKeys();
+		assertNotNull(keys);
+		assertFalse(keys.isEmpty());
+		String detokenizeText = TokenMap.detokenizeText(actual);
+		assertNotNull(actual);
+		assertEquals(expected, detokenizeText);
+	}
+	public void testConvertPage_problem1() {
+		Properties props = tester.getProperties();
+		props.setProperty("leading-spaces-delim", "code");
+		tester.setProperties(props);
+		String input, expected, actual;
+		input = "Tralala\n" + 
+				"\n" + 
+				" asldkjas: http://lakdjlaskjd/\n" + 
+				" aslkdjasd:  http://amsdkjahsd/\n" + 
+				"\n" + 
+				" <problem>\n" + 
+				" \n" + 
+				"  <ok>\n" + 
+				"  </ok>\n" + 
+				"";
+		expected = "Tralala\n" + 
+				"\n" + 
+				"{code}\n" + 
+				" asldkjas: http://lakdjlaskjd/\n" + 
+				" aslkdjasd:  http://amsdkjahsd/\n" + 
+				"{code}\n" + 
+				"\n" + 
+				"{code}\n" + 
+				" <problem>\n" + 
+				"{code}\n" + 
+				" \n" + 
+				"{code}\n" + 
+				"  <ok>\n" + 
+				"  </ok>\n" + 
+				"{code}\n" + 
+				"";
+		Page page = new Page(null);
+		page.setOriginalText(input);
+		page.setConvertedText(input);
+		tester.convert(page);
+		actual = page.getConvertedText();
+		assertNotNull(actual);
+		assertEquals(expected, actual);
+	}
+	
 }