油脂油脂:油脂颜料和猴子

分享于 

16分钟阅读

Web开发

  繁體

前言

https://www.codeproject.com/script/profile/upload/20101/greasebob.png

它是我们使用工具的本质,它是我们的本质。 我们最强大的特性之一是能够获取别人制造的工具,并将它们自定义为我们自己的需求。 遗憾的是,这通常是软件工具的一个区域,可以能是我们处理最灵活的一部分。 考虑计算机上安装的应用程序和实用程序: 它们几乎适合你的心理模型,如何使用一个工具,但是在一个区域或者另一个区域。 如果你只能做几个小修改,那么你的日常工作就会更容易和快速。

由于这种情况,软件可以自定义它的他软件,如果你愿意,就存在于软件本身。 从低速宏汇编程序到复杂的补丁工具,到允许今天使用的硬件组合的硬件组合。

Web应用程序本身是一个新小说,它最初为更简单的任务创建了技术,。 基础设计,具有良好文档化的通信协议和数据格式的客户端服务器系统比几乎任何它的他平台更开放。 "浏览器大战"的存在 speaks speaks在其他领域 speaks opportunities甚至 *nix 在不同窗口管理器中选择的能力 pales pales pales。

最近的发展是创建一些工具,以便在加载时插入代码"用户脚本",使用户能够增强。自动化和扩展网站。 这些元工具最流行的一个是 Firefox 浏览器的GreaseMonkey扩展。 自发布以来,已经编写了以上几千个脚本来使用disablities更易于访问的网站,称为"mashup脚本"。

在本文中,我将为代码项目网站上的论坛提供一些简单的增强,并尝试了解 of。 就像你可能知道的,代码项目是专门针对关于代码或者编程相关主题的文章的网站,主要用于 Windows 平台。 其中最优秀的属性是它提供的论坛,包括每个文章和那些专门用于普通主题( 如MFC和 xml )。 网网。 许多这样的论坛不同,代码集成到网站的它的余部分,为讨论和讨论文章提供了一个特别好的。 尽管可以几种不同的方式查看,但我本来提供的脚本用于以最常见的格式使用: DHTML"邮件视图",讨论线程和回复作为主题行出现,当单击以显示完整消息时展开。

工具:这是 GreaseMonkey

我们将从收集一些有用的工具开始。 我不会详细介绍这些是如何使用的,但是考虑在你自己的游戏中花些时间。

GreaseMonkey是最重要的,所以先下载并安装它: ( 当然,你应该下载 Firefox 版的版本。 如果你没有 Firefox 1.5,则下载并安装它。

现在,Greasemonkey脚本是 JavaScript。 尽管很容易使用,但你可以能从 Firefox 上获得质量调试器,这意味着: http://www.hacksrus.com/~ginda/venkman/

使用JavaScript的另一个有用工具是 JavaScript shell,它提供了一个控制台界面,完成命令完成,在网页上下文中运行。 如果你曾经使用过基本/vb"立即模式",你会喜欢它: http://www.squarefree.com/shell/

最后,下载并安装FireBug扩展。 日志记录,错误显示,DOM检查和修改。 这里工具的功能太多,无法正确总结。 只要相信我,如果你进行任何类型的web开发,你需要: http://www.joehewitt.com/software/firebug/

DHTML调整:扩展所有

( 注:我无法将. js 文件上载到,因此我托管这些文件。)

尽管默认视图( 邮件已经折叠) 通常比较可取,但有时使所有消息的文本同时可见( 例如: 要使用浏览器功能查找邮件文本,请执行以下操作:。 这里脚本在每个论坛的( 刷新) 链接旁添加一个按钮;单击后,它将展开所有显示的消息:

// ==UserScript==// @namespace http://shog9.com/greasemonkey/scripts/// @name CPExpandAll// @author Joshua Heyer// @description Add an"Expand All" option to Code Project forums// @version 1.0// @include http://*.codeproject.com/*// @include http://*.codetools.com/*// @include http://*.thecodeproject.com/*// ==/UserScript==var refreshLink = document.evaluate("//a[text()='Refresh']", document, null, 
 XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;if ( refreshLink )
{
 var expandBtn = document.createElement("BUTTON");
 expandBtn.className = "FormButton";
 expandBtn.textContent = "Expand All";
 expandBtn.addEventListener("click", function(event)
 {
 var forumTable = document.getElementById("ForumTable");
 if (!forumTable )
 return;
 var messages = document.evaluate("./tbody/tr[4]/td/table/tbody/tr", 
 forumTable, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
 if ( messages )
 {
 for (i=0; i<messages.snapshotLength; ++i)
 {
 messages.snapshotItem(i).style.display = "";
 }
 }
 }, false);
 refreshLink.parentNode.insertBefore(expandBtn, 
 refreshLink.nextSibling.nextSibling);
}

要注意的事项:

  • 对评论块收费:提供信息,包括用于确定脚本应用于的url。避免命名冲突。避免命名冲突和 NAME 自身的模式。 这也是人类可以读的,因这里给用户提供一些良好的介绍性信息是有意义的。
  • document.evaluate() :在DOM文档中使用 XPath。 Mozilla为XML和HTML文档提供了这种方法,因这里利用它是有意义的。 尽管如这里,在本脚本中,我开始搜索与文本"刷新"相关的链接,但是这样做可以更好地处理文档结构。 这种弹性很重要,只发生一次,所以我认为它可以接受。 相反,在展开按钮的事件处理程序中,我使用了更具体的XPath来收集已经折叠的元素。 但是,如果论坛结构发生变化,则可能会发生这种情况。
请参阅:http://developer.mozilla.org/en/docs/Using_the_Mozilla_JavaScript_interface_to_XPath

ajax风格:删除

开发这些脚本和其他脚本时,我经常发现创建虚拟线程来测试各种事情是有帮助的。 一旦完成测试,删除这些帖子会相当乏味- 每个帖子的[delete] 链接首先导航到确认页面,最后按下按钮,然后重新加载原始的论坛。 创建快速删除帖子的方法是必要的。

这个脚本使用 GM_xmlhttpRequest() 与服务器 behind的场景进行通信: 首先加载确认页以检索密码,然后进行实际的delete 请求。 这与使用大多数现代浏览器中的XMLHttpRequest 对象类似,但是具有能够跨域发出请求的附加优势。 这个脚本中不使用这个特性,所以实际上可以用 XMLHttpRequest 编写,我使用 GM_xmlhttpRequest() 因为它很方便。

兴趣点:

  • 收费事件:我不会向删除链接本身添加onclick处理程序,而是在论坛表中确定是否在单击处理程序中执行。 我不会在大多数情况下建议这样做,但是现在和时间都很方便,所以我觉得值得演示。
  • 如果我弄错某个地方,那么CP会返回一个页面,详细说明错误的( 这也可能发生在删除帖子的协议在某一点上发生改变时)。 这里函数对响应文本进行快速而脏的解析,查找这些错误。 其他潜在故障场景包括服务器错误和网络超时- 通过检查响应状态代码将捕获这些错误。
  • 对一个简单格式的解析:一个简单的RegExp足以从第一个响应中提取密码,对于大型复杂表单来说,这种解析很快就变得笨拙。 幸运的是,Mozilla有一个优秀的HTML解析器,并且有几个简单的黑客是我们的:
    var tmpDiv = document.createElement("DIV");
    tmpDiv.innerHTML = responseDetails.responseText;
    这就是将响应文本解析为HTML所需的全部。 尽管我们解析的HTML可以能包含了一些不处于DIV元素的有效子元素的元素。 注意 tmpDiv 未附加到任何父节点- 这将阻止显示的文档不需要的副作用;图像不会被加载,嵌入的javascript不会被执行,等等 也不会被删除。
    var pass = document.evaluate(".//input[@name='ArticlePassword']/@value", 
     tmpDiv, null, XPathResult.STRING_TYPE, null).stringValue;
    这里我们使用XPath从新解析的DOM中提取所需信息。 注意XPath相对于 tmpDiv 计算,所以即使 tmpDiv 实际上并不在主DOM树中,它也会工作。

DOM和XSL的强大功能: 打印机友好论坛

现在,你可以能已经认识到on实现的强大功能比它的他平台上更加容易。 但是等等还有更多如果你曾经使用过XSL模板来转换 XML,你就会知道它们如何减少此类任务的繁琐性。 mozilla的XSLTProcessor 在 HTML dom上也工作得很好,就像 XML dom一样。 这使得这个脚本非常困难- 它将一个"打印机友好"链接添加到每个论坛,当单击了论坛内容,格式适合打印。 有趣的是,脚本使用了两个XSL模板来实际完成格式化。

<xsl:variable name="forumID" 
 select="substring-before(substring-after(//a[text()='Refresh']/@href, 'forumid='), '&amp;')"/>
<!-- lounge -->
<xsl:variable name="title1" 
 select="/html/body/table/tbody/tr[2]/td[3]/table/tbody/tr/td/font/b"/>
<!-- article -->
<xsl:variable name="title2" 
 select="/html/body/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr/td/b/font"/>
<!-- forum -->
<xsl:variable name="title3" 
 select="/html/body/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/font/b"/>
<!-- survey/news -->
<xsl:variable name="title4" 
 select="/html/body/table/tbody/tr/td[3]/table/tbody/tr/td/table/tbody/tr/td"/>
<xsl:variable name="title">
 <xsl:choose>
 <xsl:when test="$title1"><xsl:value-of select="$title1"/></xsl:when>
 <xsl:when test="$title2"><xsl:value-of select="$title2"/></xsl:when>
 <xsl:when test="$title3"><xsl:value-of select="$title3"/></xsl:when>
 <xsl:when test="$title4"><xsl:value-of select="$title4"/></xsl:when>
 </xsl:choose>
</xsl:variable>

这可以处理从不同论坛提取信息的丑陋任务。 大量棘手的XPath和特殊案例( 显示: 用于确定论坛标题的代码。 输出是论坛的XML表示形式,它被输入到

<xsl:template match="Content">
 <div class="PostContent">
 <xsl:copy-of select="text()|*"/>
 <br clear='all'/>
 </div>
</xsl:template>

将XML表示转换为打印机友好的HTML表示形式,这有很多令人愉快的工作。 当然,它更小更容易阅读。 稍微有趣一点的位( 显示) 涉及保持rowdy签名HTML在包含元素之外出现。

使用库:语法高亮


Greasemonkey脚本在与被修改的实际网页中嵌入的环境中运行的环境稍有不同。 这部分出于安全原因,( 由于for脚本可以做类似添加菜单和交叉站点请求,因这里使恶意页变得太容易。),部分原因是( 如果页面冲突或者其他不可预知的脚本干扰,页面就会被破坏)。 无论如何,用户将它的保持在这种状态几乎总是最好的。 但是,在我们很好理解脚本的站点上,我们不能使用将它的他非特权脚本插入页本身。

of Gorbatchev编写了一个优秀的Javascript库,用于完成各种语言。 ,真是不错。 当我看到它的时候,我想在论坛上。 所以,我写了一个通用的脚本。

var forumLUT =
{
 0 : "javascript", // default (javascript)1649 : "c#", // C# forum12076 : "c#", // ASP.NET forum1650 : "c#", //. NET forum1646 : "vb", // VB forum1725 : "sql", // SQL/ADO/ADO.NET forum3421 : "xml", // XML/XSL};var langLUT =
{
 "javascript" : "shBrushJScript.js.txt",
 "c#" : "shBrushCSharp.js.txt",
 "vb" : "shBrushVb.js.txt",
 "sql" : "shBrushSql.js.txt",
 "xml" : "shBrushXml.js.txt"};

我的脚本对几个编程论坛具有显式映射,因此默认的着色将是正确的。 为它的余部分,将 class="language" 属性添加到代码的<前> 标记中将触发该语言的"画笔"( 语言特定代码)。

现在,大家都喜欢easy-to-read代码,但是停止并思考一下这项技术有多强大。 我将从CP加载这些脚本,以避免在on上添加负载,但是对于不允许上载的站点,我可以轻松地承载这些脚本。 有越来越多的优秀 3方库库可以这种方式使用。

结束语

to提供了巨大的机会,这些工具提供了一些新的和有用的改变,这样的网站。 我希望本文已经引发了你对编写网站特定增强的兴趣,我期待你的实验能够实现。

.网络带宽资源控制

有关更深入的教程,请阅读访问者的标记 Dive Greasemonkey: http://diveintogreasemonkey.org/

有关脚本网站的其他方法,请参见 Chickenfoot: http://groups.csail.mit.edu/uid/chickenfoot/index.php


Paint  Monkey  MONK  
相关文章