1# Parser for test templates 2# 3# Copyright (c) 2021 Virtuozzo International GmbH. 4# 5# This program is free software; you can redistribute it and/or modify 6# it under the terms of the GNU General Public License as published by 7# the Free Software Foundation; either version 2 of the License, or 8# (at your option) any later version. 9# 10# This program is distributed in the hope that it will be useful, 11# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13# GNU General Public License for more details. 14# 15# You should have received a copy of the GNU General Public License 16# along with this program. If not, see <http://www.gnu.org/licenses/>. 17# 18 19import itertools 20from lark import Lark 21 22grammar = """ 23start: ( text | column_switch | row_switch )+ 24 25column_switch: "{" text ["|" text]+ "}" 26row_switch: "[" text ["|" text]+ "]" 27text: /[^|{}\[\]]+/ 28""" 29 30parser = Lark(grammar) 31 32class Templater: 33 def __init__(self, template): 34 self.tree = parser.parse(template) 35 36 c_switches = [] 37 r_switches = [] 38 for x in self.tree.children: 39 if x.data == 'column_switch': 40 c_switches.append([el.children[0].value for el in x.children]) 41 elif x.data == 'row_switch': 42 r_switches.append([el.children[0].value for el in x.children]) 43 44 self.columns = list(itertools.product(*c_switches)) 45 self.rows = list(itertools.product(*r_switches)) 46 47 def gen(self, column, row): 48 i = 0 49 j = 0 50 result = [] 51 52 for x in self.tree.children: 53 if x.data == 'text': 54 result.append(x.children[0].value) 55 elif x.data == 'column_switch': 56 result.append(column[i]) 57 i += 1 58 elif x.data == 'row_switch': 59 result.append(row[j]) 60 j += 1 61 62 return ''.join(result) 63