The MarkdownBlocks class is a collection of static methods that can be used to get syntax highlighting for Markdown code-blocks.

You might notice this class is a bit different from the other Markdown classes, as its methods are fully editable. This is because i cant just make syntax highlighters for every single language, but you can help with some that i dont knw and you are :)

How to implement a syntax parser.

For this example, Ill use Haxe:

Lets say you wanted to give haxe syntax highlighting, but you discover its not supported and the text remains in a single color. how do you fix that?

first, make sure the language exists on the class. you can look at the file/try autocompletion for that

second, you make a syntax parser of your own. i recommand working with this template:

 using texter.general.TextTools;

 function parseLanguage(text) {
  	var interp:Array<{color:Int, start:Int, end:Int}> = [];
		var indexOfKeyColor1 = text.indexesFromEReg(~/(?: |\n|^)(keywords|that|need|to|be|colored|blue)/m),
		indexOfKeyColor2 = text.indexesFromArray([ "You", "can", "also", "add", "words", "with", "an", "array"]), 
		indexOfFunctionName = text.indexesFromEReg(~/([a-zA-Z_]+)\(/m), //detects function syntax, camal/snake/Title case
		indexOfClassName = text.indexesFromEReg(~/(?:\(| |\n|^)[A-Z]+[a-z]+/m), // detects Title Case
		indexOfString = text.indexesFromEReg(~/"[^"]*"|'[^']*'/), // detects "" and ''
		indexOfNumbers = text.indexesFromArray(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]),
		indexOfComment = text.indexesFromEReg(~/\/\/[^\n]*|\/\*[^]*?\*\//m); // detects //

		//add the indexes to the interp array
		for (i in indexOfFunctionName) 	interp.push({color: customColor1, start: i.startIndex, end: i.endIndex - 1}); //dont coint the last (
		for (i in indexOfKeyColor1) 	interp.push({color: customColor2, start: i.startIndex + 1, end: i.endIndex}); //dont count the first char, its not related.
		for (i in indexOfClassName) 	interp.push({color: customColor3, start: i.startIndex, end: i.endIndex});
		for (i in indexOfKeyColor2) 	interp.push({color: customColor4, start: i.startIndex + 1, end: i.endIndex}); //dont count the first char, its not related.
		for (i in indexOfString) 		interp.push({color: customColor5, start: i.startIndex, end: i.endIndex});
		for (i in indexOfNumbers) 		interp.push({color: customColor6, start: i.startIndex, end: i.endIndex});
		for (i in indexOfComments) 		interp.push({color: customColor7, start: i.startIndex, end: i.endIndex});
		for (i in indexOfConditionals) 	interp.push({color: customColor8, start: i.startIndex, end: i.endIndex});
		return interp;
 }

What do i do here:

  • Im getting all of the special syntax - functions, classes, keywords, strings, numbers, comments, etc.
  • I differentiate between the different types of syntax, so i can color them differently.
  • I add the indexes to the interp array, each one with a unique start & end index.
  • I return the interp array.

After that, i just assign this function to the correct language, in our case its haxe:

MarkdownBlocks.parseHaxe = parseLanguage;

Static variables

@:value(["json" => parseJSON, "haxe" => parseHaxe, "hx" => parseHaxe, "c" => parseC, "cpp" => parseCPP, "csharp" => parseCSharp, "cs" => parseCSharp, "java" => parseJava, "js" => parseJS, "php" => parsePHP, "python" => parsePython, "ruby" => parseRuby, "sql" => parseSQL, "xml" => parseXML, "yaml" => parseYAML, "html" => parseHTML, "css" => parseCSS, "ocaml" => parseOCaml, "ts" => parseTS, "go" => parseGo, "kotlin" => parseKotlin, "rust" => parseRust, "scala" => parseScala, "swift" => parseSwift, "typescript" => parseTS, "lua" => parseLua, "haskell" => parseHaskell, "erlang" => parseErlang, "elixir" => parseElixir, "elm" => parseElm, "clojure" => parseClojure, "crystal" => parseCrystal, "dart" => parseDart, "golang" => parseGo, "assembly" => parseAssembly, "vb" => parseVB, "basic" => parseBasic, "vhdl" => parseVHDL, "wasm" => parseWASM, "solidity" => parseSolidity, "cmake" => parseCMake, "default" => parseDefault])staticread onlyblockSyntaxMap:Map<String, String ‑> Array<{start:Int, end:Int, color:Int}>> = ["json" => parseJSON, "haxe" => parseHaxe, "hx" => parseHaxe, "c" => parseC, "cpp" => parseCPP, "csharp" => parseCSharp, "cs" => parseCSharp, "java" => parseJava, "js" => parseJS, "php" => parsePHP, "python" => parsePython, "ruby" => parseRuby, "sql" => parseSQL, "xml" => parseXML, "yaml" => parseYAML, "html" => parseHTML, "css" => parseCSS, "ocaml" => parseOCaml, "ts" => parseTS, "go" => parseGo, "kotlin" => parseKotlin, "rust" => parseRust, "scala" => parseScala, "swift" => parseSwift, "typescript" => parseTS, "lua" => parseLua, "haskell" => parseHaskell, "erlang" => parseErlang, "elixir" => parseElixir, "elm" => parseElm, "clojure" => parseClojure, "crystal" => parseCrystal, "dart" => parseDart, "golang" => parseGo, "assembly" => parseAssembly, "vb" => parseVB, "basic" => parseBasic, "vhdl" => parseVHDL, "wasm" => parseWASM, "solidity" => parseSolidity, "cmake" => parseCMake, "default" => parseDefault]

Static methods

staticdynamicparseAssembly(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseBasic(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseC(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseCMake(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseCPP(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseCSS(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseCSharp(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseClojure(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseCrystal(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseDart(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseDefault(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseElixir(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseElm(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseErlang(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseFlash(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseGo(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseHTML(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseHaskell(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseHaxe(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseJS(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseJSON(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseJava(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseKotlin(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseLisp(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseLua(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseOCaml(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparsePHP(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparsePerl(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparsePython(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseR(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseRuby(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseRust(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseSCSS(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseSQL(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseScala(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseSolidity(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseSwift(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseTS(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseVB(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseVHDL(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseVue(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseWASM(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseXAML(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseXML(text:String):Array<{start:Int, end:Int, color:Int}>

staticdynamicparseYAML(text:String):Array<{start:Int, end:Int, color:Int}>