/*
* bbcoder.c -- Generate enterprise grade forum posts.
*
* Copyright (C) 2008 Anonymous
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to
* the Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301, USA
*
*/
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to
the Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor
Boston, MA 02110-1301, USA"""
import sys
from StringIO import StringIO
# List of valid BBCode tags
BB_TAGS = ("spoiler", "sub", "sup", "b", "u", "o", "i", "s", "code")
# Escape character to go up a level
ESCAPE_CHAR = "`"
# Stack of currently opened BBCode tags
bbStack = []
# Output string
stringBuffer = StringIO()
# Clean up after the user quits, by printing the accumulated text
def EndHandler():
# Empty BBCode stack
while len(bbStack) > 0:
stringBuffer.write("[/%s]" % bbStack.pop())
# Print string
stringBuffer.seek(0)
print
print "---"
print stringBuffer.read()
sys.exit(0);
# Parses the line and returns
def ParseLine(line):
# Line is the escape character: Go up one level on the BBCode stack
if line == ESCAPE_CHAR:
if len(bbStack) > 0:
stringBuffer.write("[/%s]" % bbStack.pop())
# Line is a BBCode tag: Add tag to the string buffer and push
# tag on the stack
elif line.lower() in BB_TAGS:
bbStack.append(line)
stringBuffer.write("[%s]" % line)
# Line is empty: Add a newline character
elif line == "":
stringBuffer.write("\n")
# Otherwise: Just add the literal text
else:
stringBuffer.write(line)
# Prints the current location in the BBCode nesting
def PrintBBCodeLocation():
tagList = ["[%s]" % tag.upper() for tag in bbStack]
sys.stdout.write("".join(tagList) + ": ")
sys.stdout.flush()
def Main():
while True:
try:
PrintBBCodeLocation()
line = raw_input()
ParseLine(line)
except EOFError:
EndHandler()
if __name__ == "__main__": Main()
Example usage: : u
[U]: b
[U][B]: s
[U][B][S]: sup
[U][B][S][SUP]: BB
[U][B][S][SUP]: `
[U][B][S]: sub
[U][B][S][SUB]: CODE
[U][B][S][SUB]: <CTRL+D or whatever EOF is on your platform>