Blame src/rtfstyle.cpp

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * 
Packit 1c1d7e
 *
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#include "rtfstyle.h"
Packit 1c1d7e
Packit 1c1d7e
#include <qfile.h>
Packit 1c1d7e
#include <qtextstream.h>
Packit 1c1d7e
#include <stdlib.h>
Packit 1c1d7e
Packit 1c1d7e
#include "message.h"
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
RTFListItemInfo rtf_listItemInfo[rtf_maxIndentLevels];
Packit 1c1d7e
Packit 1c1d7e
QCString rtf_title;
Packit 1c1d7e
QCString rtf_subject;
Packit 1c1d7e
QCString rtf_comments;
Packit 1c1d7e
QCString rtf_company;
Packit 1c1d7e
QCString rtf_logoFilename;
Packit 1c1d7e
QCString rtf_author;
Packit 1c1d7e
QCString rtf_manager;
Packit 1c1d7e
QCString rtf_documentType;
Packit 1c1d7e
QCString rtf_documentId;
Packit 1c1d7e
QCString rtf_keywords;
Packit 1c1d7e
Packit 1c1d7e
char rtf_Style_Reset[] = "\\pard\\plain ";
Packit 1c1d7e
Packit 1c1d7e
Rtf_Style_Default rtf_Style_Default[] =
Packit 1c1d7e
{
Packit 1c1d7e
  { "Heading1",
Packit 1c1d7e
    "\\s1\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs36\\kerning36\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext0 heading 1"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "Heading2",
Packit 1c1d7e
    "\\s2\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs28\\kerning28\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext0 heading 2"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "Heading3",
Packit 1c1d7e
    "\\s3\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext0 heading 3"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "Heading4",
Packit 1c1d7e
    "\\s4\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext0 heading 4;}{\\*\\cs10 \\additive Default Paragraph Font"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "Heading5",
Packit 1c1d7e
    "\\s5\\sb90\\sa30\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext0 heading 5;}{\\*\\cs10 \\additive Default Paragraph Font"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "Title",
Packit 1c1d7e
    "\\s15\\qc\\sb240\\sa60\\widctlpar\\outlinelevel0\\adjustright \\b\\f1\\fs32\\kerning28\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext15 Title"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "SubTitle",
Packit 1c1d7e
    "\\s16\\qc\\sa60\\widctlpar\\outlinelevel1\\adjustright \\f1\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext16 Subtitle"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "BodyText",
Packit 1c1d7e
    "\\s17\\sa60\\sb30\\widctlpar\\qj \\fs22\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext17 BodyText"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "DenseText",
Packit 1c1d7e
    "\\s18\\widctlpar\\fs22\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext18 DenseText"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "Header",
Packit 1c1d7e
    "\\s28\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext28 header"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "Footer",
Packit 1c1d7e
    "\\s29\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\qr\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext29 footer"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "GroupHeader",
Packit 1c1d7e
    "\\s30\\li360\\sa60\\sb120\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext30 GroupHeader"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "CodeExample0",
Packit 1c1d7e
    "\\s40\\li0\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext41 Code Example 0"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "CodeExample1",
Packit 1c1d7e
    "\\s41\\li360\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext42 Code Example 1"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "CodeExample2",
Packit 1c1d7e
    "\\s42\\li720\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext43 Code Example 2"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "CodeExample3",
Packit 1c1d7e
    "\\s43\\li1080\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext44 Code Example 3"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "CodeExample4",
Packit 1c1d7e
    "\\s44\\li1440\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext45 Code Example 4"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "CodeExample5",
Packit 1c1d7e
    "\\s45\\li1800\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext46 Code Example 5"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "CodeExample6",
Packit 1c1d7e
    "\\s46\\li2160\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext47 Code Example 6"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "CodeExample7",
Packit 1c1d7e
    "\\s47\\li2520\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext48 Code Example 7"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "CodeExample8",
Packit 1c1d7e
    "\\s48\\li2880\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext49 Code Example 8"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "CodeExample9",
Packit 1c1d7e
    "\\s49\\li3240\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext49 Code Example 9"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListContinue0",
Packit 1c1d7e
    "\\s50\\li0\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext51 List Continue 0"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListContinue1",
Packit 1c1d7e
    "\\s51\\li360\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext52 List Continue 1"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListContinue2",
Packit 1c1d7e
    "\\s52\\li720\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext53 List Continue 2"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListContinue3",
Packit 1c1d7e
    "\\s53\\li1080\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext54 List Continue 3"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListContinue4",
Packit 1c1d7e
    "\\s54\\li1440\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext55 List Continue 4"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListContinue5",
Packit 1c1d7e
    "\\s55\\li1800\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext56 List Continue 5"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListContinue6",
Packit 1c1d7e
    "\\s56\\li2160\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext57 List Continue 6"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListContinue7",
Packit 1c1d7e
    "\\s57\\li2520\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext58 List Continue 7"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListContinue8",
Packit 1c1d7e
    "\\s58\\li2880\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext59 List Continue 8"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListContinue9",
Packit 1c1d7e
    "\\s59\\li3240\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext59 List Continue 9"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "DescContinue0",
Packit 1c1d7e
    "\\s60\\li0\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext61 DescContinue 0"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "DescContinue1",
Packit 1c1d7e
    "\\s61\\li360\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext62 DescContinue 1"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "DescContinue2",
Packit 1c1d7e
    "\\s62\\li720\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext63 DescContinue 2"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "DescContinue3",
Packit 1c1d7e
    "\\s63\\li1080\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext64 DescContinue 3"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "DescContinue4",
Packit 1c1d7e
    "\\s64\\li1440\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext65 DescContinue 4"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "DescContinue5",
Packit 1c1d7e
    "\\s65\\li1800\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext66 DescContinue 5"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "DescContinue6",
Packit 1c1d7e
    "\\s66\\li2160\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext67 DescContinue 6"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "DescContinue7",
Packit 1c1d7e
    "\\s67\\li2520\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext68 DescContinue 7"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "DescContinue8",
Packit 1c1d7e
    "\\s68\\li2880\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext69 DescContinue 8"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "DescContinue9",
Packit 1c1d7e
    "\\s69\\li3240\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext69 DescContinue 9"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "LatexTOC0",
Packit 1c1d7e
    "\\s70\\li0\\sa30\\sb30\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext81 LatexTOC 0"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "LatexTOC1",
Packit 1c1d7e
    "\\s71\\li360\\sa27\\sb27\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext82 LatexTOC 1"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "LatexTOC2",
Packit 1c1d7e
    "\\s72\\li720\\sa24\\sb24\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext83 LatexTOC 2"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "LatexTOC3",
Packit 1c1d7e
    "\\s73\\li1080\\sa21\\sb21\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext84 LatexTOC 3"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "LatexTOC4",
Packit 1c1d7e
    "\\s74\\li1440\\sa18\\sb18\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext85 LatexTOC 4"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "LatexTOC5",
Packit 1c1d7e
    "\\s75\\li1800\\sa15\\sb15\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext86 LatexTOC 5"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "LatexTOC6",
Packit 1c1d7e
    "\\s76\\li2160\\sa12\\sb12\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext87 LatexTOC 6"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "LatexTOC7",
Packit 1c1d7e
    "\\s77\\li2520\\sa9\\sb9\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext88 LatexTOC 7"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "LatexTOC8",
Packit 1c1d7e
    "\\s78\\li2880\\sa6\\sb6\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext89 LatexTOC 8"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "LatexTOC9",
Packit 1c1d7e
    "\\s79\\li3240\\sa3\\sb3\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext89 LatexTOC 9"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListBullet0",
Packit 1c1d7e
    "\\s80\\fi-360\\li360\\widctlpar\\jclisttab\\tx360{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\ls1\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext81 \\sautoupd List Bullet 0"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListBullet1",
Packit 1c1d7e
    "\\s81\\fi-360\\li720\\widctlpar\\jclisttab\\tx720{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\\ls2\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext82 \\sautoupd List Bullet 1"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListBullet2",
Packit 1c1d7e
    "\\s82\\fi-360\\li1080\\widctlpar\\jclisttab\\tx1080{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\ls3\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext83 \\sautoupd List Bullet 2"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListBullet3",
Packit 1c1d7e
    "\\s83\\fi-360\\li1440\\widctlpar\\jclisttab\\tx1440{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\ls4\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext84 \\sautoupd List Bullet 3"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListBullet4",
Packit 1c1d7e
    "\\s84\\fi-360\\li1800\\widctlpar\\jclisttab\\tx1800{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\\ls5\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext85 \\sautoupd List Bullet 4"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListBullet5",
Packit 1c1d7e
    "\\s85\\fi-360\\li2160\\widctlpar\\jclisttab\\tx2160{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\ls6\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext86 \\sautoupd List Bullet 5"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListBullet6",
Packit 1c1d7e
    "\\s86\\fi-360\\li2520\\widctlpar\\jclisttab\\tx2520{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\ls7\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext87 \\sautoupd List Bullet 6"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListBullet7",
Packit 1c1d7e
    "\\s87\\fi-360\\li2880\\widctlpar\\jclisttab\\tx2880{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\\pndec }\\ls8\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext88 \\sautoupd List Bullet 7"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListBullet8",
Packit 1c1d7e
    "\\s88\\fi-360\\li3240\\widctlpar\\jclisttab\\tx3240{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\ls9\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext89 \\sautoupd List Bullet 8"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListBullet9",
Packit 1c1d7e
    "\\s89\\fi-360\\li3600\\widctlpar\\jclisttab\\tx3600{\\*\\pn \\pnlvlbody\\ilvl0\\ls10\\pnrnot0\\pndec }\\ls10\\adjustright \\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext89 \\sautoupd List Bullet 9"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListEnum0",
Packit 1c1d7e
    "\\s90\\fi-360\\li360\\widctlpar\\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext91 \\sautoupd List Enum 0"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListEnum1",
Packit 1c1d7e
    "\\s91\\fi-360\\li720\\widctlpar\\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext92 \\sautoupd List Enum 1"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListEnum2",
Packit 1c1d7e
    "\\s92\\fi-360\\li1080\\widctlpar\\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext93 \\sautoupd List Enum 2"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListEnum3",
Packit 1c1d7e
    "\\s93\\fi-360\\li1440\\widctlpar\\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext94 \\sautoupd List Enum 3"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListEnum4",
Packit 1c1d7e
    "\\s94\\fi-360\\li1800\\widctlpar\\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext95 \\sautoupd List Enum 4"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListEnum5",
Packit 1c1d7e
    "\\s95\\fi-360\\li2160\\widctlpar\\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext96 \\sautoupd List Enum 5"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListEnum6",
Packit 1c1d7e
    "\\s96\\fi-360\\li2520\\widctlpar\\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext96 \\sautoupd List Enum 5"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListEnum7",
Packit 1c1d7e
    "\\s97\\fi-360\\li2880\\widctlpar\\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext98 \\sautoupd List Enum 7"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListEnum8",
Packit 1c1d7e
    "\\s98\\fi-360\\li3240\\widctlpar\\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext99 \\sautoupd List Enum 8"
Packit 1c1d7e
  },
Packit 1c1d7e
  { "ListEnum9",
Packit 1c1d7e
    "\\s99\\fi-360\\li3600\\widctlpar\\fs20\\cgrid ",
Packit 1c1d7e
    "\\sbasedon0 \\snext99 \\sautoupd List Enum 9"
Packit 1c1d7e
  },
Packit 1c1d7e
  { 0,
Packit 1c1d7e
    0,
Packit 1c1d7e
    0
Packit 1c1d7e
  }
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
const QRegExp StyleData::s_clause("\\\\s[0-9]+\\s*");
Packit 1c1d7e
Packit 1c1d7e
StyleData::StyleData(const char* reference, const char* definition)
Packit 1c1d7e
{
Packit 1c1d7e
  int start = s_clause.match(reference); ASSERT(start >= 0);
Packit 1c1d7e
  reference += start;
Packit 1c1d7e
  index = (int)atol(reference + 2); ASSERT(index > 0);
Packit 1c1d7e
Packit 1c1d7e
  ASSERT(reference != 0);
Packit 1c1d7e
  size_t size = 1 + strlen(reference);
Packit 1c1d7e
  memcpy(this->reference = new char[size], reference, size);
Packit 1c1d7e
Packit 1c1d7e
  ASSERT(definition != 0);
Packit 1c1d7e
  size = 1 + strlen(definition);
Packit 1c1d7e
  memcpy(this->definition = new char[size], definition, size);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
StyleData::~StyleData()
Packit 1c1d7e
{
Packit 1c1d7e
  delete[] reference;
Packit 1c1d7e
  delete[] definition;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool StyleData::setStyle(const char* s, const char* styleName)
Packit 1c1d7e
{
Packit 1c1d7e
  static const QRegExp subgroup("^{[^}]*}\\s*");
Packit 1c1d7e
  static const QRegExp any_clause("^\\\\[a-z][a-z0-9-]*\\s*");
Packit 1c1d7e
Packit 1c1d7e
  int len = 0;     // length of a particular RTF formatting control
Packit 1c1d7e
  int ref_len = 0; // length of the whole formatting section of a style
Packit 1c1d7e
  int start = s_clause.match(s, 0, &len;;
Packit 1c1d7e
  if (start < 0)
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Style sheet '%s' contains no '\\s' clause.\n{%s}\n", styleName, s);
Packit 1c1d7e
    return FALSE;
Packit 1c1d7e
  }
Packit 1c1d7e
  s += start;
Packit 1c1d7e
  index = (int)atol(s + 2); ASSERT(index > 0);
Packit 1c1d7e
Packit 1c1d7e
  // search for the end of pure formatting codes
Packit 1c1d7e
  const char* end = s + len;
Packit 1c1d7e
  ref_len = len;
Packit 1c1d7e
  bool haveNewDefinition = TRUE;
Packit 1c1d7e
  for(;;)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (*end == '{')
Packit 1c1d7e
    {
Packit 1c1d7e
      // subgroups are used for \\additive
Packit 1c1d7e
      if (0 != subgroup.match(end, 0, &len))
Packit 1c1d7e
        break;
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        end += len;
Packit 1c1d7e
        ref_len += len;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (*end == '\\')
Packit 1c1d7e
    {
Packit 1c1d7e
      if (0 == qstrncmp(end, "\\snext", 6))
Packit 1c1d7e
        break;
Packit 1c1d7e
      if (0 == qstrncmp(end, "\\sbasedon", 9))
Packit 1c1d7e
        break;
Packit 1c1d7e
      if (0 != any_clause.match(end, 0, &len))
Packit 1c1d7e
        break;
Packit 1c1d7e
      end += len;
Packit 1c1d7e
      ref_len += len;
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (*end == 0)
Packit 1c1d7e
    { // no style-definition part, keep default value
Packit 1c1d7e
      haveNewDefinition = FALSE;
Packit 1c1d7e
      break;
Packit 1c1d7e
    }
Packit 1c1d7e
    else // plain name without leading \\snext
Packit 1c1d7e
      break;
Packit 1c1d7e
  }
Packit 1c1d7e
  delete[] reference;
Packit 1c1d7e
  reference = new char[ref_len + 1];
Packit 1c1d7e
  memcpy(reference, s, ref_len); 
Packit 1c1d7e
  reference[ref_len] = 0;
Packit 1c1d7e
  if (haveNewDefinition)
Packit 1c1d7e
  {
Packit 1c1d7e
    delete[] definition;
Packit 1c1d7e
    size_t size = 1 + strlen(end);
Packit 1c1d7e
    definition = new char[size];
Packit 1c1d7e
    memcpy(definition, end, size);
Packit 1c1d7e
  }
Packit 1c1d7e
  return TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void loadStylesheet(const char *name, QDict<StyleData>& dict)
Packit 1c1d7e
{
Packit 1c1d7e
  QFile file(name);
Packit 1c1d7e
  if (!file.open(IO_ReadOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Can't open RTF style sheet file %s. Using defaults.\n",name);
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  msg("Loading RTF style sheet %s...\n",name);
Packit 1c1d7e
Packit 1c1d7e
  static const QRegExp separator("[ \t]*=[ \t]*");
Packit 1c1d7e
  uint lineNr=1;
Packit 1c1d7e
  QTextStream t(&file;;
Packit 1c1d7e
  t.setEncoding(QTextStream::UnicodeUTF8);
Packit 1c1d7e
Packit 1c1d7e
  while (!t.eof())
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString s(4096); // string buffer of max line length
Packit 1c1d7e
    s = t.readLine().stripWhiteSpace().utf8();
Packit 1c1d7e
    if (s.isEmpty() || s.at(0)=='#') continue; // skip blanks & comments
Packit 1c1d7e
    int sepLength;
Packit 1c1d7e
    int sepStart = separator.match(s,0,&sepLength);
Packit 1c1d7e
    if (sepStart<=0) // no valid assignment statement
Packit 1c1d7e
    {
Packit 1c1d7e
      warn(name,lineNr,"Assignment of style sheet name expected!\n");
Packit 1c1d7e
      continue;
Packit 1c1d7e
    }
Packit 1c1d7e
    QCString key=s.left(sepStart);
Packit 1c1d7e
    if (dict[key]==0) // not a valid style sheet name
Packit 1c1d7e
    {
Packit 1c1d7e
      warn(name,lineNr,"Invalid style sheet name %s ignored.\n",key.data());
Packit 1c1d7e
      continue;
Packit 1c1d7e
    }
Packit 1c1d7e
    StyleData* styleData = dict.find(key);
Packit 1c1d7e
    if (styleData == 0)
Packit 1c1d7e
    {
Packit 1c1d7e
      warn(name,lineNr,"Unknown style sheet name %s ignored.\n",key.data());
Packit 1c1d7e
      continue;
Packit 1c1d7e
    }
Packit 1c1d7e
    s+=" "; // add command separator
Packit 1c1d7e
    styleData->setStyle(s.data() + sepStart + sepLength, key.data());
Packit 1c1d7e
    lineNr++;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
QDict<StyleData> rtf_Style(257);
Packit 1c1d7e
Packit 1c1d7e
void loadExtensions(const char *name)
Packit 1c1d7e
{
Packit 1c1d7e
  QFile file(name);
Packit 1c1d7e
  if (!file.open(IO_ReadOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Can't open RTF extensions file %s. Using defaults.\n",name);
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  msg("Loading RTF extensions %s...\n",name);
Packit 1c1d7e
Packit 1c1d7e
  static const QRegExp separator("[ \t]*=[ \t]*");
Packit 1c1d7e
  uint lineNr=1;
Packit 1c1d7e
  QTextStream t(&file;;
Packit 1c1d7e
  t.setEncoding(QTextStream::UnicodeUTF8);
Packit 1c1d7e
Packit 1c1d7e
  while (!t.eof())
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString s(4096); // string buffer of max line length
Packit 1c1d7e
    s = t.readLine().stripWhiteSpace().utf8();
Packit 1c1d7e
    if (s.length()==0 || s.at(0)=='#') continue; // skip blanks & comments
Packit 1c1d7e
    int sepLength;
Packit 1c1d7e
    int sepStart = separator.match(s,0,&sepLength);
Packit 1c1d7e
    if (sepStart<=0) // no valid assignment statement
Packit 1c1d7e
    {
Packit 1c1d7e
      warn(name,lineNr,"Assignment of extension field expected!\n");
Packit 1c1d7e
      continue;
Packit 1c1d7e
    }
Packit 1c1d7e
    QCString key=s.left(sepStart);
Packit 1c1d7e
    QCString data=s.data() + sepStart + sepLength;
Packit 1c1d7e
Packit 1c1d7e
    if (key == "Title")           rtf_title            = data.data();
Packit 1c1d7e
    if (key == "Subject")         rtf_subject          = data.data();
Packit 1c1d7e
    if (key == "Comments")        rtf_comments         = data.data();
Packit 1c1d7e
    if (key == "Company")         rtf_company          = data.data();
Packit 1c1d7e
    if (key == "LogoFilename")    rtf_logoFilename     = data.data();
Packit 1c1d7e
    if (key == "Author")          rtf_author           = data.data();
Packit 1c1d7e
    if (key == "Manager")         rtf_manager          = data.data();
Packit 1c1d7e
    if (key == "DocumentType")    rtf_documentType     = data.data();
Packit 1c1d7e
    if (key == "DocumentId")      rtf_documentId       = data.data();
Packit 1c1d7e
    if (key == "Keywords")        rtf_keywords         = data.data();
Packit 1c1d7e
    lineNr++;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e