@@ -74,11 +74,8 @@ static inline bool S_is_line_end_char(char c) {
7474 return (c == '\n' || c == '\r' );
7575}
7676
77- static delimiter * S_insert_emph (subject * subj , delimiter * opener ,
78- delimiter * closer );
79-
80- static delimiter * S_insert_strikethrough (subject * subj , delimiter * opener ,
81- delimiter * closer );
77+ static delimiter * S_insert_emph_like_inline (subject * subj , delimiter * opener ,
78+ delimiter * closer );
8279
8380static int parse_inline (subject * subj , cmark_node * parent , int options );
8481
@@ -658,7 +655,8 @@ static void process_emphasis(subject *subj, bufsize_t stack_bottom) {
658655 delimiter * old_closer ;
659656 bool opener_found ;
660657 int openers_bottom_index = 0 ;
661- bufsize_t openers_bottom [18 ] = {stack_bottom , stack_bottom , stack_bottom ,
658+ bufsize_t openers_bottom [21 ] = {stack_bottom , stack_bottom , stack_bottom ,
659+ stack_bottom , stack_bottom , stack_bottom ,
662660 stack_bottom , stack_bottom , stack_bottom ,
663661 stack_bottom , stack_bottom , stack_bottom ,
664662 stack_bottom , stack_bottom , stack_bottom ,
@@ -694,6 +692,10 @@ static void process_emphasis(subject *subj, bufsize_t stack_bottom) {
694692 openers_bottom_index = 14 +
695693 (closer -> can_open ? 2 : 0 ) + (closer -> length % 2 );
696694 break ;
695+ case '=' :
696+ openers_bottom_index = 17 +
697+ (closer -> can_open ? 2 : 0 ) + (closer -> length % 2 );
698+ break ;
697699 default :
698700 assert (false);
699701 }
@@ -718,13 +720,13 @@ static void process_emphasis(subject *subj, bufsize_t stack_bottom) {
718720 old_closer = closer ;
719721 if (closer -> delim_char == '*' || closer -> delim_char == '_' ) {
720722 if (opener_found ) {
721- closer = S_insert_emph (subj , opener , closer );
723+ closer = S_insert_emph_like_inline (subj , opener , closer );
722724 } else {
723725 closer = closer -> next ;
724726 }
725- } else if (closer -> delim_char == '~' ) {
727+ } else if (closer -> delim_char == '~' || closer -> delim_char == '=' ) {
726728 if (opener_found && opener -> length >= 2 && closer -> length >= 2 ) {
727- closer = S_insert_strikethrough (subj , opener , closer );
729+ closer = S_insert_emph_like_inline (subj , opener , closer );
728730 } else {
729731 closer = closer -> next ;
730732 }
@@ -766,15 +768,16 @@ static void process_emphasis(subject *subj, bufsize_t stack_bottom) {
766768 }
767769}
768770
769- static delimiter * S_insert_emph (subject * subj , delimiter * opener ,
770- delimiter * closer ) {
771+ static delimiter * S_insert_emph_like_inline (subject * subj , delimiter * opener ,
772+ delimiter * closer ) {
771773 delimiter * delim , * tmp_delim ;
772774 bufsize_t use_delims ;
773775 cmark_node * opener_inl = opener -> inl_text ;
774776 cmark_node * closer_inl = closer -> inl_text ;
775777 bufsize_t opener_num_chars = opener_inl -> len ;
776778 bufsize_t closer_num_chars = closer_inl -> len ;
777779 cmark_node * tmp , * tmpnext , * emph ;
780+ const char delim_char = closer -> delim_char ;
778781
779782 // calculate the actual number of characters used from this closer
780783 use_delims = (closer_num_chars >= 2 && opener_num_chars >= 2 ) ? 2 : 1 ;
@@ -799,7 +802,17 @@ static delimiter *S_insert_emph(subject *subj, delimiter *opener,
799802
800803 // create new emph or strong, and splice it in to our inlines
801804 // between the opener and closer
802- emph = use_delims == 1 ? make_emph (subj -> mem ) : make_strong (subj -> mem );
805+ switch (delim_char ) {
806+ case '~' :
807+ emph = make_simple (subj -> mem , CMARK_NODE_STRIKETHROUGH );
808+ break ;
809+ case '=' :
810+ emph = make_simple (subj -> mem , CMARK_NODE_MARK );
811+ break ;
812+ default :
813+ emph = use_delims == 1 ? make_emph (subj -> mem ) : make_strong (subj -> mem );
814+ break ;
815+ }
803816
804817 tmp = opener_inl -> next ;
805818 if (tmp && tmp != closer_inl ) {
@@ -847,86 +860,6 @@ static delimiter *S_insert_emph(subject *subj, delimiter *opener,
847860 return closer ;
848861}
849862
850- static delimiter * S_insert_strikethrough (subject * subj , delimiter * opener ,
851- delimiter * closer ) {
852- delimiter * delim , * tmp_delim ;
853- bufsize_t use_delims ;
854- cmark_node * opener_inl = opener -> inl_text ;
855- cmark_node * closer_inl = closer -> inl_text ;
856- bufsize_t opener_num_chars = opener_inl -> len ;
857- bufsize_t closer_num_chars = closer_inl -> len ;
858- cmark_node * tmp , * tmpnext , * strike ;
859-
860- // calculate the actual number of characters used from this closer
861- use_delims = 2 ;
862-
863- // remove used characters from associated inlines.
864- opener_num_chars -= use_delims ;
865- closer_num_chars -= use_delims ;
866- opener_inl -> len = opener_num_chars ;
867- opener_inl -> data [opener_num_chars ] = 0 ;
868- opener_inl -> end_column -= use_delims ;
869- closer_inl -> len = closer_num_chars ;
870- closer_inl -> data [closer_num_chars ] = 0 ;
871- closer_inl -> start_column += use_delims ;
872-
873- // free delimiters between opener and closer
874- delim = closer -> previous ;
875- while (delim != NULL && delim != opener ) {
876- tmp_delim = delim -> previous ;
877- remove_delimiter (subj , delim );
878- delim = tmp_delim ;
879- }
880-
881- // create new strike node
882- strike = make_simple (subj -> mem , CMARK_NODE_STRIKETHROUGH );
883-
884- tmp = opener_inl -> next ;
885- if (tmp && tmp != closer_inl ) {
886- strike -> first_child = tmp ;
887- tmp -> prev = NULL ;
888-
889- while (tmp && tmp != closer_inl ) {
890- tmpnext = tmp -> next ;
891- tmp -> parent = strike ;
892- if (tmpnext == closer_inl ) {
893- strike -> last_child = tmp ;
894- tmp -> next = NULL ;
895- }
896- tmp = tmpnext ;
897- }
898- }
899-
900- opener_inl -> next = strike ;
901- closer_inl -> prev = strike ;
902- strike -> prev = opener_inl ;
903- strike -> next = closer_inl ;
904- strike -> parent = opener_inl -> parent ;
905-
906- strike -> start_line = opener_inl -> start_line ;
907- strike -> end_line = closer_inl -> end_line ;
908- strike -> start_column = opener_inl -> start_column + opener_inl -> len ;
909- strike -> end_column = closer_inl -> end_column - closer_inl -> len ;
910-
911- // if opener has 0 characters, remove it and its associated inline
912- if (opener_num_chars == 0 ) {
913- cmark_node_free (opener_inl );
914- remove_delimiter (subj , opener );
915- }
916-
917- // if closer has 0 characters, remove it and its associated inline
918- if (closer_num_chars == 0 ) {
919- // remove empty closer inline
920- cmark_node_free (closer_inl );
921- // remove closer from list
922- tmp_delim = closer -> next ;
923- remove_delimiter (subj , closer );
924- closer = tmp_delim ;
925- }
926-
927- return closer ;
928- }
929-
930863// Parse backslash-escape or just a backslash, returning an inline.
931864static cmark_node * handle_backslash (subject * subj ) {
932865 advance (subj );
@@ -1380,11 +1313,11 @@ static cmark_node *handle_newline(subject *subj) {
13801313
13811314static bufsize_t subject_find_special_char (subject * subj , int options ) {
13821315 // "\r\n\\`&_*[]<!"
1383- // + "~"
1316+ // Add '~', '='.
13841317 static const int8_t SPECIAL_CHARS [256 ] = {
13851318 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
13861319 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 ,
1387- 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
1320+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
13881321 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 ,
13891322 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
13901323 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
@@ -1455,6 +1388,7 @@ static int parse_inline(subject *subj, cmark_node *parent, int options) {
14551388 case '\'' :
14561389 case '"' :
14571390 case '~' :
1391+ case '=' :
14581392 new_inl = handle_delim (subj , c , (options & CMARK_OPT_SMART ) != 0 );
14591393 break ;
14601394 case '-' :
0 commit comments