diff options
-rw-r--r-- | backend.php | 6 | ||||
-rw-r--r-- | opml.php | 93 | ||||
-rw-r--r-- | prefs.js | 12 | ||||
-rw-r--r-- | prefs.php | 12 | ||||
-rw-r--r-- | 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 @@ <a class=\"button\" href=\"javascript:updateFeedList()\">Refresh</a> OPML: - <a class=\"button\" - href=\"opml.php?op=import\">Import</a> - <a class=\"button\" - href=\"opml.php?op=export\">Export</a>"; + <a class=\"button\" href=\"opml.php?op=Export\">Export</a> + "; } @@ -1,8 +1,8 @@ <? // FIXME there are some brackets issues here - $op = $_GET["op"]; - if ($op == "export") { + $op = $_REQUEST["op"]; + if ($op == "Export") { header("Content-type: application/xml"); } @@ -10,10 +10,10 @@ require_once "functions.php"; $link = pg_connect(DB_CONN); - + pg_query($link, "set client_encoding = 'utf-8'"); - if ($op == "export") { + if ($op == "Export") { print "<?xml version=\"1.0\"?>"; print "<opml version=\"1.0\">"; print "<head><dateCreated>" . date("r", time()) . "</dateCreated></head>"; @@ -31,4 +31,89 @@ print "</body></opml>"; } + function startElement($parser, $name, $attrs) { + if ($name == "OUTLINE") { + $title = pg_escape_string($attrs['TEXT']); + $url = pg_escape_string($attrs['XMLURL']); + + print "Feed <b>$title</b> ($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.<br>"; + + } else { + + $result = pg_query("INSERT INTO ttrss_feeds (title, feed_url) VALUES + ('$title', '$url')"); + + print "<b>Done.</b><br>"; + + } + + } + } + + function endElement($parser, $name) { + + + } + + if ($op == "Import") { + print "<html> + <head> + <link rel=\"stylesheet\" href=\"opml.css\" type=\"text/css\"> + </head> + <body><h1>Importing OPML...</h1> + <div>"; + + 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 "<p><a class=\"button\" href=\"prefs.php\"> + Return to preferences</a>"; + + return; + + } + } + + xml_parser_free($xml_parser); + fclose($fp); + + } else { + print("Error: Could not open OPML input."); + } + + } else { + print "Error: please upload OPML file."; + } + + print "<p><a class=\"button\" href=\"prefs.php\"> + Return to preferences</a>"; + + print "</div></body></html>"; + + } + + pg_close($link); + ?> @@ -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 @@ -32,7 +32,7 @@ <div id="piggie"> </div> - <table class="prefAddFeed"> + <table class="prefAddFeed"><tr> <td><input id="fadd_link"></td> <td colspan="4" align="right"> <a class="button" href="javascript:addFeed()">Add feed</a></td></tr> @@ -40,6 +40,16 @@ <div id="feeds"> </div> + <hr> + + <h2>Import OPML</h2> + + <form enctype="multipart/form-data" method="POST" action="opml.php"> + <input type="hidden" name="MAX_FILE_SIZE" value="30000"> + File: <input id="opml_file" name="opml_file" type="file"> + <input class="button" name="op" onclick="return validateOpmlImport();" + type="submit" value="Import"> + </form> </td> </tr> <tr> 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; |