2602c++,剪切板格式

超文本``剪切板格式

剪切板传输超文本文本的要求因方案而异.这里涉及剪切和粘贴超文本文档的片段.可能需要剪切板传输整个超文本文档;

但是,这里由传输所选超文本文本片段的要求驱动.因此,把整个超文本文档复制进剪切板的方法太麻烦了.

CF_HTML``剪切板格式允许在剪切板上按美标保存原始超文本文本及其环境(即外部超文本)的片段.

允许应用检查超文本片段的环境(由前面所有周围的标记组成),这样可用其属性来记录超文本片段周围标记.

尽管应用决定如何解释此类片段,但此处提供了一些基于IE4/MSHTML实现的基本指南.
剪切板的官方名(RegisterClipboardFormat使用的串)是"HTMLFormat".

描述

CF_HTML是总是使用UTF-8编码的文本剪切板格式.注意,此处的UTF-8的使用是窗口接口使用UTF-16来表示文本串一般规则(尤其是可本地化的)串的例外.

可用伪BackusNaur形式描述CF_HTML``剪切板普通布局或语法,如下:

注意

此语法不规范

cpp 复制代码
<cfhtml>                ::= <descriptionheader> <context>
<context>                ::= [<precedingcontext>] <fragment> [<trailingcontext>]
<descriptionheader>     ::= "Version:" <version> <br> ( <headeroffsetkeyword> ":" <headeroffsetvalue> <br> )*
<headeroffsetkeyword>  ::= "StartHTML" | "EndHTML" | "StartFragment" | "EndFragment" | "StartSelection" | "EndSelection"
<headeroffsetvalue>    ::= { Base 10 (decimal) integer string with optional _multiple_ leading zero digits (see "Offset syntax" below) }
<version>                ::= "0.9" | "1.0"
<fragment>               ::= <fragmentstartcomment> <fragmenttext> <fragmentendcomment>
<fragmentstartcomment> ::= "<!-StartFragment -->"
<fragmentendcomment>   ::= "<!-EndFragment -->"
<precedingcontext>      ::= { Arbitrary HTML }
<trailingcontext>       ::= { Arbitrary HTML }
<fragmenttext>          ::= { Arbitrary HTML }
<br>                     ::= "\r" | "\n" | "\r\n"

说明头和偏移

说明头包括剪切板版本号偏移,指示环境和片段开始和结束的位置.说明是美标文本关键字的列表后接串,并用冒号(:)分隔.

1,版本:剪切板vv``版本号.开始版本Version:0.9.从窗口1020H2开始,现在Version:1.0.

2,StartHTML:从剪切板开头到环境开头的偏移(按字节),如果没有环境,则为-1.

3,EndHTML:从剪切板开头到环境尾的偏移(按字节),如果没有环境,则为-1.

4,StartFragment:从剪切板开头到片段开头的偏移(按字节).

5,EndFragment:从剪切板开头到片段尾的偏移(按字节).

6,StartSelection:可选.从剪切板的开头到选区的开头的偏移(按字节).

7,EndSelection:可选.从剪切板的开头到选区尾的偏移(按字节).

StartSelectionEndSelection``关键字是可选的,如果不希望应用生成此信息,则必须省略这两个关键字.
CF_HTML``剪切板格式的未来修改可能会扩展,如,因为超文本StartHTML偏移处开始,因此以后可添加多个StartFragmentEndFragment对以支持不连续片段选择.

偏移语法

为了方便助手生成字节偏移,偏移值可选择多个零位'0'左填充.

原因是助手找到的偏移超文本可能会为每个关键字(如StartHTML:0000000000),将十个(10)零写入其输出缓冲.

稍后,当知道确切的StartHTML偏移(如,71),助手可在缓冲中使用"71"覆盖最右边的零(如,变成StartHTML:0000000071).

剪切板支持的唯一符集是Unicode(UTF-8).因为UTF-8美标第一个符匹配,说明总是为美标,但环境(从StartHTML开始)的字节可用UTF-8编码的任何其他符.

剪切板格式(上<br>)中的行尾可由CRLF(窗口),LF(Unix)或单个CR(原型)表示.

片段,选区及其环境

元素 说明头 需要对开始和结束符位置使用有效的超文本
环境 StartHTMLEndHTML
片段 StartFragmentEndFragment
选择 StartSelectionEndSelection

环境

环境是一个有效的,完整超文本文档,虽然这不表示包含用户选择的整个原始源超文本,会逐字执行文档;相反,可以是一个最小的,但格式正确超文本文档.

此环境包含片段和前面的所有周围标记(开始和结束标记;这些前面的周围标记表示片段所有父节点,直到超文本节点).

上例文章包含一个完整的HTML的,允许使用<base href=""><title>元素的<head>元素.如,可插入此元素以取此附加信息.

应用剪切板中复制超文本片段,可选择创建一个<base href="">元素,以把它包含在环境中(如果此类元素尚不存在).

这样,就可解析超文本片段中的非绝对URI.

环境是可选的,因为片段包含足够的信息,这样可粘贴超文本片段.如果未存储环境,则仅存储片段StartHTML=EndHTML=-1.

片段

片段(上<fragmenttext>)包含效的超文本片段.

有效的超文本片段由单个外部超文本元素组成.

此元素可能包含子超文本元素,只要它们正确嵌套.

如,片段可是包含3个<p>元素的单个<div>元素.

包含三个<p>元素的<span>元素组成的片段无效,因为<span>元素不能按子元素包含块级元素.

因此,片段有效地表示了屏幕上更大的区域,用户在其中选择文本(如复制).
选区包含所选文本及在所选文本中有结束标记任何元素开始标记和属性,及包含的任何开始标记片段尾结束标记.

这是基本粘贴超文本片段要求的所有信息.
片段前面,加超文本注释<!--StartFragment-->和<!--EndFragment-->,以指示片段开始和结束位置;这些超文本注释必须逐字,每个注释自身中没有空格符.

因此,由这些注释的存在StartFragmentEndFragment``头表示片段开始和结尾.工具应生成此信息.该冗余是故意的,引入后可找到片段的开头(从字节计数),并直接标记片段超文本树中的位置.

选择

选择是可选的,因为片段中包含足够的信息基本粘贴.如果未存储选区,则不会在中保存StartSelectionEndSelection.

如果存在,则选择是用户选择的确切文本范围(在片段中);这将通过指示确切的选中文本,而不是格式正确开始和结束标记和结束标记结束标记来向片段添加更多信息.

记住,选择可表示可在任何给定元素中开始,并在后续元素或上级元素中结束动态文本.因此,不能用超文本来表示选择文本.

场景

如下描述了IE4/MSHTML超文本编辑器如何处理超文本剪切和粘贴;

方案仅显示良好超文本,即没有覆盖的标记.

方案1,超文本的简单片段

假设以下超文本文本:

cpp 复制代码
<body>This is normal. <b>This is bold.</b> <i><b>This is bold italic.</b> This is italic.</i></body>

当用户在基于MSHTML应用(MSHTMLIE的引擎)上加载上述超文本文本时,MSHTML将如下处理复制超文本子串:

1,用户从上例中选择不带任何前导或尾空格的文本,如粗体,这是粗体.

2,要在剪切板复制文本,用户点击"复制"命令按钮.
MSHTML会如下将此超文本文本放入窗口剪切板中:

cpp 复制代码
Version:1.0
StartHTML:0121
EndHTML:0272
StartFragment:0006
EndFragment:0106
StartSelection:0180
EndSelection:0225
 <html><!-StartFragment--><body>This is normal. <b>This is bold.</b> <i><b>This is bold italic.</b> This is italic.
 </i></body><!-EndFragment--></html>

方案2,HTML中表的片段

假设以下超文本文本:

cpp 复制代码
 <BODY><TABLE BORDER><TR><TH ROWSPAN=2>Head1</TH><TD>Item 1</TD><TD>Item 2</TD><TD>Item 3</TD><TD>Item 4</TD></TR><TR><TD>Item 5</TD><TD>Item 6</TD><TD>Item 7</TD><TD>Item 8</TD></TR><TR><TH>Head2</TH><TD>Item 9</TD><TD>Item 10</TD><TD>Item 11</TD><TD>Item 12</TD></TR></TABLE></BODY>
 

如下:

cpp 复制代码
头1|项目1|项目2|项目3|项目4
头1|项目5|项目6|项目7|项目8
头2|项目9|项目`10`|项目`11`|项目`12`

MSHTML如何处理从表复制超文本子串

当用户用鼠标选择表格单元格时,项6,Item7,Item10Item11.然后,此选择将复制进剪切板.

以下是剪切板上的内容(注意这是IE4/MSHTML的解释).为此,添加了换行符.

cpp 复制代码
<!DOCTYPE
<HTML>
<BODY>
<TABLE BORDER>
<!-StartFragment-->
  **<TR>
    <TD>Item 6</TD>
    <TD>Item 7</TD>
  </TR>
  <TR>
    <TD>Item 10</TD>
    <TD>Item 11</TD>
  </TR>**
<!-EndFragment-->
</TABLE>
</BODY>
</HTML>

StartSelectionEndSelection分隔选区,以粗体显示.

方案3,将有序列表的片段粘贴到纯文本``<ol>

假设以下超文本文本:

cpp 复制代码
<BODY><OL TYPE="a"><LI>Item 1<LI>Item 2<LI>Item 3<LI>Item 4<LI>Item 5<LI>Item 6</OL></BODY>

如下:

1,项目1

2,项目2

3,项目3

4,项目4

5,项目5

6,项目6

MSHTML如何处理复制超文本``编号列表项的子串

用户从第3项开始,到第4项,到第5项的尾选择文本.用户调用复制命令.

以下超文本剪切板(为了清晰添加了换行符)<!--Start/EndFragment-->注释的精确位置,根据用户如何处理其浏览器选择文本逻辑:

cpp 复制代码
<html>
<body>
<ol>
<!-- StartFragment-->
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
<!-- EndFragment-->
</ol>
</body>
</html>

如果此片段现在粘贴到空文档中,将创建以下超文本:

cpp 复制代码
<body>
<ol>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
</ol>
</body>

如下:

1,项目3

2,项目4

3,项目5

方案5,粘贴部分选中的区域

假设以下超文本文本:

cpp 复制代码
<p>IE4/MSHTML是个支持`WYSIWYG`的编辑器:</p>
<ul><li>Cut<li>Copy<li>Paste</ul>
<p>This is a Great Tool!</p>

MSHTML如何处理复制超文本``列表项的子串

用户拖放鼠标选择文本,如与它是纯文本一样,"支持:剪切CopWYSIWYG``编辑器",该选择将类似此坏的的超文本片段:

cpp 复制代码
WYSIWYG Editor, which supports:</p>
<ul>
  <li>Cut</li>
  <li>Cop

当用户按下"复制"命令按钮时,其剪切板将如下(为此,添加了换行符;粗体文本表示用户实际选择的内容):

cpp 复制代码
<html>
<body>
<!-- StartFragment-->
<p>WYSIWYG Editor, which supports</p>
<ul>
|<li>Cut</li>
|<li>Cop</li>
</ul>
<!-- EndFragment-->
</body>
</html>

注意:

1,删除了"WYSIWYG"前的文本.

2,已删除列表项(<li>Paste</li>),因为用户选择中没有任何列表项.

3,已删除"复制"中的"y".

相关推荐
Howrun7772 小时前
可调用对象
开发语言·c++
晚风吹长发2 小时前
初步了解Linux中的线程概率及线程控制
linux·运维·服务器·开发语言·c++·centos·线程
爱学习的阿磊2 小时前
模板代码跨编译器兼容
开发语言·c++·算法
带鱼吃猫2 小时前
C++STL:从 0 到 1 手写 C++ string以及高频易错点复盘
开发语言·c++
u0109272712 小时前
代码覆盖率工具实战
开发语言·c++·算法
天赐学c语言2 小时前
2.1 - 反转字符串中的单词 && 每个进程的内存里包含什么
c++·算法·leecode
欧阳x天3 小时前
STL讲解(七)——list容器的模拟实现
c++·windows·list
枫叶丹43 小时前
【Qt开发】Qt系统(十一)-> Qt 音频
c语言·开发语言·c++·qt·音视频
散峰而望3 小时前
【基础算法】穷举的艺术:在可能性森林中寻找答案
开发语言·数据结构·c++·算法·随机森林·github·动态规划