ABAP的语法高亮是如何在浏览器里显示的

这篇文章的原文我发表在SAP官方社区上:https://blogs.sap.com/2018/03/09/how-abap-syntax-highlight-is-implemented-in-webide-launched-via-browser/

在S/4HANA里,我们现在能在浏览器里写ABAP了,并且支持语法高亮。

你也许会问,ABAP的语法高亮是如何在浏览器里显示的?下面跟我一起来通过调试的方式自己找到问题的答案。

(1). 在浏览器里敲个ABAP的关键字,比如data。发现被高亮了。通过Chrome开发工具发现高亮是通过一个叫ace_keyword的css类实现的。

在Chrome开发工具里以关键字".ace_keyword"搜索: 发现这个css类是硬编码在theme-sap-cumulus.js里的。

(2). 现在需要找到浏览器里进行ABAP代码编辑的编辑器的实现。在Chrome开发工具里Network tab里输入“.xml”作为过滤条件,于是找到编辑器的Fiori实现: Editor.view.xml

具体的编辑器是实现在命名空间reuse的ABAPWrapper标签里。

根据这个命名空间找到实现ABAP编辑器的UI5应用,如下图: nw_aps_ext_lib.

打开ABAPWrapper-dbg.js, 在第68行设置断点。这个函数负责从ABAP后台取PAD文件,该文件和语法高亮有关。

刷新ABAP编辑器页面,断点触发,在调试器里观察PAD文件的内容:

所有的ABAP关键字都列在该PAD文件里,这样UI5就知道编辑器里哪些字符串应该做高亮显示。

(3). 最后一个问题就是,比如当我敲了一个ABAP关键字"new"之后,UI5应用具体哪行代码将对应的css类加到这个字符串对应的DOM节点上?

如下图,一旦我敲了一个字符w之后,字符串new作为一个关键字需要被高亮:

具体逻辑如下图:一旦敲入字符"w"后,onInput作为事件处理函数触发:

函数$renderLine负责生成对应的HTML源代码。输入字符"new"被传入函数getLineTokens来计算该字符串是关键字还是普通变量。

在文件AceRndTokenizer.js里, ABAP解析器按照我们期望的将“new”解析成关键字,因为解析器拥有PAD文件的引用,因此它知道哪些字符串是关键字,哪些是普通变量。

(4). DOM节点的源代码在此处生成,"ace"和“keyword"做连接操作,生成最后我们在Chrome开发工具里看到的完整css类ace_keyword.

谜底就这样揭晓了。
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

原文地址:http://blog.51cto.com/5899363/2132176

时间: 2024-10-08 07:56:13

ABAP的语法高亮是如何在浏览器里显示的的相关文章

ABAP开发环境语法高亮的那些事儿

关于SAP ABAP开发环境,Jerry之前写过几篇公众号文章: 那些年我用过的SAP IDE 不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧 使用Visual Studio Code编写和激活ABAP代码 本文从另一个角度出发,单独聊聊ABAP开发环境里的语法高亮话题. 俗话说,佛靠金装,人靠衣装.咱们程序员虽然平日上班都穿千篇一律的职业装: 程序员专用的格子伞: Jerry衣柜里最不缺这种衣服: 但幸好我们的开发环境还是能够进行各种个性化设置,所以虽然大家都穿着一样的格子衫,

我是如何给discuz模板做语法高亮的

本人一直做ASP.NET开发,近期接到任务要用Discuz开发一个社区,第一次接触PHP,PHP灵活的语法,天生的模块化,各种语法糖深深的震惊了我,我从内心深处感受到了PHP是最牛逼的语言!!! 好了回到正题,初次看Discuz的模板,用VS打开是这样的: 没错,第一眼看上去就震惊了,这TM怎么维护?模板随随便便就2000行,因为DZ是一个极灵活的论坛,里面放了各种hook点用于扩展功能!所以模板非常庞大复杂. DZ的模板语法采用了HTML注释扩展(有一部分内联的却是破坏性的),见: http:

Qt的语法高亮类(注释方式)

1 //语法高亮---QSyntaxHighlighter 2 //highlighter.h 3 class Highlighter : public QSyntaxHighlighter //定义一个类继承自QSyntaxHightliaghter 4 { 5 Q_OBJECT //Qt宏定义,使用Qt元编程 6 7 public: 8 Highlighter(QTextDocument *parent = 0); //构造函数,传递一个QTextDocument对象给其父类 9 10 pr

一个C#语法高亮插件

语法高亮对程序员阅读代码来说有着不小的帮助,虽然VisualStudio本身支持C#语法高亮,但也只是对关键字.类名.字符串等少数元素加了标记,而我们代码中主题:变量.函数.属性.事件等都没有进行高亮,如下所示: ????var nodes = from id in GetIdentifiersInSpans(doc.Workspace, doc.SemanticModel, spans)????????????????let node = doc.SyntaxRoot.FindNode(id.

Ubuntu中 less 语法高亮

以下以ubuntu14.10为例: 1. 安装 source-highlight,可从 Ubuntu软件中心 安装, 也可使用命令安装: [email protected]:~$ sudo apt-get source-highlight It supports syntax highlighting for over 100 file formats, including major programming languages, markup formats, and configuratio

测试 Prism 语法高亮

测试 Prism 对 C 语言的语法高亮 #include <stdio.h> #include "math.h" int main(void) { long int i,x,y,z; for (i=1;i<100000;i++) { x=sqrt(i+100); /*x为加上100后开方后的结果*/ y=sqrt(i+268); /*y为再加上168后开方后的结果*/ if(x*x==i+100&&y*y==i+268)/*如果一个数的平方根的平方等

Spices .Net Decompiler生成的代码具备语法高亮、缩进、可折叠和主动提示的代码

Spices .Net Decompiler控件是一款功能强大的代码恢复和反编译工具,支持转换.NET二进制格式((.EXE或.DLL)为格式化的.最佳的源代码,支持MSIL, C#, VB.NET, Delphi.NET, J# 和可管理的C++.具体功能: 转换后的代码具备良好的格式:生成的代码具备语法高亮.缩进.可折叠和主动提示 支持可视的进行反编译 正确的反编译所有类型的程序集:managed (C#, VB.NET, Delphi.NET), CompactFramework and

配置使用vim编辑Nginx配置文件时语法高亮

vim是Unix系统中非常实用的文本编辑器,它和传统的vi相比最大的区别在于它所支持的配色方案,这个功能使得平时编辑一些配置文件或者是在写代码的时候极大的提高工作效率,如果我们在系统中有安装vim相应的包且开启了syntax配色方案的时候会不显示语法高亮往往是配置设置错误所引起的.一般配置错误有2个地方:1.是远程服务器的仿真客户终端配置错误:2.是服务器上环境变量配置错误.在这里就用SecureCRT仿真客户终端为例子简单的说一下vim开启syntax配色方案: 在SecureCRT上需要配置

github atom创建自己的语法高亮

使用atom一段时间了,有些插件还不是很成熟.比如项目中使用protobuf,早就有人写了语法高亮(https://github.com/podgib/atom-protobuf),但是效果不是很好.于是决定自己写一个. atom linux的配置目录在~/.atom下,里面有一个packages目录,所有安装的插件(或者叫做包)都在这里.所有在这里的包在启动时都会自动加载.因此,我们直接在这里创建一个包. cd .atom/packages mkdir language-protobufcd