mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-06 05:40:54 -06:00
CPackWiX: allow and convert UTF-8 sequences in RTF writer
This commit is contained in:
@@ -65,7 +65,41 @@ void cmWIXRichTextFormatWriter::AddText(const std::string& text)
|
||||
}
|
||||
else
|
||||
{
|
||||
File << "[NON-ASCII-" << int(c) << "]";
|
||||
if(c <= 0xC0)
|
||||
{
|
||||
EmitInvalidCodepoint(c);
|
||||
}
|
||||
else if(c < 0xE0 && i+1 < text.size())
|
||||
{
|
||||
EmitUnicodeCodepoint(
|
||||
(text[i+1] & 0x3F) |
|
||||
((c & 0x1F) << 6)
|
||||
);
|
||||
i+= 1;
|
||||
}
|
||||
else if(c < 0xF0 && i+2 < text.size())
|
||||
{
|
||||
EmitUnicodeCodepoint(
|
||||
(text[i+2] & 0x3F) |
|
||||
((text[i+1] & 0x3F) << 6) |
|
||||
((c & 0xF) << 12)
|
||||
);
|
||||
i += 2;
|
||||
}
|
||||
else if(c < 0xF8 && i+3 < text.size())
|
||||
{
|
||||
EmitUnicodeCodepoint(
|
||||
(text[i+3] & 0x3F) |
|
||||
((text[i+2] & 0x3F) << 6) |
|
||||
((text[i+1] & 0x3F) << 12) |
|
||||
((c & 0x7) << 18)
|
||||
);
|
||||
i += 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
EmitInvalidCodepoint(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -82,6 +116,7 @@ void cmWIXRichTextFormatWriter::WriteHeader()
|
||||
ControlWord("deflang1031");
|
||||
|
||||
WriteFontTable();
|
||||
WriteColorTable();
|
||||
WriteGenerator();
|
||||
}
|
||||
|
||||
@@ -99,6 +134,22 @@ void cmWIXRichTextFormatWriter::WriteFontTable()
|
||||
EndGroup();
|
||||
}
|
||||
|
||||
void cmWIXRichTextFormatWriter::WriteColorTable()
|
||||
{
|
||||
StartGroup();
|
||||
ControlWord("colortbl ;");
|
||||
ControlWord("red255");
|
||||
ControlWord("green0");
|
||||
ControlWord("blue0;");
|
||||
ControlWord("red0");
|
||||
ControlWord("green255");
|
||||
ControlWord("blue0;");
|
||||
ControlWord("red0");
|
||||
ControlWord("green0");
|
||||
ControlWord("blue255;");
|
||||
EndGroup();
|
||||
}
|
||||
|
||||
void cmWIXRichTextFormatWriter::WriteGenerator()
|
||||
{
|
||||
StartGroup();
|
||||
@@ -135,3 +186,43 @@ void cmWIXRichTextFormatWriter::EndGroup()
|
||||
{
|
||||
File.put('}');
|
||||
}
|
||||
|
||||
void cmWIXRichTextFormatWriter::EmitUnicodeCodepoint(int c)
|
||||
{
|
||||
// Do not emit byte order mark (BOM)
|
||||
if(c == 0xFEFF)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if(c <= 0xFFFF)
|
||||
{
|
||||
EmitUnicodeSurrogate(c);
|
||||
}
|
||||
else
|
||||
{
|
||||
c -= 0x10000;
|
||||
EmitUnicodeSurrogate(((c >> 10) & 0x3FF) + 0xD800);
|
||||
EmitUnicodeSurrogate((c & 0x3FF) + 0xDC00);
|
||||
}
|
||||
}
|
||||
|
||||
void cmWIXRichTextFormatWriter::EmitUnicodeSurrogate(int c)
|
||||
{
|
||||
ControlWord("u");
|
||||
if(c <= 32767)
|
||||
{
|
||||
File << c;
|
||||
}
|
||||
else
|
||||
{
|
||||
File << (c - 65536);
|
||||
}
|
||||
File << "?";
|
||||
}
|
||||
|
||||
void cmWIXRichTextFormatWriter::EmitInvalidCodepoint(int c)
|
||||
{
|
||||
ControlWord("cf1 ");
|
||||
File << "[INVALID-BYTE-" << int(c) << "]";
|
||||
ControlWord("cf0 ");
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ public:
|
||||
private:
|
||||
void WriteHeader();
|
||||
void WriteFontTable();
|
||||
void WriteColorTable();
|
||||
void WriteGenerator();
|
||||
|
||||
void WriteDocumentPrefix();
|
||||
@@ -40,6 +41,11 @@ private:
|
||||
void StartGroup();
|
||||
void EndGroup();
|
||||
|
||||
void EmitUnicodeCodepoint(int c);
|
||||
void EmitUnicodeSurrogate(int c);
|
||||
|
||||
void EmitInvalidCodepoint(int c);
|
||||
|
||||
std::ofstream File;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user