diff --git a/bob2 b/bob2
new file mode 100755
index 0000000..8fa31ed
--- /dev/null
+++ b/bob2
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+
+usage()
+{
+ echo
+ echo "This script is made for those who want to blog and are also addicted to the command line"
+ echo
+ echo "Run the initiation for a start. After that, place all your future blog
+ posts, written in markdown (.md or .markdown), in the draft folder."
+ echo
+ echo "Once you publish your blog, all the drafts in the said folder will be
+ converted to html, added to the posts folder and append to the index.html"
+ echo
+ echo "To remove a post, just remove it from the draft folder and republish
+ your blog"
+ echo
+ echo "bob commands :"
+ echo " help display this help"
+ echo " init initiate the blog"
+ echo " publish publish the blog"
+}
+
+
+init()
+{
+ echo Name of the author of the blog :
+ read author
+ echo "author:$author" > .blog.conf
+ echo Name of the blog :
+ read blog
+ echo "blog:$blog" >> .blog.conf
+ echo "Language of the blog : (en)"
+ read lang
+ if [ -z $lang ]; then
+ lang=en
+ fi
+ echo "lang:$lang" >> .blog.conf
+ echo "Activate dark mode : (y/N)"
+ read dark
+ if [ -z $dark ]; then
+ dark=n
+ fi
+ echo "dark:$dark" >> .blog.conf
+ mkdir drafts
+ mkdir bases
+ mkdir posts
+ mkdir css
+ _init_css
+ _index "$blog" "$lang" "$dark"
+}
+
+
+
+if [[ $# -eq 0 ]]; then
+ usage
+elif [[ "$1" == "help" ]]; then
+ usage
+elif [[ "$1" == "usage" ]]; then
+ usage
+elif [[ "$1" == "init" ]]; then
+ init
+elif [[ "$1" == "publish" ]]; then
+ publish
+elif [[ "$1" == "help" ]]; then
+ usage
+fi
diff --git a/lib/markdown.awk b/lib/markdown.awk
new file mode 100755
index 0000000..2a67787
--- /dev/null
+++ b/lib/markdown.awk
@@ -0,0 +1,150 @@
+#!/usr/bin/awk
+
+BEGIN {
+ env = "none"
+ stack_pointer = 0
+ push(env)
+}
+
+# Function to push a value onto the stack
+function push(value) {
+ stack_pointer++
+ stack[stack_pointer] = value
+}
+
+# Function to pop a value from the stack (LIFO)
+function pop() {
+ if (stack_pointer > 0) {
+ value = stack[stack_pointer]
+ delete stack[stack_pointer]
+ stack_pointer--
+ return value
+ } else {
+ return "empty"
+ }
+}
+
+# Function to get last value in LIFO
+function last() {
+ return stack[stack_pointer]
+}
+
+function replaceEmAndStrong(line, result, start, end) {
+ # Replace occurrences of **...** with ...
+ while (match(line, /\*\*([^*]+)\*\*/)) {
+ start = RSTART
+ end = RSTART + RLENGTH - 1
+ # Build the result: before match, , content, , after match
+ line = substr(line, 1, start-1) "" substr(line, start+2, RLENGTH-4) "" substr(line, end+1)
+ }
+
+ # Replace occurrences of *...* with ...
+ while (match(line, /\*([^*]+)\*/)) {
+ start = RSTART
+ end = RSTART + RLENGTH - 1
+ # Build the result: before match, , content, , after match
+ line = substr(line, 1, start-1) "" substr(line, start+1, RLENGTH-2) "" substr(line, end+1)
+ }
+
+ return line
+}
+
+
+function closeOne() {
+ env = pop()
+ print "" env ">"
+}
+
+# Matching headers
+/^#+ / {
+ match($0, /#+ /);
+ n = RLENGTH;
+ print "
\n" substr($0, 3) + } +} + +# Matching unordered lists +/^[-+*] / { + env = last() + if (env == "ul" ) { + # In a unordered list block, print a new item + print "" substr($0, 3) " " + } else { + # Otherwise, init the unordered list block + push("ul") + print "\n
- " substr($0, 3) "
" + } +} + +# Matching ordered lists +/^[0-9]+\./ { + env = last() + if (env == "ol") { + # In a ordered list block, print a new item + print "- " substr($0, 4) "
" + } else { + # Otherwise, init the ordered list block + push("ol") + print "\n
- " substr($0, 4) "
" + } +} + +# Matching code block +/^( |\t)/ { + env = last() + match($0, /( |\t)/); + n = RLENGTH; + if (env == "code") { + # In a code block, print a new item + print substr($0, n+1) + } else { + # Otherwise, init the code block + push("pre") + push("code") + print "" substr($0, n+1) + } +} + + +# Matching a simple paragraph +!/^(#|\*|-|\+|>|`|$|\t| )/ { + env = last() + if (env == "none") { + # If no block, print a paragraph + print "
" replaceEmAndStrong($0) "
" + } else if (env == "blockquote") { + print $0 + } +} + +$0 == "" { + env = last() + while (env != "none") { + env = pop() + print "" env ">" + env = last() + } +} + + +END { + env = last() + while (env != "none") { + env = pop() + print "" env ">" + env = last() + } +} \ No newline at end of file diff --git a/lib/post.awk b/lib/post.awk new file mode 100644 index 0000000..e69de29 diff --git a/lib/template/post.html b/lib/template/post.html new file mode 100644 index 0000000..0bc4be6 --- /dev/null +++ b/lib/template/post.html @@ -0,0 +1,16 @@ + + + + +simpet + + + + + +simpet
++ {{article}} + + + diff --git a/test/test.sh b/test/test.sh new file mode 100755 index 0000000..26f4f95 --- /dev/null +++ b/test/test.sh @@ -0,0 +1,149 @@ +#!/usr/bin/env bash + +# Text color variables +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color (reset) + +# Ensure a script is provided +if [ -z "$1" ]; then + echo "Usage: $0" + exit 1 +fi + + +PARSER="$1" + +# Check if the parser script exists +if [ ! -f "$PARSER" ]; then + echo "Error: $PARSER not found!" + exit 1 +fi + +# Determine if it's AWK or Shell (optional second argument) +PARSER_TYPE="bash" # Default to bash script +if [ -n "$2" ]; then + PARSER_TYPE="$2" +fi + +# Define test cases as an array of markdown inputs and expected outputs +declare -a tests=( + "Header 1" + "# Header 1" + " Header 1
" + + "Header 2" + "## Header 2" + "Header 2
" + + "Header 3" + "### Header 3" + "Header 3
" + + "Header 4" + "#### Header 4" + "Header 4
" + + "Header 5" + "##### Header 5" + "Header 5
" + + "Header 6" + "###### Header 6" + "Header 6
" + + "Multiple headers 1" + $'# Header 1\n## Header 2' + "Header 1
Header 2
" + + # "Multiple headers 2" + # $'### Header 3\n\n## Header 2\n\n# Header 1' + # "Header 3
Header 2
Header 1
" + + "Unordered List" + $'- item\n* item' + "" + + "Ordered List" + $'1. item1\n1. item1\n3. item3' + "
- item
- item
" + + "Blockquote 1" + "> test of blockquote" + "
- item1
- item1
- item3
test of blockquote" + + "Blockquote 2" + $'> line1\n> line2' + "line1line2" + + "Blockquote 2" + $'> line1\nline2' + "line1line2" + + "Code Block 1" + $' code1' + "" + + "Code Block 2" + $'\tcode1' + "code1
" + + "Paragraph 1" + "paragraph 1" + "code1
paragraph 1
" + + "Paragraph 2" + "paragraph *emphasis* and **strong**" + "paragraph emphasis and strong
" + + "Mix Code blocks and paragraphs 1" + $'First paragraph\n\n code block' + "First paragraph
" + + "Mix Code blocks and paragraphs 2" + $'First paragraph\n\n code1\n code2\n\nSecond paragraph' + "code block
First paragraph
code1code2
Second paragraph
" + + # You can add more test cases following the same format... +) + +input="# test" +expected="test
" + +# Function to run a single test case +run_test() { + local input="$1" + local expected="$2" + local actual="" + + # Get the actual output from the parser + if [ "$PARSER_TYPE" == "awk" ]; then + # Run AWK script with the input + actual=$(echo "$input" | awk -f "$PARSER" | tr -d '\n') + else + # Assume it's a shell script, run it + actual=$(echo "$input" | bash "$PARSER" | tr -d '\n') + fi + + # Compare the actual output with the expected output + if [ "$actual" == "$expected" ]; then + echo -e "${GREEN}Test Passed!${NC}" + else + echo -e "${RED}Test Failed!${NC}" + echo "Input:" + echo "$input" + echo "Expected:" + echo "$expected" + echo "Got:" + echo "$actual" + fi +} + +# Main loop to run all test cases +num_tests=$((${#tests[@]} / 3)) # Divide by 2 because each test has input/output pair +for ((i = 0; i < num_tests; i++)); do + input="${tests[i * 3 + 1]}" + expected="${tests[i * 3 + 2]}" + echo "Test $((i + 1)):" ${tests[i * 3]} + run_test "$input" "$expected" +done diff --git a/test/test01.md b/test/test01.md new file mode 100644 index 0000000..c7281b8 --- /dev/null +++ b/test/test01.md @@ -0,0 +1,12 @@ +# Major title + +## Minor title + +### Subtitle + +- ici +- on +- est +- là + +ok \ No newline at end of file diff --git a/test/test02.md b/test/test02.md new file mode 100644 index 0000000..3d00776 --- /dev/null +++ b/test/test02.md @@ -0,0 +1,18 @@ +# test + +salut à tous + +- item 1 +- item 2 + +## test1 + +okkk + +> blockquote +> again +> again and again + + code + +paragraph *em* and **strong** \ No newline at end of file