function importFile() { if (!(isLoggedIn() || $GLOBALS['config']['OPEN_SHAARLI'])) { die('Not allowed.'); } $LINKSDB = new linkdb(isLoggedIn() || $GLOBALS['config']['OPEN_SHAARLI']); // Read links from database (and filter private links if used it not logged in). $filename = $_FILES['filetoupload']['name']; $filesize = $_FILES['filetoupload']['size']; $data = file_get_contents($_FILES['filetoupload']['tmp_name']); $private = empty($_POST['private']) ? 0 : 1; // Should the links be imported as private ? $overwrite = !empty($_POST['overwrite']); // Should the imported links overwrite existing ones ? $import_count = 0; // Sniff file type: $type = 'unknown'; if (startsWith($data, '<!DOCTYPE NETSCAPE-Bookmark-file-1>')) { $type = 'netscape'; } // Netscape bookmark file (aka Firefox). // Then import the bookmarks. if ($type == 'netscape') { // This is a standard Netscape-style bookmark file. // This format is supported by all browsers (except IE, of course), also delicious, diigo and others. foreach (explode('<DT>', $data) as $html) { $link = array('linkdate' => '', 'title' => '', 'url' => '', 'description' => '', 'tags' => '', 'private' => 0); $d = explode('<DD>', $html); if (startswith($d[0], '<A ')) { $link['description'] = isset($d[1]) ? html_entity_decode(trim($d[1]), ENT_QUOTES, 'UTF-8') : ''; // Get description (optional) preg_match('!<A .*?>(.*?)</A>!i', $d[0], $matches); $link['title'] = isset($matches[1]) ? trim($matches[1]) : ''; // Get title $link['title'] = html_entity_decode($link['title'], ENT_QUOTES, 'UTF-8'); preg_match_all('! ([A-Z_]+)=\\"(.*?)"!i', $html, $matches, PREG_SET_ORDER); // Get all other attributes $raw_add_date = 0; foreach ($matches as $m) { $attr = $m[1]; $value = $m[2]; if ($attr == 'HREF') { $link['url'] = html_entity_decode($value, ENT_QUOTES, 'UTF-8'); } elseif ($attr == 'ADD_DATE') { $raw_add_date = intval($value); } elseif ($attr == 'PRIVATE') { $link['private'] = $value == '0' ? 0 : 1; } elseif ($attr == 'TAGS') { $link['tags'] = html_entity_decode(str_replace(',', ' ', $value), ENT_QUOTES, 'UTF-8'); } } if ($link['url'] != '') { if ($private == 1) { $link['private'] = 1; } $dblink = $LINKSDB->getLinkFromUrl($link['url']); // See if the link is already in database. if ($dblink == false) { // Link not in database, let's import it... if (empty($raw_add_date)) { $raw_add_date = time(); } // In case of shitty bookmark file with no ADD_DATE // Make sure date/time is not already used by another link. // (Some bookmark files have several different links with the same ADD_DATE) // We increment date by 1 second until we find a date which is not used in db. // (so that links that have the same date/time are more or less kept grouped by date, but do not conflict.) while (!empty($LINKSDB[date('Ymd_His', $raw_add_date)])) { $raw_add_date++; } // Yes, I know it's ugly. $link['linkdate'] = date('Ymd_His', $raw_add_date); $LINKSDB[$link['linkdate']] = $link; $import_count++; } else { if ($overwrite) { // If overwrite is required, we import link data, except date/time. $link['linkdate'] = $dblink['linkdate']; $LINKSDB[$link['linkdate']] = $link; $import_count++; } } } } } $LINKSDB->savedb(); echo '<script language="JavaScript">alert("File ' . $filename . ' (' . $filesize . ' bytes) was successfully processed: ' . $import_count . ' links imported.");document.location=\'?\';</script>'; } else { echo '<script language="JavaScript">alert("File ' . $filename . ' (' . $filesize . ' bytes) has an unknown file format. Nothing was imported.");document.location=\'?\';</script>'; } }