예제 #1
0
    def test_resolve_values_from_stream(self):
        assertEquals = self.assertEquals

        stream = BytesIO(b'\x00\x01\x00\x02')
        resolve_values = resolve_values_from_stream(stream)

        bin_item = dict(type=self.BasicStruct)
        events = bintype_map_events(bin_item)
        events = resolve_values(events)

        assertEquals((STARTEVENT, bin_item), events.next())
        assertEquals(
            (None, dict(name='a', type=UINT16, bin_offset=0, value=256)),
            events.next())
        assertEquals(
            (None, dict(name='b', type=UINT16, bin_offset=2, value=512)),
            events.next())
        assertEquals((ENDEVENT, bin_item), events.next())

        class StructWithBSTR(object):
            __metaclass__ = StructType

            @staticmethod
            def attributes():
                yield BSTR, 'name'

        stream = BytesIO(b'\x02\x00\x00\x01\x00\x02')
        resolve_values = resolve_values_from_stream(stream)
        bin_item = dict(type=StructWithBSTR)
        events = bintype_map_events(bin_item)
        events = resolve_values(events)
        assertEquals((STARTEVENT, bin_item), events.next())
        assertEquals(
            (None,
             dict(name='name', type=BSTR, bin_offset=0,
                  value=u'\u0100\u0200')), events.next())
        assertEquals((ENDEVENT, bin_item), events.next())

        class StructWithParaTextChunks(object):
            __metaclass__ = StructType

            @staticmethod
            def attributes():
                yield ParaTextChunks, 'texts'

        stream = BytesIO(b'\x20\x00\x21\x00\x22\x00')
        resolve_values = resolve_values_from_stream(stream)
        bin_item = dict(type=StructWithParaTextChunks)
        events = bintype_map_events(bin_item)
        events = resolve_values(events)
        assertEquals((STARTEVENT, bin_item), events.next())
        assertEquals((None,
                      dict(name='texts',
                           type=ParaTextChunks,
                           bin_offset=0,
                           value=[((0, 3), u'\u0020\u0021\u0022')])),
                     events.next())
        assertEquals((ENDEVENT, bin_item), events.next())
예제 #2
0
    def test_resolve_values_from_stream(self):
        assertEqual = self.assertEqual

        stream = BytesIO(b'\x00\x01\x00\x02')
        resolve_values = resolve_values_from_stream(stream)

        bin_item = dict(type=self.BasicStruct)
        events = bintype_map_events(bin_item)
        events = resolve_values(events)

        assertEqual((STARTEVENT, bin_item), next(events))
        assertEqual((None,
                     dict(name='a', type=UINT16, bin_offset=0, value=256)),
                    next(events))
        assertEqual((None,
                     dict(name='b', type=UINT16, bin_offset=2, value=512)),
                    next(events))
        assertEqual((ENDEVENT, bin_item), next(events))

        @add_metaclass(StructType)
        class StructWithBSTR(object):

            @staticmethod
            def attributes():
                yield BSTR, 'name'

        stream = BytesIO(b'\x02\x00\x00\x01\x00\x02')
        resolve_values = resolve_values_from_stream(stream)
        bin_item = dict(type=StructWithBSTR)
        events = bintype_map_events(bin_item)
        events = resolve_values(events)
        assertEqual((STARTEVENT, bin_item), next(events))
        assertEqual((None,
                     dict(name='name', type=BSTR, bin_offset=0,
                          value=u'\u0100\u0200')),
                    next(events))
        assertEqual((ENDEVENT, bin_item), next(events))

        @add_metaclass(StructType)
        class StructWithParaTextChunks(object):

            @staticmethod
            def attributes():
                yield ParaTextChunks, 'texts'

        stream = BytesIO(b'\x20\x00\x21\x00\x22\x00')
        resolve_values = resolve_values_from_stream(stream)
        bin_item = dict(type=StructWithParaTextChunks)
        events = bintype_map_events(bin_item)
        events = resolve_values(events)
        assertEqual((STARTEVENT, bin_item), next(events))
        assertEqual((None,
                     dict(name='texts', type=ParaTextChunks,
                          bin_offset=0,
                          value=[((0, 3), u'\u0020\u0021\u0022')])),
                    next(events))
        assertEqual((ENDEVENT, bin_item), next(events))
예제 #3
0
파일: __init__.py 프로젝트: hongry18/pyhwp
    def parse_model_events(self):
        context = dict(version=self.version)

        def resolve_values_from_record(record):
            stream = StringIO(record['payload'])
            return resolve_values_from_stream(stream)

        for group_idx, records in enumerate(self.records_treegrouped()):
            context['treegroup'] = group_idx
            for x in resolve_models(context, records):
                event, item = x
                if item['type'] is RecordModel:
                    if event is STARTEVENT:
                        record_frame = item['record']
                        stream = StringIO(record_frame['payload'])
                        resolve_values = resolve_values_from_stream(stream)
                        item['stream'] = stream
                        item['resolve_values'] = resolve_values
                    elif event is ENDEVENT:
                        stream = item['stream']
                        item['leftover'] = {
                            'offset': stream.tell(),
                            'bytes': stream.read()
                        }
                yield x
예제 #4
0
    def test_collect_values(self):

        stream = BytesIO(b'\x01\x00\x01\x01\x02\x01\x02\x00')
        resolve_values = resolve_values_from_stream(stream)

        bin_item = dict(type=self.NestedStruct)
        events = bintype_map_events(bin_item)
        events = resolve_values(events)
        events = construct_composite_values(events)

        a = dict(name='a', type=UINT16, bin_offset=0, value=1)
        s_a = dict(name='a', type=UINT16, bin_offset=2, value=0x101)
        s_b = dict(name='b', type=UINT16, bin_offset=4, value=0x102)
        b = dict(name='b', type=UINT16, bin_offset=6, value=2)
        s = dict(name='s', type=self.BasicStruct, value=dict(a=0x101, b=0x102))
        x = dict(type=self.NestedStruct,
                 value=dict(a=1, s=dict(a=0x101, b=0x102), b=2))
        self.assertEquals((STARTEVENT, bin_item), events.next())
        self.assertEquals((None, a), events.next())
        self.assertEquals(
            (STARTEVENT, dict(name='s', type=self.BasicStruct, value=dict())),
            events.next())
        self.assertEquals((None, s_a), events.next())
        self.assertEquals((None, s_b), events.next())
        self.assertEquals((ENDEVENT, s), events.next())
        self.assertEquals((None, b), events.next())
        self.assertEquals((ENDEVENT, x), events.next())
예제 #5
0
    def parse_model_events(self):
        context = dict(version=self.version)

        def resolve_values_from_record(record):
            stream = StringIO(record['payload'])
            return resolve_values_from_stream(stream)

        for group_idx, records in enumerate(self.records_treegrouped()):
            context['treegroup'] = group_idx
            for x in resolve_models(context, records):
                event, item = x
                if item['type'] is RecordModel:
                    if event is STARTEVENT:
                        record_frame = item['record']
                        stream = StringIO(record_frame['payload'])
                        resolve_values = resolve_values_from_stream(stream)
                        item['stream'] = stream
                        item['resolve_values'] = resolve_values
                    elif event is ENDEVENT:
                        stream = item['stream']
                        item['leftover'] = {
                            'offset': stream.tell(),
                            'bytes': stream.read()
                        }
                yield x
예제 #6
0
    def test_collect_values(self):
        from hwp5.treeop import STARTEVENT, ENDEVENT
        from hwp5.dataio import UINT16
        from hwp5.bintype import bintype_map_events
        from hwp5.bintype import resolve_values_from_stream
        from hwp5.bintype import collect_values
        from StringIO import StringIO

        stream = StringIO('\x01\x00\x01\x01\x02\x01\x02\x00')
        resolve_values = resolve_values_from_stream(stream)

        bin_item = dict(type=self.NestedStruct)
        events = bintype_map_events(bin_item)
        events = resolve_values(events)
        events = collect_values(events)

        a = dict(name='a', type=UINT16, bin_offset=0, value=1)
        s_a = dict(name='a', type=UINT16, bin_offset=2, value=0x101)
        s_b = dict(name='b', type=UINT16, bin_offset=4, value=0x102)
        b = dict(name='b', type=UINT16, bin_offset=6, value=2)
        s = dict(name='s', type=self.BasicStruct,
                 value=dict(a=0x101, b=0x102))
        x = dict(type=self.NestedStruct,
                 value=dict(a=1, s=dict(a=0x101, b=0x102), b=2))
        self.assertEquals((STARTEVENT, bin_item), events.next())
        self.assertEquals((None, a), events.next())
        self.assertEquals((STARTEVENT, dict(name='s', type=self.BasicStruct,
                                            value=dict())),
                           events.next())
        self.assertEquals((None, s_a), events.next())
        self.assertEquals((None, s_b), events.next())
        self.assertEquals((ENDEVENT, s), events.next())
        self.assertEquals((None, b), events.next())
        self.assertEquals((ENDEVENT, x), events.next())
예제 #7
0
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'
예제 #8
0
    def test_collect_values(self):

        stream = BytesIO(b'\x01\x00\x01\x01\x02\x01\x02\x00')
        resolve_values = resolve_values_from_stream(stream)

        bin_item = dict(type=self.NestedStruct)
        events = bintype_map_events(bin_item)
        events = resolve_values(events)
        events = construct_composite_values(events)

        a = dict(name='a', type=UINT16, bin_offset=0, value=1)
        s_a = dict(name='a', type=UINT16, bin_offset=2, value=0x101)
        s_b = dict(name='b', type=UINT16, bin_offset=4, value=0x102)
        b = dict(name='b', type=UINT16, bin_offset=6, value=2)
        s = dict(name='s', type=self.BasicStruct,
                 value=dict(a=0x101, b=0x102))
        x = dict(type=self.NestedStruct,
                 value=dict(a=1, s=dict(a=0x101, b=0x102), b=2))
        self.assertEqual((STARTEVENT, bin_item), next(events))
        self.assertEqual((None, a), next(events))
        self.assertEqual((STARTEVENT, dict(name='s', type=self.BasicStruct,
                                           value=dict())),
                         next(events))
        self.assertEqual((None, s_a), next(events))
        self.assertEqual((None, s_b), next(events))
        self.assertEqual((ENDEVENT, s), next(events))
        self.assertEqual((None, b), next(events))
        self.assertEqual((ENDEVENT, x), next(events))
예제 #9
0
파일: __init__.py 프로젝트: hongry18/pyhwp
def parse_model(context, model):
    ''' HWPTAG로 모델 결정 후 기본 파싱 '''

    stream = context['stream']
    context['resolve_values'] = resolve_values_from_stream(stream)
    events = resolve_model_events(context, model)
    events = raise_on_errorevent(context, events)
    model['binevents'] = list(events)

    logger.debug('model: %s', model['type'].__name__)
    logger.debug('%s', model['content'])
예제 #10
0
def parse_model(context, model):
    ''' HWPTAG로 모델 결정 후 기본 파싱 '''

    stream = context['stream']
    context['resolve_values'] = resolve_values_from_stream(stream)
    events = resolve_model_events(context, model)
    events = raise_on_errorevent(context, events)
    model['binevents'] = list(events)

    logger.debug('model: %s', model['type'].__name__)
    logger.debug('%s', model['content'])
예제 #11
0
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'
예제 #12
0
파일: __init__.py 프로젝트: hongry18/pyhwp
 def resolve_values_from_record(record):
     stream = StringIO(record['payload'])
     return resolve_values_from_stream(stream)
예제 #13
0
 def resolve_values_from_record(record):
     stream = StringIO(record['payload'])
     return resolve_values_from_stream(stream)
예제 #14
0
    def test_resolve_values_from_stream(self):
        assertEquals = self.assertEquals
        from hwp5.treeop import STARTEVENT, ENDEVENT
        from hwp5.dataio import UINT16
        from hwp5.bintype import bintype_map_events
        from hwp5.bintype import resolve_values_from_stream

        from StringIO import StringIO
        stream = StringIO('\x00\x01\x00\x02')
        resolve_values = resolve_values_from_stream(stream)

        bin_item = dict(type=self.BasicStruct)
        events = bintype_map_events(bin_item)
        events = resolve_values(events)

        assertEquals((STARTEVENT, bin_item), events.next())
        assertEquals((None,
                      dict(name='a', type=UINT16, bin_offset=0, value=256)),
                     events.next())
        assertEquals((None,
                      dict(name='b', type=UINT16, bin_offset=2, value=512)),
                     events.next())
        assertEquals((ENDEVENT, bin_item), events.next())

        from hwp5.dataio import StructType
        from hwp5.dataio import BSTR
        class StructWithBSTR(object):
            __metaclass__ = StructType

            @staticmethod
            def attributes():
                yield BSTR, 'name'

        stream = StringIO('\x02\x00\x00\x01\x00\x02')
        resolve_values = resolve_values_from_stream(stream)
        bin_item = dict(type=StructWithBSTR)
        events = bintype_map_events(bin_item)
        events = resolve_values(events)
        assertEquals((STARTEVENT, bin_item), events.next())
        assertEquals((None,
                      dict(name='name', type=BSTR, bin_offset=0,
                           value=u'\u0100\u0200')),
                     events.next())
        assertEquals((ENDEVENT, bin_item), events.next())

        from hwp5.binmodel import ParaTextChunks
        class StructWithParaTextChunks(object):
            __metaclass__ = StructType

            @staticmethod
            def attributes():
                yield ParaTextChunks, 'texts'

        stream = StringIO('\x20\x00\x21\x00\x22\x00')
        resolve_values = resolve_values_from_stream(stream)
        bin_item = dict(type=StructWithParaTextChunks)
        events = bintype_map_events(bin_item)
        events = resolve_values(events)
        assertEquals((STARTEVENT, bin_item), events.next())
        assertEquals((None,
                      dict(name='texts', type=ParaTextChunks,
                           bin_offset=0,
                           value=[((0, 3), u'\u0020\u0021\u0022')])),
                     events.next())
        assertEquals((ENDEVENT, bin_item), events.next())