Skip to content

Commit 5ef30b9

Browse files
getHelpAsCsv, getHelpAsHtmlTable, getHelpAsMarkdownTable, getHelpAsJason: #277, #276, #275, #274
1 parent e519ec5 commit 5ef30b9

File tree

20 files changed

+8113
-374
lines changed

20 files changed

+8113
-374
lines changed

CURRENT/c-sharp/src/org/mariuszgromada/math/mxparser/Expression.cs

Lines changed: 314 additions & 28 deletions
Large diffs are not rendered by default.

CURRENT/c-sharp/src/org/mariuszgromada/math/mxparser/ExpressionUtils.cs

Lines changed: 343 additions & 84 deletions
Large diffs are not rendered by default.

CURRENT/c-sharp/src/org/mariuszgromada/math/mxparser/StringInvariant.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* @(#)StringInvariant.cs 5.2.0 2022-12-23
2+
* @(#)StringInvariant.cs 5.2.0 2023-01-17
33
*
44
* MathParser.org-mXparser DUAL LICENSE AGREEMENT as of date 2022-05-22
55
* The most up-to-date license is available at the below link:
@@ -221,6 +221,8 @@ internal sealed class StringInvariant {
221221
internal static readonly String RIGHT_SQUARE_BRACKET_SPACE = RIGHT_SQUARE_BRACKET + SPACE;
222222
internal const String LEFT_BRACKET = "(";
223223
internal const String RIGHT_BRACKET = ")";
224+
internal const String LEFT_CURLY_BRACKET = "{";
225+
internal const String RIGHT_CURLY_BRACKET = "}";
224226
internal const String EQUAL = "=";
225227
internal static readonly String SPACE_EQUAL_SPACE = SPACE + EQUAL + SPACE;
226228
internal const String COLON = ":";

CURRENT/c-sharp/src/org/mariuszgromada/math/mxparser/StringResources.cs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* @(#)StringResources.cs 5.2.0 2023-01-08
2+
* @(#)StringResources.cs 5.2.0 2023-01-17
33
*
44
* MathParser.org-mXparser DUAL LICENSE AGREEMENT as of date 2022-05-22
55
* The most up-to-date license is available at the below link:
@@ -302,7 +302,6 @@ public class StringResources {
302302
internal const String DEFAULT_EXITING = "Exiting.";
303303
internal const String DEFAULT_DONE = "done.";
304304
// -------------------------------------------------
305-
internal const String DEFAULT_HELP_CONTENT = "Help content";
306305
internal const String DEFAULT_KEYWORD = "Keyword";
307306
internal const String DEFAULT_SYNTAX = "Syntax";
308307
internal const String DEFAULT_NUMBER = "Number";
@@ -342,6 +341,10 @@ public class StringResources {
342341
internal const String DEFAULT_USER_DEFINED_FUNCTION = "User defined function";
343342
internal const String DEFAULT_USER_DEFINED_RECURSIVE_ARGUMENT = "User defined recursive argument";
344343
// -------------------------------------------------
344+
internal const String DEFAULT_HELP_CONTENT_LIMITED_TO_QUERY = "Help content limited to query";
345+
internal const String DEFAULT_ALL_HELP_CONTENT = "All help content.";
346+
internal const String DEFAULT_CAPTION = "Caption";
347+
// -------------------------------------------------
345348
internal static readonly String DEFAULT_WARNING_BINARY_SERIALIZATION_SECURITY_RISKS = "SECURITY WARNING:" + StringInvariant.NEW_LINE
346349
+ "Deserializing data from an untrusted source can introduce security vulnerabilities" + StringInvariant.NEW_LINE
347350
+ "to your application. Depending on the settings used during deserialization," + StringInvariant.NEW_LINE
@@ -1137,10 +1140,6 @@ public class StringResources {
11371140
*/
11381141
public String DONE = DEFAULT_DONE;
11391142
// -------------------------------------------------
1140-
/**
1141-
* Default String = "Help content"
1142-
*/
1143-
public String HELP_CONTENT = DEFAULT_HELP_CONTENT;
11441143
/**
11451144
* Default String = "Keyword"
11461145
*/
@@ -1285,6 +1284,19 @@ public class StringResources {
12851284
*/
12861285
public String USER_DEFINED_RECURSIVE_ARGUMENT = DEFAULT_USER_DEFINED_RECURSIVE_ARGUMENT;
12871286
// -------------------------------------------------
1287+
/**
1288+
* Default String = "Help content limited to query"
1289+
*/
1290+
public String HELP_CONTENT_LIMITED_TO_QUERY = DEFAULT_HELP_CONTENT_LIMITED_TO_QUERY;
1291+
/**
1292+
* Default String = "All help content."
1293+
*/
1294+
public String ALL_HELP_CONTENT = DEFAULT_ALL_HELP_CONTENT;
1295+
/**
1296+
* Default String = "Caption"
1297+
*/
1298+
public String CAPTION = DEFAULT_CAPTION;
1299+
// -------------------------------------------------
12881300
/**
12891301
* Default String = "Deserializing data from an untrusted source can introduce security vulnerabilities to your application."
12901302
*/
@@ -2988,7 +3000,6 @@ private static void printCurrentVsDefault(String nameStr, String currentValue, S
29883000
}
29893001
currentValueNew = quoteString(currentValue);
29903002
StringUtils.consolePrintln(nameStr + " = [VAL]" + currentValueNew + " [DEF]" + defaultValueNew);
2991-
return;
29923003
}
29933004
private static void printResources(StringResources stringResources, bool printDefault) {
29943005
printCurrentVsDefault("USER_LANGUAGE", stringResources.USER_LANGUAGE, DEFAULT_USER_LANGUAGE, printDefault);
@@ -3090,7 +3101,6 @@ private static void printResources(StringResources stringResources, bool printDe
30903101
printCurrentVsDefault("EXITING", stringResources.EXITING, DEFAULT_EXITING, printDefault);
30913102
printCurrentVsDefault("DONE", stringResources.DONE, DEFAULT_DONE, printDefault);
30923103
StringUtils.consolePrintln("// -------------------------------------------------");
3093-
printCurrentVsDefault("HELP_CONTENT", stringResources.HELP_CONTENT, DEFAULT_HELP_CONTENT, printDefault);
30943104
printCurrentVsDefault("KEYWORD", stringResources.KEYWORD, DEFAULT_KEYWORD, printDefault);
30953105
printCurrentVsDefault("SYNTAX", stringResources.SYNTAX, DEFAULT_SYNTAX, printDefault);
30963106
printCurrentVsDefault("NUMBER", stringResources.NUMBER, DEFAULT_NUMBER, printDefault);
@@ -3130,6 +3140,10 @@ private static void printResources(StringResources stringResources, bool printDe
31303140
printCurrentVsDefault("USER_DEFINED_FUNCTION", stringResources.USER_DEFINED_FUNCTION, DEFAULT_USER_DEFINED_FUNCTION, printDefault);
31313141
printCurrentVsDefault("USER_DEFINED_RECURSIVE_ARGUMENT", stringResources.USER_DEFINED_RECURSIVE_ARGUMENT, DEFAULT_USER_DEFINED_RECURSIVE_ARGUMENT, printDefault);
31323142
StringUtils.consolePrintln("// -------------------------------------------------");
3143+
printCurrentVsDefault("HELP_CONTENT_LIMITED_TO_QUERY", stringResources.HELP_CONTENT_LIMITED_TO_QUERY, DEFAULT_HELP_CONTENT_LIMITED_TO_QUERY, printDefault);
3144+
printCurrentVsDefault("ALL_HELP_CONTENT", stringResources.ALL_HELP_CONTENT, DEFAULT_ALL_HELP_CONTENT, printDefault);
3145+
printCurrentVsDefault("CAPTION", stringResources.CAPTION, DEFAULT_CAPTION, printDefault);
3146+
StringUtils.consolePrintln("// -------------------------------------------------");
31333147
printCurrentVsDefault("WARNING_BINARY_SERIALIZATION_SECURITY_RISKS", stringResources.WARNING_BINARY_SERIALIZATION_SECURITY_RISKS, DEFAULT_WARNING_BINARY_SERIALIZATION_SECURITY_RISKS, printDefault);
31343148
StringUtils.consolePrintln("// -------------------------------------------------");
31353149
printCurrentVsDefault("BINARY_RELATION", stringResources.BINARY_RELATION, DEFAULT_BINARY_RELATION, printDefault);

CURRENT/c-sharp/src/org/mariuszgromada/math/mxparser/StringUtils.cs

Lines changed: 251 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* @(#)StringUtils.cs 5.2.0 2023-01-07
2+
* @(#)StringUtils.cs 5.2.0 2023-01-17
33
*
44
* MathParser.org-mXparser DUAL LICENSE AGREEMENT as of date 2022-05-22
55
* The most up-to-date license is available at the below link:
@@ -180,6 +180,7 @@
180180
*/
181181
using System;
182182
using System.Globalization;
183+
using System.Text;
183184
using System.Text.RegularExpressions;
184185
using org.mariuszgromada.math.mxparser;
185186

@@ -461,6 +462,243 @@ internal static void consolePrintln() {
461462
}
462463
internal static void consolePrintln(Object o) {
463464
mXparser.consoleWriteLine(o);
465+
}
466+
internal static String cleanForHtml(String text) {
467+
return text.Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;");
468+
}
469+
internal static String cleanForMarkdown(String text) {
470+
return text.Replace("\\", "\\\\").Replace("|", "\\|");
471+
}
472+
internal static String cleanForJson(String text) {
473+
return text.Replace("\\", "\\\\");
474+
}
475+
internal static void stringBuilderPartsAppend(StringBuilder stringBuilder, params String[] partsToAppend) {
476+
foreach (String part in partsToAppend) {
477+
stringBuilder.Append(part);
478+
}
479+
}
480+
internal static void stringBuilderLinesAppend(StringBuilder stringBuilder, params String[] linesToAppend) {
481+
foreach (String line in linesToAppend) {
482+
stringBuilder.Append(line);
483+
stringBuilder.Append(StringInvariant.NEW_LINE);
484+
}
485+
}
486+
internal static void stringBuilderPartsAppendDelimited(
487+
String partTagLeft
488+
,String partTagRight
489+
,String delimiter
490+
,bool clearForHtml
491+
,bool clearForMarkdown
492+
,bool clearForJson
493+
,StringBuilder stringBuilder
494+
,params String[] partsToAppend
495+
) {
496+
int n = 0;
497+
foreach (String part in partsToAppend) {
498+
n++;
499+
if (n > 1) stringBuilder.Append(delimiter);
500+
stringBuilder.Append(partTagLeft);
501+
502+
String partFinal = part;
503+
if (clearForHtml)
504+
partFinal = cleanForHtml(partFinal);
505+
if (clearForMarkdown)
506+
partFinal = cleanForMarkdown(partFinal);
507+
508+
if (clearForJson)
509+
partFinal = cleanForJson(partFinal);
510+
511+
stringBuilder.Append(partFinal);
512+
513+
stringBuilder.Append(partTagRight);
514+
}
515+
}
516+
internal static void stringBuilderPartsAppendDelimited(String partQuote, String delimiter, StringBuilder stringBuilder, params String[] partsToAppend) {
517+
stringBuilderPartsAppendDelimited(partQuote, partQuote, delimiter, false, false, false, stringBuilder, partsToAppend);
518+
}
519+
internal static void stringBuilderPartsAppendDelimitedRow(
520+
String partTagLeft
521+
,String partTagRight
522+
,String delimiter
523+
,String rowBeforeTag
524+
,String rowAfterTag
525+
,bool clearForHtml
526+
,bool clearForMarkdown
527+
,bool clearForJson
528+
,StringBuilder stringBuilder
529+
,params String[] partsToAppend
530+
) {
531+
bool tagBefore = rowBeforeTag == null || rowBeforeTag.Length > 0;
532+
bool tagAfter = rowAfterTag == null || rowAfterTag.Length > 0;
533+
534+
if (tagBefore) stringBuilder.Append(rowBeforeTag);
535+
stringBuilderPartsAppendDelimited(partTagLeft, partTagRight, delimiter, clearForHtml, clearForMarkdown, clearForJson, stringBuilder, partsToAppend);
536+
if (tagAfter) stringBuilder.Append(rowAfterTag);
537+
}
538+
internal static void stringBuilderPartsAppendDelimitedRow(
539+
String partQuote
540+
,String delimiter
541+
,bool newLineBefore
542+
,bool clearForHtml
543+
,bool clearForMarkdown
544+
,bool clearForJson
545+
,StringBuilder stringBuilder
546+
,params String[] partsToAppend
547+
) {
548+
if (newLineBefore)
549+
stringBuilderPartsAppendDelimitedRow(partQuote, partQuote, delimiter, StringInvariant.NEW_LINE, "", clearForHtml, clearForMarkdown, clearForJson, stringBuilder, partsToAppend);
550+
else
551+
stringBuilderPartsAppendDelimitedRow(partQuote, partQuote, delimiter, "", "", clearForHtml, clearForMarkdown, clearForJson, stringBuilder, partsToAppend);
552+
}
553+
internal static void stringBuilderPartsAppendDelimitedRow(
554+
String partQuote
555+
,String delimiter
556+
,bool newLineBefore
557+
,StringBuilder stringBuilder
558+
,params String[] partsToAppend
559+
) {
560+
stringBuilderPartsAppendDelimitedRow(partQuote, delimiter, newLineBefore, false, false, false, stringBuilder, partsToAppend);
561+
}
562+
563+
private const String HTML_TD_START_TAG = "<td>";
564+
private const String HTML_TD_END_TAG = "</td>";
565+
private const String HTML_TH_START_TAG = "<th>";
566+
private const String HTML_TH_END_TAG = "</th>";
567+
private const String HTML_TR_START_TAG = "<tr>";
568+
private static readonly String HTML_TR_END_TAG = "</tr>" + StringInvariant.NEW_LINE;
569+
570+
internal static void stringBuilderPartsAppendHtmlTableRow(StringBuilder stringBuilder, params String[] partsToAppend) {
571+
stringBuilderPartsAppendDelimitedRow(
572+
HTML_TD_START_TAG
573+
,HTML_TD_END_TAG
574+
,StringInvariant.EMPTY
575+
, HTML_TR_START_TAG
576+
,HTML_TR_END_TAG
577+
,true
578+
,false
579+
,false
580+
,stringBuilder
581+
,partsToAppend
582+
);
583+
}
584+
585+
internal static void stringBuilderPartsAppendHtmlTableHead(StringBuilder stringBuilder, params String[] partsToAppend) {
586+
stringBuilderPartsAppendDelimitedRow(
587+
HTML_TH_START_TAG
588+
,HTML_TH_END_TAG
589+
,StringInvariant.EMPTY
590+
,HTML_TR_START_TAG
591+
,HTML_TR_END_TAG
592+
,true
593+
,false
594+
,false
595+
,stringBuilder
596+
,partsToAppend);
597+
}
598+
private const String MARKDOWN_DELIMITER = "|";
599+
private const String MARKDOWN_ROW_BEFORE_TAG = "|";
600+
private static readonly String MARKDOWN_ROW_AFTER_TAG = "|" + StringInvariant.NEW_LINE;
601+
private const String MARKDOWN_HEADER_TAG = "---";
602+
internal static void stringBuilderPartsAppendMarkdownTableRow(StringBuilder stringBuilder, params String[] partsToAppend) {
603+
stringBuilderPartsAppendDelimitedRow(
604+
StringInvariant.EMPTY
605+
,StringInvariant.EMPTY
606+
,MARKDOWN_DELIMITER
607+
,MARKDOWN_ROW_BEFORE_TAG
608+
,MARKDOWN_ROW_AFTER_TAG
609+
,false
610+
,true
611+
,false
612+
,stringBuilder
613+
,partsToAppend
614+
);
615+
}
616+
617+
internal static void stringBuilderPartsAppendMarkdownTableHead(bool addHeader, StringBuilder stringBuilder, params String[] partsToAppend) {
618+
if (!addHeader) {
619+
String[] mdTableEmptyHeader = new String[partsToAppend.Length];
620+
for (int i = 0; i < mdTableEmptyHeader.Length; i++)
621+
mdTableEmptyHeader[i] = " ";
622+
stringBuilderPartsAppendDelimitedRow(
623+
StringInvariant.EMPTY
624+
,StringInvariant.EMPTY
625+
,MARKDOWN_DELIMITER
626+
,MARKDOWN_ROW_BEFORE_TAG
627+
,MARKDOWN_ROW_AFTER_TAG
628+
,false
629+
,false
630+
,false
631+
,stringBuilder
632+
,mdTableEmptyHeader
633+
);
634+
} else
635+
stringBuilderPartsAppendDelimitedRow(
636+
StringInvariant.EMPTY
637+
,StringInvariant.EMPTY
638+
,MARKDOWN_DELIMITER
639+
,MARKDOWN_ROW_BEFORE_TAG
640+
,MARKDOWN_ROW_AFTER_TAG
641+
,false
642+
,true
643+
,false
644+
,stringBuilder
645+
,partsToAppend
646+
);
647+
648+
String[] mdTableStructure = new String[partsToAppend.Length];
649+
for (int i = 0; i < mdTableStructure.Length; i++)
650+
mdTableStructure[i] = MARKDOWN_HEADER_TAG;
651+
652+
stringBuilderPartsAppendDelimitedRow(
653+
StringInvariant.EMPTY
654+
,StringInvariant.EMPTY
655+
,MARKDOWN_DELIMITER
656+
,MARKDOWN_ROW_BEFORE_TAG
657+
,MARKDOWN_ROW_AFTER_TAG
658+
,false
659+
,false
660+
,false
661+
,stringBuilder
662+
,mdTableStructure
663+
);
664+
}
665+
666+
internal const String JSON_ROW_INDENTATION_TAG = " ";
667+
private static readonly String JSON_PART_INDENTATION_TAG = JSON_ROW_INDENTATION_TAG + JSON_ROW_INDENTATION_TAG;
668+
private static readonly String JSON_ROW_BEFORE_TAG = StringInvariant.NEW_LINE
669+
+ JSON_ROW_INDENTATION_TAG
670+
+ StringInvariant.LEFT_CURLY_BRACKET
671+
+ StringInvariant.NEW_LINE
672+
;
673+
private static readonly String JSON_ROW_AFTER_TAG = StringInvariant.NEW_LINE
674+
+ JSON_ROW_INDENTATION_TAG
675+
+ StringInvariant.RIGHT_CURLY_BRACKET
676+
;
677+
private static readonly String JSON_PART_DELIMITER = StringInvariant.COMMA + StringInvariant.NEW_LINE;
678+
internal static void stringBuilderPartsAppendJsonRow(StringBuilder stringBuilder, params String[] partsToAppend) {
679+
stringBuilderPartsAppendDelimitedRow(
680+
JSON_PART_INDENTATION_TAG
681+
,StringInvariant.EMPTY
682+
,JSON_PART_DELIMITER
683+
,JSON_ROW_BEFORE_TAG
684+
,JSON_ROW_AFTER_TAG
685+
,false
686+
,false
687+
,true
688+
,stringBuilder
689+
,partsToAppend
690+
);
691+
}
692+
internal static String cleanNewLineAtTheEnd(String str) {
693+
int length = str.Length;
694+
695+
if (length == 0)
696+
return str;
697+
698+
if (str.EndsWith(StringInvariant.NEW_LINE))
699+
return str.Substring(0, length - StringInvariant.NEW_LINE.Length);
700+
701+
return str;
464702
}
465703
/**
466704
* Converts integer number to hex string (plain text)
@@ -540,5 +778,17 @@ public static String numberToAsciiString(long number) {
540778
public static String numberToAsciiString(double number) {
541779
return hexString2AsciiString(numberToHexString(number));
542780
}
781+
public static int countOccurrences(String str, String toFind) {
782+
if (str == null || toFind == null) return -1;
783+
int strLen = str.Length;
784+
int toFindLen = toFind.Length;
785+
if (strLen == 0 || toFindLen == 0 || toFindLen > strLen) return 0;
786+
return (strLen - str.Replace(toFind, StringInvariant.EMPTY).Length) / toFindLen;
787+
}
788+
public static int countLines(String text) {
789+
if (text == null) return -1;
790+
if (text.Length == 0) return 0;
791+
return countOccurrences(text, StringInvariant.NEW_LINE) + 1;
792+
}
543793
}
544794
}

0 commit comments

Comments
 (0)