1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
27:
28: 29: 30:
31: class PHPWord_Writer_Word2007_Styles extends PHPWord_Writer_Word2007_Base
32: {
33:
34: private $_document;
35:
36: public function writeStyles(PHPWord $pPHPWord = null)
37: {
38:
39: $objWriter = null;
40: if ($this->getParentWriter()->getUseDiskCaching()) {
41: $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
42: } else {
43: $objWriter = new PHPWord_Shared_XMLWriter(PHPWord_Shared_XMLWriter::STORAGE_MEMORY);
44: }
45:
46: $this->_document = $pPHPWord;
47:
48:
49: $objWriter->startDocument('1.0', 'UTF-8', 'yes');
50:
51: $objWriter->startElement('w:styles');
52:
53: $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
54: $objWriter->writeAttribute('xmlns:w', 'http://schemas.openxmlformats.org/wordprocessingml/2006/main');
55:
56:
57: $this->_writeDocDefaults($objWriter);
58:
59:
60: $objWriter->startElement('w:style');
61: $objWriter->writeAttribute('w:type', 'paragraph');
62: $objWriter->writeAttribute('w:default', '1');
63: $objWriter->writeAttribute('w:styleId', 'Normal');
64: $objWriter->startElement('w:name');
65: $objWriter->writeAttribute('w:val', 'Normal');
66: $objWriter->endElement();
67: $objWriter->startElement('w:pPr');
68: $objWriter->startElement('w:spacing');
69: $objWriter->writeAttribute('w:before', 0);
70: $objWriter->writeAttribute('w:after', 0);
71: $objWriter->writeAttribute('w:line', 240);
72: $objWriter->endElement();
73: $objWriter->endElement();
74: $objWriter->endElement();
75:
76:
77: $styles = PHPWord_Style::getStyles();
78: if (count($styles) > 0) {
79: foreach ($styles as $styleName => $style) {
80: if ($style instanceof PHPWord_Style_Font) {
81:
82: $paragraphStyle = $style->getParagraphStyle();
83: $styleType = $style->getStyleType();
84:
85: $type = ($styleType == 'title') ? 'paragraph' : 'character';
86:
87: if (!is_null($paragraphStyle)) {
88: $type = 'paragraph';
89: }
90:
91: $objWriter->startElement('w:style');
92: $objWriter->writeAttribute('w:type', $type);
93:
94: if ($styleType == 'title') {
95: $arrStyle = explode('_', $styleName);
96: $styleId = 'Heading' . $arrStyle[1];
97: $styleName = 'heading ' . $arrStyle[1];
98: $styleLink = 'Heading' . $arrStyle[1] . 'Char';
99: $objWriter->writeAttribute('w:styleId', $styleId);
100:
101: $objWriter->startElement('w:link');
102: $objWriter->writeAttribute('w:val', $styleLink);
103: $objWriter->endElement();
104: }
105:
106: $objWriter->startElement('w:name');
107: $objWriter->writeAttribute('w:val', $styleName);
108: $objWriter->endElement();
109:
110: if (!is_null($paragraphStyle)) {
111: $objWriter->startElement('w:basedOn');
112: $objWriter->writeAttribute('w:val', 'Normal');
113: $objWriter->endElement();
114: $this->_writeParagraphStyle($objWriter, $paragraphStyle);
115: }
116:
117: $this->_writeTextStyle($objWriter, $style);
118:
119: $objWriter->endElement();
120:
121: } elseif ($style instanceof PHPWord_Style_Paragraph) {
122: $objWriter->startElement('w:style');
123: $objWriter->writeAttribute('w:type', 'paragraph');
124: $objWriter->writeAttribute('w:customStyle', '1');
125: $objWriter->writeAttribute('w:styleId', $styleName);
126:
127: $objWriter->startElement('w:name');
128: $objWriter->writeAttribute('w:val', $styleName);
129: $objWriter->endElement();
130:
131: $objWriter->startElement('w:basedOn');
132: $objWriter->writeAttribute('w:val', 'Normal');
133: $objWriter->endElement();
134:
135: $this->_writeParagraphStyle($objWriter, $style);
136: $objWriter->endElement();
137:
138: } elseif ($style instanceof PHPWord_Style_TableFull) {
139: $objWriter->startElement('w:style');
140: $objWriter->writeAttribute('w:type', 'table');
141: $objWriter->writeAttribute('w:customStyle', '1');
142: $objWriter->writeAttribute('w:styleId', $styleName);
143:
144: $objWriter->startElement('w:name');
145: $objWriter->writeAttribute('w:val', $styleName);
146: $objWriter->endElement();
147:
148: $objWriter->startElement('w:uiPriority');
149: $objWriter->writeAttribute('w:val', '99');
150: $objWriter->endElement();
151:
152: $this->_writeFullTableStyle($objWriter, $style);
153:
154: $objWriter->endElement();
155: }
156: }
157: }
158:
159: $objWriter->endElement();
160:
161:
162: return $objWriter->getData();
163: }
164:
165: private function _writeFullTableStyle(PHPWord_Shared_XMLWriter $objWriter = null, PHPWord_Style_TableFull $style)
166: {
167:
168: $brdSz = $style->getBorderSize();
169: $brdCol = $style->getBorderColor();
170: $bgColor = $style->getBgColor();
171: $cellMargin = $style->getCellMargin();
172:
173: $bTop = (!is_null($brdSz[0])) ? true : false;
174: $bLeft = (!is_null($brdSz[1])) ? true : false;
175: $bRight = (!is_null($brdSz[2])) ? true : false;
176: $bBottom = (!is_null($brdSz[3])) ? true : false;
177: $bInsH = (!is_null($brdSz[4])) ? true : false;
178: $bInsV = (!is_null($brdSz[5])) ? true : false;
179: $borders = ($bTop || $bLeft || $bRight || $bBottom || $bInsH || $bInsV) ? true : false;
180:
181: $mTop = (!is_null($cellMargin[0])) ? true : false;
182: $mLeft = (!is_null($cellMargin[1])) ? true : false;
183: $mRight = (!is_null($cellMargin[2])) ? true : false;
184: $mBottom = (!is_null($cellMargin[3])) ? true : false;
185: $margins = ($mTop || $mLeft || $mRight || $mBottom) ? true : false;
186:
187: $objWriter->startElement('w:tblPr');
188:
189: if ($margins) {
190: $objWriter->startElement('w:tblCellMar');
191: if ($mTop) {
192: echo $margins[0];
193: $objWriter->startElement('w:top');
194: $objWriter->writeAttribute('w:w', $cellMargin[0]);
195: $objWriter->writeAttribute('w:type', 'dxa');
196: $objWriter->endElement();
197: }
198: if ($mLeft) {
199: $objWriter->startElement('w:left');
200: $objWriter->writeAttribute('w:w', $cellMargin[1]);
201: $objWriter->writeAttribute('w:type', 'dxa');
202: $objWriter->endElement();
203: }
204: if ($mRight) {
205: $objWriter->startElement('w:right');
206: $objWriter->writeAttribute('w:w', $cellMargin[2]);
207: $objWriter->writeAttribute('w:type', 'dxa');
208: $objWriter->endElement();
209: }
210: if ($mBottom) {
211: $objWriter->startElement('w:bottom');
212: $objWriter->writeAttribute('w:w', $cellMargin[3]);
213: $objWriter->writeAttribute('w:type', 'dxa');
214: $objWriter->endElement();
215: }
216: $objWriter->endElement();
217: }
218:
219: if ($borders) {
220: $objWriter->startElement('w:tblBorders');
221: if ($bTop) {
222: $objWriter->startElement('w:top');
223: $objWriter->writeAttribute('w:val', 'single');
224: $objWriter->writeAttribute('w:sz', $brdSz[0]);
225: $objWriter->writeAttribute('w:color', $brdCol[0]);
226: $objWriter->endElement();
227: }
228: if ($bLeft) {
229: $objWriter->startElement('w:left');
230: $objWriter->writeAttribute('w:val', 'single');
231: $objWriter->writeAttribute('w:sz', $brdSz[1]);
232: $objWriter->writeAttribute('w:color', $brdCol[1]);
233: $objWriter->endElement();
234: }
235: if ($bRight) {
236: $objWriter->startElement('w:right');
237: $objWriter->writeAttribute('w:val', 'single');
238: $objWriter->writeAttribute('w:sz', $brdSz[2]);
239: $objWriter->writeAttribute('w:color', $brdCol[2]);
240: $objWriter->endElement();
241: }
242: if ($bBottom) {
243: $objWriter->startElement('w:bottom');
244: $objWriter->writeAttribute('w:val', 'single');
245: $objWriter->writeAttribute('w:sz', $brdSz[3]);
246: $objWriter->writeAttribute('w:color', $brdCol[3]);
247: $objWriter->endElement();
248: }
249: if ($bInsH) {
250: $objWriter->startElement('w:insideH');
251: $objWriter->writeAttribute('w:val', 'single');
252: $objWriter->writeAttribute('w:sz', $brdSz[4]);
253: $objWriter->writeAttribute('w:color', $brdCol[4]);
254: $objWriter->endElement();
255: }
256: if ($bInsV) {
257: $objWriter->startElement('w:insideV');
258: $objWriter->writeAttribute('w:val', 'single');
259: $objWriter->writeAttribute('w:sz', $brdSz[5]);
260: $objWriter->writeAttribute('w:color', $brdCol[5]);
261: $objWriter->endElement();
262: }
263: $objWriter->endElement();
264: }
265:
266: $objWriter->endElement();
267:
268: if (!is_null($bgColor)) {
269: $objWriter->startElement('w:tcPr');
270: $objWriter->startElement('w:shd');
271: $objWriter->writeAttribute('w:val', 'clear');
272: $objWriter->writeAttribute('w:color', 'auto');
273: $objWriter->writeAttribute('w:fill', $bgColor);
274: $objWriter->endElement();
275: $objWriter->endElement();
276: }
277:
278:
279:
280: $firstRow = $style->getFirstRow();
281: if (!is_null($firstRow)) {
282: $this->_writeRowStyle($objWriter, 'firstRow', $firstRow);
283: }
284: }
285:
286: private function _writeRowStyle(PHPWord_Shared_XMLWriter $objWriter = null, $type, PHPWord_Style_TableFull $style)
287: {
288: $brdSz = $style->getBorderSize();
289: $brdCol = $style->getBorderColor();
290: $bgColor = $style->getBgColor();
291:
292: $bTop = (!is_null($brdSz[0])) ? true : false;
293: $bLeft = (!is_null($brdSz[1])) ? true : false;
294: $bRight = (!is_null($brdSz[2])) ? true : false;
295: $bBottom = (!is_null($brdSz[3])) ? true : false;
296: $borders = ($bTop || $bLeft || $bRight || $bBottom) ? true : false;
297:
298: $objWriter->startElement('w:tblStylePr');
299: $objWriter->writeAttribute('w:type', $type);
300:
301: $objWriter->startElement('w:tcPr');
302: if (!is_null($bgColor)) {
303: $objWriter->startElement('w:shd');
304: $objWriter->writeAttribute('w:val', 'clear');
305: $objWriter->writeAttribute('w:color', 'auto');
306: $objWriter->writeAttribute('w:fill', $bgColor);
307: $objWriter->endElement();
308: }
309:
310: $objWriter->startElement('w:tcBorders');
311: if ($bTop) {
312: $objWriter->startElement('w:top');
313: $objWriter->writeAttribute('w:val', 'single');
314: $objWriter->writeAttribute('w:sz', $brdSz[0]);
315: $objWriter->writeAttribute('w:color', $brdCol[0]);
316: $objWriter->endElement();
317: }
318: if ($bLeft) {
319: $objWriter->startElement('w:left');
320: $objWriter->writeAttribute('w:val', 'single');
321: $objWriter->writeAttribute('w:sz', $brdSz[1]);
322: $objWriter->writeAttribute('w:color', $brdCol[1]);
323: $objWriter->endElement();
324: }
325: if ($bRight) {
326: $objWriter->startElement('w:right');
327: $objWriter->writeAttribute('w:val', 'single');
328: $objWriter->writeAttribute('w:sz', $brdSz[2]);
329: $objWriter->writeAttribute('w:color', $brdCol[2]);
330: $objWriter->endElement();
331: }
332: if ($bBottom) {
333: $objWriter->startElement('w:bottom');
334: $objWriter->writeAttribute('w:val', 'single');
335: $objWriter->writeAttribute('w:sz', $brdSz[3]);
336: $objWriter->writeAttribute('w:color', $brdCol[3]);
337: $objWriter->endElement();
338: }
339: $objWriter->endElement();
340:
341: $objWriter->endElement();
342:
343: $objWriter->endElement();
344: }
345:
346:
347: private function _writeDocDefaults(PHPWord_Shared_XMLWriter $objWriter = null)
348: {
349: $fontName = $this->_document->getDefaultFontName();
350: $fontSize = $this->_document->getDefaultFontSize();
351:
352: $objWriter->startElement('w:docDefaults');
353: $objWriter->startElement('w:rPrDefault');
354: $objWriter->startElement('w:rPr');
355:
356: $objWriter->startElement('w:rFonts');
357: $objWriter->writeAttribute('w:ascii', $fontName);
358: $objWriter->writeAttribute('w:hAnsi', $fontName);
359: $objWriter->writeAttribute('w:eastAsia', $fontName);
360: $objWriter->writeAttribute('w:cs', $fontName);
361: $objWriter->endElement();
362:
363: $objWriter->startElement('w:sz');
364: $objWriter->writeAttribute('w:val', $fontSize);
365: $objWriter->endElement();
366:
367: $objWriter->startElement('w:szCs');
368: $objWriter->writeAttribute('w:val', $fontSize);
369: $objWriter->endElement();
370:
371: $objWriter->endElement();
372: $objWriter->endElement();
373: $objWriter->endElement();
374: }
375: }
376: