【问题标题】:How can a Greasemonkey script split a link into three related links? [closed]Greasemonkey 脚本如何将一个链接拆分为三个相关链接? [关闭]
【发布时间】:2012-12-08 07:33:02
【问题描述】:

我想使用 Greasemonkey 将显示在 cgit 提交消息中的 Redmine 问题编号链接到他们的问题或项目。

cgit Commit 消息的 HTML 源代码是这样的。

<a href='/editingmodule/commit/?id=49e4a33e0f8b306ded5'>refs #459 - create separate directory and repo for editingModule, lots of dif...</a>

我想要做的是使#459 成为Redmine 问题的单独href,但保持两边的cgit 链接不变。所以上面的 URL 就变成了这样的:

<a href='/editingmodule/commit/?id=49e4a33e0f8b306ded5'>refs</a>
<a href='http://redmine.project.com/redmine/issues/459'>#459</a>
<a href='/editingmodule/commit/?id=49e4a33e0f8b306ded5'> - create separate directory and repo for editingModule, lots of dif...</a>

可能很难阅读,但上面链接中的 #459 链接到 Redmine 项目。

Redmine 问题的链接也可以附加到 cgit 链接中以清楚起见。

【问题讨论】:

  • @Alexander 谢谢我已经编辑过了。我把关于这个问题的原始笔记复制到了 stackoverflow 编辑框中,却忘记了编辑它们。
  • Alexander, Juhana, Explosion Pills, Francois Wahl 等人。您是否注意到有人对这个问题的理解足够好,可以在大约 7 小时后关闭它之前为编程代码中的问题提供完美的工作解决方案?
  • 我的投票是在回答前 20 多分钟投下的。当时没有任何真正的问题,我仍然认为这没有改变。我看不到您尝试了什么以及为什么未能完成此任务,并且仍然未知。代码请求也很正常,您可以找到已回答的代码请求,我只是觉得您这次很幸运
  • @Alexander 您可能在答案前 20 分钟投票,但显然那些在您之后投票的人可以看到有人对这个问题的理解程度足以给出一个完美的非平凡的答案,它是最佳答案 我不得不对 SO 提出一个问题。在一个不熟悉的领域使用正确的术语来构建一个问题是很困难的,这不是结束一个问题的理由。回答的人在主题方面具有洞察力、专业知识和勤奋来理解它,似乎是你和另一方的缺乏导致它被否决。

标签: javascript hyperlink greasemonkey redmine cgit


【解决方案1】:

使用 jQuery 查找链接,使用正则表达式提取关键文本部分。

这是一个完整的工作脚本;有关更多信息,请参阅内联 cmets:

// ==UserScript==
// @name     _Split Commit links and add Redmine links
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

//-- Fing matching links
$("a[href*='/editingmodule/commit/']").each ( function () {
    /*-- Parse each link for the expected format:
        refs #{number} {description text}
    */
    var jThis       = $(this);
    var parseText   = jThis.text ().match (/\s*(refs)\s+\#(\d+)\s+(.+)/i);
    if (parseText  &&  parseText.length >= 4) {
        //-- Truncate original link text.
        jThis.text (parseText[1]);

        //-- Add tailing link.
        jThis.after (
            ' <a href="' + jThis.attr ("href") + '">' + parseText[3] + '</a>'
        );

        //-- Add Redmine link. Note it is inserted just after the original link.
        var issueNumber = parseInt (parseText[2], 10);
        jThis.after (
            ' <a href="http://redmine.project.com/redmine/issues/'
            + issueNumber + '">#' + issueNumber + '</a>'
        );

        //-- Style the Redmine link, if desired.
        jThis.next ().css ("background", "yellow")
    }
} );

【讨论】:

  • 感谢您的快速回复,非常感谢。 Javascript 和正则表达式都不是我的强项。我有时让提交消息引用多个问题,例如 refs #456、#457 等。'refs' 也不需要匹配,因为 Redmine 允许其他问题引用单词。只有#XXX 字符串需要匹配。你能帮我解决这个问题吗?
  • 这比原来的问题多一点。请为此打开一个新问题。举例说明您想要匹配的每种类型的 ref。指向整个 HTML 的pastebin.com 的链接也是一个好主意。 ...另外,为了避免人们投票和投票关闭(我没有),请显示您尝试过的代码。
  • 我认为它被否决了,因为我将关于该问题的原始注释复制到编辑框中并忘记将它们编辑出来,我更正了。插件问题更像是一个 Javascript 正则表达式问题,以及如何将匹配项放在数组中。等我办完事回来就这么做
  • 我添加了另一个问题 - stackoverflow.com/questions/13782177/…。这个想法是,如果派生了正确的正则表达式,我会使用它来拆分原始 URL,并将它们与指向问题编号的链接结合起来,就像您在原始答案中一样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 2020-04-15
  • 2014-05-04
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多