support Github style code formatting (#121)

Signed-off-by: Namhyung Kim <namhyung@gmail.com>
This commit is contained in:
Namhyung Kim 2017-09-03 23:22:41 +09:00 committed by Michael Göhler
parent a7b433385a
commit b56994fd24
5 changed files with 61 additions and 4 deletions

View File

@ -48,6 +48,7 @@ enum line_bitmask {
IS_QUOTE,
IS_CODE,
IS_TILDE_CODE,
IS_GFM_CODE,
IS_HR,
IS_UNORDERED_LIST_1,
IS_UNORDERED_LIST_2,

View File

@ -59,5 +59,6 @@ int prev_blank(cstring_t *text, int i);
int next_blank(cstring_t *text, int i);
int next_word(cstring_t *text, int i);
int next_nontilde(cstring_t *text, int i);
int next_nonbacktick(cstring_t *text, int i);
#endif // !defined( PARSER_H )

View File

@ -115,8 +115,8 @@ at least as many or more ~ for closing.
becomes
~~~ {.numberLines}
int main(int argc, char \*argv[]) {
printf("%s\\n", "Hello world!");
int main(int argc, char *argv[]) {
printf("%s\n", "Hello world!");
}
~~~~~~~~~~~~~~~~~~
@ -127,6 +127,30 @@ will be ignored
-> # Supported markdown formatting <-
You can also use [github](https://guides.github.com/features/mastering-markdown/#GitHub-flavored-markdown) flavored markdown's
code block. Use at least three backticks to open
and at least as many or more backticks for closing.
\```
\int main(int argc, char \*argv[]) {
\ printf("%s\\n", "Hello world!");
\}
\```
becomes
```
int main(int argc, char *argv[]) {
printf("%s\n", "Hello world!");
}
```
Language hint will be ignored
-------------------------------------------------
-> # Supported markdown formatting <-
Quotes are auto-detected by preceding *>*.
Multiple *>* are interpreted as nested quotes.

View File

@ -158,7 +158,8 @@ deck_t *markdown_load(FILE *input, int noexpand) {
slide = next_slide(slide);
sc++;
} else if(CHECK_BIT(bits, IS_TILDE_CODE) &&
} else if((CHECK_BIT(bits, IS_TILDE_CODE) ||
CHECK_BIT(bits, IS_GFM_CODE)) &&
CHECK_BIT(bits, IS_EMPTY)) {
// remove tilde code markers
(text->reset)(text);
@ -400,6 +401,7 @@ int markdown_analyse(cstring_t *text, int prev) {
static int unordered_list_level = 0;
static int unordered_list_level_offset[] = {-1, -1, -1, -1};
static int num_tilde_characters = 0;
static int num_backticks = 0;
int i = 0; // increment
int bits = 0; // markdown bits
@ -447,6 +449,27 @@ int markdown_analyse(cstring_t *text, int prev) {
return bits;
}
// IS_GFM_CODE
if (wcsncmp(text->value, L"```", 3) == 0) {
int backticks_in_line = next_nonbacktick(text, 0);
if (backticks_in_line >= num_backticks) {
if (num_backticks > 0) {
num_backticks = 0;
} else {
num_backticks = backticks_in_line;
}
SET_BIT(bits, IS_EMPTY);
SET_BIT(bits, IS_GFM_CODE);
return bits;
}
}
if (num_backticks > 0) {
SET_BIT(bits, IS_CODE);
SET_BIT(bits, IS_GFM_CODE);
return bits;
}
// IS_STOP
if((offset < CODE_INDENT || !CHECK_BIT(prev, IS_CODE)) &&
(!wcsncmp(&text->value[offset], L"<br>", 4) ||
@ -831,3 +854,10 @@ int next_nontilde(cstring_t *text, int i) {
return i;
}
int next_nonbacktick(cstring_t *text, int i) {
while ((i < text->size) && text->value[i] == L'`')
i++;
return i;
}

View File

@ -656,7 +656,8 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
// IS_CODE
if(CHECK_BIT(line->bits, IS_CODE)) {
if (!CHECK_BIT(line->bits, IS_TILDE_CODE)) {
if (!CHECK_BIT(line->bits, IS_TILDE_CODE) &&
!CHECK_BIT(line->bits, IS_GFM_CODE)) {
// set static offset for code
offset = CODE_INDENT;
}