def record_assignments(content, statements=None): def record_assignment(match): label = eval(content[match.start('label'):match.end('label')].strip()) maybe_statement = MaybeStatement(MaybeStatement.ASSIGNMENT, match.start(), label, match.end()) maybe_statement.content = content[match.start():match.end()] maybe_statement.line = len(content[:match.end()].splitlines()) alternative_start = match.start('alternatives') alternatives = content[match.start('alternatives'):match.end('alternatives')] for value, alternative in enumerate(alternatives.split(',')): alternative_content = alternative.strip() alternative_start += len(alternative) - len(alternative.lstrip()) maybe_alternative = MaybeAlternative(value, maybe_statement.start, alternative_start, alternative_start + len(alternative_content), alternative_content) maybe_statement.alternatives.append(maybe_alternative) alternative_start += len(alternative.lstrip()) + 1 statements[maybe_statement.label] = maybe_statement if not statements: statements = {} cleaned_content = clean_string(content) for match in ASSIGNMENT_PATTERN.finditer(cleaned_content): record_assignment(match) return statements
def record_blocks(content, statements=None): if not statements: statements = {} cleaned_content = clean_string(content) for match in BLOCK_START_PATTERN.finditer(cleaned_content): maybe_block = match_to_block(match, content) assert not statements.has_key(maybe_block.label) statements[maybe_block.label] = maybe_block return statements
def record_constants(content, statements=None): if not statements: statements = [] file_line_count = len(content.splitlines()) cleaned_content = clean_string(content) for match in CONSTANT_PATTERN.finditer(content): line = len(content[:match.end()].splitlines()) statements.append(ConstantLine(line, match.group().strip(), file_line_count)) return statements
def record_blocks(content, statements=None): if not statements: statements = [] file_line_count = len(content.splitlines()) cleaned_content = clean_string(content) for match in find_blocks(cleaned_content): if_else_block = match_to_block(match, cleaned_content, content) if_else_block.file_line_count = file_line_count statements.append(if_else_block) return statements
def record_timers(content, statements=None): if not statements: statements = [] cleaned_content = clean_string(content) file_line_count = len(content.splitlines()) for match in TIMER_PATTERN.finditer(content): line = len(content[:match.end()].splitlines()) statements.append(TimerLine(match.group('timer_type').strip(), line, match.group().strip(), file_line_count)) return statements
def replace_blocks(content, standard_indent=" "): labels = {} package_name = get_package_name(content) while True: cleaned_content = clean_string(content) block_match = BLOCK_START_PATTERN.search(cleaned_content) if block_match: maybe_block = match_to_block(block_match, content) name = "__{slug}__{nonce}".format(slug=re.sub("[^A-Za-z0-9]", "_", maybe_block.label), nonce=random.randint(0,1024)) inner = [] alternative_indent = re.match("^\s*", maybe_block.alternatives[0].content).group() for i, alternative in enumerate(maybe_block.alternatives): if i == 0: block_template = JAVA_LAST_BLOCK_ALTERNATIVE_TEMPLATE else: block_template = JAVA_BLOCK_ALTERNATIVE_TEMPLATE unindented_inner = block_template.format(value=alternative.value, contents=alternative.content.rstrip(), indent=alternative_indent, stdindent=standard_indent, label=maybe_block.label, package=package_name, name=name) indented_inner = [] for line in unindented_inner.splitlines(): indented_inner.append(standard_indent + line) indented_inner = "\n".join(indented_inner) inner.append(indented_inner) reversed_inner = "".join(reversed(inner)) replacement = JAVA_BLOCK_TEMPLATE.format(name=name, stdindent=standard_indent, package=package_name, label=maybe_block.label, inner=reversed_inner) indented_replacement = [] for line in replacement.splitlines(): indented_replacement.append(block_match.group('indent') + line) indented_replacement = "\n".join(indented_replacement) labels[maybe_block.label] = indented_replacement content = content[:maybe_block.start] + indented_replacement + content[maybe_block.end:] else: break return content, labels
def replace_assignments(content, standard_indent=" "): package_name = get_package_name(content) def replace_assignment(match, content, labels): label = eval(content[match.start('label'):match.end('label')].strip()) indent = match.group('indent') variable = match.group('variable').rstrip() separator = "\n{indent}}} or {{\n".format(indent=indent) name = re.split(r"""\s+""", match.group('variable').strip())[-1] alternatives = content[match.start('alternatives'):match.end('alternatives')] inner = separator.join(["{indent}{name} = {a};".format(indent=standard_indent, name=name, a=a.strip()) for a in alternatives.split(',')]) replacement = ASSIGNMENT_TEMPLATE.format(indent=indent, package=package_name, variable=variable, label=label, inner=inner) if name == variable: # Jinghao: Mar 19, 2015 # remove the declaration: variable was assigned a value without declaration. replacement = '\n'.join(replacement.split('\n')[2:]) indented_replacement = [] for line in replacement.splitlines(): indented_replacement.append(indent + line) indented_replacement = "\n".join(indented_replacement) replacement = indented_replacement labels[label] = replacement return content[:match.start()] + replacement + content[match.end():] labels = {} while True: cleaned_content = clean_string(content) assignment_match = ASSIGNMENT_PATTERN.search(cleaned_content) if assignment_match: content = replace_assignment(assignment_match, content, labels) else: break return content, labels
import lib import glob import os import re import sys nav = vars.get_nav() read_nav = True scene_num = 1 dir = 'L:\\cbt_video_published\\content\\PPL05-air-air\\' os.chdir(dir) lesson_name = nav.get('lesson_name', 'Lesson') #remove full stop from end of lesson_name lesson_name = re.sub(r'\.$', '', lesson_name) lesson_name = lib.clean_string(lesson_name) #start to build ini_lesson.js last_scene = '' ini = 'var lesson_title = \'' + lesson_name + '\';\n' ini += 'var my_scenes;\n' ini += 'my_scenes = [];\n' print('BUILDING HTML FILES FROM GLOB LIST:') #build files from glob for file in glob.glob('*.mp4'): video_file = file[:-4] scene_number = re.sub(r'.*-s', '', video_file)
def test_match_block(self): cleaned_content = lib.clean_string(self.test_file) matches = ifelse.find_blocks(cleaned_content) self.assertEqual(self.answers['statement_count'], len(matches)) for match in matches: self.assertEqual(match.group()[-1], "(")
def test_clean_string(self): string = lib.clean_string(self.test_file).rstrip('\n') self.assertEqual(strip_quotes(strip_whitespace(string)), self.answers['is_block_test'])
def test_match_timers(self): cleaned_content = lib.clean_string(self.test_file) matches = list(timers.TIMER_PATTERN.finditer(cleaned_content)) self.assertEqual(self.answers['statement_count'], len(matches))