|
441 | 441 | } else if (t === CLASS_LEFT_SQUARE) {
|
442 | 442 | pushStack(state, {mode: STATE_SQUARE_OPEN});
|
443 | 443 | } else if (t === CLASS_LEFT_ANGLE) {
|
444 |
| - pushStack(state, {mode: STATE_TAG_OPEN}); |
| 444 | + pushStack(state, {mode: STATE_TAG_OPEN, argument: false}); |
445 | 445 | } else if (t === CLASS_TILDE) {
|
446 | 446 | stream.next();
|
447 | 447 | return STYLE_OPERATOR;
|
|
783 | 783 | if (stream.match(/<[a-zA-Z0-9_-]*!\s+/, false) || stream.match(/<[a-zA-Z0-9_-]*!>/, false)) { // TODO: Improve this part. Highlights tags ending in ! differently.
|
784 | 784 | macro = true;
|
785 | 785 | }
|
786 |
| - replaceStack(state, {mode: STATE_TAG_NAME, macro: macro}); |
| 786 | + replaceStack(state, {mode: STATE_TAG_NAME, macro: macro, argument: head.argument}); |
787 | 787 | stream.next();
|
788 | 788 | return macro ? STYLE_MACRO : STYLE_TAG;
|
789 | 789 | } else {
|
|
797 | 797 | } else if (t === CLASS_COMMENT_HASH) {
|
798 | 798 | pushStack(state, {mode: STATE_COMMENT});
|
799 | 799 | } else if (t === CLASS_GLYPH || t === CLASS_CHARACTER_ESCAPE_SEQUENCE || t === CLASS_REPEATED_ESCAPE_SEQUENCE) {
|
800 |
| - replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro}); |
| 800 | + replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro, argument: head.argument}); |
801 | 801 | pushStack(state, {mode: STATE_WORD, style: head.macro ? STYLE_MACRO : STYLE_TAG});
|
802 | 802 | } else {
|
803 | 803 | pushStack(state, {mode: STATE_ERROR});
|
|
810 | 810 | } else if (t === CLASS_COMMENT_HASH) {
|
811 | 811 | pushStack(state, {mode: STATE_COMMENT});
|
812 | 812 | } else if (t === CLASS_GLYPH || t === CLASS_CHARACTER_ESCAPE_SEQUENCE || t === CLASS_REPEATED_ESCAPE_SEQUENCE) {
|
813 |
| - replaceStack(state, {mode: STATE_TAG_COLON, macro: head.macro}); |
| 813 | + replaceStack(state, {mode: STATE_TAG_COLON, macro: head.macro, argument: head.argument}); |
814 | 814 | pushStack(state, {mode: STATE_WORD, style: STYLE_ATTRIBUTE});
|
815 | 815 | } else {
|
816 |
| - replaceStack(state, {mode: STATE_TAG_CLOSE, macro: head.macro}); |
| 816 | + replaceStack(state, {mode: STATE_TAG_CLOSE, macro: head.macro, argument: head.argument}); |
817 | 817 | }
|
818 | 818 | } else if (mode === STATE_TAG_COLON) {
|
819 | 819 | // Expect whitespace or colon, otherwise end.
|
820 | 820 | let t = classifyCharacter(stream);
|
821 | 821 | if (t === CLASS_WHITESPACE) {
|
822 |
| - replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro}); |
| 822 | + replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro, argument: head.argument}); |
823 | 823 | pushStack(state, {mode: STATE_WHITESPACE});
|
824 | 824 | } else if (t === CLASS_COMMENT_HASH) {
|
825 |
| - replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro}); |
| 825 | + replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro, argument: head.argument}); |
826 | 826 | pushStack(state, {mode: STATE_COMMENT});
|
827 | 827 | } else if (t === CLASS_COLON) {
|
828 |
| - replaceStack(state, {mode: STATE_TAG_VALUE, macro: head.macro}); |
| 828 | + replaceStack(state, {mode: STATE_TAG_VALUE, macro: head.macro, argument: head.argument}); |
829 | 829 | stream.next();
|
830 | 830 | return head.macro ? STYLE_ATTRIBUTE : STYLE_ATTRIBUTE;
|
831 | 831 | } else {
|
832 |
| - replaceStack(state, {mode: STATE_TAG_CLOSE, macro: head.macro}); |
| 832 | + replaceStack(state, {mode: STATE_TAG_CLOSE, macro: head.macro, argument: head.argument}); |
833 | 833 | }
|
834 | 834 | } else if (mode === STATE_TAG_VALUE) {
|
835 | 835 | // Expect attribute value.
|
836 | 836 | let t = classifyCharacter(stream);
|
837 | 837 | if (t === CLASS_GLYPH || t === CLASS_CHARACTER_ESCAPE_SEQUENCE || t === CLASS_REPEATED_ESCAPE_SEQUENCE) {
|
838 |
| - replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro}); |
| 838 | + replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro, argument: head.argument}); |
839 | 839 | pushStack(state, {mode: STATE_WORD, style: STYLE_ATTRIBUTE_VALUE});
|
840 | 840 | } else if (t === CLASS_QUOTATION_MARK) {
|
841 |
| - replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro}); |
| 841 | + replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro, argument: head.argument}); |
842 | 842 | pushStack(state, {mode: STATE_QUOTATION_OPEN});
|
843 | 843 | } else if (t === CLASS_LEFT_ANGLE_HASH) {
|
844 |
| - replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro}); |
| 844 | + replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro, argument: head.argument}); |
845 | 845 | pushStack(state, {mode: STATE_TEXT_BLOCK_OPEN});
|
846 | 846 | } else if (t === CLASS_LEFT_BRACKET) {
|
847 |
| - replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro}); |
| 847 | + replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro, argument: head.argument}); |
848 | 848 | pushStack(state, {mode: STATE_BRACKET_OPEN});
|
849 | 849 | } else if (t === CLASS_LEFT_SQUARE) {
|
850 |
| - replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro}); |
| 850 | + replaceStack(state, {mode: STATE_TAG_ATTRIBUTE, macro: head.macro, argument: head.argument}); |
851 | 851 | pushStack(state, {mode: STATE_SQUARE_OPEN});
|
852 | 852 | } else {
|
853 | 853 | pushStack(state, {mode: STATE_ERROR});
|
|
860 | 860 | } else if (t === CLASS_COMMENT_HASH) {
|
861 | 861 | pushStack(state, {mode: STATE_COMMENT});
|
862 | 862 | } else if (t === CLASS_RIGHT_ANGLE) {
|
863 |
| - replaceStack(state, {mode: STATE_PATTERN_COLON}); |
| 863 | + if (!head.argument) { |
| 864 | + replaceStack(state, {mode: STATE_PATTERN_COLON, macro: head.macro}); |
| 865 | + } else { |
| 866 | + popStack(state); |
| 867 | + } |
864 | 868 | stream.next();
|
865 | 869 | return head.macro ? STYLE_MACRO : STYLE_TAG;
|
866 | 870 | } else {
|
|
870 | 874 | // Expect colon, otherwise end.
|
871 | 875 | let t = classifyCharacter(stream);
|
872 | 876 | if (t === CLASS_COLON) {
|
873 |
| - replaceStack(state, {mode: STATE_PATTERN_ARGUMENT}); |
| 877 | + replaceStack(state, {mode: STATE_PATTERN_ARGUMENT, macro: head.macro}); |
874 | 878 | stream.next();
|
875 | 879 | if (stream.eol()) pushStack(state, {mode: STATE_ERROR});
|
876 |
| - return STYLE_ARGUMENT_COLON; |
| 880 | + return head.macro ? STYLE_MACRO : STYLE_ARGUMENT_COLON; |
877 | 881 | } else {
|
878 | 882 | popStack(state);
|
879 | 883 | }
|
880 | 884 | } else if (mode === STATE_PATTERN_ARGUMENT) {
|
881 | 885 | // Expect argument.
|
882 | 886 | let t = classifyCharacter(stream);
|
883 | 887 | if (t === CLASS_GLYPH || t === CLASS_CHARACTER_ESCAPE_SEQUENCE || t === CLASS_REPEATED_ESCAPE_SEQUENCE) {
|
884 |
| - replaceStack(state, {mode: STATE_PATTERN_COLON}); |
| 888 | + replaceStack(state, {mode: STATE_PATTERN_COLON, macro: head.macro}); |
885 | 889 | pushStack(state, {mode: STATE_WORD, style: STYLE_WORD_ARGUMENT});
|
886 | 890 | } else if (t === CLASS_QUOTATION_MARK) {
|
887 |
| - replaceStack(state, {mode: STATE_PATTERN_COLON}); |
| 891 | + replaceStack(state, {mode: STATE_PATTERN_COLON, macro: head.macro}); |
888 | 892 | pushStack(state, {mode: STATE_QUOTATION_OPEN});
|
889 | 893 | } else if (t === CLASS_LEFT_ANGLE_HASH) {
|
890 |
| - replaceStack(state, {mode: STATE_PATTERN_COLON}); |
| 894 | + replaceStack(state, {mode: STATE_PATTERN_COLON, macro: head.macro}); |
891 | 895 | pushStack(state, {mode: STATE_TEXT_BLOCK_OPEN});
|
892 | 896 | } else if (t === CLASS_LEFT_BRACKET) {
|
893 |
| - replaceStack(state, {mode: STATE_PATTERN_COLON}); |
| 897 | + replaceStack(state, {mode: STATE_PATTERN_COLON, macro: head.macro}); |
894 | 898 | pushStack(state, {mode: STATE_BRACKET_OPEN});
|
895 | 899 | } else if (t === CLASS_LEFT_SQUARE) {
|
896 |
| - replaceStack(state, {mode: STATE_PATTERN_COLON}); |
| 900 | + replaceStack(state, {mode: STATE_PATTERN_COLON, macro: head.macro}); |
897 | 901 | pushStack(state, {mode: STATE_SQUARE_OPEN});
|
898 | 902 | } else if (t === CLASS_LEFT_ANGLE) {
|
899 |
| - replaceStack(state, {mode: STATE_TAG_OPEN}); // TODO Maybe? |
| 903 | + replaceStack(state, {mode: STATE_PATTERN_COLON, macro: head.macro}); |
| 904 | + pushStack(state, {mode: STATE_TAG_OPEN, argument: true}); |
900 | 905 | } else if (t === CLASS_DIAMOND) {
|
901 | 906 | replaceStack(state, {mode: STATE_PATTERN_COMPOSE});
|
902 | 907 | stream.next();
|
|
909 | 914 | // Expect colon.
|
910 | 915 | let t = classifyCharacter(stream);
|
911 | 916 | if (t === CLASS_COLON) {
|
912 |
| - replaceStack(state, {mode: STATE_TAG_OPEN}); // TODO Maybe? |
| 917 | + replaceStack(state, {mode: STATE_TAG_OPEN, argument: false}); |
913 | 918 | stream.next();
|
914 | 919 | return STYLE_ARGUMENT_COLON;
|
915 | 920 | } else {
|
|
0 commit comments