Putting in an html table

bruno at modulix onurb at xiludom.gro
Mon Dec 5 04:18:11 EST 2005


Little wrote:
> Could someone start me on putting in a table into this code, and some
> HTML tags. I would to make the table below the map and have a header at
> the top. Thanks for the help.
> 
> """ Publisher example """
> 
> def query(req, building=""):
>     # NOTE:  best way to understand this is to see the output,
>     #  that is, to "view source" on the generated web page
>     # read common header for any google mapping
>     f = file('/home/ta/public_html/maplish/googleHead.html','r')

Never hardcode a path.

>     t = f.read()
>     f.close()
>     # define the two buildings we know (because no SQL is done here)
>     buildings =  [ ("cb", "Cambus Office",  "-91.552977", "41.659655")
> ]
>     buildings +=  [ ("va/hardlib", "VA/Hardin Library", "-91.549501",
> "41.662348") ]
>     buildings +=  [ ("hancher", "Hancher Auditorium",  "-91.538214",
> "41.669529") ]
>     buildings +=  [ ("currier", "Currier Hall",  "-91.534996",
> "41.666163") ]
>     buildings +=  [ ("schaeffer", "Schaeffer Hall",  "-91.535296",
> "41.660969") ]
>     buildings +=  [ ("shospital", "South Hospital",  "-91.548900",
> "41.658885") ]

# avoid useless operations
     buildings =  [
       ("cb", "Cambus Office",  "-91.552977", "41.659655"),
       ("va/hardlib", "VA/Hardin Library", "-91.549501", "41.662348"),
       ("hancher", "Hancher Auditorium",  "-91.538214", "41.669529"),
       ("currier", "Currier Hall",  "-91.534996", "41.666163") ,
       ("schaeffer", "Schaeffer Hall",  "-91.535296", "41.660969"),
       ("shospital", "South Hospital",  "-91.548900", "41.658885")
    ]


>     str = ''  #  in case no buildings match, use empty string
# don't use 'str' as an identifier, it will shadow the builtin str type.


>     for x in buildings:
>        a,b,c,d = x   # isolate all the tuple components into a,b,c,d
>        if building.lower() == a:

If what you want is to find the building matching the one given as
argument, you should build a dict, not a list of tuples.

     buildings =  {
       "cb" : ("Cambus Office",  "-91.552977", "41.659655"),
       "va/hardlib" : ("VA/Hardin Library", "-91.549501", "41.662348"),
       "hancher" : ("Hancher Auditorium",  "-91.538214", "41.669529"),
       "currier" : ("Currier Hall",  "-91.534996", "41.666163") ,
       "schaeffer" : ("Schaeffer Hall",  "-91.535296", "41.660969"),
       "shospital" : ("South Hospital",  "-91.548900", "41.658885")
    }

Now you don't need to loop and compare, a simple :
    buildings.get(building.lower())
should be enough

(NB : Anyway, this dict should not be hardcoded. Put this in a separate
conf file, in a db, or whatever, but keep it out of the code.)


>           # construct javascript, using Python %s to substitute names
> and data
>           # see http://docs.python.org/lib/typesseq-strings.html if
> needed
>           str =  'var bldg%s = new GPoint( %s, %s);\n' % (a, c, d)
>           str += 'var mrk%s = new GMarker( bldg%s );\n' % (a, a)
>           str += 'var htm%s = "%s";\n' % (a, b)
>           str += 'GEvent.addListener(mrk%s,"click",function() {' % a
>           str += 'mrk%s.openInfoWindowHtml(htm%s); });\n' % (a, a)
>           str += 'map.addOverlay(mrk%s);\n' % a

string concatenation is not an efficient idiom. In a loop, the common
idiom is to use a list and join it, but here I guess a triple quoted
string and simple templating trick would be better.


>     # output markers, if any
>     t = t + str
>     # then add trailing html to finish page
>     trail = "//]]> </script> </body> </html>"
>     t = t + trail    
>     return t

This is definitevely not how I would do HTML/js in Python. There are a
lot of templating / HTML generation tools available, that allow to
cleanly separate logic from presentation.

-- 
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'onurb at xiludom.gro'.split('@')])"



More information about the Python-list mailing list