def test_brackets_wrapping(self):
     """A bracket block that wraps over multiple lines."""
     cases = [
         [[
             'abcd [ inside block',
             'abcd ',
         ], [
             'inside block ] efg',
             ' efg',
         ]],
         [[
             'abcd',
             'abcd',
         ], [
             'abcd [ inside block',
             'abcd ',
         ], [
             'inside block',
             '',
         ], [
             'inside block comment ] efg',
             ' efg',
         ]],
     ]
     blocks = Blocks()
     for lines in cases:
         blocks.reset()
         for line in lines:
             self.assertEqual(blocks.remove(line[0]), line[1])
def execute_strategy(strategy, args, options):
    """Compile the proze project using the strategy.
    @type  strategy: BaseStrategy
    @param strategy: Strategy to use.
    @type  args: object
    @param args: Parsed command line args.
    @type  options: DotMap
    @param options: Compile options parsed from the config file.
    """
    blocks = Blocks()
    names = Names(options)
    state = State()
    output_path = args.output + '.' + args.doctype
    os.makedirs(os.path.dirname(output_path), exist_ok=True)
    with strategy.compile(output_path) as compiler:
        for filename in options.compile.order:
            path = args.path + '/' + filename
            try:
                with open(path, 'r') as proze_file:
                    blocks.reset()
                    state.reset()
                    line_number = 0
                    for raw_line in proze_file:
                        line_number = line_number + 1
                        line = blocks.remove(raw_line)
                        state.update(raw_line)
                        check_invalid_names(line, path, line_number, names)
                        if line:
                            compiler.write(line, state)
            except FileNotFoundError:
                print('MISSING: Cannot find file "{}". '.format(path) +
                      'Update the file names in your config file.')
 def test_wrapped_blocks_hiding(self):
     """Test wrapped blocks hiding each other.."""
     cases = [
         [[
             'abcd ### inside block comment',
             'abcd ',
         ], [
             '[inside block comment ### efg',
             ' efg',
         ]],
         [[
             'abcd [ inside block comment',
             'abcd ',
         ], [
             '###inside block comment ] efg',
             ' efg',
         ]],
         [[
             'abcd',
             'abcd',
         ], [
             'abcd ### inside block ] comment',
             'abcd ',
         ], [
             'inside block [ comment',
             '',
         ], [
             'inside block comment ### efg',
             ' efg',
         ]],
         [[
             'abcd',
             'abcd',
         ], [
             'abcd [ inside block ### comment',
             'abcd ',
         ], [
             'inside block comment',
             '',
         ], [
             'inside block comment ] efg',
             ' efg',
         ]],
         [[
             'abcd ## hidden by [ line comment',
             'abcd ',
         ], [
             'efg',
             'efg',
         ]],
     ]
     blocks = Blocks()
     for lines in cases:
         blocks.reset()
         for line in lines:
             self.assertEqual(blocks.remove(line[0]), line[1])
 def test_comment_block_line_comment_adjacent(self):
     """A line comment is adjacent to the ending block comment."""
     lines = [
         [
             'abcd ### test of hidden ##### and this is hidden too',
             'abcd ',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])
 def test_comment_block_wrapping(self):
     """Test a block comment wrapping across multiple lines."""
     cases = [
         [[
             'abcd ### inside block comment',
             'abcd ',
         ], [
             'inside block comment ### efg',
             ' efg',
         ]],
         [[
             'abcd',
             'abcd',
         ], [
             'abcd ### inside block comment',
             'abcd ',
         ], [
             'inside block comment',
             '',
         ], [
             'inside block comment ### efg',
             ' efg',
         ]],
         [[
             'abcd ### inside block comment',
             'abcd ',
         ], [
             'this is all ## inside block comment',
             '',
         ], [
             'inside block comment ### efg',
             ' efg',
         ]],
         [[
             'abcd ## this will not start ### a block comment',
             'abcd ',
         ], [
             'abcd ### inside block comment',
             'abcd ',
         ], [
             'this is all ## inside block comment',
             '',
         ], [
             'inside block comment ### efg',
             ' efg',
         ]],
     ]
     blocks = Blocks()
     for lines in cases:
         blocks.reset()
         for line in lines:
             self.assertEqual(blocks.remove(line[0]), line[1])
 def test_comment_block_no_spacing(self):
     """Block tokens without spacing between them."""
     lines = [
         [
             'abcd ### hidden ###### also hidden ### ef',
             'abcd  ef',
         ],
         [
             'abcd### hidden ###ef',
             'abcdef',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])
 def test_comment_block_hides_line_comment(self):
     """A line comment token is hidden by a block token."""
     lines = [
         [
             'abcd ### test of hidden ## token ### ef',
             'abcd  ef',
         ],
         [
             'abcd ### test of hidden ## token',
             'abcd ',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])
 def test_comment_tokens_in_brackets(self):
     """Comment tokens aren't recognized inside bracket blocks."""
     lines = [
         [
             'abcd [ hidden ### hidden ] ef',
             'abcd  ef',
         ],
         [
             'abcd [ ## hidden ## hidden ] efg',
             'abcd  efg',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])
 def test_line_comment_hides_block_comment(self):
     """A block comment token is hidden by a line token."""
     lines = [
         [
             'abcd ## test of ### hidden block ### comment token',
             'abcd ',
         ],
         [
             'abcd ## test of ### hidden block comment token',
             'abcd ',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])
 def test_comment_block(self):
     """Normal usage of a block comment."""
     lines = [
         [
             'abcd ### hidden ### efg',
             'abcd  efg',
         ],
         [
             '### hidden ###',
             '',
         ],
         [
             '  ### hidden ###  ',
             '    ',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])
 def test_comments_hide_brackets(self):
     """A comment token hides a bracket block."""
     lines = [
         [
             'abcd ## test of [ hidden block ] comment token',
             'abcd ',
         ],
         [
             'abcd ### test of [ hidden block ] comment token',
             'abcd ',
         ],
         [
             'abcd ### test of [ hidden block ] comment token ### efg',
             'abcd  efg',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])
 def test_escape_brackets(self):
     """Bracket tokens aren't matched if they are escaped."""
     lines = [
         [
             r'abcd \[ efg',
             r'abcd \[ efg',
         ],
         [
             r'abcd \[ efg [ this is hidden ]',
             r'abcd \[ efg ',
         ],
         [
             r'abcd \[ efg [ this is hidden \] hij ]',
             r'abcd \[ efg ',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])
 def test_multiple_mixed_comment_bracket_blocks(self):
     """Lines that have multiple block comments."""
     lines = [
         [
             'a ### test ### b [ test ] c',
             'a  b  c',
         ],
         [
             'a [ test] bcde ### f g ###',
             'a  bcde ',
         ],
         [
             'a ### test ### bcde [ f g',
             'a  bcde ',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])
 def test_multiple_brackets_per_line(self):
     """Lines that have multiple blocks."""
     lines = [
         [
             'a [ test ] b [ test ] c',
             'a  b  c',
         ],
         [
             'a [ test ] bcde [ f g ]',
             'a  bcde ',
         ],
         [
             'a [ test ] bcde [ f g',
             'a  bcde ',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])
 def test_escape_comment_line(self):
     """Bracket tokens aren't matched if they are escaped."""
     lines = [
         [
             r'abcd \## efg',
             r'abcd \## efg',
         ],
         [
             r'abcd \## efg ## test',
             r'abcd \## efg ',
         ],
         [
             r'abcd ## efg ## test',
             r'abcd ',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])
 def test_line_comment_token(self):
     """Normal usage of a line comment token."""
     lines = [
         [
             'abcd ## The rest of the line is hidden',
             'abcd ',
         ],
         [
             'abcd ##',
             'abcd ',
         ],
         [
             '## The entire line is hidden',
             '',
         ],
         [
             ' ## The entire line is hidden',
             ' ',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])
 def test_brackets_hide_comments(self):
     """A bracket block hiding comment tokens."""
     lines = [
         [
             'abcd [ test of ### hidden block ### comment token ]',
             'abcd ',
         ],
         [
             'abcd [ test of ## hidden block comment token]',
             'abcd ',
         ],
         [
             'abcd [ test of ### hidden block ### comment token ] efg',
             'abcd  efg',
         ],
         [
             'abcd [ test of ## hidden block comment token ] efg',
             'abcd  efg',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])
 def test_brackets_on_same_line(self):
     """Brackets open and close on same line."""
     lines = [
         [
             'abcd [hidden] efg',
             'abcd  efg',
         ],
         [
             'abcd[hidden]efg',
             'abcdefg',
         ],
         [
             '[ hidden ]',
             '',
         ],
         [
             '  [ hidden ]  ',
             '    ',
         ],
     ]
     blocks = Blocks()
     for line in lines:
         blocks.reset()
         self.assertEqual(blocks.remove(line[0]), line[1])