WebView使用SyntaxHighlighter实现代码高亮

在上一篇文章中已经解决图片的适配问题,现在查看博文时只有长代码(代码的宽度超过屏幕宽度)会导致水平滑动,并且代码没有高亮显示,使得可读性很差。查找资料得到一个开源的插件SyntaxHighlighter,通过css、js实现代码高亮度。


查看CSDN博文的源码发现代码的标签都是<pre name="code" class="java">,html的<pre>标签是可以保持原有内容的格式,name属性是表明内容为代码,class属性表明代码的类型。

SyntaxHighlighter的使用正是修改<pre>标签的class属性<pre class="brush: java; gutter: false;">

其中java就是指代码类型,gutter是设置行号,false为不显示行号。

在使用前还需要调用基本的js、css包,核心的shCore.js、shCore.css、shThemeDefault.css,其他的就是根据需求添加相应的包。下载地址SyntaxHighlighter

需要在html标签内添加的代码:

	// 链接样式文件,代码块高亮的处理
	public final static String linkCss = 
			  "<script type=\"text/javascript\" src=\"file:///android_asset/shCore.js\"></script>"
			+ "<script type=\"text/javascript\" src=\"file:///android_asset/shBrushCpp.js\"></script>"
			+ "<script type=\"text/javascript\" src=\"file:///android_asset/shBrushXml.js\"></script>"
			+ "<script type=\"text/javascript\" src=\"file:///android_asset/shBrushJScript.js\"></script>"
			+ "<script type=\"text/javascript\" src=\"file:///android_asset/shBrushJava.js\"></script>"
			+ "<link rel=\"stylesheet\" type=\"text/css\" href=\"file:///android_asset/shThemeDefault.css\">"
			+ "<link rel=\"stylesheet\" type=\"text/css\" href=\"file:///android_asset/shCore.css\">"
			+ "<script type=\"text/javascript\">SyntaxHighlighter.all();</script>";

其中导入了cpp、xml、javascript、java等额外的四个包。

需要把相应的文件(从下载的包里面选取)置于Android项目的assets文件夹下,shThemeDefault.css文件里面是定义的默认的一些样式,主要是代码颜色的配置;shCore.css文件主要是代码的缩进,以及其他的布局配置。

我的需求是长代码不换行,但是可以水平滚动,这样的话修改shCore.css文件

.syntaxhighlighter .line .content
{
	padding-left: .5em !important;
	white-space: pre !important; /**强制不换行 */
}
.syntaxhighlighter .lines.no-wrap
{
	overflow: auto !important;<span style="font-family: Consolas, 'Lucida Console', monospace;">/**可滚动 */</span>
	overflow-y: hidden !important;<span style="font-family: Consolas, 'Lucida Console', monospace;">/**竖直不可滚动 */</span>
	white-space: nowrap!important;
}

经过以上的配置,然后就是修改<pre>标签的class属性了,方法跟上一篇文章一样的:

			Elements codeElements = detail.select("pre[name=code]");
			for (Element codeNode : codeElements) {
				codeNode.attr("class", "brush: java; gutter: false;");
				Log.i(TAG, "codeNode.text()" + codeNode.text());
			}
			
			return JsoupUtil.linkCss + detail.toString();
注意把刚才定义的css样式添加到html代码(detail)中。因为我只是把html中文章内容部分截取出的片段,所以可以直接通过字符串拼接完成,如果是整个html的话就需要通过jsoup操作了。

经过如此的处理,博文的显示终于是把宽度问题搞定了。


ps:今天意外发现csdn有开放的接口,后期如果方便的话,会通过接口完成CSDNBlog客户端。




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。