#!/usr/bin/python # -*- coding: UTF-8 -*- import cgitb cgitb.enable() import cgi import time import datetime import random import os from xml.dom.minidom import getDOMImplementation, parse, parseString # pari apufunktiota joilla luodaan tarvittavat piilotetut input-elementit ja option-elementit def hidden(parent, value): input = dom1.createElement("input") input.setAttribute("type", "hidden") input.setAttribute("name", "css_list") input.setAttribute("value", value) parent.appendChild( input ) def option(dom, parent, value): option = dom1.createElement("option") option.setAttribute("value", value) option.appendChild ( dom.createTextNode(value) ) parent.appendChild( option ) print """Content-type: text/html;charset=UTF-8 """ # u merkkijonon alussa tekee unicode-merkkijonon. Tarvitaan jos lähdekoodin merkistö on muuta kuin UTF-8 css = [u'http://www.w3.org/StyleSheets/Core/Oldstyle.css',u'http://www.w3.org/StyleSheets/Core/Modernist',u'http://www.w3.org/StyleSheets/Core/Midnight',u'http://www.w3.org/StyleSheets/Core/Steely'] kuukausi = datetime.datetime.now().month if kuukausi == 0 or kuukausi == 1 or kuukausi == 2: tyyli = "http://www.w3.org/StyleSheets/Core/Oldstyle.css" elif kuukausi >= 3 and kuukausi <= 5: tyyli = "http://www.w3.org/StyleSheets/Core/Modernist" elif kuukausi == 6 or kuukausi == 7 or kuukausi == 8: tyyli = "http://www.w3.org/StyleSheets/Core/Midnight" else: tyyli = "http://www.w3.org/StyleSheets/Core/Steely" #tyyli = css[random.randint(0,len(css)-1)] form = cgi.FieldStorage() # täytyy muuntaa syötteet unicode-merkkijonoiksi # merkistö on oltava sama kuin mitä lomakkeelle hyväksytään eli UTF-8 tässä tapauksessa # pitäisi laittaa vielä try..exceptin sisään siltä varata, että jokin selain sotkee merkistöjen kanssa # http://blog.notdot.net/2010/07/Getting-unicode-right-in-Python # http://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=python_l2 url = form.getfirst("url", "").decode('UTF-8') valittu = form.getfirst("css", "").decode('UTF-8') urlit = form.getlist("css_list") urlit2 = [] # pitää tehdä sama dekoodaus myös listana tulleille tiedoille for p in urlit: urlit2.append( p.decode('UTF-8') ) urlit = urlit2 if len(url) > 0: tyyli = url else: if len(valittu) > 0: tyyli = valittu # antaa polun samassa kansiossa olevaan vuodenaika.html-tiedostoon: # ei tarvitse huolehtia siitä onko polku riippuvainen palvelimenasetuksista pohja = os.path.join(os.path.dirname(os.environ['SCRIPT_FILENAME']), 'vuodenaika.html') dom1 = parse(pohja) # parse an XML file by name # minidom ei tunnista id-attribuutteja ilman sopivaa DTD:tä # http://stackoverflow.com/questions/24653950/minidom-getelementbyid-not-working # http://stackoverflow.com/questions/1971186/how-to-set-elements-id-in-pythons-xml-dom-minidom # Tämä ei siis toimi tavallisella xhtml-dokumentilla: css_link = dom1.getElementById("css_link") # Jos käytettävissä on uudempi python niin kannattaa kokeilla elementtree-kirjastoa css_link = dom1.getElementsByTagName("link") css_link[0].setAttribute("href",tyyli) p = dom1.getElementsByTagName("p") p[0].appendChild ( dom1.createTextNode(url) ) select = dom1.getElementsByTagName("select") form = dom1.getElementsByTagName("form") if ( len(urlit) > 0): for p in urlit: option(dom1, select[0], p) hidden( form[0], p) else: for p in css: option(dom1, select[0], p) hidden( form[0], p) if len(url) > 0: option(dom1, select[0], url) hidden( form[0], url) # Merkistö on annettava parametrina tai python kaatuu helpsti konversiovirheeseen print dom1.toxml('UTF-8')