"Fossies" - the Fresh Open Source Software Archive 
Member "ansifilter-2.18/src/rtfgenerator.cpp" (30 Jan 2021, 18427 Bytes) of package /linux/privat/ansifilter-2.18.tar.bz2:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "rtfgenerator.cpp" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
2.17_vs_2.18.
1 /***************************************************************************
2 rtfcode.cpp - description
3 -------------------
4 copyright : (C) 2007-2017 by Andre Simon
5 email : a.simon@mailbox.org
6 ***************************************************************************/
7
8 /*
9 This file is part of ANSIFilter.
10
11 ANSIFilter is free software: you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
15
16 ANSIFilter is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with ANSIFilter. If not, see <http://www.gnu.org/licenses/>.
23 */
24
25 #include <sstream>
26
27 #include "charcodes.h"
28 #include "version.h"
29 #include "rtfgenerator.h"
30 #include "stylecolour.h"
31
32 namespace ansifilter
33 {
34
35
36 RtfGenerator::RtfGenerator()
37 : CodeGenerator(RTF),
38 pageSize("a4"), // Default: DIN A4
39 isUtf8(false),
40 utf16Char(0),
41 utf8SeqLen(0)
42 {
43 newLineTag = "\\line\n";
44 spacer=" ";
45
46 // Page dimensions
47 psMap["a3"] = PageSize(16837,23811);
48 psMap["a4"] = PageSize(11905,16837);
49 psMap["a5"] = PageSize(8390,11905);
50
51 psMap["b4"] = PageSize(14173,20012);
52 psMap["b5"] = PageSize(9977,14173);
53 psMap["b6"] = PageSize(7086,9977);
54
55 psMap["letter"] = PageSize(12240,15840);
56 psMap["legal"] = PageSize(12240,20163);
57 }
58
59 RtfGenerator::~RtfGenerator()
60 {}
61
62 string RtfGenerator::getAttributes( const StyleColour & col)
63 {
64 stringstream s;
65 s << "\\red"<< col.getRed(RTF)
66 << "\\green"<<col.getGreen(RTF)
67 << "\\blue"<<col.getBlue(RTF)
68 << ";";
69 return s.str();
70 }
71
72 string RtfGenerator::getOpenTag()
73 {
74 ostringstream s;
75 if (elementStyle.getFgColourID()>=0) {
76 s << "{\\cf"<<(elementStyle.getFgColourID()+ 1);
77 }
78 if (elementStyle.getBgColourID()>=0) {
79 s << "\\chcbpat"<<(elementStyle.getBgColourID()+1);
80 }
81 s <<"{";
82 if (!parseCP437 && elementStyle.isBold()) s << "\\b ";
83 if (elementStyle.isItalic()) s << "\\i ";
84 if (elementStyle.isUnderline()) s << "\\ul ";
85 return s.str();
86 }
87
88 string RtfGenerator::getCloseTag()
89 {
90 ostringstream s;
91 if (!parseCP437 && elementStyle.isBold()) s << "\\b0 ";
92 if (elementStyle.isItalic()) s << "\\i0 ";
93 if (elementStyle.isUnderline()) s << "\\ul0 ";
94 s << "}}";
95 return s.str();
96 }
97
98 /* '{{\\field{\\*\\fldinst HYPERLINK "'..token..'" }{\\fldrslt\\ul\\ulc0 '..token..'}}}' */
99
100 string RtfGenerator::getHyperlink(string uri, string txt){
101 ostringstream os;
102 os <<"{{\\field{\\*\\fldinst HYPERLINK \""<<uri<<"\" }{\\fldrslt\\ul\\ulc0 "<<txt<<"}}}";
103 return os.str();
104 }
105
106 string RtfGenerator::getHeader()
107 {
108 return string();
109 }
110
111 void RtfGenerator::printBody()
112 {
113 isUtf8 = encoding == "utf-8" || encoding == "UTF-8"; // FIXME
114
115 *out << "{\\rtf1";
116
117 if (parseCP437)
118 *out<< "\\cpg437";
119 else
120 *out<< "\\ansi";
121
122 *out <<" \\deff1"
123 << "{\\fonttbl{\\f1\\fmodern\\fprq1\\fcharset0 " ;
124 *out << font ;
125 *out << ";}}"
126 << "{\\colortbl;";
127
128 for (int i=0;i<16;i++){
129 *out << getAttributes(StyleColour(rgb2html(workingPalette[i])));
130 }
131
132 *out << "}\n";
133
134 *out << "\\paperw"<< psMap[pageSize].width <<"\\paperh"<< psMap[pageSize].height
135 << "\\margl1134\\margr1134\\margt1134\\margb1134\\sectd" // page margins
136 << "\\plain\\f1\\fs" ; // Font formatting
137
138 int fontSizeRTF=0;
139 StringTools::str2num<int>(fontSizeRTF, fontSize, std::dec);
140 *out << ((fontSizeRTF)? fontSizeRTF*2: 20); // RTF needs double amount
141 *out << "\n\\pard";
142
143 //TODO save 24bit colors in RTF
144 if (parseCP437/*||parseAsciiBin||parseAsciiTundra*/) *out << "\\cbpat1{";
145
146 processInput();
147
148 if (parseCP437/*||parseAsciiBin||parseAsciiTundra*/) *out << "}";
149
150 *out << "}"<<endl;
151 }
152
153 string RtfGenerator::getFooter()
154 {
155 return string();
156 }
157
158 string RtfGenerator::maskCharacter(unsigned char c)
159 {
160 if (isUtf8 && c > 0x7f && utf8SeqLen==0){
161
162 //http://stackoverflow.com/questions/7153935/how-to-convert-utf-8-stdstring-to-utf-16-stdwstring
163
164 if (c <= 0xDF)
165 {
166 utf16Char = c&0x1F;
167 utf8SeqLen = 1;
168 }
169 else if (c <= 0xEF)
170 {
171 utf16Char = c&0x0F;
172 utf8SeqLen = 2;
173 }
174 else if (c <= 0xF7)
175 {
176 utf16Char = c&0x07;
177 utf8SeqLen = 3;
178 } else {
179 utf8SeqLen = 0;
180 }
181 return "";
182 }
183
184 if (utf8SeqLen) {
185 utf16Char <<= 6;
186 utf16Char += c & 0x3f;
187 --utf8SeqLen;
188
189 if (!utf8SeqLen){
190 string m ( "\\u" );
191 m += to_string(utf16Char);
192 m += '?';
193 utf16Char=0L;
194 return m;
195 } else {
196 return "";
197 }
198 }
199
200 switch (c) {
201 case '}' :
202 case '{' :
203 case '\\' : {
204 string m;
205 m="\\";
206 return m+=c;
207 }
208 break;
209 case '\t' : // see deletion of nonprintable chars below
210 return "\t";
211 break;
212
213 case '0':
214 case '1':
215 case '2':
216 case '3':
217 case '4':
218 case '5':
219 case '6':
220 case '7':
221 case '8':
222 case '9': {
223 string m;
224 m="{";
225 m+=c;
226 m+="}";
227 return m;
228 }
229 break;
230
231 case AUML_LC:
232 return "\\'e4";
233 break;
234 case OUML_LC:
235 return "\\'f6";
236 break;
237 case UUML_LC:
238 return "\\'fc";
239 break;
240 case AUML_UC:
241 return "\\'c4";
242 break;
243 case OUML_UC:
244 return "\\'d6";
245 break;
246 case UUML_UC:
247 return "\\'dc";
248 break;
249
250 case AACUTE_LC:
251 return "\\'e1";
252 break;
253 case EACUTE_LC:
254 return "\\'e9";
255 break;
256 case OACUTE_LC:
257 return "\\'f3";
258 break;
259 case UACUTE_LC:
260 return "\\'fa";
261 break;
262
263 case AGRAVE_LC:
264 return "\\'e0";
265 break;
266 case EGRAVE_LC:
267 return "\\'e8";
268 break;
269 case OGRAVE_LC:
270 return "\\'f2";
271 break;
272 case UGRAVE_LC:
273 return "\\'f9";
274 break;
275
276 case AACUTE_UC:
277 return "\\'c1";
278 break;
279 case EACUTE_UC:
280 return "\\'c9";
281 break;
282 case OACUTE_UC:
283 return "\\'d3";
284 break;
285 case UACUTE_UC:
286 return "\\'da";
287 break;
288 case AGRAVE_UC:
289 return "\\'c0";
290 break;
291 case EGRAVE_UC:
292 return "\\'c8";
293 break;
294 case OGRAVE_UC:
295 return "\\'d2";
296 break;
297 case UGRAVE_UC:
298 return "\\'d9";
299 break;
300
301 case SZLIG:
302 return "\\'df";
303 break;
304
305 default : {
306 if (c>0x1f ) {
307 return string( 1, c );
308 } else {
309 return "";
310 }
311 }
312 }
313 }
314
315 string RtfGenerator::unicodeFromHTML(const string &htmlEntity){
316 if (htmlEntity.length()!=8) return "";
317
318 string decCode = "\\u", hexCode = htmlEntity.substr(3,4);
319
320 int x=0;
321 std::istringstream iss(hexCode);
322
323 iss >> std::hex >> x;
324 decCode += to_string(x);
325 decCode +="?";
326
327 return decCode;
328 }
329
330 string RtfGenerator::maskCP437Character(unsigned char c)
331 {
332 switch (c) {
333 case 0:
334 // case ' ' :
335 return " "; break;
336
337 case '}' :
338 case '{' :
339 case '\\' : {
340 string m;
341 m="\\";
342 return m+=c;
343 }
344 break;
345 case '\t' : // see deletion of nonprintable chars below
346 return "\t";
347 break;
348
349
350 case '0':
351 case '1':
352 case '2':
353 case '3':
354 case '4':
355 case '5':
356 case '6':
357 case '7':
358 case '8':
359 case '9': {
360 string m;
361 m="{";
362 m+=c;
363 m+="}";
364 return m;
365 }
366 break;
367
368 case 0x01:
369 return unicodeFromHTML("☺");
370 break;
371 case 0x02:
372 return unicodeFromHTML("☻");
373 break;
374 case 0x03:
375 return unicodeFromHTML("♥");
376 break;
377 case 0x04:
378 return unicodeFromHTML("♦");
379 break;
380 case 0x05:
381 return unicodeFromHTML("♣");
382 break;
383 case 0x06:
384 return unicodeFromHTML("♠");
385 break;
386 case 0x08:
387 return unicodeFromHTML("◘");
388 break;
389 case 0x0a:
390 return unicodeFromHTML("◙");
391 break;
392 case 0x0b:
393 return unicodeFromHTML("♂");
394 break;
395 case 0x0c:
396 return unicodeFromHTML("♀");
397 break;
398
399 case 0x10:
400 return unicodeFromHTML("►");
401 break;
402 case 0x11:
403 return unicodeFromHTML("◄");
404 break;
405 case 0x12:
406 return unicodeFromHTML("↕");
407 break;
408 case 0x13:
409 return unicodeFromHTML("‼");
410 break;
411 case 0x14:
412 return unicodeFromHTML("¶");
413 break;
414 case 0x15:
415 return unicodeFromHTML("§");
416 break;
417 case 0x16:
418 return unicodeFromHTML("▬");
419 break;
420 case 0x17:
421 return unicodeFromHTML("↨");
422 break;
423 case 0x18:
424 return unicodeFromHTML("↑");
425 break;
426 case 0x19:
427 return unicodeFromHTML("↓");
428 break;
429 case 0x1a:
430 return unicodeFromHTML("→");
431 break;
432 case 0x1b:
433 return unicodeFromHTML("←");
434 break;
435 case 0x1c:
436 return unicodeFromHTML("∟");
437 break;
438 case 0x1d:
439 return unicodeFromHTML("↔");
440 break;
441 case 0x1e:
442 return unicodeFromHTML("▲");
443 break;
444 case 0x1f:
445 return unicodeFromHTML("▼");
446 break;
447
448 case 0x80:
449 return unicodeFromHTML("Ç");
450 break;
451 case 0x81:
452 return unicodeFromHTML("ü");
453 break;
454 case 0x82:
455 return unicodeFromHTML("é");
456 break;
457 case 0x83:
458 return unicodeFromHTML("â");
459 break;
460 case 0x84:
461 return unicodeFromHTML("ä");
462 break;
463 case 0x85:
464 return unicodeFromHTML("à");
465 break;
466 case 0x86:
467 return unicodeFromHTML("å");
468 break;
469 case 0x87:
470 return unicodeFromHTML("ç");
471 break;
472 case 0x88:
473 return unicodeFromHTML("ê");
474 break;
475 case 0x89:
476 return unicodeFromHTML("ë");
477 break;
478 case 0x8a:
479 return unicodeFromHTML("è");
480 break;
481 case 0x8b:
482 return unicodeFromHTML("ï");
483 break;
484 case 0x8c:
485 return unicodeFromHTML("î");
486 break;
487 case 0x8d:
488 return unicodeFromHTML("ì");
489 break;
490 case 0x8e:
491 return unicodeFromHTML("Ä");
492 break;
493 case 0x8f:
494 return unicodeFromHTML("Å");
495 break;
496
497 case 0x90:
498 return unicodeFromHTML("É");
499 break;
500 case 0x91:
501 return unicodeFromHTML("æ");
502 break;
503 case 0x92:
504 return unicodeFromHTML("Æ");
505 break;
506 case 0x93:
507 return unicodeFromHTML("ô");
508 break;
509 case 0x94:
510 return unicodeFromHTML("ö");
511 break;
512 case 0x95:
513 return unicodeFromHTML("ò");
514 break;
515 case 0x96:
516 return unicodeFromHTML("û");
517 break;
518 case 0x97:
519 return unicodeFromHTML("ù");
520 break;
521 case 0x98:
522 return unicodeFromHTML("ÿ");
523 break;
524 case 0x99:
525 return unicodeFromHTML("Ö");
526 break;
527 case 0x9a:
528 return unicodeFromHTML("Ü");
529 break;
530 case 0x9b:
531 return unicodeFromHTML("¢");
532 break;
533 case 0x9c:
534 return unicodeFromHTML("£");
535 break;
536 case 0x9d:
537 return unicodeFromHTML("¥");
538 break;
539 case 0x9e:
540 return unicodeFromHTML("₧");
541 break;
542 case 0x9f:
543 return unicodeFromHTML("ƒ");
544 break;
545
546 case 0xa0:
547 return unicodeFromHTML("á");
548 break;
549 case 0xa1:
550 return unicodeFromHTML("í");
551 break;
552 case 0xa2:
553 return unicodeFromHTML("ó");
554 break;
555 case 0xa3:
556 return unicodeFromHTML("ú");
557 break;
558 case 0xa4:
559 return unicodeFromHTML("ñ");
560 break;
561 case 0xa5:
562 return unicodeFromHTML("Ñ");
563 break;
564 case 0xa6:
565 return unicodeFromHTML("ª");
566 break;
567 case 0xa7:
568 return unicodeFromHTML("º");
569 break;
570 case 0xa8:
571 return unicodeFromHTML("¿");
572 break;
573 case 0xa9:
574 return unicodeFromHTML("⌐");
575 break;
576 case 0xaa:
577 return unicodeFromHTML("¬");
578 break;
579 case 0xab:
580 return unicodeFromHTML("½");
581 break;
582 case 0xac:
583 return unicodeFromHTML("¼");
584 break;
585 case 0xad:
586 return unicodeFromHTML("¡");
587 break;
588 case 0xae:
589 return unicodeFromHTML("«");
590 break;
591 case 0xaf:
592 return unicodeFromHTML("»");
593 break;
594
595 //shades
596 case 0xb0:
597 return "\\u9617?";
598 break;
599 case 0xb1:
600 return "\\u9618?";
601 break;
602 case 0xb2:
603 return "\\u9619?";
604 break;
605
606 //box drawings
607 case 0xb3:
608 return "\\u9474?";
609 break;
610 case 0xb4:
611 return "\\u9508?";
612 break;
613 case 0xb5:
614 return "\\u9569?";
615 break;
616 case 0xb6:
617 return "\\u9570?";
618 break;
619 case 0xb7:
620 return "\\u9558?";
621 break;
622 case 0xb8:
623 return "\\u9557?";
624 break;
625 case 0xb9:
626 return "\\u9571?";
627 break;
628 case 0xba:
629 return "\\u9553?";
630 break;
631 case 0xbb:
632 return "\\u9559?";
633 break;
634 case 0xbc:
635 return "\\u9565?";
636 break;
637 case 0xbd:
638 return "\\u9564?";
639 break;
640 case 0xbe:
641 return "\\u9563?";
642 break;
643 case 0xbf:
644 return "\\u9488?";
645 break;
646
647 case 0xc0:
648 return "\\u9492?";
649 break;
650 case 0xc1:
651 return "\\u9524?";
652 break;
653 case 0xc2:
654 return "\\u9516?";
655 break;
656 case 0xc3:
657 return "\\u9500?";
658 break;
659 case 0xc4:
660 return "\\u9472?";
661 break;
662 case 0xc5:
663 return "\\u9532?";
664 break;
665 case 0xc6:
666 return "\\u9566?";
667 break;
668 case 0xc7:
669 return "\\u9567?";
670 break;
671 case 0xc8:
672 return "\\u9562?";
673 break;
674 case 0xc9:
675 return "\\u9556?";
676 break;
677 case 0xca:
678 return "\\u9577?";
679 break;
680 case 0xcb:
681 return "\\u9574?";
682 break;
683 case 0xcc:
684 return "\\u9568?";
685 break;
686 case 0xcd:
687 return "\\u9552?";
688 break;
689 case 0xce:
690 return "\\u9580?";
691 break;
692 case 0xcf:
693 return "\\u9575?";
694 break;
695
696 case 0xd0:
697 return "\\u9576?";
698 break;
699 case 0xd1:
700 return "\\u9572?";
701 break;
702 case 0xd2:
703 return "\\u9573?";
704 break;
705 case 0xd3:
706 return "\\u9561?";
707 break;
708 case 0xd4:
709 return "\\u9560?";
710 break;
711 case 0xd5:
712 return "\\u9554?";
713 break;
714 case 0xd6:
715 return "\\u9555?";
716 break;
717 case 0xd7:
718 return "\\u9579?";
719 break;
720 case 0xd8:
721 return "\\u9578?";
722 break;
723 case 0xd9:
724 return "\\u9496?";
725 break;
726 case 0xda:
727 return "\\u9484?";
728 break;
729
730 //https://de.wikipedia.org/wiki/Unicodeblock_Blockelemente
731 case 0xdb:
732 return "\\u9608?";
733 break;
734 case 0xdc:
735 return "\\u9604?";
736 break;
737 case 0xdd:
738 return "\\u9612?";
739 break;
740 case 0xde:
741 return "\\u9616?";
742 break;
743 case 0xdf:
744 return "\\u9600?";
745 break;
746
747 case 0xe0:
748 return unicodeFromHTML("α");
749 break;
750 case 0xe1:
751 return unicodeFromHTML("ß");
752 break;
753 case 0xe2:
754 return unicodeFromHTML("Γ");
755 break;
756 case 0xe3:
757 return unicodeFromHTML("π");
758 break;
759 case 0xe4:
760 return unicodeFromHTML("Σ");
761 break;
762 case 0xe5:
763 return unicodeFromHTML("σ");
764 break;
765 case 0xe6:
766 return unicodeFromHTML("µ");
767 break;
768 case 0xe7:
769 return unicodeFromHTML("τ");
770 break;
771 case 0xe8:
772 return unicodeFromHTML("Φ");
773 break;
774 case 0xe9:
775 return unicodeFromHTML("Θ");
776 break;
777 case 0xea:
778 return unicodeFromHTML("Ω");
779 break;
780 case 0xeb:
781 return unicodeFromHTML("δ");
782 break;
783
784 case 0xec:
785 return unicodeFromHTML("∞");
786 break;
787 case 0xed:
788 return unicodeFromHTML("φ");
789 break;
790 case 0xee:
791 return unicodeFromHTML("ε");
792 break;
793 case 0xef:
794 return unicodeFromHTML("∩");
795 break;
796
797 case 0xf0:
798 return unicodeFromHTML("≡");
799 break;
800
801 case 0xf1:
802 return unicodeFromHTML("±");
803 break;
804 case 0xf2:
805 return unicodeFromHTML("≥");
806 break;
807 case 0xf3:
808 return unicodeFromHTML("≤");
809 break;
810 case 0xf4:
811 return unicodeFromHTML("⌠");
812 break;
813 case 0xf5:
814 return unicodeFromHTML("⌡");
815 break;
816 case 0xf6:
817 return unicodeFromHTML("÷");
818 break;
819 case 0xf7:
820 return unicodeFromHTML("≈");
821 break;
822 case 0xf8:
823 return unicodeFromHTML("°");
824 break;
825
826 case 0xf9:
827 return unicodeFromHTML("∙");
828 break;
829 case 0xfa:
830 return unicodeFromHTML("·");
831 break;
832 case 0xfb:
833 return unicodeFromHTML("√");
834 break;
835 case 0xfc:
836 return unicodeFromHTML("ⁿ");
837 break;
838 case 0xfd:
839 return unicodeFromHTML("₲");
840 break;
841 case 0xfe:
842 return unicodeFromHTML("■");
843 break;
844
845 case 0xff:
846 return " ";
847 break;
848
849 default : {
850 if (c ) {
851 return string( 1, c );
852 } else {
853 return "";
854 }
855 }
856 }
857 }
858
859 void RtfGenerator::setPageSize(const string & ps)
860 {
861 if (psMap.count(ps)) pageSize = ps;
862 }
863
864 void RtfGenerator::insertLineNumber ()
865 {
866 if ( showLineNumbers && !parseCP437 ) {
867
868 ostringstream lnum;
869 lnum << setw ( 5 ) << right;
870 if( numberCurrentLine ) {
871 lnum << lineNumber;
872 *out <<lnum.str()<<spacer;
873 } else {
874 *out << lnum.str(); //for indentation
875 }
876 }
877 }
878
879 }