Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

bbcode

Name: Anonymous 2008-11-08 20:29

/*
 * 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
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char *bbcode[7] = {
    "spoiler", "sub", "sup", "b", "u", "o", "i"
};

typedef struct stack_t {
    int value;
    struct stack_t *next;
} stack_t;

stack_t *push(int value, stack_t *stack) {
    stack_t *buf;

    if ((buf = malloc(sizeof(stack_t))) == NULL)
        return NULL;

    buf->value = value;
    buf->next = stack;

    return buf;
}

stack_t *pop(int *out, stack_t *stack) {
    stack_t *next = NULL;

    if(stack != NULL) {
        *out = stack->value;
        next = stack->next;
        free(stack);
    }

    return next;
}

int main(int argc, char **argv) {
    stack_t *stack = NULL;
    int maxc, arg, pushorpop, c;
    int pushed = 0;

    srand(time(NULL));
    maxc = sizeof(bbcode)/sizeof(char*);

    if(argc == 1) {
        return -1;
    }

    for(arg = 1; arg < argc; arg++) {
        pushorpop = rand() % 2;
        if(pushed < 2)
            pushorpop = 0;

        if(pushorpop == 0) {
            c = rand() % maxc;
            stack = push(c, stack);
            pushed++;
            printf("[%s]", bbcode[c]);
        } else {
            stack = pop(&c, stack);
            pushed--;
            printf("[/%s]", bbcode[c]);
        }
        printf("%s ", argv[arg]);
    }
    while(pushed > 0) {
        stack = pop(&c, stack);
        pushed--;
        printf("[/%s]", bbcode[c]);
    }
    printf("\n");
    return 0;
}

Name: Anonymous 2008-11-10 12:08

"""
bbcoder.py, version 0.1

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"""

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>


Result:
BBCODE

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List