Как скрипт Greasemonkey может разделить ссылку на три связанные ссылки?
Я хочу использовать Greasemonkey, чтобы связать номера проблем Redmine, которые отображаются в сообщениях коммитов cgit, с их проблемами или проектами.
Источник HTML сообщений cgit Commit выглядит следующим образом.
<a href='/editingmodule/commit/?id=49e4a33e0f8b306ded5'>refs #459 - create separate directory and repo for editingModule, lots of dif...</a>
То, что я хочу сделать, это сделать #459 отдельным разделом к проблеме Redmine, но оставить неизменными ссылки на 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 для ясности.
1 ответ
Используйте jQuery, чтобы найти ссылки, и regex, чтобы извлечь ключевые части текста.
Вот полный рабочий скрипт; см. встроенные комментарии для получения дополнительной информации:
// ==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")
}
} );