cka
cka

Reputation: 93

Python: Need to replace a series of different substrings in HTML template with additional HTML or database results

Situation:

I am writing a basic templating system in Python/mod_python that reads in a main HTML template and replaces instances of ":value:" throughout the document with additional HTML or db results and then returns it as a view to the user.

I am not trying to replace all instances of 1 substring. Values can vary. There is a finite list of what's acceptable. It is not unlimited. The syntax for the values is [colon]value[colon]. Examples might be ":gallery: , :related: , :comments:". The replacement may be additional static HTML or a call to a function. The functions may vary as well.

Question:

What's the most efficient way to read in the main HTML file and replace the unknown combination of values with their appropriate replacement?


Thanks in advance for any thoughts/solutions,

c

Upvotes: 1

Views: 564

Answers (3)

Alex Martelli
Alex Martelli

Reputation: 882441

If you can't use an existing templating system for whatever reason, your problem seems best tackled with regular expressions:

import re

valre = re.compile(r':\w+:')

def dosub(correspvals, correspfuns, lastditch):
  def f(value):
    v = value.group()[1:-1]
    if v in correspvals:
      return correspvals[v]
    if v in correspfuns:
      return correspfuns[v]()  # or whatever args you need
    # what if a value has neither a corresponding value to
    # substitute, NOR a function to call?  Whatever...:
    return lastditch(v)
  return f

replacer = dosub(adict, another, somefun)

thehtml = valre.sub(replacer, thehtml)

Basically you'll need two dictionaries (one mapping values to corresponding values, another mapping values to corresponding functions to be called) and a function to be called as a last-ditch attempt for values that can't be found in either dictionary; the code above shows you how to put these things together (I'm using a closure, a class would of course do just as well) and how to apply them for the required replacement task.

Upvotes: 1

Tendayi Mawushe
Tendayi Mawushe

Reputation: 26138

This is probably a job for a templating engine and for Python there are a number of choices. In this stackoveflow question people have listed their favourites and some helpfully explain why: What is your single favorite Python templating engine?

Upvotes: 1

Travis Bradshaw
Travis Bradshaw

Reputation: 4330

There are dozens of templating options that already exist. Consider genshi, mako, jinja2, django templates, or more.

You'll find that you're reinventing the wheel with little/no benefit.

Upvotes: 4

Related Questions