CN115688690B - 将Word文档内容转换成符合S1000D标准XML片段的动态转换方法 - Google Patents

将Word文档内容转换成符合S1000D标准XML片段的动态转换方法 Download PDF

Info

Publication number
CN115688690B
CN115688690B CN202211438445.9A CN202211438445A CN115688690B CN 115688690 B CN115688690 B CN 115688690B CN 202211438445 A CN202211438445 A CN 202211438445A CN 115688690 B CN115688690 B CN 115688690B
Authority
CN
China
Prior art keywords
content
xml
document
data module
word
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202211438445.9A
Other languages
English (en)
Other versions
CN115688690A (zh
Inventor
肖卫东
丁凡
陈飞
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Jinhang Digital Technology Co ltd
Original Assignee
Jinhang Digital Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Jinhang Digital Technology Co ltd filed Critical Jinhang Digital Technology Co ltd
Priority to CN202211438445.9A priority Critical patent/CN115688690B/zh
Publication of CN115688690A publication Critical patent/CN115688690A/zh
Application granted granted Critical
Publication of CN115688690B publication Critical patent/CN115688690B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Document Processing Apparatus (AREA)

Abstract

本发明公开了将Word文档内容转换成符合S1000D标准XML片段的动态转换方法,包括以下步骤:打开Word文档和需要编辑的数据模块,在Word显示页面选中需要转换的内容,并在数据模块中设定一个插入Word内容片段的锚点;获取数据模块中锚点的行号和元素名称,加载元素名对应的、符合S1000D标准模式要求的XML格式代码生成规则;将Word文档中选定的内容生成新的文档;解析新文档中所有节点,判断所有节点的类型,按照标题、段落、表格、有序列表、无序列表、图形、图解列表等进行分类处理,依据XML格式代码生成规则转换为符合S1000D标准的XML格式片段;将生成的XML片段插入数据模块中锚点位置。通过本发明所述方法可以非常准确、迅速地将Word文档中的部分片段或全部内容自动转换成符合S1000D标准XML片段,显著提高了交互式电子技术手册数据内容编制的质量和效率。

Description

将Word文档内容转换成符合S1000D标准XML片段的动态转换 方法
技术领域
本发明涉及一种将Word文档内容转换成符合S1000D标准XML片段的动态转换方法,属于数据智能处理技术领域。
背景技术
复杂装备在交付用户时需随装交付一套用户手册,用户手册一般用交互式电子技术手册(IETM)软件制作生成,数据模块构成了IETM的主要内容。所述的数据模块翻译自S1000D国际标准(www.s1000d.org),英文原文是data model,简称为DM,意指一段包含技术内容的XML格式文档。S1000D标准定义了描述类、程序类、故障类、图解零件类、维护计划类、接线类等类型DM的Schema(模式)。
目前常用的DM编制方法是将已有的维修手册、使用操作手册等Word文档拆分为片段,然后将这些文档片段转换为符合标准要求的DM,一般采用两种转换方式:第一种是将Word中文字内容拷贝到DM编辑器的正确位置;第二种需先处理Word文档(例如将word文档内容增加标签或者转换为Html格式),再利用转换软件将标签或元素按内置的规则进行批量转换。第一种方式需要进行大量重复的选择、拷贝、粘贴、事后复核等操作,第二种方式需要对Word文档内容进行大量预处理工作,难以提升数据编制工作效率和质量,现急需一种能够将Word文档内容动态转换为符合标准要求的XML格式片段方法。
发明内容
现有面向S1000D标准格式的DM自动转换或快速编辑方法仅适用于描述类DM单一数据类型,本发明提出的技术方法适用于将Word文档内容转换为S1000D标准规定的描述类、图解类、程序类等多种DM类型,在提高XML格式数据编制效率同时降低了数据编制技术难度。
本发明的技术方案为:一种将Word文档内容转换成符合S1000D标准XML片段的动态转换方法,其特征在于:包括以下步骤:
步骤1、打开Word文档和需要编辑的DM文档,在Word显示页面选中需要转换的内容,并在DM文档中设定一个插入Word内容片段的锚点;
步骤2、获取DM中锚点的行号和当前行中包含的元素名称,加载与元素名称对应的、符合S1000D标准模式要求的XML格式代码生成规则;
步骤3、将Word文档中选定的内容生成新的文档;
步骤4、解析新文档中所有节点,判断新文档中节点的类型,按照标题、段落、表格、有序列表、无序列表、图形、图解列表进行分类处理,生成符合S1000D标准XML格式片段;
步骤5、将生成的XML片段插入DM中锚点位置。
附图说明
图1:业务流程图;
图2:技术实现路径示意图;
图3:Word内容转换为DM片段规则示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅为本发明的一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域的普通技术人员在不付出创造性劳动的前提下所获得的所有其他实施例,都属于本发明的保护范围。
根据本发明的实施例,提出一种将Word文档内容转换成符合S1000D标准XML片段的动态转换方法,包括如下步骤:
步骤1、打开Word文档和需要编辑的DM,在Word显示页面选中需要转换的内容,同时在DM中设定一个插入Word内容片段的锚点;
步骤2、获取DM中锚点的行号和当前行中包含的元素名称,加载与元素名称对应的、符合S1000D标准模式要求的XML格式代码生成规则;
步骤3、将Word文档中选定的内容生成新的Word文档;
步骤4、解析新文档包含的所有节点,判断新文档中节点的类型,按照标题、段落、表格、有序列表、无序列表、图形、图解列表等进行分类处理,生成符合S1000D标准XML格式片段;
步骤5、将生成的XML片段插入DM中锚点位置。
进一步的,所述步骤1具体执行过程为:
步骤1.1、同时打开Word文档和XML格式DM。Word内容利用第三方插件(例如NTKO)显示。DM需要用javascript类库CodeMirror显示并编辑,支持折叠、展开、撤销、重做、查找等操作。在DM编辑页面中加载Schema以支持DM的编辑和校核,即:“editor.setOption("hintOptions",{schemaInfo:schema__});”,其中schema__是用开源java类库xmlschema-core解析相应的S1000D标准Schema文件(例如描述类DM为descript.xsd,程序类DM为proced.xsd,图解零部件类DM为ipd.xsd)得到符合CodeMirror要求的json文件;
步骤1.2、在Word文档显示页面中用鼠标或键盘选择需要转换的内容片段,包括含标题的层级段落、普通段落、表格、有序或无序列表(支持嵌套)、图形、上下标等;
步骤1.3、在DM编辑页面中设定一个插入Word内容片段的锚点。
进一步的,所述步骤2具体执行过程为:
步骤2.1、获取DM中锚点行号,添加锚点位置标识anchorJson,以{text:text值,line:line值,ch:ch值}的JSON形式来表示,包括以下四种情况(在DM的content元素前不能设定为锚点):
(1)锚点行文本不以“>”结尾的(即以文字结尾的,例如带randomList的para),如果以“</”结尾,则anchorJson={text:锚点行文本,line:锚点行行号,ch:锚点行文本中“</”位置},否则anchorJson={text:锚点行匹配结束行文本,line:锚点行匹配结束行行号,ch:锚点行匹配结束行的长度};
(2)锚点行以“</”开头的anchorJson={text:锚点行文本,line:锚点行行号,ch:0};
(3)锚点行是形如”<元素></元素>”的则anchorJson={text:锚点行文本,line:锚点行行号,ch:0};
(4)如以上都不是则anchorJson={text:锚点行文本,line:锚点行行号,ch:锚点行文本长度};
步骤2.2、解析锚点行数据元素名称,加载数据元素名称对应的XML格式代码生成规则,例如S1000D国际标准中定义的常用数据元素:warning、caution、note、para、table、sequentialList、randomList、levelledPara、mainProcedure、proceduralStep、reqCondGroup、illustratedPartsCatalog等,其中__text__为文本占位符,如附图3所示。
进一步的,所述步骤3具体执行过程为:
步骤3.1、将Word文档中选定的内容提取出来,拷贝到Windows剪贴板中,在内存中将拷贝的内容转换为RTF格式的二进制代码;
步骤3.2、在内存中将二进制代码生成新文档(此文档具有访问速度快、复制的内容完整、不受原Word文档的影响等特点,其后的操作都是基于此文档);
步骤3.3、解析新文档中所有内容节点并编号,形成documentNodes集合。
进一步的,所述步骤4具体执行过程为:
步骤4.1、定义一个字符串集合initTexts,用于存储新文档中documentNodes解析结果;
步骤4.2、解析新文档包含的节点documentNodes,判断新文档中节点的类型;
步骤4.3、对节点内容按照标题、段落、表格、有序列表、无序列表、图形、图解列表等进行分类处理;
步骤4.4、如图2所示,按照加载的XML格式代码生成规则,对节点的技术内容进行转换,添加符合S1000D标准模式定义的元素、属性标签,具体过程为:
步骤4.4.1、当节点类型是Paragraph时,首先取出其字符串文本值{文本},①如果Paragraph的样式是标题,如本标题和上一个标题级别一样,则initTexts中增加“</levelledPara>”,本标题级别小于上一级别,则initTexts中增加多个“</levelledPara>”,initTexts中增加“<levelledPara><title>{文本}</title>”;②如果是列表(编号样式是23的为无序列表,以“rl”表示;其余为有序列表,以“sl”表示),则在initTexts中增加“rl(或sl)#列表级别<listItem><para>{文本}</para></listItem>”;③如果是正常段落,则在initTexts中增加“{文本}”。其中处理上标和下标为“<subscript>{上报文本}</subscript>”和“<superscript>{下标文本}</superscript>”;
步骤4.4.2、当节点类型是表格时,首先取到表格列数值{列数},然后循环解析行Row,再循环Row中包含的单元格Cell,最后在initTexts中增加“<tgroup cols="{列数}"><colspec colname="col{列序号}"/><thead>…</thead><tbody><row><entry><para>{文本}</para></entry></row></tbody></tgroup>”。其中要特别处理合并单元格。单元格中的文本用Paragraph中的处理方式;
步骤4.4.3、当节点类型是图形时,在initTexts中增加“<figure><title></title><graphic infoEntityIdent="{ICN值}"xlink:actuate="onRequest"xlink:show="replace"xlink:type="simple"></graphic></figure>”。
步骤4.5、循环上述步骤4.2、4.3、4.4,将新文档的所有节点完成转换,生成initTexts集合;
步骤4.6、对initTexts集合进行有序列表、无序列表及其嵌套的后续处理,得到处理后的字符串集合resultTexts。具体处理过程如下:用java类库dom4j新建xml的Document为docu,初始化根节点并赋值为当前元素为elem。预定义当前值之前的最近的列表级别beforeLevelNumber为-2。循环initTexts的每个字符串nowStr并判断是否为有序无序列表及其列表级别,取出下个值nextStr并判断是否有序无序列表及其列表级别,包括以下四种情况:
(1)当前值和下一值都是有序无序列表时,①如当前值列表级别大于下一值列表级别,则elem增加子元素listItem及子子元素para为当前元素elem并赋值文本为nowStr,根据当前值的有序无序elem增加子元素sequentialList或randomList并赋值slrl属性为当前值列表级别,②如当前值列表级别小于下一值列表级别,则向上找到下一值列表级别的元素,增加子元素listItem及子子元素para为当前元素elem并赋值文本为nowStr,③如果当前值列表级别等于下一值列表级别,则elem增加子元素listItem及子子元素para为当前元素elem并赋值文本为nowStr,④赋值当前值列表级别给beforeLevelNumber;
(2)当前值是有序无序列表而下一值不是有序无序列表时,则elem元素的祖父元素增加子元素listItem及子子元素para为当前元素elem并赋值文本为nowStr;
(3)当前值不是有序无序列表而下一值是有序无序列表时,则将beforeLevelNumber赋值给当前值列表级别,①如beforeLevelNumber为-2或下一值列表级别大于当前值列表级别,则elem增加子元素para并赋值文本为nowStr,根据下一值的有序无序elem增加子元素sequentialList或randomList并赋值slrl属性为下一值列表级别,②如下一值列表级别小于当前值列表级别,则elem增加子元素listItem及子子元素para为当前元素elem并赋值文本为nowStr,并往回找到列表级别为下一值列表级别的sequentialList或randomList元素为当前元素elem,③如下一值列表级别等于当前值列表级别,则elem增加子元素listItem和子子元素para并赋值文本为nowStr;
(4)当beforeLevelNumber为-2或下一值为“</levelledPara>”时,则resultTexts添加docu的xml文本,并初始化docu和赋值beforeLevelNumber为-2。循环完毕initTexts的每个元素最后得到resultTexts;
步骤4.7、对resultTexts中XML格式片段文本进行后续处理,主要分为两种情况:一种是DM为描述类时,循环resultTexts中的每个字符串,首先剔除掉“<xml/>”、“<para/>”、“<para></para>”等,然后处理转义后的特殊字符为正常字符(例如<、>、\、/),其次根据不同的字符串进行不同的处理,(1)如果是以“<tgroup”开头的,则字符串前后分别增加”<table>”和“</table>”,(2)如果不是以“<para>”开头,则在字符串前增加“<para>”,不是以“</para>”结尾的,则在字符串后增加“</para>”;另一种是非描述类DM时,需要替换占位符“__text__”,首先计算出转换规则中的占位符的出现次数{count},以resultTexts的长度除以{count}为循环次数,逐个替换代码生成规则{rule}中的占位符为resultTexts的对应值,得到最终的XML格式片段;
步骤4.9、合并resultTexts中的文本,得到完整的XML格式片段文本。
进一步的,所述步骤5具体执行过程为:
步骤5.1、将生成的XML格式片段文本添加到DM锚点行的{line:line值,ch:ch值}位置,执行editor.replaceSelection(str);
步骤5.2、对编制完成的DM整体内容用javascript类库jquery.format.js进行格式化;
步骤5.3、按照S1000D标准模式对DM利用java类库dom4j进行校验;
步骤5.4、保存DM内容。
以上述依据本发明的理想实施例为启示,通过上述的说明内容,相关工作人员完全可以在不偏离本项发明技术思想的范围内,进行多样的变更以及修改。本项发明的技术性范围并不局限于说明书上的内容,必须要根据权利要求范围来确定其技术性范围。

Claims (6)

1.一种将Word文档内容转换成符合S1000D标准XML片段的动态转换方法,其特征在于:包括以下步骤:
步骤1、打开Word文档和数据模块文档,在Word显示页面选中需要转换的内容,并在数据模块文档中设定一个插入Word内容片段的锚点;
步骤2、获取数据模块中锚点的行号和当前行中包含的元素名称,加载与元素名称对应的XML格式代码生成规则;
步骤3、基于Word文档中选中的内容生成新的文档;
步骤4、解析新文档中所有节点,判断所有节点的类型,按照标题、段落、表格、有序列表、无序列表、图形、图解列表进行分类处理,依据XML格式代码生成规则转换为符合S1000D标准的XML格式片段;
步骤5、将生成的XML片段插入数据模块中锚点位置。
2.根据权利要求1所述的一种将Word文档内容转换成符合S1000D标准XML片段的动态转换方法,其特征在于:所述步骤1中具体包括:
步骤1.1、打开Word文档和需要编辑的数据模块;
步骤1.2、在Word文档显示页面中选择需要转换的内容片段,包括含标题的层级段落、普通段落、表格、有序或无序列表、图形、上下标;
步骤1.3、在数据模块中设定一个插入Word内容片段的锚点,用于将生成的XML片段插入正确位置。
3.根据权利要求2所述的一种将Word文档内容转换成符合S1000D标准XML片段的动态转换方法,其特征在于:所述步骤2中具体包括:
步骤2.1、获取数据模块中锚点的行号;
步骤2.2、解析锚点位置对应元素名称;
步骤2.3、加载与锚点对应元素适配的XML格式代码生成规则。
4.根据权利要求3所述的一种将Word文档内容转换成符合S1000D标准XML片段的动态转换方法,其特征在于:所述步骤3中具体包括:
步骤3.1、将Word文档中选择的内容片段提取出来;
步骤3.2、将提取的文档内容生成一个新Word文档;
步骤3.3、解析新文档中所有内容节点并顺序编号,创建documentNodes集合。
5.根据权利要求4所述的一种将Word文档内容转换成符合S1000D标准XML片段的动态转换方法,其特征在于:所述步骤4中具体包括:
步骤4.1、按照编号顺序解析新文档包含的documentNodes节点类型;
步骤4.2、对节点内容按照标题、段落、表格、有序列表、无序列表、图形、图解列表进行分类处理,加载相应的XML格式代码生成规则;
步骤4.3、依据XML格式代码生成规则将该节点的技术内容添加符合S1000D标准模式定义的元素、属性标签,得到转换后的XML格式片段内容;
步骤4.4、循环上述步骤4.1、4.2、4.3,将新文档的所有节点完成转换;
步骤4.5、对转换完成的XML格式片段内容进行格式化。
6.根据权利要求5所述的一种将Word文档内容转换成符合S1000D标准XML片段的动态转换方法,其特征在于:所述步骤5中具体包括:
步骤5.1、将生成的XML格式片段内容添加到数据模块的锚点位置;
步骤5.2、对编制完成的数据模块内容进行格式化;
步骤5.3、按照S1000D标准模式对数据模块进行校验;
步骤5.4、保存数据模块内容。
CN202211438445.9A 2022-11-16 2022-11-16 将Word文档内容转换成符合S1000D标准XML片段的动态转换方法 Active CN115688690B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211438445.9A CN115688690B (zh) 2022-11-16 2022-11-16 将Word文档内容转换成符合S1000D标准XML片段的动态转换方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211438445.9A CN115688690B (zh) 2022-11-16 2022-11-16 将Word文档内容转换成符合S1000D标准XML片段的动态转换方法

Publications (2)

Publication Number Publication Date
CN115688690A CN115688690A (zh) 2023-02-03
CN115688690B true CN115688690B (zh) 2023-10-03

Family

ID=85054765

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211438445.9A Active CN115688690B (zh) 2022-11-16 2022-11-16 将Word文档内容转换成符合S1000D标准XML片段的动态转换方法

Country Status (1)

Country Link
CN (1) CN115688690B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116050362B (zh) * 2023-03-23 2023-07-04 青岛诺亚信息技术有限公司 一种Web表格动态数据绑定方法、介质及系统

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6725426B1 (en) * 2000-03-17 2004-04-20 Broadvision, Inc. Mechanism for translating between word processing documents and XML documents
KR20150084430A (ko) * 2014-01-14 2015-07-22 한국전자통신연구원 장치 매뉴얼 문서를 s1000d데이터 모듈 문서로 생성하는 방법 및 장치
CN105528411A (zh) * 2015-12-03 2016-04-27 中国人民解放军海军工程大学 船舶装备交互式电子技术手册全文检索装置及方法
CN110069450A (zh) * 2019-03-28 2019-07-30 北京航空航天大学 基于s1000d标准的交互式电子技术手册平台
WO2019169205A1 (en) * 2018-02-28 2019-09-06 Rocky Kahn Document viewer aligning pdf and xml
CN111666747A (zh) * 2020-05-29 2020-09-15 中国工程物理研究院计算机应用研究所 将word文档生成符合s1000d标准描述类数据模块的方法
CN112380823A (zh) * 2020-12-02 2021-02-19 中国商用飞机有限责任公司 民用飞机的飞行类手册编制系统及编制方法
CN112699641A (zh) * 2021-03-25 2021-04-23 南京国睿信维软件有限公司 Word内容批量拷贝到基于s1000d标准dm的快速转换方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101407069B1 (ko) * 2012-10-09 2014-06-12 한국전자통신연구원 Xml 문서 저작 방법 및 이를 수행하는 장치

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6725426B1 (en) * 2000-03-17 2004-04-20 Broadvision, Inc. Mechanism for translating between word processing documents and XML documents
KR20150084430A (ko) * 2014-01-14 2015-07-22 한국전자통신연구원 장치 매뉴얼 문서를 s1000d데이터 모듈 문서로 생성하는 방법 및 장치
CN105528411A (zh) * 2015-12-03 2016-04-27 中国人民解放军海军工程大学 船舶装备交互式电子技术手册全文检索装置及方法
WO2019169205A1 (en) * 2018-02-28 2019-09-06 Rocky Kahn Document viewer aligning pdf and xml
CN110069450A (zh) * 2019-03-28 2019-07-30 北京航空航天大学 基于s1000d标准的交互式电子技术手册平台
CN111666747A (zh) * 2020-05-29 2020-09-15 中国工程物理研究院计算机应用研究所 将word文档生成符合s1000d标准描述类数据模块的方法
CN112380823A (zh) * 2020-12-02 2021-02-19 中国商用飞机有限责任公司 民用飞机的飞行类手册编制系统及编制方法
CN112699641A (zh) * 2021-03-25 2021-04-23 南京国睿信维软件有限公司 Word内容批量拷贝到基于s1000d标准dm的快速转换方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
王友刚等.面向S1000D的线性IETM 生成技术研究.《微计算机信息》.2009,第25卷(第10-3期),171-173. *
马永起等.面向IETM 的PDF 文档发布模型研究.《微型机与应用》.2017,第36卷(第24期),87-91. *

Also Published As

Publication number Publication date
CN115688690A (zh) 2023-02-03

Similar Documents

Publication Publication Date Title
CN101375278B (zh) 用于处理注释的策略
CN111507073A (zh) 一种基于web富文本的论文编辑与智能排版方法及平台
JP2005025763A (ja) 構造化文書の分割プログラム、分割装置、及び分割方法
Ofazer et al. Bootstrapping morphological analyzers by combining human elicitation and machine learning
US7046847B2 (en) Document processing method, system and medium
CN111913739B (zh) 一种服务接口原语定义方法和系统
CN115688690B (zh) 将Word文档内容转换成符合S1000D标准XML片段的动态转换方法
US20070150494A1 (en) Method for transformation of an extensible markup language vocabulary to a generic document structure format
CN109683881B (zh) 一种代码格式调整方法及装置
US9286272B2 (en) Method for transformation of an extensible markup language vocabulary to a generic document structure format
CN114238575A (zh) 文档解析方法、系统、计算机设备及计算机可读存储介质
Donatelli et al. Saarland at MRP 2019: Compositional parsing across all graphbanks
Wax Automated grammar engineering for verbal morphology
JP2005043990A (ja) 文書処理装置および文書処理方法
CN101996190B (zh) 一种从网页中抽取信息的方法及装置
CN110554860B (zh) 一种软件项目自然语言编程接口nli的构造方法及代码生成方法
CN116090416B (zh) 基于标准知识图谱的标准编写方法、系统、设备及介质
US20220198133A1 (en) System and method for validating tabular summary reports
JP2004178010A (ja) 文書処理装置並びにその方法及びプログラム
EP1780645A1 (en) Document processing method and device
CN113392354B (zh) 一种网页正文解析方法、系统、介质及电子设备
CN110533143B (zh) 生成电子卡片的方法与装置、存储介质及计算机设备
CN116414395A (zh) 一种基于递归下降算法的语法树构建方法及装置
Bauer et al. Fiasco: Filtering the internet by automatic subtree classification, osnabruck
US6523031B1 (en) Method for obtaining structured information exists in special data format from a natural language text by aggregation

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant