Package translate :: Package storage :: Package placeables :: Module parse'
[hide private]
[frames] | no frames]

Source Code for Module translate.storage.placeables.parse'

 1  #!/usr/bin/env python 
 2  # -*- coding: utf-8 -*- 
 3  # 
 4  # Copyright 2008-2009 Zuza Software Foundation 
 5  # 
 6  # This file is part of the Translate Toolkit. 
 7  # 
 8  # This program is free software; you can redistribute it and/or modify 
 9  # it under the terms of the GNU General Public License as published by 
10  # the Free Software Foundation; either version 2 of the License, or 
11  # (at your option) any later version. 
12  # 
13  # This program is distributed in the hope that it will be useful, 
14  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
15  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
16  # GNU General Public License for more details. 
17  # 
18  # You should have received a copy of the GNU General Public License 
19  # along with this program; if not, see <http://www.gnu.org/licenses/>. 
20   
21  """ 
22  Contains the C{parse} function that parses normal strings into StringElem- 
23  based "rich" string element trees. 
24  """ 
25   
26  from translate.storage.placeables import base, StringElem 
27   
28 -def parse(tree, parse_funcs):
29 """Parse placeables from the given string or sub-tree by using the 30 parsing functions provided. 31 32 The output of this function is B{heavily} dependent on the order of the 33 parsing functions. This is because of the algorithm used. 34 35 An over-simplification of the algorithm: the leaves in the C{StringElem} 36 tree are expanded to the output of the first parsing function in 37 C{parse_funcs}. The next level of recursion is then started on the new 38 set of leaves with the used parsing function removed from 39 C{parse_funcs}. 40 41 @type tree: unicode|StringElem 42 @param tree: The string or string element sub-tree to parse. 43 @type parse_funcs: A list of parsing functions. It must take exactly 44 one argument (a C{unicode} string to parse) and return a list of 45 C{StringElem}s which, together, form the original string. If nothing 46 could be parsed, it should return C{None}.""" 47 if isinstance(tree, unicode): 48 tree = StringElem(tree) 49 if not parse_funcs: 50 return tree 51 52 parse_func = parse_funcs[0] 53 54 for leaf in tree.flatten(): 55 #FIXME: we might rather want to test for editability, but for now this 56 # works better 57 if not leaf.istranslatable: 58 continue 59 60 unileaf = unicode(leaf) 61 if not unileaf: 62 continue 63 64 subleaves = parse_func(unileaf) 65 if subleaves is not None: 66 if len(subleaves) == 1 and type(leaf) is type(subleaves[0]) and leaf == subleaves[0]: 67 pass 68 elif isinstance(leaf, unicode): 69 parent = tree.get_parent_elem(leaf) 70 if parent is not None: 71 if len(parent.sub) == 1: 72 parent.sub = subleaves 73 leaf = parent 74 else: 75 leafindex = parent.sub.index(leaf) 76 parent.sub[leafindex] = StringElem(subleaves) 77 leaf = parent.sub[leafindex] 78 else: 79 leaf.sub = subleaves 80 81 parse(leaf, parse_funcs[1:]) 82 83 if isinstance(leaf, StringElem): 84 leaf.prune() 85 return tree
86