147 lines
4.3 KiB
QML
147 lines
4.3 KiB
QML
|
import org.kde.falkon 1.0 as Falkon
|
||
|
import QtQuick.Controls 2.3
|
||
|
import QtQuick.Layouts 1.0
|
||
|
import QtQuick 2.3
|
||
|
|
||
|
Falkon.PluginInterface {
|
||
|
|
||
|
QtObject {
|
||
|
id: rssFinderObject
|
||
|
property ListModel feeds: ListModel {}
|
||
|
}
|
||
|
|
||
|
init: function(state, settingsPath){
|
||
|
console.log(i18n('"RSSFinder" plugin loaded'))
|
||
|
}
|
||
|
|
||
|
testPlugin: function() {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
unload: function() {
|
||
|
console.log(i18n('"RSSFinder" plugin unloaded'))
|
||
|
}
|
||
|
|
||
|
function findCurrentTab(window) {
|
||
|
for (var i = 0; i < window.tabs.length; ++i) {
|
||
|
if (window.tabs[i].current) {
|
||
|
return window.tabs[i]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function findFeeds() {
|
||
|
var window = Falkon.Windows.getCurrent()
|
||
|
var currentTab = findCurrentTab(window)
|
||
|
var result = currentTab.execJavaScript("
|
||
|
var availableLinks = [];
|
||
|
var links = document.getElementsByTagName('link');
|
||
|
var siteTitle = 'No title was found';
|
||
|
|
||
|
if (document.getElementsByTagName('title').lenght > 0) {
|
||
|
siteTitle = document.getElementsByTagName('title')[0].innerHTML
|
||
|
}
|
||
|
|
||
|
for (link of links) {
|
||
|
if (link.getAttribute('rel') == 'alternate' && link.getAttribute('type') == 'application/rss+xml') {
|
||
|
var linkTitle;
|
||
|
var linkUrl;
|
||
|
|
||
|
if (link.hasAttribute('title')) {
|
||
|
linkTitle = link.getAttribute('title');
|
||
|
} else {
|
||
|
linkTitle = siteTitle;
|
||
|
}
|
||
|
|
||
|
if (link.getAttribute('href').startsWith('/')) {
|
||
|
linkUrl = window.location.protocol + '//' + window.location.hostname + link.getAttribute('href');
|
||
|
} else if (!link.getAttribute('href').includes('/')) {
|
||
|
linkUrl = window.location.protocol + '//' + window.location.hostname + '/' + link.getAttribute('href');
|
||
|
} else {
|
||
|
linkUrl = link.getAttribute('href');
|
||
|
}
|
||
|
|
||
|
availableLinks.push({
|
||
|
title: linkTitle,
|
||
|
url: linkUrl
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (links.length == 0) {
|
||
|
availableLinks.push({
|
||
|
title: 'No RSS feed was found',
|
||
|
url: 'No URL is provided'
|
||
|
});
|
||
|
}
|
||
|
|
||
|
var out = {
|
||
|
links: availableLinks
|
||
|
};
|
||
|
|
||
|
out;
|
||
|
")
|
||
|
|
||
|
rssFinderObject.feeds.clear()
|
||
|
|
||
|
for (var link of result.links) {
|
||
|
rssFinderObject.feeds.append({
|
||
|
"title": link.title,
|
||
|
"url": link.url
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Falkon.BrowserAction {
|
||
|
name: 'RSS Finder'
|
||
|
identity: 'rssfinder-id'
|
||
|
title: i18n('RSS Finder')
|
||
|
toolTip: i18n('RSS Finder')
|
||
|
icon: 'rss'
|
||
|
location: Falkon.BrowserAction.NavigationToolBar | Falkon.BrowserAction.StatusBar
|
||
|
onClicked: findFeeds()
|
||
|
|
||
|
popup: ScrollView {
|
||
|
id: popupWindow
|
||
|
width: 500
|
||
|
height: 200
|
||
|
|
||
|
ScrollBar.horizontal.policy: ScrollBar.AlwaysOn
|
||
|
ScrollBar.vertical.policy: ScrollBar.AlwaysOn
|
||
|
|
||
|
ListView {
|
||
|
Component {
|
||
|
id: contactsDelegate
|
||
|
|
||
|
Button {
|
||
|
hoverEnabled: true
|
||
|
width: popupWindow.width
|
||
|
onClicked: Falkon.Clipboard.copy(url)
|
||
|
|
||
|
ToolTip.delay: 1000
|
||
|
ToolTip.timeout: 5000
|
||
|
ToolTip.visible: hovered
|
||
|
ToolTip.text: i18n("Click to copy URL")
|
||
|
|
||
|
ColumnLayout {
|
||
|
id: wrapper
|
||
|
spacing: 0
|
||
|
|
||
|
Text {
|
||
|
text: "<strong>" + title + "</strong>"
|
||
|
}
|
||
|
Text {
|
||
|
text: url
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
model: rssFinderObject.feeds
|
||
|
delegate: contactsDelegate
|
||
|
focus: true
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|