Use o3tl::convert in Math
[LibreOffice.git] / writerfilter / documentation / tablesInDoc.txt
blob50c58a4e290dd73e227db8a61c19b6f8dccf7a8c
2 # This file is part of the LibreOffice project.
4 # This Source Code Form is subject to the terms of the Mozilla Public
5 # License, v. 2.0. If a copy of the MPL was not distributed with this
6 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 # This file incorporates work covered by the following license notice:
10 #   Licensed to the Apache Software Foundation (ASF) under one or more
11 #   contributor license agreements. See the NOTICE file distributed
12 #   with this work for additional information regarding copyright
13 #   ownership. The ASF licenses this file to you under the Apache
14 #   License, Version 2.0 (the "License"); you may not use this file
15 #   except in compliance with the License. You may obtain a copy of
16 #   the License at http://www.apache.org/licenses/LICENSE-2.0 .
19 All paragraphs in tables:
21     sprms: 
22            0x2416 (sprmPFInTable)    indicates a paragraph is in a table
23            0x6649 (sprmPTableDepth)  demarks the nesting depth of the paragraph
24            
25 paragraph at nesting depth 1:
26     
27     end of cell:        0x7
28     end of row:         0x7 + sprm 0x2417(sprmFTtp)
30     the end of a row has its own 0x7
31     
32 paragraphs at nesting depth > 1;
34     end of cell:      0xd + sprm 0x244b(sprmPCell)
35     end of row        0xd + sprm 0x244b(sprmPCell) + sprm 0x244c(sprmPRow)
37     the end of a row has its own 0xd
39 Algorithm to detect table structure:
41 Datastructures:
43 RowData<Handle>:
44         int getCellCount()
45             // return number of cells in row
46         Handle getStart(i)
47                // get handle for start of cell i
48         Handle getEnd(i)
49                // get handle for end off cell i
50         Properties getProperties()
51                    // return properties of row
53 TableData<Handle>:
54         void addCell(Handle start, Handle end)
55              // insert cell starting at start and ending at end into the 
56              // current row
57         void endRow(properties)
58              // end current row and save properties for that row, begin new row
59         int getRowCount
60             // return number of rows in table
61         RowData<Handle> getRow(i)
62                         // get data for row i
64 prevTableDepth
65         depth in table hierarchy of previous paragraph
67 curTableDepth
68         depth in table hierarchy of current paragraph
70 bInCell
71         true if current paragraph is in a cell
73 bEndCell
74         true if current paragraph if the last paragraph of a cell
76 bEndRow
77         true if current paragraph is the end of a row
79 paragraphHandle
80           handle for current paragraph
82 initial:
83         create stack of TableData<Handle>
85 final:
86         handle remaining TableData<Handle> on stack
88 creating StreamHandler:
89          push new TableData<Handle> on stack
91 destroying StreamHandler:
92            handle TableData<Handle> on top of stack
93            pop TableData<Handle> from stack
94            
95 StreamHandler::substream:
96          push new TableData<Handle> on stack
97          handle TableData<Handle> on top of stack
98          pop TableData<Handle> from stack
99         
100 starting paragraph group:
101          paragraphHandle = currentHandle;
102          bInCell = false;
103          bCellEnd = false;
104          bRowEnd = false;
106 ending paragraph group:
107        difference = curTableDepth - prevTableDepth
109        if (difference > 0)
110           push difference new TableData<Handle> onto stack
111        else if (difference < 0)
112        {
113             repeat difference times
114             {
115                    handle top of stack
116                    pop stack
117             }
118        }
119        precTableDepth = curTableDepth
121        if (bInCell)
122        {
123           if (handleStart is null)
124              handleStart = paragraphHandle;
125        
126           if (bCellEnd)
127           {
128                 stack.top().addCell(handleStart, paragraphHandle);
129                 clear handleStart
130           }
132           if (bRowEnd)
133           {
134                 stack.top().endRow(properties)
135           }
138 in StreamHandler::props:
139    save properties
141 PropertiesHandler::sprm:
142         sprm 0x6649:
143              save value in curTableDepth
144         sprm 0x2416:
145              bInCell = true
146         sprm 0x244b:
147              bCellEnd = true
148         sprm 0x2417:
149              bRowEnd = true
151 text:
152         0x7:
153                 bCellEnd = true