@@ -8,37 +8,38 @@ namespace CSharpMath.Rendering {
8
8
using Structures ;
9
9
using static Structures . Result ;
10
10
public static class TextBuilder {
11
- /* //Paste this into the C# Interactive, fill <username> yourself
11
+ /* //Paste this into the C# Interactive, fill <username> yourself
12
12
#r "C:/Users/<username>/source/repos/CSharpMath/Typography/Build/NetStandard/Typography.TextBreak/bin/Debug/netstandard1.3/Typography.TextBreak.dll"
13
13
using Typography.TextBreak;
14
14
(int, WordKind, char)[] BreakText(string text) {
15
- var breaker = new CustomBreaker();
16
- var breakList = new List<BreakAtInfo>();
17
- breaker.BreakWords(text);
18
- breaker.LoadBreakAtList(breakList);
19
- //index is after the boundary -> last one will be out of range
20
- return breakList.Select(i => (i.breakAt, i.wordKind, text.ElementAtOrDefault(i.breakAt))).ToArray();
15
+ var breaker = new CustomBreaker();
16
+ var breakList = new List<BreakAtInfo>();
17
+ breaker.BreakWords(text);
18
+ breaker.LoadBreakAtList(breakList);
19
+ //index is after the boundary -> last one will be out of range
20
+ return breakList.Select(i => (i.breakAt, i.wordKind, text.ElementAtOrDefault(i.breakAt))).ToArray();
21
21
}
22
22
BreakText(@"Here are some text $1 + 12 \frac23 \sqrt4$ $$Display$$ text")
23
- */
24
- /* //Version 2
23
+ */
24
+ /* //Version 2
25
25
#r "C:/Users/<username>/source/repos/CSharpMath/Typography/Build/NetStandard/Typography.TextBreak/bin/Debug/netstandard1.3/Typography.TextBreak.dll"
26
26
using Typography.TextBreak;
27
27
string BreakText(string text, string seperator = "|")
28
28
{
29
- var breaker = new CustomBreaker();
30
- var breakList = new List<BreakAtInfo>();
31
- breaker.BreakWords(text);
32
- breaker.LoadBreakAtList(breakList);
33
- //reverse to ensure earlier inserts do not affect later ones
34
- foreach (var @break in breakList.Select(i => i.breakAt).Reverse())
35
- text = text.Insert(@break, seperator);
36
- return text;
29
+ var breaker = new CustomBreaker();
30
+ var breakList = new List<BreakAtInfo>();
31
+ breaker.BreakWords(text);
32
+ breaker.LoadBreakAtList(breakList);
33
+ //reverse to ensure earlier inserts do not affect later ones
34
+ foreach (var @break in breakList.Select(i => i.breakAt).Reverse())
35
+ text = text.Insert(@break, seperator);
36
+ return text;
37
37
}
38
38
BreakText(@"Here are some text $1 + 12 \frac23 \sqrt4$ $$Display$$ text")
39
- */
40
- public static Result < TextAtom > Build ( string text , bool enhancedColors ) {
41
- if ( string . IsNullOrEmpty ( text ) ) return new TextAtom . List ( Array . Empty < TextAtom > ( ) , 0 ) ;
39
+ */
40
+ public static bool NoEnhancedColors { get ; set ; }
41
+ public static Result < TextAtom > Build ( string latex ) {
42
+ if ( string . IsNullOrEmpty ( latex ) ) return new TextAtom . List ( Array . Empty < TextAtom > ( ) , 0 ) ;
42
43
bool ? displayMath = null ;
43
44
StringBuilder mathLaTeX = null ;
44
45
bool backslashEscape = false ;
@@ -47,7 +48,7 @@ public static Result<TextAtom> Build(string text, bool enhancedColors) {
47
48
var atoms = new TextAtomListBuilder ( ) ;
48
49
var breaker = new CustomBreaker ( ) ;
49
50
var breakList = new List < BreakAtInfo > ( ) ;
50
- breaker . BreakWords ( text , false ) ;
51
+ breaker . BreakWords ( latex , false ) ;
51
52
breaker . LoadBreakAtList ( breakList ) ;
52
53
Result CheckDollarCount ( ) {
53
54
switch ( dollarCount ) {
@@ -93,7 +94,7 @@ Result CheckDollarCount() {
93
94
return Ok ( ) ;
94
95
}
95
96
( int startAt , int endAt , char endingChar , WordKind wordKind ) ObtainRange ( int i ) =>
96
- ( i == 0 ? 0 : breakList [ i - 1 ] . breakAt , breakList [ i ] . breakAt , text [ breakList [ i ] . breakAt - 1 ] , breakList [ i ] . wordKind ) ;
97
+ ( i == 0 ? 0 : breakList [ i - 1 ] . breakAt , breakList [ i ] . breakAt , latex [ breakList [ i ] . breakAt - 1 ] , breakList [ i ] . wordKind ) ;
97
98
for ( var i = 0 ; i < breakList . Count ; i ++ ) {
98
99
var ( startAt , endAt , endingChar , wordKind ) = ObtainRange ( i ) ;
99
100
bool SetNextRange ( ) {
@@ -105,7 +106,7 @@ Result<string> ReadArgument() {
105
106
afterCommand = false ;
106
107
if ( ! SetNextRange ( ) ) return Err ( "Missing argument" ) ;
107
108
if ( endingChar != '{' ) {
108
- var toReturn = text [ startAt ] . ToString ( ) ;
109
+ var toReturn = latex [ startAt ] . ToString ( ) ;
109
110
#warning Not one char only, should skip spaces then read next char, and it is a possible command
110
111
//range contains one char only
111
112
if ( startAt == endAt )
@@ -116,14 +117,14 @@ Result<string> ReadArgument() {
116
117
}
117
118
int endingIndex = - 1 ;
118
119
//startAt + 1 to not start at the { we started at
119
- for ( int j = startAt + 1 , bracketDepth = 0 ; j < text . Length ; j ++ ) {
120
- if ( text [ j ] == '{' ) bracketDepth ++ ;
121
- else if ( text [ j ] == '}' )
120
+ for ( int j = startAt + 1 , bracketDepth = 0 ; j < latex . Length ; j ++ ) {
121
+ if ( latex [ j ] == '{' ) bracketDepth ++ ;
122
+ else if ( latex [ j ] == '}' )
122
123
if ( bracketDepth > 0 ) bracketDepth -- ;
123
124
else { endingIndex = j ; break ; }
124
125
}
125
126
if ( endingIndex == - 1 ) return Err ( "Missing }" ) ;
126
- var resultText = text . Substring ( endAt , endingIndex - endAt ) ;
127
+ var resultText = latex . Substring ( endAt , endingIndex - endAt ) ;
127
128
while ( startAt < endingIndex )
128
129
_ = SetNextRange ( ) ; //this never fails because the above check
129
130
return Ok ( resultText ) ;
@@ -143,7 +144,7 @@ Result<string> ReadArgument() {
143
144
144
145
//Normal unescaped text section, could be in display/inline math mode
145
146
if ( ! backslashEscape ) {
146
- var textSection = text . Substring ( startAt , endAt - startAt ) ;
147
+ var textSection = latex . Substring ( startAt , endAt - startAt ) ;
147
148
switch ( endingChar ) {
148
149
case '$' :
149
150
throw new InvalidCodePathException ( "The $ case should have been accounted for." ) ;
@@ -223,7 +224,7 @@ Result<string> ReadArgument() {
223
224
}
224
225
break ;
225
226
default :
226
- mathLaTeX . Append ( $@ "\{ text . Substring ( startAt , endAt - startAt ) } ") ;
227
+ mathLaTeX . Append ( $@ "\{ latex . Substring ( startAt , endAt - startAt ) } ") ;
227
228
break ;
228
229
}
229
230
backslashEscape = false ;
@@ -232,7 +233,7 @@ Result<string> ReadArgument() {
232
233
233
234
//Escaped text section and not in inline/display math mode
234
235
afterCommand = true ;
235
- switch ( text . Substring ( startAt , endAt - startAt ) ) {
236
+ switch ( latex . Substring ( startAt , endAt - startAt ) ) {
236
237
case "(" :
237
238
mathLaTeX = new StringBuilder ( ) ;
238
239
displayMath = false ;
@@ -273,7 +274,7 @@ Result<string> ReadArgument() {
273
274
Ok ( parsedResult ) :
274
275
Err ( "Invalid font size" )
275
276
) . Bind (
276
- ReadArgument ( ) . Bind ( resizedContent => Build ( resizedContent , enhancedColors ) ) ,
277
+ ReadArgument ( ) . Bind ( Build ) ,
277
278
( fontSize , resizedContent ) =>
278
279
atoms . Add ( resizedContent , fontSize , "fontsize" . Length )
279
280
) . Error is string error
@@ -282,24 +283,24 @@ Result<string> ReadArgument() {
282
283
}
283
284
case "color" : {
284
285
if ( ReadArgument ( ) . Bind ( color =>
285
- Color . Create ( color , enhancedColors ) is Color value ?
286
+ Color . Create ( color , ! NoEnhancedColors ) is Color value ?
286
287
Ok ( value ) :
287
288
Err ( "Invalid color" )
288
289
) . Bind (
289
- ReadArgument ( ) . Bind ( coloredContent => Build ( coloredContent , enhancedColors ) ) ,
290
+ ReadArgument ( ) . Bind ( Build ) ,
290
291
( color , coloredContent ) =>
291
292
atoms . Add ( coloredContent , color , "color" . Length )
292
293
) . Error is string error
293
294
) return error ;
294
295
break ;
295
296
}
296
297
//case "red", "yellow", ...
297
- case var shortColor when enhancedColors && Color . PredefinedColors . Contains ( shortColor ) : {
298
- if ( Ok ( Color . Create ( shortColor , enhancedColors ) ??
298
+ case var shortColor when ! NoEnhancedColors && Color . PredefinedColors . Contains ( shortColor ) : {
299
+ if ( Ok ( Color . Create ( shortColor , ! NoEnhancedColors ) ??
299
300
throw new InvalidCodePathException (
300
301
"This case's condition should have checked the validity of shortColor." )
301
302
) . Bind (
302
- ReadArgument ( ) . Bind ( coloredContent => Build ( coloredContent , enhancedColors ) ) ,
303
+ ReadArgument ( ) . Bind ( Build ) ,
303
304
( color , coloredContent ) =>
304
305
atoms . Add ( coloredContent , color , shortColor . Length )
305
306
) . Error is string error
@@ -309,7 +310,7 @@ Result<string> ReadArgument() {
309
310
//case "textbf", "textit", ...
310
311
case var command when ! command . Contains ( "math" ) && FontStyleExtensions . FontStyles . TryGetByFirst ( command . Replace ( "text" , "math" ) , out var fontStyle ) : {
311
312
if ( ReadArgument ( )
312
- . Bind ( content => Build ( content , enhancedColors ) )
313
+ . Bind ( Build )
313
314
. Bind ( builtContent => atoms . Add ( builtContent , fontStyle , command . Length ) )
314
315
. Error is string error )
315
316
return error ;
0 commit comments