#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
RandomQuote.py
A “web service” for generating random quotes.

Place this file (along with quotes.py) on your server, execute it through the browser.

When called without arguments, this script produces a quote in standard HTML format. It takes
an optional format parameter, by appending ?format=Format_Name at the end of the URL.

Formats supported so far (case sensitive):
* html — default foramt
* javascript — the script works as a Javascript widget
* json — output is in JSON format, for to use as you want

Widget example:
Place the following in your HTML file: 
<script type='text/javascript' src='URL/to/script?format=javascript' />
A quote will be inserted wherever you’ve placed the script tag.

All the output is utf-8 encoded, and so are the source files.

Required third-party libraries:
* simplejson

Have fun.
"""

__author__ = "Ankit Solanki (ankit@simulacra.in)"
__copyright__ = "Copyright 2006, Ankit Solanki"
__contributors__ = []
__version__ = "1.1"
__license__ = "MIT"
__history__ = """
1.0 — Initial version of the script
1.1 — Refactored the script, created the RandomQuote class.
      Made the code slightly more flexible by adding a method dispatcher in main.
      Also documented the code somewhat.
1.2 — Added proper content types. It was always outputting text/html before, now
      the output is text/html, application/json, text/javascript depending on the mode.
      The Javascript widget now does the ‘right’ thing, no more document.write().
"""

class RandomQuote:

    def getQuote(self):
        """
        Generate a random quote.
        Output is a dictionary, with keys: quote, author, URL.
        Only the quote key is sure to be present"""
        
        from quotes import quotes, authors
        from random import Random
        
        quote = quotes[Random().randint(0, len(quotes)-1)]

        if quote.has_key("author") and authors.has_key(quote["author"]):
            quote["URL"] = authors[quote["author"]]

        return quote


    def htmlQuote(self):
        """Outputs a random quote in HTML format."""
        quote = self.getHTMLQuote()

        print "Content-Type: text/html; charset=utf-8"
        print "Status: 200 Ok"
        print  

        print quote


    def getHTMLQuote(self):
        """Get a random quote in HTML format."""
        quote = self.getQuote()
        html = quote["quote"]
        
        if quote.has_key("author") and quote.has_key("URL"):
            html += " — " + "<a href=\"" + quote["URL"] + "\">" + quote["author"] + "</a>"

        return html 


    def jsonQuote(self):
        """Output a random quote in JSON format."""
        quote = self.getQuote()

        print "Content-Type: application/json; charset=utf-8"
        print "Status: 200 Ok"
        print  

        import simplejson
        print simplejson.dumps(quote, ensure_ascii=False)


    def javascriptQuote(self):
        """Inserts a random quote into your page using Javascript."""
        javascript = "document.getElementById('quote-div').innerHTML = \"<h2>Random quote</h2><p>"
        javascript += self.__javascriptEscape(self.getHTMLQuote())
        javascript += "</p>\");"

        print "Content-Type: text/javascript; charset=utf-8"
        print "Status: 200 Ok"
        print  

        print javascript
    

    def __javascriptEscape(self, text):
        return text.replace('"', '\\"')


if __name__ == "__main__":
    import cgi
    import cgitb

    cgitb.enable()

    obj = RandomQuote()
    form = cgi.FieldStorage()

    if form.has_key("format"):
        format = form["format"].value + "Quote"
        (hasattr(obj, format) and getattr(obj, format) or obj.htmlQuote)()
    else:
        obj.htmlQuote()