diff --git a/exec/typehtml.src b/exec/typehtml.src new file mode 100644 index 0000000000000000000000000000000000000000..deae2b91b15813e027f3f61fb21ca6625c400438 --- /dev/null +++ b/exec/typehtml.src @@ -0,0 +1,467 @@ +# typehtml.c + +# Synchronet Baja Modules to Display HTML files to TTY/ANSI users + +# Created October 09, 2000 by Rob Swindell + +# $id$ + +# @format.tab-size 8, @format.use-tabs true + +!include file_io.inc +!include sbbsdefs.inc + +# Color Attributes for HTML type styles +!define NORMAL "\1N\1H" +!define HEADING1 "\1H\1Y" +!define HEADING2 "\1H\1C" +!define HEADING3 "\1H\1M" +!define HEADING4 "\1H\1G" +!define HEADING5 "\1H\1B" +!define HEADING6 "\1H\1R" +!define BOLD "\1H\1C\x014" +!define ITALIC "\1H\1G\x012" +!define UNDERLINE "\1H\1W\x016" +!define STRIKE_THROUGH "\1N\1K\x017" +!define LIST_ITEM " \1H\1Wo \1G" + +!define RIGHT_MARGIN 79 + +str filename # HTML filename +str tmpfname # Temporary filename +str href +int i +int ch +int len +int t +int start +int htmlfile +int tmpfile +int hlevel # header level +int col # current cursor column +int last_line_len # length of last line printed +int lines # total lines printed +int printing # printing on +int newline # new line read from html file + +copy filename str + +compare_str "" +if_true + print "usage: typehtml <filename>\r\n" + return + end_if + +# Open HTML input file +fopen htmlfile O_RDONLY|O_DENYNONE filename +if_false + printf "!Error %d opening %s\r\n" _ERRNO filename + return + end_if + +# Open Ctrl-A output file +set tmpfname "%gHTML.ASC" +fopen tmpfile O_WRONLY|O_CREAT|O_TRUNC tmpfname +if_false + printf "!Error %d creating %s\r\n" _ERRNO tmpfname + return + end_if + +set col 0 # reset column counter +set last_line_len 0 # reset last line length +set lines 0 # reset line counter +set printing 1 # printing by default + +print "Converting HTML" +time start + +:next_line + print "." + + # Read a line + fread_line htmlfile str + if_false # end of file + fclose htmlfile + fclose tmpfile + time t + sub t start +# printf "%d seconds" t +# pause + cls + printfile tmpfname P_NOATCODES + return + end_if + + set newline 1 + + # truncate whitespace off end + truncsp str + + # truncate whitespace off front + call skip_whitespace + + :next_char + compare_first_char str 0 + if_true + goto next_line + end_if + + compare_substr str "<" + if_false + compare col 0 + if_true + call skip_whitespace + end_if + set i RIGHT_MARGIN + sub i col + compare i 0 + if_equal + call crlf + set i RIGHT_MARGIN + end_if + strlen len str + compare i len + if_greater + copy i len + end_if + fprintf tmpfile "%.*s" i str + shift_str str i + add col i + compare col RIGHT_MARGIN + if_greater_or_equal + call crlf + end_if + goto next_char + end_if + + compare_first_char str '<' + if_false + compare printing 1 + if_true + # handle word wrap + compare newline 1 + if_equal + compare col 0 + if_not_equal + fprintf tmpfile " " + add col 1 + end_if + end_if + set newline 0 + + # don't start lines with white-space + compare col 0 + if_true + compare_first_char str ' ' + end_if + if_false + fwrite tmpfile str 1 + add col 1 + compare col RIGHT_MARGIN + if_greater_or_equal + call crlf + end_if + end_if + end_if + shift_str 1 + goto next_char + end_if + + shift_str 1 # skip < + + # Title + compare_word "TITLE>" + if_true + set printing 0 + call find_close_bracket + goto next_char + end_if + compare_word "/TITLE>" + if_true + set printing 1 + call find_close_bracket + goto next_char + end_if + + + # List item + compare_word "LI>" + if_false + compare_word "LI " + end_if + if_true + compare col 0 + if_not_equal + call crlf + end_if + fprintf tmpfile LIST_ITEM + set col 6 + call find_close_bracket + goto next_char + end_if + + # Strike-through + compare_word "S>" + if_false + compare_word "STRIKE>" + end_if + if_true + fprintf tmpfile STRIKE_THROUGH + call find_close_bracket + goto next_char + end_if + + # Bold + compare_word "B>" + if_false + compare_word "STRONG>" + end_if + if_true + fprintf tmpfile BOLD + call find_close_bracket + goto next_char + end_if + + # Italics + compare_word "I>" + if_false + compare_word "EM>" + end_if + if_true + fprintf tmpfile ITALIC + call find_close_bracket + goto next_char + end_if + + # Underline + compare_word "U>" + if_false + compare_word "U>" + end_if + if_true + fprintf tmpfile UNDERLINE + call find_close_bracket + goto next_char + end_if + + + # Attribute off + compare_word "/S>" + if_false + compare_word "/STRIKE>" + end_if + if_false + compare_word "/B>" + end_if + if_false + compare_word "/STRONG>" + end_if + if_false + compare_word "/I>" + end_if + if_false + compare_word "/EM>" + end_if + if_false + compare_word "/U>" + end_if + if_true + fprintf tmpfile NORMAL + call find_close_bracket + goto next_char + end_if + + # Table cell + compare_word "TD>" + if_false + compare_word "TD " + end_if + if_true + # visually separate cells + compare col 0 + if_greater + fprintf tmpfile " " + add col 1 + end_if + call find_close_bracket + goto next_char + end_if + + + # Dumb CR/LF block + compare_word "BR>" + if_false + compare_word "BR " + end_if + if_false + compare_word "P>" + end_if + if_false + compare_word "P " + end_if + if_false + compare_word "TR>" + end_if + if_false + compare_word "TR " + end_if + if_true + call crlf + call find_close_bracket + goto next_char + end_if + + + # Intelligent CR/LF block (force single blank line) + compare_word "/UL>" + if_false + compare_word "/OL>" + end_if + if_false + compare_word "/DIR>" + end_if + if_false + compare_word "/MENU>" + end_if + if_true + fprintf tmpfile NORMAL + end_if + if_false + compare_word "H" + if_true + shift_str 1 + copy hlevel str + compare hlevel 0 + if_greater + switch hlevel + case 1 + fprintf tmpfile HEADING1 + end_case + case 2 + fprintf tmpfile HEADING2 + end_case + case 3 + fprintf tmpfile HEADING3 + end_case + case 4 + fprintf tmpfile HEADING4 + end_case + case 5 + fprintf tmpfile HEADING5 + end_case + default + fprintf tmpfile HEADING6 + end_case + end_switch + setlogic TRUE + else + setlogic FALSE + end_if + end_if + end_if + if_false + compare_word "/H" + if_true + shift_str 2 + copy hlevel str + compare hlevel 0 + if_greater + fprintf tmpfile NORMAL + setlogic TRUE + else + setlogic FALSE + end_if + end_if + end_if + if_true + compare lines 0 + if_equal + compare col 0 + end_if + if_greater + compare last_line_len 0 + if_equal + compare col 0 + end_if + if_not_equal + call crlf + call crlf + end_if + end_if + call find_close_bracket + goto next_char + end_if + + # Hyper-link + compare_word "A HREF=" + if_true + shift_str 7 + set href "" + :copy_href + compare_first_char str '>' + if_false + copy_first_char ch str + strcat href ch + shift_str 1 + goto copy_href + end_if + end_if + + # Show hyper-link + compare_word "/A>" + if_true + compare href "" + if_false + strlen i href + add i 3 + add col i + compare col RIGHT_MARGIN + if_equal_or_greater + call crlf + sub i 1 + copy col i + else + fprintf tmpfile " " + end_if + fprintf tmpfile "<%s>" href + end_if + set href "" + end_if + + call find_close_bracket + goto next_char + +return + +# Carriage-return/Line-feed with column reset +:crlf + copy last_line_len col + fprintf tmpfile "\r\n" + set col 0 + add lines 1 + return + +# Shift str past first close bracket +:find_close_bracket + compare_first_char str 0 + if_true + return + end_if + + compare_first_char str '>' + shift_str 1 + if_false + goto find_close_bracket + end_if + return + +:skip_whitespace + compare_first_char str ' ' + if_false + compare_first_char str '\t' + end_if + if_true + shift_str 1 + goto skip_whitespace + end_if + return