"""A file manager for Cioset XML files."""
from __future__ import annotations
from os.path import join, dirname
from lxml import etree
from pyramid.config import Configurator
from pyramid.request import Request
from ciowarehouse2.lib.ciotype import CioType
from ciowarehouse2.lib.ciopath import CioPath
from ciowarehouse2.lib.manager import LAYOUT_VIEW_PT, LAYOUT_EDIT_PT
from ciowarehouse2.lib.manager import CHRYSALIO_JS
from ciowarehouse2.lib.warehouse import Warehouse
from cioprocessor.relaxng import RELAXNG_CIOSET
from ...lib.i18n import _, translate
from ...lib.cioset import cioset_update
from ..xml import MANAGER_CSS, MANAGER_XML_CSS, CODEMIRROR_CSS, ManagerXml
from .panel_cioset import PanelCioset
CIOSET_CSS = ('/cioxml2/css/manager_cioset.css', )
CIOSET_JS = ('/js/jquery-ui.js', '/cioxml2/js/cioset.js')
CIOSET_MASK_CSS = ('/cioxml2/css/manager_cioset_mask.css', )
CIOSET_CXE_CSS = ('/cioxml2/css/manager_cioset_cxe.css', )
CIOSET_CXE_JS = ('/cioxml2/js/cxe4cioset.js', )
CODEMIRROR_JS = ('/cioxml2/js/cm4cioset.js', )
IMAGE_PATHS = ('./', )
FILE_PATHS = ('./', 'Workspace:Xml/')
# =============================================================================
[docs]
def includeme(configurator: Configurator):
"""Function to include WBWarehouse a manager.
:type configurator: pyramid.config.Configurator
:param configurator:
Object used to do configuration declaration within the application.
"""
ManagerXml.register(configurator, ManagerCioset)
# =============================================================================
[docs]
class ManagerCioset(ManagerXml):
"""Class to manage a Cioset XML file."""
ciotype = CioType('xml', 'cioset')
uid = 'cioset'
label = _('Cioset XML file manager')
viewings = ( # yapf: disable
{'name': 'preview',
'label': _('Preview'),
'template': LAYOUT_VIEW_PT,
'css': MANAGER_CSS + CIOSET_CSS,
'js': CHRYSALIO_JS + CIOSET_JS,
'xsl': join('Xsl', 'cioset_preview.xsl'),
'image_paths': IMAGE_PATHS},
{'name': 'xml',
'label': _('XML'),
'template': LAYOUT_VIEW_PT,
'css': MANAGER_XML_CSS,
'js': CHRYSALIO_JS})
editings = ( # yapf: disable
{'name': 'cxe',
'label': _('Wysiwym'),
'template': LAYOUT_EDIT_PT,
'css': MANAGER_CSS + CIOSET_CXE_CSS,
'js': CHRYSALIO_JS + CIOSET_CXE_JS,
'xsl': (join('Xsl', 'cioset_cxe_in.xsl'),
join('Xsl', 'cioset_cxe_out.xsl')),
'regex': (None, join('Regex', 'cioset_cxe_out.regex')),
'image_paths': IMAGE_PATHS,
'file_paths': FILE_PATHS},
# {'name': 'mask', 'label': _('Mask'),
# 'template': LAYOUT_EDIT_PT,
# 'css': CIOSET_MASK_CSS,
# 'js': CHRYSALIO_JS + CIOSET_JS,
# 'xsl': join('Xsl', 'cioset_mask.xsl'),
# 'image_paths': IMAGE_PATHS},
{'name': 'xml',
'label': _('XML'),
'template': LAYOUT_EDIT_PT,
'css': CODEMIRROR_CSS,
'js': CHRYSALIO_JS + CODEMIRROR_JS})
panel = PanelCioset
relaxng = RELAXNG_CIOSET
class_xpath = 'normalize-space(/*/@class)'
_home = dirname(__file__)
# -------------------------------------------------------------------------
@classmethod
def _edit_cxe_i18n(cls, request: Request):
"""Return a string of data-i18n_* attributes for translations in
CioXmlEditor.
See: :meth:.managers.xml.ManagerXml._edit_cse_i18n
"""
return '{data}'\
' data-i18n_tag_title_head="{tag_title_head}"'\
' data-i18n_tag_picture="{tag_picture}"'\
' data-i18n_files="{files}"'\
' data-i18n_assembly="{assembly}"'\
' data-i18n_defines="{defines}"'\
' data-i18n_tag_define="{tag_define}"'\
' data-i18n_tag_define_files="{tag_define_files}"'\
' data-i18n_tag_define_text_files="{tag_define_text_files}"'\
' data-i18n_tag_define_boolean_files="{tag_define_boolean_files}"'\
' data-i18n_tag_define_integer_files="{tag_define_integer_files}"'\
' data-i18n_tag_define_list_files="{tag_define_list_files}"'\
' data-i18n_attr_name="{attr_name}"'\
' data-i18n_attr_type="{attr_type}"'\
' data-i18n_options_list="{options_list}"'\
' data-i18n_tag_division="{tag_division}"'\
' data-i18n_tag_define_division="{tag_define_division}"'\
' data-i18n_tag_define_text_division="{tag_define_text_division}"'\
' data-i18n_tag_define_boolean_division="{tag_define_bool_div}"'\
' data-i18n_tag_define_integer_division="{tag_define_int_div}"'\
' data-i18n_tag_define_list_division="{tag_define_list_division}"'\
' data-i18n_tag_title_division="{tag_title_division}"'\
' data-i18n_tag_file="{tag_file}"'\
' data-i18n_tag_title_file="{tag_title_file}"'\
' data-i18n_tag_define_file="{tag_define_file}"'\
' data-i18n_tag_define_text_file="{tag_define_text_file}"'\
' data-i18n_tag_define_boolean_file="{tag_define_boolean_file}"'\
' data-i18n_tag_define_integer_file="{tag_define_integer_file}"'\
' data-i18n_tag_define_list_file="{tag_define_list_file}"'\
' data-i18n_tag_path="{tag_path}"'\
' data-i18n_resources="{resources}"'\
' data-i18n_tag_resources="{tag_resources}"'\
' data-i18n_tag_resource="{tag_resource}"'\
' data-i18n_copies="{copies}"'\
' data-i18n_tag_copies="{tag_copies}"'\
' data-i18n_tag_copy="{tag_copy}"'\
' data-i18n_values="{values}"'\
' data-i18n_tag_values="{tag_values}"'\
' data-i18n_tag_value="{tag_value}"'\
' data-i18n_tag_value_text="{tag_value_text}"'\
' data-i18n_tag_value_boolean="{tag_value_boolean}"'\
' data-i18n_tag_value_integer="{tag_value_integer}"'\
' data-i18n_tag_value_list="{tag_value_list}"'\
' data-i18n_attr_src="{attr_src}"'\
' data-i18n_attr_for="{attr_for}"'.format(
data=ManagerXml._edit_cxe_i18n(request),
tag_title_head=translate(_('Assembly title'), request=request),
tag_picture=translate(_('Cover'), request=request),
files=translate(_('Files'), request=request),
assembly=translate(_('Assembly: '), request=request),
defines=translate(_('Constants'), request=request),
tag_define=translate(_('Constant'), request=request),
tag_define_files=translate(
_('Global constant'), request=request),
tag_define_text_files=translate(
_('Global text constant'), request=request),
tag_define_boolean_files=translate(
_('Global boolean constant'), request=request),
tag_define_integer_files=translate(
_('Global integer constant'), request=request),
tag_define_list_files=translate(
_('Global constant from a list'), request=request),
attr_name=translate(_('name'), request=request),
attr_type=translate(_('type'), request=request),
options_list=translate(
_('‖ separated options'), request=request),
tag_division=translate(
_('Division (Ctrl- above, Shift- sub-division)'),
request=request),
tag_define_division=translate(
_('Division constant'), request=request),
tag_define_text_division=translate(
_('Division text constant'), request=request),
tag_define_bool_div=translate(
_('Division boolean constant'), request=request),
tag_define_int_div=translate(
_('Division integer constant'), request=request),
tag_define_list_division=translate(
_('Division constant from a list'), request=request),
tag_title_division=translate(
_('Division title'), request=request),
tag_file=translate(_('File'), request=request),
tag_define_file=translate(_('File constant'), request=request),
tag_define_text_file=translate(
_('File text constant'), request=request),
tag_define_boolean_file=translate(
_('File boolean constant'), request=request),
tag_define_integer_file=translate(
_('File integer constant'), request=request),
tag_define_list_file=translate(
_('File constant from a list'), request=request),
tag_title_file=translate(_('File title'), request=request),
tag_path=translate(_('File path'), request=request),
resources=translate(_('Resources'), request=request),
tag_resources=translate(
_('Group of resources'), request=request),
tag_resource=translate(_('Resource'), request=request),
copies=translate(_('Copies'), request=request),
tag_copies=translate(_('Groupe of copies'), request=request),
tag_copy=translate(_('Copy'), request=request),
values=translate(_('Values'), request=request),
tag_values=translate(_('Group of values'), request=request),
tag_value=translate(_('Value'), request=request),
tag_value_text=translate(_('Text value'), request=request),
tag_value_boolean=translate(
_('Boolean value'), request=request),
tag_value_integer=translate(
_('Integer value'), request=request),
tag_value_list=translate(
_('Value from a list'), request=request),
attr_src=translate(_('Source'), request=request),
attr_for=translate(_('For'), request=request))
# -------------------------------------------------------------------------
def _save_mask(
self, request: Request, warehouse: Warehouse, ciopath: CioPath,
values: dict, go_on: bool,
original: etree.ElementTree) -> str | None:
"""Update XML according to a mask.
See: :meth:`cioxml2.managers.xml.ManagerXml._save_mask`
"""
# pylint: disable = too-many-arguments, too-many-positional-arguments
# Update XML
updated = cioset_update(original, values)
if updated is None:
return translate(_('Cannot be updated!'), request=request)
# Validate and save XML
return super()._save_mask(
request, warehouse, ciopath, values, go_on, updated)