- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
处理简单文本样式(例如 bbcode 允许在文本内使用粗体斜体等)的最佳方法是什么? 我所做的是将文本分成几个部分,每个部分都指定了样式,然后我从 Rect.Left + Canvas.TextWidth(Texts[i-1]) 开始对每个部分进行文本输出。然而,这可能相当慢,而且我不知道如何在 VirtualStringTree 的情况下将其文本输出。它有 OnBeforeItemPaint 但回调不知道列索引。然而,OnBeforeCellPaint 并没有公开变量来表示我自己绘制了 VST,因此它绘制在我的文本上...
请问有人吗? :)
问候,米哈尔
最佳答案
我已经使用 HTML 标记的简单子(monad)集完成了类似的操作。这是绘制文本的代码:
function TMyVST.DrawHTML(const ARect: TRect; const ACanvas: TCanvas; const Text: String): Integer;
(*DrawHTML - Draws text on a canvas using tags based on a simple subset of HTML/CSS
<B> - Bold e.g. <B>This is bold</B>
<I> - Italic e.g. <I>This is italic</I>
<U> - Underline e.g. <U>This is underlined</U>
<font-color=x> Font colour e.g.
<font-color=clRed>Delphi red</font-color>
<font-color=#FFFFFF>Web white</font-color>
<font-color=$000000>Hex black</font-color>
<font-size=x> Font size e.g. <font-size=30>This is some big text</font-size>
<font-family> Font family e.g. <font-family=Arial>This is arial</font-family>*)
function CloseTag(const ATag: String): String;
begin
Result := concat('/', ATag);
end;
function GetTagValue(const ATag: String): String;
var
p: Integer;
begin
p := pos('=', ATag);
if p = 0 then
Result := ''
else
Result := copy(ATag, p + 1, MaxInt);
end;
function ColorCodeToColor(const Value: String): TColor;
var
HexValue: String;
begin
Result := 0;
if Value <> '' then
begin
if (length(Value) >= 2) and (copy(Uppercase(Value), 1, 2) = 'CL') then
begin
// Delphi colour
Result := StringToColor(Value);
end else
if Value[1] = '#' then
begin
// Web colour
HexValue := copy(Value, 2, 6);
Result := RGB(StrToInt('$'+Copy(HexValue, 1, 2)),
StrToInt('$'+Copy(HexValue, 3, 2)),
StrToInt('$'+Copy(HexValue, 5, 2)));
end
else
// Hex or decimal colour
Result := StrToIntDef(Value, 0);
end;
end;
const
TagBold = 'B';
TagItalic = 'I';
TagUnderline = 'U';
TagBreak = 'BR';
TagFontSize = 'FONT-SIZE';
TagFontFamily = 'FONT-FAMILY';
TagFontColour = 'FONT-COLOR';
TagColour = 'COLOUR';
var
x, y, idx, CharWidth, MaxCharHeight: Integer;
CurrChar: Char;
Tag, TagValue: String;
PreviousFontColour: TColor;
PreviousFontFamily: String;
PreviousFontSize: Integer;
PreviousColour: TColor;
begin
ACanvas.Font.Size := Canvas.Font.Size;
ACanvas.Font.Name := Canvas.Font.Name;
ACanvas.Font.Color := Canvas.Font.Color;
ACanvas.Font.Style := Canvas.Font.Style;
PreviousFontColour := ACanvas.Font.Color;
PreviousFontFamily := ACanvas.Font.Name;
PreviousFontSize := ACanvas.Font.Size;
PreviousColour := ACanvas.Brush.Color;
x := ARect.Left;
y := ARect.Top + 1;
idx := 1;
MaxCharHeight := ACanvas.TextHeight('Ag');
While idx <= length(Text) do
begin
CurrChar := Text[idx];
// Is this a tag?
if CurrChar = '<' then
begin
Tag := '';
inc(idx);
// Find the end of then tag
while (Text[idx] <> '>') and (idx <= length(Text)) do
begin
Tag := concat(Tag, UpperCase(Text[idx]));
inc(idx);
end;
///////////////////////////////////////////////////
// Simple tags
///////////////////////////////////////////////////
if Tag = TagBold then
ACanvas.Font.Style := ACanvas.Font.Style + [fsBold] else
if Tag = TagItalic then
ACanvas.Font.Style := ACanvas.Font.Style + [fsItalic] else
if Tag = TagUnderline then
ACanvas.Font.Style := ACanvas.Font.Style + [fsUnderline] else
if Tag = TagBreak then
begin
x := ARect.Left;
inc(y, MaxCharHeight);
end else
///////////////////////////////////////////////////
// Closing tags
///////////////////////////////////////////////////
if Tag = CloseTag(TagBold) then
ACanvas.Font.Style := ACanvas.Font.Style - [fsBold] else
if Tag = CloseTag(TagItalic) then
ACanvas.Font.Style := ACanvas.Font.Style - [fsItalic] else
if Tag = CloseTag(TagUnderline) then
ACanvas.Font.Style := ACanvas.Font.Style - [fsUnderline] else
if Tag = CloseTag(TagFontSize) then
ACanvas.Font.Size := PreviousFontSize else
if Tag = CloseTag(TagFontFamily) then
ACanvas.Font.Name := PreviousFontFamily else
if Tag = CloseTag(TagFontColour) then
ACanvas.Font.Color := PreviousFontColour else
if Tag = CloseTag(TagColour) then
ACanvas.Brush.Color := PreviousColour else
///////////////////////////////////////////////////
// Tags with values
///////////////////////////////////////////////////
begin
// Get the tag value (everything after '=')
TagValue := GetTagValue(Tag);
if TagValue <> '' then
begin
// Remove the value from the tag
Tag := copy(Tag, 1, pos('=', Tag) - 1);
if Tag = TagFontSize then
begin
PreviousFontSize := ACanvas.Font.Size;
ACanvas.Font.Size := StrToIntDef(TagValue, ACanvas.Font.Size);
end else
if Tag = TagFontFamily then
begin
PreviousFontFamily := ACanvas.Font.Name;
ACanvas.Font.Name := TagValue;
end;
if Tag = TagFontColour then
begin
PreviousFontColour := ACanvas.Font.Color;
try
ACanvas.Font.Color := ColorCodeToColor(TagValue);
except
//Just in case the canvas colour is invalid
end;
end else
if Tag = TagColour then
begin
PreviousColour := ACanvas.Brush.Color;
try
ACanvas.Brush.Color := ColorCodeToColor(TagValue);
except
//Just in case the canvas colour is invalid
end;
end;
end;
end;
end
else
// Draw the character if it's not a ctrl char
if CurrChar >= #32 then
begin
CharWidth := ACanvas.TextWidth(CurrChar);
if x + CharWidth > ARect.Right then
begin
x := ARect.Left;
inc(y, MaxCharHeight);
end;
if y + MaxCharHeight < ARect.Bottom then
begin
ACanvas.Brush.Style := bsClear;
ACanvas.TextOut(x, y, CurrChar);
end;
x := x + CharWidth;
end;
inc(idx);
end;
Result := x;
end;
...以及 DoAfterCellPaint 调用
procedure TMyVST.DoAfterCellPaint(Canvas: TCanvas;
Node: PVirtualNode; Column: TColumnIndex; CellRect: TRect);
begin
inherited;
DrawHTML(CellRect, Canvas, 'HTML <B>tagged</B> string');
end;
关于Delphi、VirtualStringTree - 处理简单的文本样式(如 bbcode),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1587571/
基本上,我正在尝试将 xenforo 的论坛脚本数据库转换为我的自定义数据库(放弃我在 xenforo 上的使用),他们的 bbcode 让我很烦。 我正在尝试将他们的所有 url bbcode 更改
好吧,让我解释一下我的意思是哪种“剧透标签”: 在我所在的 phpBB 论坛中,有一个 [剧透] BBCode 隐藏了里面的文本,有一个显示/隐藏的按钮,应该看起来像发布页面中的 prosilver
所以我创建了这个函数来替换字符串中的特殊字符。主要目的是替换 BBCode 标签内的那些特殊字符([code=any]我想显示的代码[/code]),但当时它是否替换其余部分并不重要BBcode 标签
我有一些 javascript 会变成 [b]test[/b]进入 test 还有,这个 [i]test 2[/i]会变成 test 效果很好,但我也需要能够对其进行解码。对于多种类型的 bbcode
这是脚本的 jQuery 变体(它不起作用): $("div.post-content").each(function(){ if($(this).innerHTML.indexOf("[/
我有一个字符串想要转换为 div,但它无法正确关闭 div。 我使用的示例字符串是这样的: [quote]Quote by: user1 [quote]Quote by: user2 ads[/quo
我有这个函数来解析 bbcode -> html: $this->text = preg_replace(array( '/\[b\](.*?)\[\/b\]/ms', '/\[i
我正在尝试找到一种从字符串中删除 BBCode 的方法。我发现的模块(BBCode 和 Post Markup)似乎只将它们转换为 HTML,而不是仅仅删除 BBCode 并返回一个干净的字符串。如果
我在装有最新操作系统的 mac book air 上使用最新版本的 chrome 浏览器。我正在尝试在 javascript 中创建一个 BBcode 解析器。我可以很容易地解析一行代码,例如 [b]
我编写了一个 Javascript bbcode,类似于我用来编写此消息的代码。它还包含一个实时预览框,如下图所示。我目前面临的唯一问题是某些嵌套的 bbcode 未解析。 例如: [quote]
我需要一个正则表达式来去除字符串中的任何 BBCode。我有以下内容(和一个带有标签的数组): new RegExp('\\[' + tags[index] + '](.*?)\\[/' + tags
我有一个非常简单的 Javascript BBCode 解析器用于客户端实时预览(不想为此使用 Ajax)。问题是,这个解析器只识别第一个列表元素: function bbcode_parser(st
因此,我正在尝试向我的网站 (bbCodes) 添加笑脸符号,但我不知道该怎么做。我的数据库中有所有笑脸触发词和输出,以便更轻松地删除/添加笑脸。 下面的这段代码什么都不做...我没有收到错误,它也没
我已经阅读过有关此主题的其他帖子,但似乎没有一个有帮助。 好的,我正在编写自己的 BBCode 解析器。现在我的问题是如何不解析 [code] 标签之间的 BBCode?我真的不知道该怎么做。这是我当
所以看起来这个问题已经被问到太阳下的几乎所有语言......除了 C++。我有一个 XML 文档,在文本节点中存储了一些 bbcode。我正在寻找删除它的最佳方法,我想我会在这里查看是否有人知道一些预
我编写了一个 Javascript bbcode,类似于我用来编写此消息的代码。它还包含一个实时预览框,如下所示。我目前面临的唯一问题是某些嵌套的 bbcode 无法解析。 例如: [quote]
我正在使用 BBcode 编辑器通过表单发布内容。当我通过按 Enter 键然后发送表单并在屏幕上打印发送的文本来创建新行时,所有内容都在一行中,并且没有 BBcode 代表它。起初我以为我使用的编辑
我目前正在尝试测试匹配以下内容的正则表达式模式: [#123456] [#aabc36] 然后转换成HTML代码: 但是如果模式像这样: [/#123456] 然后被替换为 我尝试了以下模式: \
我有这个正则表达式: \[code(?:=(["']?)(.{0,50}?)\1)?\](?!\s*\[\/code\])(.*?)\[\/code\] 这个正则表达式应该支持: [code]cont
我正在研究 bbcodes 的自定义实现(基本上是 Wordpress 短代码)。为此,我需要匹配可以在两个类似 bbcode 的标签之间找到的内容。 例如: [example]The content
我是一名优秀的程序员,十分优秀!