def xmlevents_from_hwp5file(hwp5file): version = '%d.%d.%d.%d' % hwp5file.fileheader.version hexversion = '%02x%02x%02x%02x' % hwp5file.fileheader.version yield STARTEVENT, ('Hwp5Doc', { 'version': version, 'hexversion': hexversion }) with hwp5file.fileheader.open() as f: yield STARTEVENT, ('FileHeader', {}) resolve_values = resolve_values_from_stream(f) from hwp5.filestructure import FileHeader model_events = resolve_type_events(FileHeader, {}, resolve_values) for x in xmlevents_from_modelevents(model_events): yield x yield ENDEVENT, 'FileHeader' yield STARTEVENT, ('DocInfo', {}) model_events = hwp5file.docinfo.parse_model_events() for x in xmlevents_from_modelevents(model_events): yield x yield ENDEVENT, 'DocInfo' for section_name in hwp5file.bodytext: section = hwp5file.bodytext[section_name] yield STARTEVENT, ('Section', {'name': section_name}) model_events = section.parse_model_events() for x in xmlevents_from_modelevents(model_events): yield x yield ENDEVENT, 'Section' yield ENDEVENT, 'Hwp5Doc'
def resolve_model_events(context, model): resolve_values = context['resolve_values'] model['type'] = model_type = tag_models.get(model['tagid'], UnknownTagModel) for ev, item in resolve_type_events(model_type, context, resolve_values): yield ev, item model['content'] = item['value'] extension_types = getattr(model['type'], 'extension_types', None) if extension_types: key = model['type'].get_extension_key(context, model) extension = extension_types.get(key) if extension is not None: # 예: Control -> TableControl로 바뀌는 경우, # Control의 member들은 이미 읽은 상태이고 # CommonControl, TableControl에서 각각 정의한 # 멤버들을 읽어들여야 함 for cls in get_extension_mro(extension, model['type']): extension_type_events = resolve_type_events(cls, context, resolve_values) for ev, item in extension_type_events: yield ev, item content = item['value'] model['content'].update(content) model['type'] = extension if 'parent' in context: parent = context['parent'] parent_context, parent_model = parent parent_type = parent_model.get('type') parent_content = parent_model.get('content') on_child = getattr(parent_type, 'on_child', None) if on_child: on_child(parent_content, parent_context, (context, model))
def resolve_model_events(context, model): resolve_values = context['resolve_values'] model['type'] = model_type = tag_models.get(model['tagid'], UnknownTagModel) for ev, item in resolve_type_events(model_type, context, resolve_values): yield ev, item model['content'] = item['value'] extension_types = getattr(model['type'], 'extension_types', None) if extension_types: key = model['type'].get_extension_key(context, model) extension = extension_types.get(key) if extension is not None: # 예: Control -> TableControl로 바뀌는 경우, # Control의 member들은 이미 읽은 상태이고 # CommonControl, TableControl에서 각각 정의한 # 멤버들을 읽어들여야 함 for cls in get_extension_mro(extension, model['type']): extension_type_events = resolve_type_events( cls, context, resolve_values) for ev, item in extension_type_events: yield ev, item content = item['value'] model['content'].update(content) model['type'] = extension if 'parent' in context: parent = context['parent'] parent_context, parent_model = parent parent_type = parent_model.get('type') parent_content = parent_model.get('content') on_child = getattr(parent_type, 'on_child', None) if on_child: on_child(parent_content, parent_context, (context, model))
def xmlevents_from_hwp5file(hwp5file): version = '%d.%d.%d.%d' % hwp5file.fileheader.version hexversion = '%02x%02x%02x%02x' % hwp5file.fileheader.version yield STARTEVENT, ('Hwp5Doc', { 'version': version, 'hexversion': hexversion }) with hwp5file.fileheader.open() as f: yield STARTEVENT, ('FileHeader', { }) resolve_values = resolve_values_from_stream(f) from hwp5.filestructure import FileHeader model_events = resolve_type_events(FileHeader, {}, resolve_values) for x in xmlevents_from_modelevents(model_events): yield x yield ENDEVENT, 'FileHeader' yield STARTEVENT, ('DocInfo', { }) model_events = hwp5file.docinfo.parse_model_events() for x in xmlevents_from_modelevents(model_events): yield x yield ENDEVENT, 'DocInfo' for section_name in hwp5file.bodytext: section = hwp5file.bodytext[section_name] yield STARTEVENT, ('Section', { 'name': section_name }) model_events = section.parse_model_events() for x in xmlevents_from_modelevents(model_events): yield x yield ENDEVENT, 'Section' yield ENDEVENT, 'Hwp5Doc'