markdown2html.sh

Искусство написания bash скриптов. Делимся своими наработками
Ответить
ypaseka
Сообщения: 10
Зарегистрирован: 20 янв 2015, 19:13
Темы: 2
Статус: Не в сети

markdown2html.sh

Сообщение ypaseka » 20 янв 2015, 19:35

Скрипт который меняет txt в html. Не запускается, помогите срочно!!

Код: Выделить всё

#!/bin/bash# there are 5 tags to be searched,
# <p> => beginning of the file till the end,
# </p><p> => on \n\n
# <b> on " *" and </b> on "* "
# {lll} into link with link as a test
# {aaa|bbb} into link with alternated text

usage="Usage: $0 -f outfile|- [<infile]"
outfile=""

if [ $# -ne 2 ]; then
  echo "$usage"
  exit 1
fi

if [ $# -eq 2 ]; then
  while getopts ":f:h" optname
  do
    case "$optname" in
      "h")
        echo "$usage"
        ;;
      "f")
        if [[ "$optname" == "" ]]; then
          echo "no output filename provided! Exit!"
          exit 2
        fi
        outfile=$OPTARG
        ;;
      *)
        echo "Unknown error while processing options"
        echo "$usage"
        ;;
    esac
  done
fi 

url_re='(.*)(\{)(.*)(\})(.*)'
img_re='(.*)(\[)(.*)(\])(.*)'
italic_re='(.*)( _)(.*)(_ )(.*)'
bold_re='(.*)( \*)(.*)(\* )(.*)'
out=tmp

function subst {
  echo $( cat $out | sed s/"$1"/"$2"/g ) > tmp2
  mv tmp2 $out
}


# main loop for input
echo '<html><head></head><body><p>' > $out
#IFS=$'\n'
while read line  # For as many lines as the input file has...
do
  if [ "$line" == "" ]; then
    echo "</p>\n<p>" >> $out
  else
    echo "$line" >> $out
  fi
done

echo "</p></body></html>" >> $out

subst " _" " <i>"
subst "_ " "<\/i> "
subst " \*" " <b>"
subst "\* " "<\/b> "
subst " \[" "<img src=\"images\/"
subst "\] " "\" \/> "

# convert {.*|.*} into a link:
echo $( grep {.*} $out | sed -e 's/{\([^|}]*\)|\([^}]*\)}/<a href=\"\2\">\1<\/a>/g' ) > tmp2
mv tmp2 $out

#convert {.*} into a link:
echo $( grep {.*} $out | sed -e 's/{\([^}]*\)}/<a href=\"\1\">\1<\/a>/g' ) > tmp2
mv tmp2 $out

if [[ "$outfile" == "-" ]]; then
  cat $out
  rm $out
else
  mv $out $outfile
fi

#eof!

Аватара пользователя
ZEN
Администратор
Сообщения: 1358
Зарегистрирован: 27 сен 2012, 18:23
Темы: 208
Откуда: Украина, Одесса
Статус: Не в сети

Re: markdown2html.sh

Сообщение ZEN » 21 янв 2015, 00:27

Как я понял из скрипта - задача преобразовывать markdown в html. Что правда то, что написано в текущем варианте мне не особо нравится. Без обид, но мне проще было свой парсер с нуля написать, чем исправлять текущий.

Собственно, ниже код моего парсера:

Код: Выделить всё

#!/usr/bin/env bash

IN_FILE="$1";

test -n "$IN_FILE" || {
    echo "usage: $0 /path/to/file.txt";
    echo "or";
    echo "usage: $0 /path/to/file.txt > /path/to/output.html";
    exit 1;
}

test -r "$IN_FILE" || {
    echo "Cannot read file: $1" 1>&2;
    exit 2;
}

echo "<html><head></head><body><p>";

while read LINE; do
    # Parse URL: {http://url}
    LINE=$(echo $LINE | sed 's/{\(http[^{|}]\+\)}/<a href="\1">\1\<\/a>/g');

    # Parse URL: {example|http://url}
    LINE=$(echo $LINE | sed 's/{\([^{|}]\+\)|\(http[^}]\+\)}/<a href="\2">\1\<\/a>/g');

    # Parse Img: [Url]
    LINE=$(echo $LINE | sed 's/\[\(http[^[]\+\)\]/<img src="\1"\/>/g');

    # Parse Italic text: _example_
    LINE=$(echo $LINE | sed 's/_\([^_]\+\)_/<i>\1<\/i>/g');

    # Parse Bold text: *example*
    LINE=$(echo $LINE | sed 's/\*\([^*]\+\)\*/<b>\1<\/b>/g');

    echo "$LINE<br>";
done < <(cat "$IN_FILE");

echo "</p></body></html>";

exit 0;
Пример файла, который скармливается скрипту:

Код: Выделить всё

text {google.com|http://google.com}!
Image:
[https://cdn.tutsplus.com/net/uploads/legacy/951_vimEasyMotion/markdown-to-html2.jpg]
Italic _Test_
Bold *Text*
*Combo* _Text_
Запускаем скрипт выше:

Код: Выделить всё

./markdown2html.sh test.txt > index.html
И получаем следующее содержимое внутри файла index.html:

Код: Выделить всё

<html><head></head><body><p>
text <a href="http://google.com">google.com</a>!<br>
Image:<br>
<img src="https://cdn.tutsplus.com/net/uploads/legacy/951_vimEasyMotion/markdown-to-html2.jpg"/><br>
Italic <i>Test</i><br>
Bold <b>Text</b><br>
<b>Combo</b> <i>Text</i><br>
</p></body></html>
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей