Skip to content

Commit 10c785e

Browse files
committed
Update
- Macro highlighting improved - Update editor style, add references for preprocessor - Update examples
1 parent d997b52 commit 10c785e

File tree

7 files changed

+152
-124
lines changed

7 files changed

+152
-124
lines changed

README.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,9 @@ An online Khi-editor with highlighting, preprocessors and other features.
44

55
## Links
66

7-
- [**Khi**](https://github.com/khilang/khilang)**:** [reference](https://github.com/khilang/khilang/blob/master/guide.md), [editor & preprocessors](https://khilang.github.io/khi-editor)
8-
- **Libraries:** [Rust](https://github.com/khilang/khi.rs), [Javascript](https://github.com/khilang/khi.js)
7+
- [**Khi**](https://github.com/khilang/khilang)**:**
8+
- [reference](https://github.com/khilang/khilang/blob/master/reference.md)
9+
- [online editor & preprocessor](https://khilang.github.io/khi-editor)
10+
- **Libraries:**
11+
- [khi.rs](https://github.com/khilang/khi.rs) (Rust)
12+
- [khi.js](https://github.com/khilang/khi.js) (JavaScript)

cm-modes/khi.js

+29-24
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@
441441
} else if (t === CLASS_LEFT_SQUARE) {
442442
pushStack(state, {mode: STATE_SQUARE_OPEN});
443443
} else if (t === CLASS_LEFT_ANGLE) {
444-
pushStack(state, {mode: STATE_TAG_OPEN});
444+
pushStack(state, {mode: STATE_TAG_OPEN, argument: false});
445445
} else if (t === CLASS_TILDE) {
446446
stream.next();
447447
return STYLE_OPERATOR;
@@ -783,7 +783,7 @@
783783
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.
784784
macro = true;
785785
}
786-
replaceStack(state, {mode: STATE_TAG_NAME, macro: macro});
786+
replaceStack(state, {mode: STATE_TAG_NAME, macro: macro, argument: head.argument});
787787
stream.next();
788788
return macro ? STYLE_MACRO : STYLE_TAG;
789789
} else {
@@ -797,7 +797,7 @@
797797
} else if (t === CLASS_COMMENT_HASH) {
798798
pushStack(state, {mode: STATE_COMMENT});
799799
} 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});
801801
pushStack(state, {mode: STATE_WORD, style: head.macro ? STYLE_MACRO : STYLE_TAG});
802802
} else {
803803
pushStack(state, {mode: STATE_ERROR});
@@ -810,44 +810,44 @@
810810
} else if (t === CLASS_COMMENT_HASH) {
811811
pushStack(state, {mode: STATE_COMMENT});
812812
} 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});
814814
pushStack(state, {mode: STATE_WORD, style: STYLE_ATTRIBUTE});
815815
} else {
816-
replaceStack(state, {mode: STATE_TAG_CLOSE, macro: head.macro});
816+
replaceStack(state, {mode: STATE_TAG_CLOSE, macro: head.macro, argument: head.argument});
817817
}
818818
} else if (mode === STATE_TAG_COLON) {
819819
// Expect whitespace or colon, otherwise end.
820820
let t = classifyCharacter(stream);
821821
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});
823823
pushStack(state, {mode: STATE_WHITESPACE});
824824
} 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});
826826
pushStack(state, {mode: STATE_COMMENT});
827827
} 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});
829829
stream.next();
830830
return head.macro ? STYLE_ATTRIBUTE : STYLE_ATTRIBUTE;
831831
} else {
832-
replaceStack(state, {mode: STATE_TAG_CLOSE, macro: head.macro});
832+
replaceStack(state, {mode: STATE_TAG_CLOSE, macro: head.macro, argument: head.argument});
833833
}
834834
} else if (mode === STATE_TAG_VALUE) {
835835
// Expect attribute value.
836836
let t = classifyCharacter(stream);
837837
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});
839839
pushStack(state, {mode: STATE_WORD, style: STYLE_ATTRIBUTE_VALUE});
840840
} 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});
842842
pushStack(state, {mode: STATE_QUOTATION_OPEN});
843843
} 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});
845845
pushStack(state, {mode: STATE_TEXT_BLOCK_OPEN});
846846
} 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});
848848
pushStack(state, {mode: STATE_BRACKET_OPEN});
849849
} 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});
851851
pushStack(state, {mode: STATE_SQUARE_OPEN});
852852
} else {
853853
pushStack(state, {mode: STATE_ERROR});
@@ -860,7 +860,11 @@
860860
} else if (t === CLASS_COMMENT_HASH) {
861861
pushStack(state, {mode: STATE_COMMENT});
862862
} 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+
}
864868
stream.next();
865869
return head.macro ? STYLE_MACRO : STYLE_TAG;
866870
} else {
@@ -870,33 +874,34 @@
870874
// Expect colon, otherwise end.
871875
let t = classifyCharacter(stream);
872876
if (t === CLASS_COLON) {
873-
replaceStack(state, {mode: STATE_PATTERN_ARGUMENT});
877+
replaceStack(state, {mode: STATE_PATTERN_ARGUMENT, macro: head.macro});
874878
stream.next();
875879
if (stream.eol()) pushStack(state, {mode: STATE_ERROR});
876-
return STYLE_ARGUMENT_COLON;
880+
return head.macro ? STYLE_MACRO : STYLE_ARGUMENT_COLON;
877881
} else {
878882
popStack(state);
879883
}
880884
} else if (mode === STATE_PATTERN_ARGUMENT) {
881885
// Expect argument.
882886
let t = classifyCharacter(stream);
883887
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});
885889
pushStack(state, {mode: STATE_WORD, style: STYLE_WORD_ARGUMENT});
886890
} else if (t === CLASS_QUOTATION_MARK) {
887-
replaceStack(state, {mode: STATE_PATTERN_COLON});
891+
replaceStack(state, {mode: STATE_PATTERN_COLON, macro: head.macro});
888892
pushStack(state, {mode: STATE_QUOTATION_OPEN});
889893
} else if (t === CLASS_LEFT_ANGLE_HASH) {
890-
replaceStack(state, {mode: STATE_PATTERN_COLON});
894+
replaceStack(state, {mode: STATE_PATTERN_COLON, macro: head.macro});
891895
pushStack(state, {mode: STATE_TEXT_BLOCK_OPEN});
892896
} else if (t === CLASS_LEFT_BRACKET) {
893-
replaceStack(state, {mode: STATE_PATTERN_COLON});
897+
replaceStack(state, {mode: STATE_PATTERN_COLON, macro: head.macro});
894898
pushStack(state, {mode: STATE_BRACKET_OPEN});
895899
} else if (t === CLASS_LEFT_SQUARE) {
896-
replaceStack(state, {mode: STATE_PATTERN_COLON});
900+
replaceStack(state, {mode: STATE_PATTERN_COLON, macro: head.macro});
897901
pushStack(state, {mode: STATE_SQUARE_OPEN});
898902
} 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});
900905
} else if (t === CLASS_DIAMOND) {
901906
replaceStack(state, {mode: STATE_PATTERN_COMPOSE});
902907
stream.next();
@@ -909,7 +914,7 @@
909914
// Expect colon.
910915
let t = classifyCharacter(stream);
911916
if (t === CLASS_COLON) {
912-
replaceStack(state, {mode: STATE_TAG_OPEN}); // TODO Maybe?
917+
replaceStack(state, {mode: STATE_TAG_OPEN, argument: false});
913918
stream.next();
914919
return STYLE_ARGUMENT_COLON;
915920
} else {

examples/equations.tex.khi

+10-3
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,18 @@
88

99
<begin>:document
1010

11+
A document containing some
12+
equations and matrices.
13+
1114
<section>:Equations
1215

1316
# Define a sum-range command.
1417
<def!>:<SumRn>:4:{ # def! is a macro that defines a LaTeX command.
15-
<sum>_{#1}^{#2`:#3} #4
18+
<sum>_{#1}^{`[#2`:#3`]} #4
1619
}
1720

21+
<def!>:<Log>:0:<>:<operatorname>:Log
22+
1823
<begin>:equation* <begin>:split
1924

2025
<sqrt>:5 <times> <sqrt>:5 = 5
@@ -24,6 +29,8 @@
2429

2530
<end>:split <end>:equation*
2631

32+
<begin>:equation* <Log>(1 + 2 + 3) = <Log>:1 + <Log>:2 + <Log>:3 <end>:equation*
33+
2734
<begin>:align* [
2835
| <SumRn>:k:0:100:k | = 0 + 1 + 2 + <dots> + 99 + 100 |
2936
| ~ | = (0 + 100) + (1 + 99) + <dots> + (49 + 51) + 50 |
@@ -46,8 +53,8 @@
4653
|0|1|0|
4754
|0|0|1|
4855
] <end>:bmatrix
49-
<n>
50-
<mathbf>:X = <begin>:bmatrix [1|~|~; ~|1|~; ~|~|1] <end>:bmatrix
56+
=
57+
<begin>:bmatrix [1|~|~; ~|1|~; ~|~|1] <end>:bmatrix
5158
<end>:math
5259

5360
<end>:document

0 commit comments

Comments
 (0)