Skip to main content
Glama

NetBrain MCP

by NorthLaneMS
template_engine.cpython-312.pyc14.4 kB
� awh�5���dZddlmZmZmZmZmZmZddlZddl Z ddl Z ddl Z ddl m Z e jd�Z ddlmZmZmZmZdZej-d�Gd �d �Ze�Zy#e$rd Zej1d �Y�,wxYw) u� NetBrain MCP 模板引擎模块 此模块提供了一个灵活、强大的模板引擎,支持条件、循环、过滤器等高级功能。 基于Jinja2实现,用于生成提示和其他文本内容。 �)�Dict�List�Any�Optional�Callable�UnionN)�Path�template_engine)� Environment�FileSystemLoader�select_autoescape�TemplateTu*Jinja2已加载,使用高级模板功能Fu*Jinja2未安装,使用基本模板系统c ���eZdZdZddeeeeffd�Zd�Zdede fd�Z dedefd �Z ddeded e ed efd �Z dedeeefd efd�Zddedeeefded efd�Zdd e ed eeeeffd�Zded e efd�Zy )�TemplateEngineu-NetBrain MCP模板引擎,基于Jinja2实现� templates_dirc�x�t|t�r|n|g|_i|_i|_|jD]}t j |d���trBtt|j�tddg�dd��|_ |j�tjd|j���y)u� 初始化模板引擎 Args: templates_dir: 模板目录路径,可以是单个目录或目录列表 T��exist_ok�html�xml)�loader� autoescape� trim_blocks� lstrip_blocksu,模板引擎初始化完成,模板目录: N)� isinstance�listr�in_memory_templates�filters�os�makedirs�JINJA2_AVAILABLEr r r �env�_register_default_filters�logger�info)�selfr�dir_paths �!F:\NetBrainMCP\template_engine.py�__init__zTemplateEngine.__init__s���/9���.M�]�Ta�Sb���#%�� ��� ��*�*�H� �K�K��4� 0�+� �"�'��(:�(:�;�,�f�e�_�=� �"� �D�H� � *� *� ,�� � �B�4�CU�CU�BV�W�X�c��tsyd d�}d d�}d�}d�}|jd|�|jd|�|jd|�|jd |�y) u注册默认过滤器Nc��t|t�r tj|�}tj|d|��S#Y�xYw)NF)� ensure_ascii�indent)r�str�json�loads�dumps)�valuer.s r(� format_jsonz=TemplateEngine._register_default_filters.<locals>.format_jsonAs>���%��%�� �J�J�u�-�E��:�:�e�%��G� G����s �?�Ac�N�|syt|�}t|�|kr|S|d||zS�N�)r/�len)r3�length�ends r(�truncatez:TemplateEngine._register_default_filters.<locals>.truncateJs3������J�E��5�z�V�#�� ���&�>�C�'� 'r*c�<�|rt|�j�SdSr6)r/�upper�r3s r(� uppercasez;TemplateEngine._register_default_filters.<locals>.uppercaseS���).�3�u�:�#�#�%� 6�B� 6r*c�<�|rt|�j�SdSr6)r/�lowerr>s r(� lowercasez;TemplateEngine._register_default_filters.<locals>.lowercaseWr@r*r4r;r?rC)�)�dz...)r!�register_filter)r&r4r;r?rCs r(r#z(TemplateEngine._register_default_filters;s_��� � H� (� 7� 7� ���]�K�8� ���Z��2� ���[�)�4� ���[�)�4r*�name� filter_funcc��||j|<tr||jj|<tj d|���y)u� 注册自定义过滤器 Args: name: 过滤器名称 filter_func: 过滤器函数 u已注册自定义过滤器: N)rr!r"r$r%)r&rGrHs r(rFzTemplateEngine.register_filter`s=��)�� � �T�� �%0�D�H�H� � �T� "�� � �3�D�6�:�;r*�template_contentc�R�||j|<tjd|���y)u� 注册内存中的模板 Args: name: 模板名称 template_content: 模板内容 u已注册内存模板: N)rr$r%)r&rGrJs r(�register_templatez TemplateEngine.register_templatems(��*:�� � ��&�� � �-�d�V�4�5r*N�category�returnc�f�|r;t|jd�|z }tj|d��||�d�z }nt|jd�|�d�z }t |dd��5}|j |�ddd�t jd |���t|�S#1swY�,xYw) u 保存模板到文件 Args: name: 模板名称 template_content: 模板内容 category: 模板分类,用于组织目录结构 Returns: 模板文件路径 rTr�.j2�w�utf-8��encodingNu已保存模板到文件: ) r rrr �open�writer$r%r/)r&rGrJrM� template_dir� template_path�fs r(� save_templatezTemplateEngine.save_templatexs��� ��� 2� 2�1� 5�6��A�L� �K�K� �t� 4�(�d�V�3�<�7�M� ��!3�!3�A�!6�7�T�F�#�,�F�M��-��w� 7�1� �G�G�$� %�8� � � �0���@�A��=�!�!� 8� 7�s �*B'�'B0�contextc �L�|}|j�D�]B\}}dtj|�zdz}t|t�rtj |||�}n:|�tj |d|�}n tj |t |�|�}t|t �s��|j�D]�\}}dtj|�zdztj|�zdz} t|t�rtj | ||�}�b|�tj | d|�}�|tj | t |�|�}����E|j�D�]\}}|rCdtj|�zdz}tj |d |tj� �}nBdtj|�zd z}tj |d|tj� �}|sCd tj|�zdz}tj |d |tj� �}��d tj|�zd z}tj |d|tj� �}��|jj�D]�\} } d tj| �zdz}tj||�} | D]�} | jd�}| jd�}d}d|vr>|jd�}|d|vr7t||dt �r! ||d|d}n|j|�}|��} | |�}|j|t |��}����|S#d}Y�3xYw#|j|t |��}Y��xYw)u� 基本模板渲染(无需Jinja2) Args: template_content: 模板内容 context: 渲染上下文 Returns: 渲染后的内容 z{{[ \t]*z[ \t]*}}Nr7z\.(z )[ \t]*}}z{%[ \t]*if[ \t]+z"[ \t]*%}(.*?){%[ \t]*endif[ \t]*%}z\1)�flagsz [ \t]*%}.*?{%[ \t]*endif[ \t]*%}z{%[ \t]*if[ \t]+not[ \t]+z{{[ \t]*([\w\.]+)[ \t]*\|[ \t]*z(?:\([^)]*\))?[ \t]*}}�r�.)�items�re�escaperr/�sub�dict�DOTALLr�finditer�group�split�get�replace)r&rJr[�result�keyr3�pattern� nested_key� nested_value�nested_pattern� filter_namerH�matches�match�var_name� full_match� var_value�parts�filtered_values r(�_basic_render_templatez%TemplateEngine._basic_render_template�s��"��!�-�-�/�J�C��!�B�I�I�c�N�2�[�@�G��%��%�������7���������V�4�������U��V�<���%��&�05� � � �,�J� �%0�2�9�9�S�>�%A�F�%J�R�Y�Y�Wa�Mb�%b�eq�%q�N�!�,��4�!#���� �f�!M��%�-�!#�����F�!C��!#�����L�8I�6�!R��1>�*�,"�-�-�/�J�C���-�� � �#��>�Af�f��������b�i�i�H��-�� � �#��>�Ad�d�������V�2�9�9�E���6����3��G�Jo�o��������b�i�i�H��6����3��G�Jm�m�������V�2�9�9�E��*�$)-� � �(:�(:�(<� $�K��8�2�9�9�[�;Q�Q�Tm�m�G��k�k�'�6�2�G� �� �;�;�q�>��"�[�[��^� �!� ��(�?�$�N�N�3�/�E��Q�x�7�*�z�'�%��(�:K�T�/R�-�(/��a��(9�%��(�(C�I�!(� � �H� 5�I��(�L�)4�Y�)?��!'��� �C��<O�!P��'!�)=�4� ��-�(,�I��L�!'��� �C� �N�!K��s�.M;�#N�;N�N#�template_name_or_content�is_filec�l� d}|r7||jvr|j|}n|j|�}|sd|�d�S|}trt|�}|jdi|��}|S|j ||�}|S#t $r2}dt|���}tj|�d|��cYd}~Sd}~wwxYw)u3 渲染模板 Args: template_name_or_content: 模板名称或模板内容 context: 渲染上下文 is_file: 是否为文件模板,False表示直接渲染模板内容字符串 Returns: 渲染后的内容 r7u错误: 未找到模板 '�'u渲染模板失败: u模板错误: N�) r�get_template_contentr!r�renderry� Exceptionr/r$�error) r&rzr[r{rJ�templaterk�e� error_msgs r(�render_templatezTemplateEngine.render_template�s��� 0�!� ��+�t�/G�/G�G�'+�'?�'?�@X�'Y�$�(,�'@�'@�AY�'Z�$�+�!:�;S�:T�TU�V�V�#;� � �#�$4�5��(����3�7�3�� �M��4�4�5E�w�O���M��� 0�.�s�1�v�h�7�I� �L�L�� #�#�I�;�/� /�� 0�s(�:A8�&A8�$A8�8 B3�'B.�(B3�.B3c ��g}|jD]1}|r|j|�d��s�|j|dd|��d���3|jD]�}t |�}|j �s�|rz||z }|j �s�7|j d�D]O}|j|�}t|�jdd�dd} |j| d t|�d���Q��|j d�D]O}|j|�}t|�jdd�dd} |j| d t|�d���Q��|S) u� 列出可用的模板 Args: category: 可选的分类过滤 Returns: 模板信息列表 �/�memoryzmemory:)rG�type�pathz**/*.j2�\N������file) r� startswith�appendrr �exists�glob� relative_tor/rj) r&rM� templatesrGr'� base_path� category_path� file_path� relative_path� template_names r(�list_templateszTemplateEngine.list_templatessh��� ��,�,�D��t���(��1�~�>�� � � �$�%�d�V�,�"��-��*�*�H��X��I��#�#�%��� )�H� 4� � �'�'�)�%2�%7�%7� �%B� �(1�(=�(=�i�(H� �(+�M�(:�(B�(B�4��(M�c�r�(R� �!�(�(�$1�$*�$'� �N�*�� &C�"+��� �!:�I�$-�$9�$9�)�$D�M�$'� �$6�$>�$>�t�S�$I�#�2�$N�M��$�$� -� &� #�I��&�� ";�++�>�r*r�c��||jvr|j|S d}|}|jd�s|�d�}|jD]$}t|�|z }|j �s�"|}n|syt |dd��5}|j �cddd�S#1swYyxYw#t$r+}tjdt|����Yd}~yd}~wwxYw)u� 获取模板内容 Args: template_name: 模板名称 Returns: 模板内容或None NrP�rrRrSu获取模板内容失败: ) r�endswithrr r�rU�readr�r$r�r/)r&r�rX�template_filenamer'r�rYr�s r(rz#TemplateEngine.get_template_contentEs��� �D�4�4� 4��+�+�M�:� :� � �M� -� �$�-�-�e�4�'8�&9��$=�!� �.�.���H�~�(9�9���;�;�=�$(�M�� /� !���m�S�7�;�q��v�v�x�<�;�;��� � �L�L�5�c�!�f�X�>� ?��� �sB�AB#�'B#�/B#�=B� B#�B �B#� B#�# C�,!C�C)r�)N)T)�__name__� __module__� __qualname__�__doc__rr/rr)r#rrFrLrrZrrry�boolr�r�rr~r*r(rrs��7�Y�e�C��c��N�&;�Y�:#5�J <�C� <�h� <� 6�c� 6�S� 6�"�#�"��"��QT� �"�ad�"�6O�s�O�T�#�s�(�^�O�X[�O�b(0��(0�d�3�PS�8�n�(0�_c�(0�or�(0�T5�x��}�5��T�#�s�(�^�@T�5�n"�#�"�(�3�-�"r*r)r��typingrrrrrrr�loggingrar0�pathlibr � getLoggerr$�jinja2r r r rr!r%� ImportError�warningrr r~r*r(�<module>r�s����>�=� �� � �� �� � �,� -��A�Q�Q��� �K�K�<�=� L�L�^ !�"���g �A��� �N�N�?�@�A�s�A-�-B�B

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/NorthLaneMS/NetBrain_MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server