From 9f311df6262c206a56f47a593244336e6ba1f54c Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Fri, 2 Sep 2005 12:49:47 +0100 Subject: [PATCH] OPML import --- backend.php | 6 ++-- opml.php | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++--- prefs.js | 12 +++++++ prefs.php | 12 ++++++- tt-rss.css | 19 ++++++++--- 5 files changed, 129 insertions(+), 13 deletions(-) diff --git a/backend.php b/backend.php index 94ddb22ff..56dd6441d 100644 --- a/backend.php +++ b/backend.php @@ -571,10 +571,8 @@ Refresh  OPML: - Import  - Export"; + Export + "; } diff --git a/opml.php b/opml.php index 05ad1943c..f29b19023 100644 --- a/opml.php +++ b/opml.php @@ -1,8 +1,8 @@ "; print ""; print "" . date("r", time()) . ""; @@ -31,4 +31,89 @@ print ""; } + function startElement($parser, $name, $attrs) { + if ($name == "OUTLINE") { + $title = pg_escape_string($attrs['TEXT']); + $url = pg_escape_string($attrs['XMLURL']); + + print "Feed $title ($url)... "; + + $result = pg_query("SELECT id FROM ttrss_feeds WHERE + title = '$title' OR feed_url = '$url'"); + + if (pg_num_rows($result) > 0) { + + print " Already imported.
"; + + } else { + + $result = pg_query("INSERT INTO ttrss_feeds (title, feed_url) VALUES + ('$title', '$url')"); + + print "Done.
"; + + } + + } + } + + function endElement($parser, $name) { + + + } + + if ($op == "Import") { + print " + + + +

Importing OPML...

+
"; + + if (is_file($_FILES['opml_file']['tmp_name'])) { + + $xml_parser = xml_parser_create(); + + xml_set_element_handler($xml_parser, "startElement", "endElement"); + + $fp = fopen($_FILES['opml_file']['tmp_name'], "r"); + + if ($fp) { + + while ($data = fread($fp, 4096)) { + + if (!xml_parse($xml_parser, $data, feof($fp))) { + + print sprintf("Unable to parse OPML file, XML error: %s at line %d", + xml_error_string(xml_get_error_code($xml_parser)), + xml_get_current_line_number($xml_parser)); + + print "

+ Return to preferences"; + + return; + + } + } + + xml_parser_free($xml_parser); + fclose($fp); + + } else { + print("Error: Could not open OPML input."); + } + + } else { + print "Error: please upload OPML file."; + } + + print "

+ Return to preferences"; + + print "

"; + + } + + pg_close($link); + ?> diff --git a/prefs.js b/prefs.js index b468a362a..e9a0e49df 100644 --- a/prefs.js +++ b/prefs.js @@ -297,6 +297,18 @@ function localPiggieFunction(enable) { } } +function validateOpmlImport() { + + var opml_file = document.getElementById("opml_file"); + + if (opml_file.value.length == 0) { + notify("Please select OPML file to upload."); + return false; + } else { + return true; + } +} + function init() { // IE kludge diff --git a/prefs.php b/prefs.php index e0494c224..1d47d539a 100644 --- a/prefs.php +++ b/prefs.php @@ -32,7 +32,7 @@
 
- +
@@ -40,6 +40,16 @@
 
+
+ +

Import OPML

+ + + + File:   + + diff --git a/tt-rss.css b/tt-rss.css index b8c0b6c2c..a714ca5cb 100644 --- a/tt-rss.css +++ b/tt-rss.css @@ -218,6 +218,17 @@ table.prefAddFeed input { width : 250px; } +form.prefForm { + border : 1px solid #c0c0c0; + padding : 10px; + -moz-border-radius : 5px; + background-color : #f0f0f0; + background-image : url("images/form.png"); + background-position : bottom left; + background-repeat : repeat-x; + width : 500px; +} + table.prefAddFeed { border : 1px solid #c0c0c0; padding : 10px; @@ -269,7 +280,7 @@ a.disabledButton:hover { color : #909090; } -a.button { +.button { font-family : tahoma, sans-serif; border : 1px solid #d0d0d0; background-image : url("images/button.png"); @@ -281,13 +292,13 @@ a.button { font-size : small; } -a.button:hover { +.button:hover { background : white; text-decoration : none; color : black; } -a.buttonWarn { +.buttonWarn { font-family : tahoma, sans-serif; border : 1px solid #d0d0d0; background-image : url("images/button.png"); @@ -299,7 +310,7 @@ a.buttonWarn { font-size : small; } -a.buttonWarn:hover { +.buttonWarn:hover { background : #fff0f0; text-decoration : none; color : black;
Add feed