src/docdirstream.py |    7 ++
 src/docrecord.py    |  132 ++++++++++++++++++++++++++++++++++++++++++++++++----
 src/docsprm.py      |   84 +++++++++++++++++++++++++++++++++
 test/parstyles.rtf  |   10 +++
 4 files changed, 223 insertions(+), 10 deletions(-)

New commits:
commit b9e772aad9c8f0a25d4986a427e2281175090174
Author: Miklos Vajna <vmik...@suse.cz>
Date:   Tue Nov 13 10:52:06 2012 +0100

    fix typo and add par styles test

diff --git a/src/docrecord.py b/src/docrecord.py
index 2352dde..9931173 100755
--- a/src/docrecord.py
+++ b/src/docrecord.py
@@ -842,7 +842,7 @@ class LPUpxTapx(DOCDirStream):
         uPXPadding = UPXPadding(self)
         uPXPadding.pad()
         self.pos = uPXPadding.pos
-        print '</lPUpxChpx>'
+        print '</lPUpxTapx>'
 
 class StkCharLpUpxGrLpUpxRM(DOCDirStream):
     """The StkCharLPUpxGrLPUpxRM structure specifies revision-marking 
information and formatting for character styles."""
diff --git a/test/parstyles.rtf b/test/parstyles.rtf
new file mode 100755
index 0000000..93e3201
--- /dev/null
+++ b/test/parstyles.rtf
@@ -0,0 +1,10 @@
+{\rtf1
+{\fonttbl
+{\f0 Times New Roman;}
+}
+{\stylesheet
+{\s15\qc\sbasedon0\snext15 Center;}
+}
+{Hello world!\par }
+{\s15\qc This is centered.\par }
+}
commit 4b9d33f73b96e78298198d15f2b76a72fbbd3736
Author: Miklos Vajna <vmik...@suse.cz>
Date:   Tue Nov 13 09:57:33 2012 +0100

    dump STSH part 2: the remaining parts

diff --git a/src/docdirstream.py b/src/docdirstream.py
index 1e21832..cbb7d21 100755
--- a/src/docdirstream.py
+++ b/src/docdirstream.py
@@ -52,6 +52,13 @@ class DOCDirStream:
             pos = self.pos
         return struct.unpack("<I", bytes[pos:pos+4])[0]
 
+    def getuInt64(self, bytes = None, pos = None):
+        if not bytes:
+            bytes = self.bytes
+        if not pos:
+            pos = self.pos
+        return struct.unpack("<Q", bytes[pos:pos+8])[0]
+
     def getString(self):
         bytes = []
         while True:
diff --git a/src/docrecord.py b/src/docrecord.py
index abaed0e..2352dde 100755
--- a/src/docrecord.py
+++ b/src/docrecord.py
@@ -102,7 +102,6 @@ class Sprm(DOCDirStream):
                 3: 4,
                 4: 2,
                 5: 2,
-                # 6: variable,
                 7: 3,
                 }
 
@@ -114,12 +113,16 @@ class Sprm(DOCDirStream):
         self.sgc   = (self.sprm & 0x1c00) >> 10 # 11-13th bits
         self.spra  = (self.sprm & 0xe000) >> 13 # 14-16th bits
 
-        if self.operandSizeMap[self.spra] == 1:
+        if self.getOperandSize() == 1:
             self.operand = self.getuInt8()
-        elif self.operandSizeMap[self.spra] == 2:
+        elif self.getOperandSize() == 2:
             self.operand = self.getuInt16()
-        elif self.operandSizeMap[self.spra] == 4:
+        elif self.getOperandSize() == 3:
+            self.operand = self.getuInt32() & 0x0fff
+        elif self.getOperandSize() == 4:
             self.operand = self.getuInt32()
+        elif self.getOperandSize() == 7:
+            self.operand = self.getuInt64() & 0x0fffffff
         else:
             self.operand = "todo"
 
@@ -134,12 +137,17 @@ class Sprm(DOCDirStream):
         nameMap = {
                 1: docsprm.parMap,
                 2: docsprm.chrMap,
+                5: docsprm.tblMap,
                 }
         print '<sprm value="%s" name="%s" ispmd="%s" fSpec="%s" sgc="%s" 
spra="%s" operandSize="%s" operand="%s"/>' % (
                 hex(self.sprm), nameMap[self.sgc][self.sprm], hex(self.ispmd), 
hex(self.fSpec), sgcmap[self.sgc], hex(self.spra), self.getOperandSize(), 
hex(self.operand)
                 )
 
     def getOperandSize(self):
+        if self.spra == 6: # variable
+            if self.sprm == 0xd634:
+                return 7
+            raise Exception()
         return self.operandSizeMap[self.spra]
 
 class Prl(DOCDirStream):
@@ -753,6 +761,25 @@ class UpxChpx(DOCDirStream):
         print '</grpprlChpx>'
         print '</upxChpx>'
 
+class UpxTapx(DOCDirStream):
+    """The UpxTapx structure specifies the table formatting properties that 
differ from the parent"""
+    def __init__(self, lPUpxTapx):
+        DOCDirStream.__init__(self, lPUpxTapx.bytes)
+        self.lPUpxTapx = lPUpxTapx
+        self.pos = lPUpxTapx.pos
+
+    def dump(self):
+        print '<upxTapx type="UpxTapx" offset="%d">' % self.pos
+        size = self.lPUpxTapx.cbUpx
+        pos = 0
+        print '<grpprlTapx offset="%d" size="%d bytes">' % (self.pos, size)
+        while size - pos > 0:
+            prl = Prl(self.bytes, self.pos + pos)
+            prl.dump()
+            pos += prl.getSize()
+        print '</grpprlTapx>'
+        print '</upxTapx>'
+
 class UPXPadding:
     """The UPXPadding structure specifies the padding that is used to pad the 
UpxPapx/Chpx/Tapx structures if any of them are an odd number of bytes in 
length."""
     def __init__(self, parent):
@@ -799,6 +826,37 @@ class LPUpxChpx(DOCDirStream):
         self.pos = uPXPadding.pos
         print '</lPUpxChpx>'
 
+class LPUpxTapx(DOCDirStream):
+    """The LPUpxTapx structure specifies table formatting properties."""
+    def __init__(self, stkParaGRLPUPX):
+        DOCDirStream.__init__(self, stkParaGRLPUPX.bytes)
+        self.pos = stkParaGRLPUPX.pos
+
+    def dump(self):
+        print '<lPUpxTapx type="LPUpxTapx" offset="%d">' % self.pos
+        self.printAndSet("cbUpx", self.getuInt16())
+        self.pos += 2
+        upxTapx = UpxTapx(self)
+        upxTapx.dump()
+        self.pos += self.cbUpx
+        uPXPadding = UPXPadding(self)
+        uPXPadding.pad()
+        self.pos = uPXPadding.pos
+        print '</lPUpxChpx>'
+
+class StkCharLpUpxGrLpUpxRM(DOCDirStream):
+    """The StkCharLPUpxGrLPUpxRM structure specifies revision-marking 
information and formatting for character styles."""
+    def __init__(self, stkCharGRLPUPX):
+        DOCDirStream.__init__(self, stkCharGRLPUPX.bytes)
+        self.pos = stkCharGRLPUPX.pos
+
+    def dump(self):
+        print '<stkCharLpUpxGrLpUpxRM type="StkCharLpUpxGrLpUpxRM" 
offset="%d">' % self.pos
+        self.printAndSet("cbStkCharUpxGrLpUpxRM", self.getuInt16())
+        if self.cbStkCharUpxGrLpUpxRM != 0:
+            print '<todo what="StkCharLpUpxGrLpUpxRM: cbStkCharUpxGrLpUpxRM != 
0 not implemented"/>'
+        print '</stkCharLpUpxGrLpUpxRM>'
+
 class StkParaLpUpxGrLpUpxRM(DOCDirStream):
     """The StkParaLPUpxGrLPUpxRM structure specifies revision-marking 
information and formatting for paragraph styles."""
     def __init__(self, stkParaGRLPUPX):
@@ -812,6 +870,57 @@ class StkParaLpUpxGrLpUpxRM(DOCDirStream):
             print '<todo what="StkParaLpUpxGrLpUpxRM: cbStkParaUpxGrLpUpxRM != 
0 not implemented"/>'
         print '</stkParaLpUpxGrLpUpxRM>'
 
+class StkListGRLPUPX(DOCDirStream):
+    """The StkListGRLPUPX structure that specifies the formatting properties 
for a list style."""
+    def __init__(self, grLPUpxSw):
+        DOCDirStream.__init__(self, grLPUpxSw.bytes)
+        self.grLPUpxSw = grLPUpxSw
+        self.pos = grLPUpxSw.pos
+
+    def dump(self):
+        print '<stkListGRLPUPX type="StkListGRLPUPX" offset="%d">' % self.pos
+        lpUpxPapx = LPUpxPapx(self)
+        lpUpxPapx.dump()
+        self.pos = lpUpxPapx.pos
+        print '</stkListGRLPUPX>'
+
+class StkTableGRLPUPX(DOCDirStream):
+    """The StkTableGRLPUPX structure that specifies the formatting properties 
for a table style."""
+    def __init__(self, grLPUpxSw):
+        DOCDirStream.__init__(self, grLPUpxSw.bytes)
+        self.grLPUpxSw = grLPUpxSw
+        self.pos = grLPUpxSw.pos
+
+    def dump(self):
+        print '<stkTableGRLPUPX type="StkTableGRLPUPX" offset="%d">' % self.pos
+        lpUpxTapx = LPUpxTapx(self)
+        lpUpxTapx.dump()
+        self.pos = lpUpxTapx.pos
+        lpUpxPapx = LPUpxPapx(self)
+        lpUpxPapx.dump()
+        self.pos = lpUpxPapx.pos
+        lpUpxChpx = LPUpxChpx(self)
+        lpUpxChpx.dump()
+        self.pos = lpUpxChpx.pos
+        print '</stkTableGRLPUPX>'
+
+class StkCharGRLPUPX(DOCDirStream):
+    """The StkCharGRLPUPX structure that specifies the formatting properties 
for a character style."""
+    def __init__(self, grLPUpxSw):
+        DOCDirStream.__init__(self, grLPUpxSw.bytes)
+        self.grLPUpxSw = grLPUpxSw
+        self.pos = grLPUpxSw.pos
+
+    def dump(self):
+        print '<stkCharGRLPUPX type="StkCharGRLPUPX" offset="%d">' % self.pos
+        lpUpxChpx = LPUpxChpx(self)
+        lpUpxChpx.dump()
+        self.pos = lpUpxChpx.pos
+        stkCharLpUpxGrLpUpxRM = StkCharLpUpxGrLpUpxRM(self)
+        stkCharLpUpxGrLpUpxRM.dump()
+        self.pos = stkCharLpUpxGrLpUpxRM.pos
+        print '</stkCharGRLPUPX>'
+
 class StkParaGRLPUPX(DOCDirStream):
     """The StkParaGRLPUPX structure that specifies the formatting properties 
for a paragraph style."""
     def __init__(self, grLPUpxSw):
@@ -841,7 +950,10 @@ class GrLPUpxSw(DOCDirStream):
 
     def dump(self):
         stkMap = {
-                1: StkParaGRLPUPX
+                1: StkParaGRLPUPX,
+                2: StkCharGRLPUPX,
+                3: StkTableGRLPUPX,
+                4: StkListGRLPUPX
                 }
         child = stkMap[self.std.stdf.stdfBase.stk](self)
         child.dump()
@@ -878,9 +990,10 @@ class LPStd(DOCDirStream):
     def dump(self):
         self.printAndSet("cbStd", self.getuInt16())
         self.pos += 2
-        std = STD(self)
-        std.dump()
-        self.pos = std.pos
+        if self.cbStd > 0:
+            std = STD(self)
+            std.dump()
+            self.pos = std.pos
 
 class STSH(DOCDirStream):
     """The STSH structure specifies the stylesheet for a document."""
@@ -895,12 +1008,11 @@ class STSH(DOCDirStream):
         self.lpstshi.dump()
         self.pos = self.lpstshi.pos
         for i in range(self.lpstshi.stshi.stshif.cstd):
-            print '<rglpstd index="%d" type="LPStd">' % i
+            print '<rglpstd index="%d" type="LPStd" offset="%d">' % (i, 
self.pos)
             lpstd = LPStd(self)
             lpstd.dump()
             self.pos = lpstd.pos
             print '</rglpstd>'
-            break # FIXME
         print '</stsh>'
 
 # vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
commit 2b17879905f1899ed5d4bfa89f67998f9fb8ac3c
Author: Miklos Vajna <vmik...@suse.cz>
Date:   Tue Nov 13 10:14:23 2012 +0100

    add table sprms

diff --git a/src/docsprm.py b/src/docsprm.py
index 5255cd6..54c9798 100755
--- a/src/docsprm.py
+++ b/src/docsprm.py
@@ -1,5 +1,89 @@
 #!/usr/bin/env python
 
+# see 2.6.3 of the spec
+tblMap = {
+    0x5400: "sprmTJc90",
+    0x9601: "sprmTDxaLeft",
+    0x9602: "sprmTDxaGapHalf",
+    0x3403: "sprmTFCantSplit90",
+    0x3404: "sprmTTableHeader",
+    0xD605: "sprmTTableBorders80",
+    0x9407: "sprmTDyaRowHeight",
+    0xD608: "sprmTDefTable",
+    0xD609: "sprmTDefTableShd80",
+    0x740A: "sprmTTlp",
+    0x560B: "sprmTFBiDi",
+    0xD60C: "sprmTDefTableShd3rd",
+    0x360D: "sprmTPc",
+    0x940E: "sprmTDxaAbs",
+    0x940F: "sprmTDyaAbs",
+    0x9410: "sprmTDxaFromText",
+    0x9411: "sprmTDyaFromText",
+    0xD612: "sprmTDefTableShd",
+    0xD613: "sprmTTableBorders",
+    0xF614: "sprmTTableWidth",
+    0x3615: "sprmTFAutofit",
+    0xD616: "sprmTDefTableShd2nd",
+    0xF617: "sprmTWidthBefore",
+    0xF618: "sprmTWidthAfter",
+    0x3619: "sprmTFKeepFollow",
+    0xD61A: "sprmTBrcTopCv",
+    0xD61B: "sprmTBrcLeftCv",
+    0xD61C: "sprmTBrcBottomCv",
+    0xD61D: "sprmTBrcRightCv",
+    0x941E: "sprmTDxaFromTextRight",
+    0x941F: "sprmTDyaFromTextBottom",
+    0xD620: "sprmTSetBrc80",
+    0x7621: "sprmTInsert",
+    0x5622: "sprmTDelete",
+    0x7623: "sprmTDxaCol",
+    0x5624: "sprmTMerge",
+    0x5625: "sprmTSplit",
+    0x7629: "sprmTTextFlow",
+    0xD62B: "sprmTVertMerge",
+    0xD62C: "sprmTVertAlign",
+    0xD62D: "sprmTSetShd",
+    0xD62E: "sprmTSetShdOdd",
+    0xD62F: "sprmTSetBrc",
+    0xD632: "sprmTCellPadding",
+    0xD633: "sprmTCellSpacingDefault",
+    0xD634: "sprmTCellPaddingDefault",
+    0xD635: "sprmTCellWidth",
+    0xF636: "sprmTFitText",
+    0xD639: "sprmTFCellNoWrap",
+    0x563A: "sprmTIstd",
+    0xD63E: "sprmTCellPaddingStyle",
+    0xD642: "sprmTCellFHideMark",
+    0xD660: "sprmTSetShdTable",
+    0xF661: "sprmTWidthIndent",
+    0xD662: "sprmTCellBrcType",
+    0x5664: "sprmTFBiDi90",
+    0x3465: "sprmTFNoAllowOverlap",
+    0x3466: "sprmTFCantSplit",
+    0xD667: "sprmTPropRMark",
+    0x3668: "sprmTWall",
+    0x7469: "sprmTIpgp",
+    0xD66A: "sprmTCnf",
+    0xD670: "sprmTDefTableShdRaw",
+    0xD671: "sprmTDefTableShdRaw2nd",
+    0xD672: "sprmTDefTableShdRaw3rd",
+    0x7479: "sprmTRsid",
+    0x347C: "sprmTCellVertAlignStyle",
+    0x347D: "sprmTCellNoWrapStyle",
+    0xD47F: "sprmTCellBrcTopStyle",
+    0xD680: "sprmTCellBrcBottomStyle",
+    0xD681: "sprmTCellBrcLeftStyle",
+    0xD682: "sprmTCellBrcRightStyle",
+    0xD683: "sprmTCellBrcInsideHStyle",
+    0xD684: "sprmTCellBrcInsideVStyle",
+    0xD685: "sprmTCellBrcTL2BRStyle",
+    0xD686: "sprmTCellBrcTR2BLStyle",
+    0xD687: "sprmTCellShdStyle",
+    0x3488: "sprmTCHorzBands",
+    0x3489: "sprmTCVertBands",
+    0x548A: "sprmTJc",
+        }
+
 # see 2.6.2 of the spec
 parMap = {
     0x4600: "sprmPIstd",
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to