# Path: diffoscope/diff.py
# def color_unified_diff(diff):
#     RESET = '\033[0m'
#     RED, GREEN, CYAN = '\033[31m', '\033[32m', '\033[0;36m'
# 
#     def repl(m):
#         return '{}{}{}'.format({
#             '-': RED,
#             '@': CYAN,
#             '+': GREEN,
#         }[m.group(1)], m.group(0), RESET)
# 
#     return re_diff_change.sub(repl, diff)
# 
# Path: diffoscope/config.py
# class Config(object):
#     max_diff_block_lines = 256
#     max_diff_block_lines_parent = 50
#     max_diff_block_lines_saved = float("inf")
#     # html-dir output uses ratio * max-diff-block-lines as its limit
#     max_diff_block_lines_html_dir_ratio = 4
#     # GNU diff cannot process arbitrary large files :(
#     max_diff_input_lines = 2 ** 20
#     max_report_size = 2000 * 2 ** 10 # 2000 kB
#     max_text_report_size = 0
#     max_report_child_size = 500 * 2 ** 10
#     new_file = False
#     fuzzy_threshold = 60
#     enforce_constraints = True
#     excludes = ()
# 
#     _singleton = {}
# 
#     def __init__(self):
#         self.__dict__ = self._singleton
# 
#     def __setattr__(self, k, v):
#         super(Config, self).__setattr__(k, v)
# 
#         if self.enforce_constraints:
#             self.check_constraints()
# 
#     def check_constraints(self):
#         if self.max_diff_block_lines < self.max_diff_block_lines_parent:  # noqa
#             raise ValueError("max_diff_block_lines ({0.max_diff_block_lines}) "
#                 "cannot be smaller than max_diff_block_lines_parent "
#                 "({0.max_diff_block_lines_parent})".format(self),
#             )
# 
#         max_ = self.max_diff_block_lines_html_dir_ratio * \
#             self.max_diff_block_lines
#         if self.max_diff_block_lines_saved < max_:  # noqa
#             raise ValueError("max_diff_block_lines_saved "
#                 "({0.max_diff_block_lines_saved}) cannot be smaller than "
#                 "{0.max_diff_block_lines_html_dir_ratio} * "
#                 "max_diff_block_lines ({1})".format(self, max_),
#             )
# 
# Path: diffoscope/presenters/utils.py
# class Presenter(object):
#     def __init__(self):
#         self.depth = 0
# 
#     def start(self, difference):
#         self.visit(difference)
# 
#     def visit(self, difference):
#         self.visit_difference(difference)
# 
#         self.depth += 1
# 
#         for x in difference.details:
#             self.visit(x)
# 
#         self.depth -= 1
# 
#     def visit_difference(self, difference):
#         raise NotImplementedError()
# 
#     @classmethod
#     def indent(cls, val, prefix):
#         # As an optimisation, output as much as possible in one go to avoid
#         # unnecessary splitting, interpolating, etc.
#         #
#         # We don't use textwrap.indent as that unnecessarily calls
#         # str.splitlines, etc.
#         return prefix + val.rstrip().replace('\n', '\n{}'.format(prefix))
# 
# def create_limited_print_func(print_func, max_page_size):
#     count = 0
# 
#     def fn(val, force=False, count=count):
#         print_func(val)
# 
#         if force or max_page_size == 0:
#             return
# 
#         count += len(val)
#         if count >= max_page_size:
#             raise PrintLimitReached()
# 
#     return fn
# 
# class PrintLimitReached(Exception):
#     pass


import re
from diffoscope.diff import color_unified_diff
from diffoscope.config import Config
from .utils import Presenter, create_limited_print_func, PrintLimitReached
# -*- coding: utf-8 -*-
#
# diffoscope: in-depth comparison of files, archives, and directories
#
# Copyright © 2017 Chris Lamb <lamby@debian.org>
#
# diffoscope is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# diffoscope is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with diffoscope.  If not, see <https://www.gnu.org/licenses/>.





class TextPresenter(Presenter):
    PREFIX = u'│ '
    RE_PREFIX = re.compile(r'(^|\n)')

    def __init__(self, print_func, color):
        self.print_func = create_limited_print_func(
            print_func,

# Path: diffoscope/diff.py
# def color_unified_diff(diff):
#     RESET = '\033[0m'
#     RED, GREEN, CYAN = '\033[31m', '\033[32m', '\033[0;36m'
# 
#     def repl(m):
#         return '{}{}{}'.format({
#             '-': RED,
#             '@': CYAN,
#             '+': GREEN,
#         }[m.group(1)], m.group(0), RESET)
# 
#     return re_diff_change.sub(repl, diff)
# 
# Path: diffoscope/config.py
# class Config(object):
#     max_diff_block_lines = 256
#     max_diff_block_lines_parent = 50
#     max_diff_block_lines_saved = float("inf")
#     # html-dir output uses ratio * max-diff-block-lines as its limit
#     max_diff_block_lines_html_dir_ratio = 4
#     # GNU diff cannot process arbitrary large files :(
#     max_diff_input_lines = 2 ** 20
#     max_report_size = 2000 * 2 ** 10 # 2000 kB
#     max_text_report_size = 0
#     max_report_child_size = 500 * 2 ** 10
#     new_file = False
#     fuzzy_threshold = 60
#     enforce_constraints = True
#     excludes = ()
# 
#     _singleton = {}
# 
#     def __init__(self):
#         self.__dict__ = self._singleton
# 
#     def __setattr__(self, k, v):
#         super(Config, self).__setattr__(k, v)
# 
#         if self.enforce_constraints:
#             self.check_constraints()
# 
#     def check_constraints(self):
#         if self.max_diff_block_lines < self.max_diff_block_lines_parent:  # noqa
#             raise ValueError("max_diff_block_lines ({0.max_diff_block_lines}) "
#                 "cannot be smaller than max_diff_block_lines_parent "
#                 "({0.max_diff_block_lines_parent})".format(self),
#             )
# 
#         max_ = self.max_diff_block_lines_html_dir_ratio * \
#             self.max_diff_block_lines
#         if self.max_diff_block_lines_saved < max_:  # noqa
#             raise ValueError("max_diff_block_lines_saved "
#                 "({0.max_diff_block_lines_saved}) cannot be smaller than "
#                 "{0.max_diff_block_lines_html_dir_ratio} * "
#                 "max_diff_block_lines ({1})".format(self, max_),
#             )
# 
# Path: diffoscope/presenters/utils.py
# class Presenter(object):
#     def __init__(self):
#         self.depth = 0
# 
#     def start(self, difference):
#         self.visit(difference)
# 
#     def visit(self, difference):
#         self.visit_difference(difference)
# 
#         self.depth += 1
# 
#         for x in difference.details:
#             self.visit(x)
# 
#         self.depth -= 1
# 
#     def visit_difference(self, difference):
#         raise NotImplementedError()
# 
#     @classmethod
#     def indent(cls, val, prefix):
#         # As an optimisation, output as much as possible in one go to avoid
#         # unnecessary splitting, interpolating, etc.
#         #
#         # We don't use textwrap.indent as that unnecessarily calls
#         # str.splitlines, etc.
#         return prefix + val.rstrip().replace('\n', '\n{}'.format(prefix))
# 
# def create_limited_print_func(print_func, max_page_size):
#     count = 0
# 
#     def fn(val, force=False, count=count):
#         print_func(val)
# 
#         if force or max_page_size == 0:
#             return
# 
#         count += len(val)
#         if count >= max_page_size:
#             raise PrintLimitReached()
# 
#     return fn
# 
# class PrintLimitReached(Exception):
#     pass


# Path: diffoscope/presenters/text.py
import re
from diffoscope.diff import color_unified_diff
from diffoscope.config import Config
from .utils import Presenter, create_limited_print_func, PrintLimitReached

# -*- coding: utf-8 -*-
#
# diffoscope: in-depth comparison of files, archives, and directories
#
# Copyright © 2017 Chris Lamb <lamby@debian.org>
#
# diffoscope is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# diffoscope is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with diffoscope.  If not, see <https://www.gnu.org/licenses/>.





class TextPresenter(Presenter):
    PREFIX = u'│ '
    RE_PREFIX = re.compile(r'(^|\n)')

    def __init__(self, print_func, color):
        self.print_func = create_limited_print_func(
            print_func,

            Config().max_text_report_size,