class ColumnsDef(Control): ''' 4.2.10.2. 단 정의 ''' chid = CHID.COLD Kind = Enum('normal', 'distribute', 'parallel') Direction = Enum('l2r', 'r2l', 'both') Flags = Flags(UINT16, 0, 1, Kind, 'kind', 2, 9, 'count', 10, 11, Direction, 'direction', 12, 'same_widths') def attributes(cls): yield cls.Flags, 'flags' yield HWPUNIT16, 'spacing' def not_same_widths(context, values): ''' flags.same_widths == 0 ''' return not values['flags'].same_widths def n_entries(member_ref): def n_entries(context, values): n_columns = member_ref(context, values) return n_columns - 1 return n_entries yield dict(name='column0', type=Column0, condition=not_same_widths) yield dict(name='columns', type=X_ARRAY(Column, n_entries(ref_member_flag('flags', 'count'))), condition=not_same_widths) yield UINT16, 'attr2' yield Border, 'splitter' attributes = classmethod(attributes)
class FillImage(Fill): FillImageEnum = Enum(TILE_ALL=0, TILE_HORIZONTAL_TOP=1, TILE_HORIZONTAL_BOTTOM=2, TILE_VERTICAL_LEFT=3, TILE_VERTICAL_RIGHT=4, RESIZE=5, CENTER=6, CENTER_TOP=7, CENTER_BOTTOM=8, LEFT_MIDDLE=9, LEFT_TOP=10, LEFT_BOTTOM=11, RIGHT_MIDDLE=12, RIGHT_TOP=13, RIGHT_BOTTOM=14, NONE=15) FillImageFlags = Flags(BYTE, 0, 16, FillImageEnum, 'fillimage_type') EffectEnum = Enum(REAL_PIC=0, GRAY_SCALE=1, BLACK_WHITE=2, PATTERN8x8=3) EffectFlags = Flags(UINT8, 0, 8, EffectEnum, 'effect_type') def attributes(cls): yield cls.FillImageFlags, 'flags' yield INT8, 'brightness' yield INT8, 'contrast' yield cls.EffectFlags, 'effect' yield UINT16, 'bindata_id' attributes = classmethod(attributes)
class Panose1(Struct): ''' 표 17 글꼴 유형 정보 ''' FamilyType = Enum('any', 'no_fit', 'text_display', 'script', 'decorative', 'pictorial') SerifStyle = Enum('any', 'no_fit', 'cove', 'obtuse_cove', 'square_cove', 'obtuse_square_cove', 'square', 'thin', 'bone', 'exaggerated', 'triangle', 'normal_sans', 'obtuse_sans', 'perp_sans', 'flared', 'rounded') Weight = Enum('any', 'no_fit', 'very_light', 'light', 'thin', 'book', 'medium', 'demi', 'bold', 'heavy', 'black', 'nord') Proportion = Enum('any', 'no_fit', 'old_style', 'modern', 'even_width', 'expanded', 'condensed', 'very_expanded', 'very_condensed', 'monospaced') Contrast = Enum('any', 'no_fit', 'none', 'very_low', 'low', 'medium_low', 'medium', 'medium_high', 'high', 'very_high') StrokeVariation = Enum('any', 'no_fit', 'gradual_diag', 'gradual_tran', 'gradual_vert', 'gradual_horz', 'rapid_vert', 'rapid_horz', 'instant_vert') ArmStyle = Enum('any', 'no_fit', 'straight_horz', 'straight_wedge', 'straight_vert', 'straight_single_serif', 'straight_double_serif', 'bent_horz', 'bent_wedge', 'bent_vert', 'bent_single_serif', 'bent_double_serif') Letterform = Enum('any', 'no_fit', 'normal_contact', 'normal_weighted', 'normal_boxed', 'normal_flattened', 'normal_rounded', 'normal_off_center', 'normal_square', 'oblique_contact', 'oblique_weighted', 'oblique_boxed', 'oblique_flattened', 'oblique_rounded', 'oblique_off_center', 'oblique_square') Midline = Enum('any', 'no_fit', 'standard_trimmed', 'standard_pointed', 'standard_serifed', 'high_trimmed', 'high_pointed', 'high_serifed', 'constant_trimmed', 'constant_pointed', 'constant_serifed', 'low_trimmed', 'low_pointed', 'low_serifed') XHeight = Enum('any', 'no_fit', 'constant_small', 'constant_std', 'constant_large', 'ducking_small', 'ducking_std', 'ducking_large') def attributes(): yield BYTE, 'family_type', yield BYTE, 'serif_style', yield BYTE, 'weight', yield BYTE, 'proportion', yield BYTE, 'contrast', yield BYTE, 'stroke_variation', yield BYTE, 'arm_style', yield BYTE, 'letterform', yield BYTE, 'midline', yield BYTE, 'x_height', attributes = staticmethod(attributes)
class BorderLine(Struct): ''' 표 81 테두리 선 정보 ''' LineEnd = Enum('round', 'flat') ArrowShape = Enum('none', 'arrow', 'arrow2', 'diamond', 'circle', 'rect', 'diamondfilled', 'disc', 'rectfilled') ArrowSize = Enum('smallest', 'smaller', 'small', 'abitsmall', 'normal', 'abitlarge', 'large', 'larger', 'largest') ''' 표 82 테두리 선 정보 속성 ''' Flags = Flags(UINT32, 0, 5, Border.StrokeEnum, 'stroke', 6, 9, LineEnd, 'line_end', 10, 15, ArrowShape, 'arrow_start', 16, 21, ArrowShape, 'arrow_end', 22, 25, ArrowSize, 'arrow_start_size', 26, 29, ArrowSize, 'arrow_end_size', 30, 'arrow_start_fill', 31, 'arrow_end_fill') def attributes(cls): yield COLORREF, 'color' yield INT32, 'width' yield cls.Flags, 'flags' attributes = classmethod(attributes)
class PageDef(RecordModel): tagid = HWPTAG_PAGE_DEF Orientation = Enum(PORTRAIT=0, LANDSCAPE=1) BookBinding = Enum(LEFT=0, RIGHT=1, TOP=2, BOTTOM=3) Flags = Flags(UINT32, 0, Orientation, 'orientation', 1, 2, BookBinding, 'bookbinding') def attributes(cls): yield HWPUNIT, 'width', yield HWPUNIT, 'height', yield HWPUNIT, 'left_offset', yield HWPUNIT, 'right_offset', yield HWPUNIT, 'top_offset', yield HWPUNIT, 'bottom_offset', yield HWPUNIT, 'header_offset', yield HWPUNIT, 'footer_offset', yield HWPUNIT, 'bookbinding_offset', yield cls.Flags, 'attr', # yield UINT32, 'attr', attributes = classmethod(attributes) def getDimension(self): width = HWPUNIT(self.paper_width - self.offsetLeft - self.offsetRight) height = HWPUNIT(self.paper_height - (self.offsetTop + self.offsetHeader) - (self.offsetBottom + self.offsetFooter)) if self.attr.landscape: return (height, width) else: return (width, height) dimension = property(getDimension) def getHeight(self): if self.attr.landscape: width = HWPUNIT(self.paper_width - self.offsetLeft - self.offsetRight) return width else: height = HWPUNIT(self.paper_height - (self.offsetTop + self.offsetHeader) - (self.offsetBottom + self.offsetFooter)) return height height = property(getHeight) def getWidth(self): if self.attr.landscape: height = HWPUNIT(self.paper_height - (self.offsetTop + self.offsetHeader) - (self.offsetBottom + self.offsetFooter)) return height else: width = HWPUNIT(self.paper_width - self.offsetLeft - self.offsetRight) return width width = property(getWidth)
class PageBorderFill(RecordModel): tagid = HWPTAG_PAGE_BORDER_FILL RelativeTo = Enum(BODY=0, PAPER=1) FillArea = Enum(PAPER=0, PAGE=1, BORDER=2) Flags = Flags(UINT32, 0, RelativeTo, 'relative_to', 1, 'include_header', 2, 'include_footer', 3, 4, FillArea, 'fill') def attributes(cls): yield cls.Flags, 'flags' yield Margin, 'margin' yield UINT16, 'borderfill_id' attributes = classmethod(attributes)
class TableCaption(ListHeader): ''' 표 66 캡션 리스트 ''' parent_model_type = TableControl before_tablebody = False # 표 68 캡션 속성 Position = Enum(LEFT=0, RIGHT=1, TOP=2, BOTTOM=3) Flags = Flags( UINT32, 0, 1, Position, 'position', # 캡션이 긴 경우 테이블 여백 영역까지 확장 2, 'expand_to_margin') def attributes(cls): ''' 표 67 캡션 ''' yield cls.Flags, 'flags', yield HWPUNIT, 'width', yield HWPUNIT16, 'separation', # 캡션과 틀 사이 간격 yield HWPUNIT, 'max_width', # expand_to_margin 고려한 최대 너비 attributes = classmethod(attributes)
class NumberingLevel(Struct): # 표 35 문단 머리 정보 속성 Align = Enum(LEFT=0, CENTER=1, RIGHT=2, UNKNOWN=3) DistanceType = Enum(RATIO=0, VALUE=1) Flags = Flags(UINT32, 0, 1, Align, 'paragraph_align', 2, 'auto_width', 3, 'auto_dedent', 4, DistanceType, 'distance_to_body_type') @classmethod def attributes(cls): ''' 표 34 문단 머리 정보 ''' yield cls.Flags, 'flags' yield HWPUNIT16, 'width_correction' yield HWPUNIT16, 'distance_to_body' yield INT32, 'charshape_id' yield BSTR, 'numbering_format' # see 표 36 문단 번호 형식
class TableBody(RecordModel): ''' 4.2.9.1. 표 개체 ''' tagid = HWPTAG_TABLE # 표 71 표 속성의 속성 Split = Enum(NONE=0, BY_CELL=1, SPLIT=2) Flags = Flags(UINT32, 0, 1, Split, 'split_page', 2, 'repeat_header') def attributes(cls): ''' 표 70 표 개체 속성 ''' yield cls.Flags, 'flags' yield UINT16, 'rows' yield UINT16, 'cols' yield HWPUNIT16, 'cellspacing' # 표 72 안쪽 여백 정보 yield Margin, 'padding' yield dict(type=X_ARRAY(UINT16, ref_member('rows')), name='rowcols') yield UINT16, 'borderfill_id' yield dict(type=N_ARRAY(UINT16, ZoneInfo), name='validZones', version=(5, 0, 0, 7)) attributes = classmethod(attributes)
class CharShape(RecordModel): ''' 4.1.6. 글자 모양 ''' tagid = HWPTAG_CHAR_SHAPE # 표 30 글자 모양 속성 Underline = Enum(NONE=0, UNDERLINE=1, UNKNOWN=2, UPPERLINE=3) Flags = Flags(UINT32, 0, 'italic', 1, 'bold', 2, 3, Underline, 'underline', 4, 7, 'underline_style', 8, 10, 'outline', 11, 13, 'shadow') def attributes(cls): ''' 표 28 글자 모양 ''' yield LanguageStruct('FontFace', WORD), 'font_face', yield (LanguageStruct('LetterWidthExpansion', UINT8), 'letter_width_expansion') yield LanguageStruct('LetterSpacing', INT8), 'letter_spacing' yield LanguageStruct('RelativeSize', INT8), 'relative_size' yield LanguageStruct('Position', INT8), 'position' yield INT32, 'basesize', yield cls.Flags, 'charshapeflags', yield ShadowSpace, 'shadow_space' yield COLORREF, 'text_color', yield COLORREF, 'underline_color', yield COLORREF, 'shade_color', yield COLORREF, 'shadow_color', # yield UINT16, 'borderfill_id', # DIFFSPEC # yield COLORREF, 'strikeoutColor', # DIFFSPEC attributes = classmethod(attributes)
class ListHeader(RecordModel): ''' 4.2.7. 문단 리스트 헤더 ''' __metaclass__ = ListHeaderType tagid = HWPTAG_LIST_HEADER VAlign = Enum(TOP=0, MIDDLE=1, BOTTOM=2) Flags = Flags(UINT32, 0, 2, 'textdirection', 3, 4, 'linebreak', 5, 6, VAlign, 'valign') def attributes(cls): ''' 표 60 문단 리스트 헤더 ''' yield UINT16, 'paragraphs', yield UINT16, 'unknown1', yield cls.Flags, 'listflags', attributes = classmethod(attributes) extension_types = list_header_models def get_extension_key(context, model): ''' (parent model type, after TableBody) ''' if 'parent' in context: context, model = context['parent'] seen_table_body = context.get('seen_table_body', False) return model['type'], seen_table_body get_extension_key = staticmethod(get_extension_key)
def test_bitfields(self): MyEnum = Enum(a=1, b=2) MyFlags = Flags(UINT32, 0, 1, 'field0', 2, 4, MyEnum, 'field2') bitfields = MyFlags.bitfields f = bitfields['field0'] self.assertEqual((0, 1, int), (f.lsb, f.msb, f.valuetype)) f = bitfields['field2'] self.assertEqual((2, 4, MyEnum), (f.lsb, f.msb, f.valuetype))
class HeaderFooter(Control): ''' 4.2.10.3. 머리말/꼬리말 ''' Places = Enum(BOTH_PAGES=0, EVEN_PAGE=1, ODD_PAGE=2) Flags = Flags(UINT32, 0, 1, Places, 'places') def attributes(cls): yield cls.Flags, 'flags' attributes = classmethod(attributes)
class Tab(Struct): Kind = Enum(LEFT=0, RIGHT=1, CENTER=2, FLOAT=3) Flags = Flags(UINT32, 0, 7, Kind, 'kind', 8, 15, 'fill_type') @classmethod def attributes(cls): yield HWPUNIT, 'pos', yield cls.Flags, 'flags'
class NumberingControl(Control): Kind = Enum(PAGE=0, FOOTNOTE=1, ENDNOTE=2, PICTURE=3, TABLE=4, EQUATION=5) Flags = Flags(UINT32, 0, 3, Kind, 'kind', 4, 11, 'footnoteshape', 12, 'superscript') def attributes(cls): yield cls.Flags, 'flags', yield UINT16, 'number', attributes = classmethod(attributes)
class PageOddEven(Control): ''' 4.2.10.8 홀/짝수 조정 ''' chid = CHID.PGCT OddEven = Enum(BOTH_PAGES=0, EVEN_PAGE=1, ODD_PAGE=2) Flags = Flags(UINT32, 0, 1, OddEven, 'pages') def attributes(cls): yield cls.Flags, 'flags' attributes = classmethod(attributes)
def test_bitfields(self): from hwp5.dataio import UINT32 from hwp5.dataio import Flags from hwp5.dataio import Enum MyEnum = Enum(a=1, b=2) MyFlags = Flags(UINT32, 0, 1, 'field0', 2, 4, MyEnum, 'field2') bitfields = MyFlags.bitfields f = bitfields['field0'] self.assertEquals((0, 1, int), (f.lsb, f.msb, f.valuetype)) f = bitfields['field2'] self.assertEquals((2, 4, MyEnum), (f.lsb, f.msb, f.valuetype))
class CharShape(RecordModel): ''' 4.1.6. 글자 모양 ''' tagid = HWPTAG_CHAR_SHAPE # 표 30 글자 모양 속성 Underline = Enum(NONE=0, UNDERLINE=1, LINE_THROUGH=2, OVERLINE=3) UnderlineStyle = Enum(SOLID=0, DASHED=1, DOTTED=2, DASH_DOT=3, DASH_DOT_DOT=4, LONG_DASHED=5, LARGE_DOTTED=6, DOUBLE=7, LOWER_WEIGHTED=8, UPPER_WEIGHTED=9, MIDDLE_WEIGHTED=10) Flags = Flags(UINT32, 0, 'italic', 1, 'bold', 2, 3, Underline, 'underline', 4, 7, UnderlineStyle, 'underline_style', 8, 10, 'outline', 11, 13, 'shadow') def attributes(cls): ''' 표 28 글자 모양 ''' yield LanguageStruct('FontFace', WORD), 'font_face', yield (LanguageStruct('LetterWidthExpansion', UINT8), 'letter_width_expansion') yield LanguageStruct('LetterSpacing', INT8), 'letter_spacing' yield LanguageStruct('RelativeSize', INT8), 'relative_size' yield LanguageStruct('Position', INT8), 'position' yield INT32, 'basesize', yield cls.Flags, 'charshapeflags', yield ShadowSpace, 'shadow_space' yield COLORREF, 'text_color', yield COLORREF, 'underline_color', yield COLORREF, 'shade_color', yield COLORREF, 'shadow_color', # yield UINT16, 'borderfill_id', # DIFFSPEC # yield COLORREF, 'strikeoutColor', # DIFFSPEC attributes = classmethod(attributes)
class Dutmal(Control): ''' 4.2.10.13. 덧말 ''' chid = CHID.TDUT Position = Enum(ABOVE=0, BELOW=1, CENTER=2) Align = Enum(BOTH=0, LEFT=1, RIGHT=2, CENTER=3, DISTRIBUTE=4, DISTRIBUTE_SPACE=5) def attributes(cls): yield BSTR, 'maintext' yield BSTR, 'subtext' yield Flags(UINT32, 0, 31, cls.Position, 'position'), 'position' yield UINT32, 'fsizeratio' yield UINT32, 'option' yield UINT32, 'stylenumber' yield Flags(UINT32, 0, 31, cls.Align, 'align'), 'align' attributes = classmethod(attributes)
class FillColorPattern(Fill): ''' 표 23 채우기 정보 ''' PatternTypeEnum = Enum(NONE=255, HORIZONTAL=0, VERTICAL=1, BACKSLASH=2, SLASH=3, GRID=4, CROSS=5) PatternTypeFlags = Flags(UINT32, 0, 7, PatternTypeEnum, 'pattern_type') def attributes(cls): yield COLORREF, 'background_color', yield COLORREF, 'pattern_color', yield cls.PatternTypeFlags, 'pattern_type_flags', attributes = classmethod(attributes)
class CompatibleDocument(RecordModel): ''' 4.1.14. 호환 문서 ''' tagid = HWPTAG_COMPATIBLE_DOCUMENT # 표 50 대상 프로그램 Target = Enum(DEFAULT=0, HWP2007=1, MSWORD=2) Flags = Flags(UINT32, 0, 1, 'target') def attributes(cls): ''' 표 49 호환 문서 ''' yield cls.Flags, 'flags' attributes = classmethod(attributes)
class Border(Struct): # 표 20 테두리선 종류 StrokeEnum = Enum('none', 'solid', 'dashed', 'dotted', 'dash-dot', 'dash-dot-dot', 'long-dash', 'large-dot', 'double', 'double-2', 'double-3', 'triple', 'wave', 'double-wave', 'inset', 'outset', 'groove', 'ridge') StrokeType = Flags(UINT8, 0, 4, StrokeEnum, 'stroke_type') # 표 21 테두리선 굵기 widths = {'0.1mm': 0, '0.12mm': 1, '0.15mm': 2, '0.2mm': 3, '0.25mm': 4, '0.3mm': 5, '0.4mm': 6, '0.5mm': 7, '0.6mm': 8, '0.7mm': 9, '1.0mm': 10, '1.5mm': 11, '2.0mm': 12, '3.0mm': 13, '4.0mm': 14, '5.0mm': 15} WidthEnum = Enum(**widths) Width = Flags(UINT8, 0, 4, WidthEnum, 'width') def attributes(cls): yield cls.StrokeType, 'stroke_flags', yield cls.Width, 'width_flags', yield COLORREF, 'color', attributes = classmethod(attributes)
class BinData(RecordModel): ''' 4.1.3. 바이너리 데이터 ''' tagid = HWPTAG_BIN_DATA # 표 13 바이너리 데이터 속성 StorageType = Enum(LINK=0, EMBEDDING=1, STORAGE=2) CompressionType = Enum(STORAGE_DEFAULT=0, YES=1, NO=2) AccessState = Enum(NEVER=0, OK=1, FAILED=2, FAILED_IGNORED=3) Flags = Flags(UINT16, 0, 3, StorageType, 'storage', 4, 5, CompressionType, 'compression', 16, 17, AccessState, 'access') def attributes(cls): ''' 표 12 바이너리 데이터 ''' yield cls.Flags, 'flags' yield (SelectiveType(ref_member_flag('flags', 'storage'), {cls.StorageType.LINK: BinDataLink, cls.StorageType.EMBEDDING: BinDataEmbedding, cls.StorageType.STORAGE: BinDataStorage}), 'bindata') attributes = classmethod(attributes)
class EqEdit(RecordModel): ''' 4.2.9.3. 한글 스크립트 수식 (한글 97 방식 수식) ''' tagid = HWPTAG_CTRL_EQEDIT ScriptScope = Enum(CHAR=0, LINE=1) Flags = Flags(UINT32, 0, ScriptScope, 'script_scope') @classmethod def attributes(cls): ''' 표 100 수식 개체 속성 ''' # TODO: followings are not tested against real files if False: yield
class CommonControl(Control): # 표 65 개체 공통 속성의 속성 Flow = Enum(FLOAT=0, BLOCK=1, BACK=2, FRONT=3) TextSide = Enum(BOTH=0, LEFT=1, RIGHT=2, LARGER=3) VRelTo = Enum(PAPER=0, PAGE=1, PARAGRAPH=2) HRelTo = Enum(PAPER=0, PAGE=1, COLUMN=2, PARAGRAPH=3) VAlign = Enum(TOP=0, MIDDLE=1, BOTTOM=2) HAlign = Enum(LEFT=0, CENTER=1, RIGHT=2, INSIDE=3, OUTSIDE=4) WidthRelTo = Enum(PAPER=0, PAGE=1, COLUMN=2, PARAGRAPH=3, ABSOLUTE=4) HeightRelTo = Enum(PAPER=0, PAGE=1, ABSOLUTE=2) NumberCategory = Enum(NONE=0, FIGURE=1, TABLE=2, EQUATION=3) CommonControlFlags = Flags( UINT32, 0, 'inline', 2, 'affect_line_spacing', 3, 4, VRelTo, 'vrelto', 5, 7, VAlign, 'valign', 8, 9, HRelTo, 'hrelto', 10, 12, HAlign, 'halign', 13, 'restrict_in_page', 14, 'overlap_others', 15, 17, WidthRelTo, 'width_relto', 18, 19, HeightRelTo, 'height_relto', 20, 'protect_size_when_vrelto_paragraph', 21, 23, Flow, 'flow', 24, 25, TextSide, 'text_side', 26, 27, NumberCategory, 'number_category') MARGIN_LEFT = 0 MARGIN_RIGHT = 1 MARGIN_TOP = 2 MARGIN_BOTTOM = 3 def attributes(cls): ''' 표 64 개체 공통 속성 ''' yield cls.CommonControlFlags, 'flags', yield SHWPUNIT, 'y', # DIFFSPEC yield SHWPUNIT, 'x', # DIFFSPEC yield HWPUNIT, 'width', yield HWPUNIT, 'height', yield INT16, 'z_order', yield INT16, 'unknown1', yield Margin, 'margin', yield UINT32, 'instance_id', yield dict(type=INT16, name='unknown2', version=(5, 0, 0, 5)) yield dict(type=BSTR, name='description', version=(5, 0, 0, 5)) attributes = classmethod(attributes)
class PageNumberPosition(Control): ''' 4.2.10.9. 쪽 번호 위치 ''' chid = CHID.PGNP Position = Enum(NONE=0, TOP_LEFT=1, TOP_CENTER=2, TOP_RIGHT=3, BOTTOM_LEFT=4, BOTTOM_CENTER=5, BOTTOM_RIGHT=6, OUTSIDE_TOP=7, OUTSIDE_BOTTOM=8, INSIDE_TOP=9, INSIDE_BOTTOM=10) Flags = Flags(UINT32, 0, 7, 'shape', 8, 11, Position, 'position') def attributes(cls): yield cls.Flags, 'flags' yield WCHAR, 'usersymbol' yield WCHAR, 'prefix' yield WCHAR, 'suffix' yield WCHAR, 'dash' attributes = classmethod(attributes)
class Style(RecordModel): ''' 4.1.11. 스타일 ''' tagid = HWPTAG_STYLE # 표 43 스타일 종류 Kind = Enum(PARAGRAPH=0, CHAR=1) Flags = Flags(BYTE, 0, 1, Kind, 'kind') def attributes(cls): ''' 표 42 스타일 ''' yield BSTR, 'local_name', yield BSTR, 'name', yield cls.Flags, 'flags', yield BYTE, 'next_style_id', yield INT16, 'lang_id', yield UINT16, 'parashape_id', yield UINT16, 'charshape_id', # unknown fields # following fields are found from 5.0.0.0 yield UINT16, 'unknown' attributes = classmethod(attributes)
class FaceName(RecordModel): ''' 4.1.4. 글꼴 ''' tagid = HWPTAG_FACE_NAME # 표 16 대체 글꼴 유형 FontFileType = Enum(UNKNOWN=0, TTF=1, HFT=2) # 표 15 글꼴 속성 Flags = Flags(BYTE, 0, 1, FontFileType, 'font_file_type', 5, 'default', 6, 'metric', 7, 'alternate') def attributes(cls): ''' 표 14 글꼴 ''' yield cls.Flags, 'flags' yield BSTR, 'name' def has_alternate(context, values): ''' flags.alternate == 1 ''' return values['flags'].alternate def has_metric(context, values): ''' flags.metric == 1 ''' return values['flags'].metric def has_default(context, values): ''' flags.default == 1 ''' return values['flags'].default yield dict(type=AlternateFont, name='alternate_font', condition=has_alternate) yield dict(type=Panose1, name='panose1', condition=has_metric) yield dict(type=BSTR, name='default_font', condition=has_default) attributes = classmethod(attributes)
class FooRecord(RecordModel): Bar = Flags(UINT32) Baz = Enum()
class ParaShape(RecordModel): ''' 4.1.10. 문단 모양 ''' tagid = HWPTAG_PARA_SHAPE # 표 39 문단 모양 속성1 LineSpacingType = Enum(RATIO=0, FIXED=1, SPACEONLY=2, MINIMUM=3) Align = Enum(BOTH=0, LEFT=1, RIGHT=2, CENTER=3, DISTRIBUTE=4, DISTRIBUTE_SPACE=5) VAlign = Enum(FONT=0, TOP=1, CENTER=2, BOTTOM=3) LineBreakAlphabet = Enum(WORD=0, HYPHEN=1, CHAR=2) LineBreakHangul = Enum(WORD=0, CHAR=1) HeadShape = Enum(NONE=0, OUTLINE=1, NUMBER=2, BULLET=3) Flags1 = Flags(UINT32, 0, 1, LineSpacingType, 'linespacing_type', 2, 4, Align, 'align', 5, 6, LineBreakAlphabet, 'linebreak_alphabet', 7, LineBreakHangul, 'linebreak_hangul', 8, 'use_paper_grid', 9, 15, 'minimum_space', # 공백 최소값 16, 'protect_single_line', # 외톨이줄 보호 17, 'with_next_paragraph', # 다음 문단과 함께 18, 'protect', # 문단 보호 19, 'start_new_page', # 문단 앞에서 항상 쪽 나눔 20, 21, VAlign, 'valign', 22, 'lineheight_along_fontsize', # 글꼴에 어울리는 줄 높이 23, 24, HeadShape, 'head_shape', # 문단 머리 모양 25, 27, 'level', # 문단 수준 28, 'linked_border', # 문단 테두리 연결 여부 29, 'ignore_margin', # 문단 여백 무시 30, 'tail_shape') # 문단 꼬리 모양 # 표 40 문단 모양 속성2 Flags2 = Flags(UINT32, 0, 1, 'in_single_line', 2, 3, 'reserved', 4, 'autospace_alphabet', 5, 'autospace_number') # 표 41 줄 간격 종류 Flags3 = Flags(UINT32, 0, 4, LineSpacingType, 'linespacing_type3') Flags = Flags1 def attributes(cls): ''' 표 38 문단 모양 ''' yield cls.Flags, 'parashapeflags', yield INT32, 'doubled_margin_left', # 1/7200 * 2 # DIFFSPEC yield INT32, 'doubled_margin_right', # 1/7200 * 2 yield SHWPUNIT, 'indent', yield INT32, 'doubled_margin_top', # 1/7200 * 2 yield INT32, 'doubled_margin_bottom', # 1/7200 * 2 yield SHWPUNIT, 'linespacing', yield UINT16, 'tabdef_id', yield UINT16, 'numbering_bullet_id', yield UINT16, 'borderfill_id', yield HWPUNIT16, 'border_left', yield HWPUNIT16, 'border_right', yield HWPUNIT16, 'border_top', yield HWPUNIT16, 'border_bottom', yield dict(type=cls.Flags2, name='flags2', version=(5, 0, 1, 7)) # yield cls.Flags3, 'flags3', # DIFFSPEC # yield UINT32, 'lineSpacing', # DIFFSPEC attributes = classmethod(attributes)