1
1
/*
2
- * @(#)StringUtils.cs 5.2.0 2023-01-07
2
+ * @(#)StringUtils.cs 5.2.0 2023-01-17
3
3
*
4
4
* MathParser.org-mXparser DUAL LICENSE AGREEMENT as of date 2022-05-22
5
5
* The most up-to-date license is available at the below link:
180
180
*/
181
181
using System ;
182
182
using System . Globalization ;
183
+ using System . Text ;
183
184
using System . Text . RegularExpressions ;
184
185
using org . mariuszgromada . math . mxparser ;
185
186
@@ -461,6 +462,243 @@ internal static void consolePrintln() {
461
462
}
462
463
internal static void consolePrintln ( Object o ) {
463
464
mXparser . consoleWriteLine ( o ) ;
465
+ }
466
+ internal static String cleanForHtml ( String text ) {
467
+ return text . Replace ( "&" , "&" ) . Replace ( "<" , "<" ) . Replace ( ">" , ">" ) ;
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 ;
464
702
}
465
703
/**
466
704
* Converts integer number to hex string (plain text)
@@ -540,5 +778,17 @@ public static String numberToAsciiString(long number) {
540
778
public static String numberToAsciiString ( double number ) {
541
779
return hexString2AsciiString ( numberToHexString ( number ) ) ;
542
780
}
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
+ }
543
793
}
544
794
}
0 commit comments