init
This commit is contained in:
commit
959aa67bf2
|
@ -0,0 +1,2 @@
|
||||||
|
mmd
|
||||||
|
test.html
|
|
@ -0,0 +1,20 @@
|
||||||
|
Copyright (c) 2024 Hamza NANAHA <hamza.nanaha@hotmail.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,5 @@
|
||||||
|
all:
|
||||||
|
clang -ggdb main.c -o mmd
|
||||||
|
|
||||||
|
run: all
|
||||||
|
./mmd test.md test.html
|
|
@ -0,0 +1,106 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define CHECK_MD_BOUND(md) (md->in_cursor < md->in_cap && md->out_cursor < md->out_cap)
|
||||||
|
|
||||||
|
typedef struct MegaData {
|
||||||
|
char *in;
|
||||||
|
char *out;
|
||||||
|
int in_cap;
|
||||||
|
int out_cap;
|
||||||
|
int in_cursor;
|
||||||
|
int out_cursor;
|
||||||
|
} MegaData;
|
||||||
|
|
||||||
|
void skip_begin(MegaData *md)
|
||||||
|
{
|
||||||
|
while (CHECK_MD_BOUND(md) && (md->in[md->in_cursor] == ' ' || md->in[md->in_cursor] == '\t' || md->in[md->in_cursor] == '\n')) {
|
||||||
|
md->out[md->out_cursor] = md->in[md->in_cursor];
|
||||||
|
md->in_cursor++;
|
||||||
|
md->out_cursor++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void skip_endline(MegaData *md)
|
||||||
|
{
|
||||||
|
while (CHECK_MD_BOUND(md) && md->in[md->in_cursor] != '\n') {
|
||||||
|
md->out[md->out_cursor] = md->in[md->in_cursor];
|
||||||
|
md->in_cursor++;
|
||||||
|
md->out_cursor++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int mmdeeznut(MegaData *md)
|
||||||
|
{
|
||||||
|
assert(md->in_cap < md->out_cap && "output buffer should be bigger than the input file size.");
|
||||||
|
while (CHECK_MD_BOUND(md)) {
|
||||||
|
skip_begin(md);
|
||||||
|
if (md->in[md->in_cursor] == '#') {
|
||||||
|
int level = 1;
|
||||||
|
while (md->in[md->in_cursor+level] == '#' && level < 6)
|
||||||
|
level++;
|
||||||
|
if (md->in[md->in_cursor+level] == ' ') {
|
||||||
|
md->in_cursor += level+1;
|
||||||
|
|
||||||
|
md->out[md->out_cursor] = '<';
|
||||||
|
md->out[++md->out_cursor] = 'h';
|
||||||
|
md->out[++md->out_cursor] = '0' + level;
|
||||||
|
md->out[++md->out_cursor] = '>';
|
||||||
|
md->out_cursor++;
|
||||||
|
skip_endline(md);
|
||||||
|
md->out[md->out_cursor] = '<';
|
||||||
|
md->out[++md->out_cursor] = '/';
|
||||||
|
md->out[++md->out_cursor] = 'h';
|
||||||
|
md->out[++md->out_cursor] = '0' + level;
|
||||||
|
md->out[++md->out_cursor] = '>';
|
||||||
|
md->out_cursor++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
skip_endline(md);
|
||||||
|
}
|
||||||
|
|
||||||
|
return md->out_cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
if (argc != 3) {
|
||||||
|
printf("ERR: please input only 2 parameter.\nusage: %s <input file> <output file>\n", *argv);
|
||||||
|
exit(-69);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *input_file = fopen(argv[1], "r");
|
||||||
|
FILE *output_file = fopen(argv[2], "w");
|
||||||
|
|
||||||
|
fseek(input_file , 0L, SEEK_END);
|
||||||
|
int file_size = ftell(input_file);
|
||||||
|
rewind(input_file);
|
||||||
|
|
||||||
|
char *mmd_data = malloc(file_size);
|
||||||
|
assert(mmd_data && "Buy more RAM!");
|
||||||
|
fread(mmd_data, file_size, 1, input_file);
|
||||||
|
|
||||||
|
char *html_data = malloc(file_size*2);
|
||||||
|
|
||||||
|
MegaData md = {
|
||||||
|
.in = mmd_data,
|
||||||
|
.in_cap = file_size,
|
||||||
|
.out = html_data,
|
||||||
|
.out_cap = file_size*2,
|
||||||
|
.in_cursor = 0,
|
||||||
|
.out_cursor = 0,
|
||||||
|
};
|
||||||
|
int data_size = mmdeeznut(&md);
|
||||||
|
|
||||||
|
printf("%s", mmd_data);
|
||||||
|
printf("--------------------\n");
|
||||||
|
printf("%.*s", data_size, html_data);
|
||||||
|
|
||||||
|
fwrite(html_data, data_size, 1, output_file);
|
||||||
|
|
||||||
|
fclose(output_file);
|
||||||
|
fclose(input_file);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width">
|
||||||
|
<title>Test Mega Markdown</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
# Mega Markdown
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
##grotext
|
||||||
|
|
||||||
|
# Title 1
|
||||||
|
## Title 2
|
||||||
|
### Title 3
|
||||||
|
#### Title 4
|
||||||
|
##### Title 5
|
||||||
|
###### Title 6
|
||||||
|
####### Title 7
|
||||||
|
######## Title 8
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue