@@ -226,4 +226,98 @@ private function buildPropertiesAndOptions(\PhpOffice\PhpWord\Element\Field $ele
226
226
227
227
return $ propertiesAndOptions ;
228
228
}
229
+
230
+ /**
231
+ * Writes a REF field
232
+ *
233
+ * @param \PhpOffice\PhpWord\Element\Field $element
234
+ */
235
+ protected function writeRef (\PhpOffice \PhpWord \Element \Field $ element )
236
+ {
237
+ $ xmlWriter = $ this ->getXmlWriter ();
238
+ $ this ->startElementP ();
239
+
240
+ $ xmlWriter ->startElement ('w:r ' );
241
+ $ xmlWriter ->startElement ('w:fldChar ' );
242
+ $ xmlWriter ->writeAttribute ('w:fldCharType ' , 'begin ' );
243
+ $ xmlWriter ->endElement (); // w:fldChar
244
+ $ xmlWriter ->endElement (); // w:r
245
+
246
+ $ instruction = ' ' . $ element ->getType () . ' ' ;
247
+
248
+ foreach ($ element ->getProperties () as $ property ) {
249
+ $ instruction .= $ property . ' ' ;
250
+ }
251
+ foreach ($ element ->getOptions () as $ optionKey => $ optionValue ) {
252
+ $ instruction .= $ this ->convertRefOption ($ optionKey , $ optionValue ) . ' ' ;
253
+ }
254
+
255
+ $ xmlWriter ->startElement ('w:r ' );
256
+ $ this ->writeFontStyle ();
257
+ $ xmlWriter ->startElement ('w:instrText ' );
258
+ $ xmlWriter ->writeAttribute ('xml:space ' , 'preserve ' );
259
+ $ xmlWriter ->text ($ instruction );
260
+ $ xmlWriter ->endElement (); // w:instrText
261
+ $ xmlWriter ->endElement (); // w:r
262
+
263
+ if ($ element ->getText () != null ) {
264
+ if ($ element ->getText () instanceof \PhpOffice \PhpWord \Element \TextRun) {
265
+ $ containerWriter = new Container ($ xmlWriter , $ element ->getText (), true );
266
+ $ containerWriter ->write ();
267
+
268
+ $ xmlWriter ->startElement ('w:r ' );
269
+ $ xmlWriter ->startElement ('w:instrText ' );
270
+ $ xmlWriter ->text ('" ' . $ this ->buildPropertiesAndOptions ($ element ));
271
+ $ xmlWriter ->endElement (); // w:instrText
272
+ $ xmlWriter ->endElement (); // w:r
273
+
274
+ $ xmlWriter ->startElement ('w:r ' );
275
+ $ xmlWriter ->startElement ('w:instrText ' );
276
+ $ xmlWriter ->writeAttribute ('xml:space ' , 'preserve ' );
277
+ $ xmlWriter ->text (' ' );
278
+ $ xmlWriter ->endElement (); // w:instrText
279
+ $ xmlWriter ->endElement (); // w:r
280
+ }
281
+ }
282
+
283
+ $ xmlWriter ->startElement ('w:r ' );
284
+ $ xmlWriter ->startElement ('w:fldChar ' );
285
+ $ xmlWriter ->writeAttribute ('w:fldCharType ' , 'separate ' );
286
+ $ xmlWriter ->endElement (); // w:fldChar
287
+ $ xmlWriter ->endElement (); // w:r
288
+
289
+ $ xmlWriter ->startElement ('w:r ' );
290
+ $ xmlWriter ->startElement ('w:rPr ' );
291
+ $ xmlWriter ->startElement ('w:noProof ' );
292
+ $ xmlWriter ->endElement (); // w:noProof
293
+ $ xmlWriter ->endElement (); // w:rPr
294
+ $ xmlWriter ->writeElement ('w:t ' , $ element ->getText () != null && is_string ($ element ->getText ()) ? $ element ->getText () : '1 ' );
295
+ $ xmlWriter ->endElement (); // w:r
296
+
297
+ $ xmlWriter ->startElement ('w:r ' );
298
+ $ xmlWriter ->startElement ('w:fldChar ' );
299
+ $ xmlWriter ->writeAttribute ('w:fldCharType ' , 'end ' );
300
+ $ xmlWriter ->endElement (); // w:fldChar
301
+ $ xmlWriter ->endElement (); // w:r
302
+
303
+ $ this ->endElementP (); // w:p
304
+ }
305
+
306
+ private function convertRefOption ($ optionKey , $ optionValue )
307
+ {
308
+ if ($ optionKey === 'NumberSeperatorSequence ' ) {
309
+ return '\\d ' . $ optionValue ;
310
+ }
311
+
312
+ switch ($ optionValue ) {
313
+ case 'IncrementAndInsertText ' : return '\\f ' ;
314
+ case 'CreateHyperLink ' : return '\\h ' ;
315
+ case 'NoTrailingPeriod ' : return '\\n ' ;
316
+ case 'IncludeAboveOrBelow ' : return '\\p ' ;
317
+ case 'InsertParagraphNumberRelativeContext ' : return '\\r ' ;
318
+ case 'SuppressNonDelimeterNonNumericalText ' : return '\\t ' ;
319
+ case 'InsertParagraphNumberFullContext ' : return '\\w ' ;
320
+ default : return '' ;
321
+ }
322
+ }
229
323
}
0 commit comments