a delegate class that invokes the actual processors def initself groups liststr envenvironment kwargs availableplugins pluginmanager getformattersgrouped self enabledplugins for group in groups for cls in availablepluginsgroup p clsenvenv kwargs if p enabled self enabledplugins appendp def formatheadersself headers str str for p in self enabledplugins headers p formatheadersheaders return headers def formatbodyself content str mime str str if isvalidmimemime for p in self enabledplugins content p formatbodycontent mime return content def formatmetadataself metadata str str for p in self enabledplugins metadata p formatmetadatametadata return metadata a delegate class that invokes the actual processors param groups names of processor groups to be applied param env environment param kwargs additional keyword arguments for processors
import re
from typing import Optional, List

from ..plugins import ConverterPlugin
from ..plugins.registry import plugin_manager
from ..context import Environment


MIME_RE = re.compile(r'^[^/]+/[^/]+$')


def is_valid_mime(mime):
    return mime and MIME_RE.match(mime)


class Conversion:

    @staticmethod
    def get_converter(mime: str) -> Optional[ConverterPlugin]:
        if is_valid_mime(mime):
            for converter_class in plugin_manager.get_converters():
                if converter_class.supports(mime):
                    return converter_class(mime)


class Formatting:
    

    def __init__(self, groups: List[str], env=Environment(), **kwargs):
        
        available_plugins = plugin_manager.get_formatters_grouped()
        self.enabled_plugins = []
        for group in groups:
            for cls in available_plugins[group]:
                p = cls(env=env, **kwargs)
                if p.enabled:
                    self.enabled_plugins.append(p)

    def format_headers(self, headers: str) -> str:
        for p in self.enabled_plugins:
            headers = p.format_headers(headers)
        return headers

    def format_body(self, content: str, mime: str) -> str:
        if is_valid_mime(mime):
            for p in self.enabled_plugins:
                content = p.format_body(content, mime)
        return content

    def format_metadata(self, metadata: str) -> str:
        for p in self.enabled_plugins:
            metadata = p.format_metadata(metadata)
        return metadata