diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/Import/Importer.php | 81 | ||||
-rw-r--r-- | include/Import/refimport.php | 284 | ||||
-rw-r--r-- | include/language.php | 35 |
3 files changed, 34 insertions, 366 deletions
diff --git a/include/Import/Importer.php b/include/Import/Importer.php deleted file mode 100644 index 1fa677db0..000000000 --- a/include/Import/Importer.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php /** @file */ - -namespace Hubzilla\Import; - -/** - * @brief Class Import - * - */ -class Import { - - private $credentials = null; - - protected $itemlist = null; - protected $src_items = null; - protected $items = null; - - function get_credentials() { - return $this->credentials; - } - - function get_itemlist() { - return $this->itemlist; - } - - function get_item_ident($item) { - - } - - function get_item($item_ident) { - - } - - function get_taxonomy($item_ident) { - - } - - function get_children($item_ident) { - - } - - function convert_item($item_ident) { - - } - - function convert_taxonomy($item_ident) { - - } - - function convert_child($child) { - - } - - function store($item, $update = false) { - - } - - function run() { - $this->credentials = $this->get_credentials(); - $this->itemlist = $this->get_itemlist(); - if($this->itemlist) { - $this->src_items = array(); - $this->items = array(); - $cnt = 0; - foreach($this->itemlist as $item) { - $ident = $item->get_item_ident($item); - $this->src_items[$ident]['item'] = $this->get_item($ident); - $this->src_items[$ident]['taxonomy'] = $this->get_taxonomy($ident); - $this->src_items[$ident]['children'] = $this->get_children($ident); - $this->items[$cnt]['item'] = $this->convert_item($ident); - $this->items[$cnt]['item']['term'] = $this->convert_taxonomy($ident); - if($this->src_items[$ident]['children']) { - $this->items[$cnt]['children'] = array(); - foreach($this->src_items[$ident]['children'] as $child) { - $this[$cnt]['children'][] = $this->convert_child($child); - } - } - $cnt ++; - } - } - } -}
\ No newline at end of file diff --git a/include/Import/refimport.php b/include/Import/refimport.php deleted file mode 100644 index 04540a9bd..000000000 --- a/include/Import/refimport.php +++ /dev/null @@ -1,284 +0,0 @@ -<?php - -require_once('include/html2bbcode.php'); - -// Sample module for importing conversation data from Reflection CMS. Some preparation was used to -// dump relevant posts, categories and comments into individual JSON files, and also JSON dump of -// the user table to search for avatars. Importation was also batched in sets of 20 posts per page -// visit so as to survive shared hosting process limits. This provides some clues as how to handle -// WordPress imports, which use a somewhat similar DB structure. The batching and individual files -// might not be needed in VPS environments. As such this could be considered an extreme test case, but -// the importation was successful in all regards using this code. The module URL was visited repeatedly -// with a browser until all the posts had been imported. - - -define('REDMATRIX_IMPORTCHANNEL','mike'); -define('REFLECT_EXPORTUSERNAME','mike'); -define('REFLECT_BLOGNAME','Diary and Other Rantings'); -define('REFLECT_BASEURL','http://example.com/'); -define('REFLECT_USERFILE','user.json'); - -// set to true if you need to process everything again -define('REFLECT_OVERWRITE',false); - -// we'll only process a small number of posts at a time on a shared host. - -define('REFLECT_MAXPERRUN',30); - -function reflect_get_channel() { - - // this will be the channel_address or nickname of the red channel - - $c = q("select * from channel left join xchan on channel_hash = xchan_hash - where channel_address = '%s' limit 1", - dbesc(REDMATRIX_IMPORTCHANNEL) - ); - return $c[0]; -} - - -function refimport_content(&$a) { - - $channel = reflect_get_channel(); - - // load the user file. We need that to find the commenter's avatars - - $u = file_get_contents(REFLECT_USERFILE); - if($u) { - $users = json_decode($u,true); - } - - $ignored = 0; - $processed = 0; - - $files = glob('article/*'); - if(! $files) - return; - - foreach($files as $f) { - $s = file_get_contents($f); - $j = json_decode($s,true); - - if(! $j) - continue; - - $arr = array(); - - // see if this article was already processed - $r = q("select * from item where mid = '%s' and uid = %d limit 1", - dbesc($j['guid']), - intval($channel['channel_id']) - ); - if($r) { - if(REFLECT_OVERWRITE) - $arr['id'] = $r[0]['id']; - else { - $ignored ++; - rename($f,str_replace('article','done',$f)); - continue; - } - } - - $arr['uid'] = $channel['channel_account_id']; - $arr['aid'] = $channel['channel_id']; - $arr['mid'] = $arr['parent_mid'] = $j['guid']; - $arr['created'] = $j['created']; - $arr['edited'] = $j['edited']; - $arr['author_xchan'] = $channel['channel_hash']; - $arr['owner_xchan'] = $channel['channel_hash']; - $arr['app'] = REFLECT_BLOGNAME; - - $arr['item_origin'] = 1; - $arr['item_wall'] = 1; - $arr['item_thread_top'] = 1; - - $arr['verb'] = ACTIVITY_POST; - - // this is an assumption - $arr['comment_policy'] = 'contacts'; - - - // import content. In this case the content is XHTML. - - $arr['title'] = html2bbcode($j['title']); - $arr['title'] = htmlspecialchars($arr['title'],ENT_COMPAT,'UTF-8',false); - - - $arr['body'] = html2bbcode($j['body']); - $arr['body'] = htmlspecialchars($arr['body'],ENT_COMPAT,'UTF-8',false); - - - // convert relative urls to other posts on that service to absolute url on our service. - $arr['body'] = preg_replace_callback("/\[url\=\/+article\/(.*?)\](.*?)\[url\]/",'reflect_article_callback',$arr['body']); - - // also import any photos - $arr['body'] = preg_replace_callback("/\[img(.*?)\](.*?)\[\/img\]/",'reflect_photo_callback',$arr['body']); - - - // add categories - - if($j['taxonomy'] && is_array($j['taxonomy']) && count($j['taxonomy'])) { - $arr['term'] = array(); - foreach($j['taxonomy'] as $tax) { - $arr['term'][] = array( - 'uid' => $channel['channel_id'], - 'type' => TERM_CATEGORY, - 'otype' => TERM_OBJ_POST, - 'term' => trim($tax['name']), - 'url' => $channel['xchan_url'] . '?f=&cat=' . urlencode(trim($tax['name'])) - ); - } - } - - // store the item - - if($arr['id']) - item_store_update($arr); - else - item_store($arr); - - // if there are any comments, process them - // $comment['registered'] is somebody with an account on the system. Others are mostly anonymous - - if($j['comments']) { - foreach($j['comments'] as $comment) { - $user = (($comment['registered']) ? reflect_find_user($users,$comment['author']) : null); - reflect_comment_store($channel,$arr,$comment,$user); - } - } - $processed ++; - - if(REFLECT_MAXPERRUN && $processed > REFLECT_MAXPERRUN) - break; - } - return 'processed: ' . $processed . EOL . 'completed: ' . $ignored . EOL; - -} - -function reflect_article_callback($matches) { - return '[zrl=' . z_root() . '/display/'. $matches[1] . ']' . $matches[2] . '[/zrl]'; -} - -function reflect_photo_callback($matches) { - - if(strpos($matches[2],'http') !== false) - return $matches[0]; - - $prefix = REFLECT_BASEURL; - $x = z_fetch_url($prefix.$matches[2],true); - - $hash = basename($matches[2]); - - if($x['success']) { - $channel = reflect_get_channel(); - require_once('include/photos.php'); - $p = photo_upload($channel,$channel, - array('data' => $x['body'], - 'resource_id' => str_replace('-','',$hash), - 'filename' => $hash . '.jpg', - 'type' => 'image/jpeg', - 'visible' => false - ) - ); - - if($p['success']) - $newlink = $p['resource_id'] . '-0.jpg'; - - - // import photo and locate the link for it. - return '[zmg]' . z_root() . '/photo/' . $newlink . '[/zmg]'; - - } - // no replacement. Leave it alone. - return $matches[0]; -} - -function reflect_find_user($users,$name) { - if($users) { - foreach($users as $x) { - if($x['name'] === $name) { - return $x; - } - } - } - - return false; - -} - -function reflect_comment_store($channel,$post,$comment,$user) { - - // if the commenter was the channel owner, use their hubzilla xchan - - if($comment['author'] === REFLECT_EXPORTUSERNAME && $comment['registered']) - $hash = $channel['xchan_hash']; - else { - // we need a unique hash for the commenter. We don't know how many may have supplied - // http://yahoo.com as their URL, so we'll use their avatar guid if they have one. - // anonymous folks may get more than one xchan_hash if they commented more than once. - - $hash = (($comment['registered'] && $user) ? $user['avatar'] : ''); - if(! $hash) - $hash = random_string() . '.unknown'; - - // create an xchan for them which will also import their profile photo - // they will have a network type 'unknown'. - - $x = array( - 'hash' => $hash, - 'guid' => $hash, - 'url' => (($comment['url']) ? $comment['url'] : z_root()), - 'photo' => (($user) ? REFLECT_BASEURL . $user['avatar'] : z_root() . '/' . get_default_profile_photo()), - 'name' => $comment['author'] - ); - xchan_store($x); - - } - - $arr = array(); - - $r = q("select * from item where mid = '%s' and uid = %d limit 1", - dbesc($comment['guid']), - intval($channel['channel_id']) - ); - if($r) { - if(REFLECT_OVERWRITE) - $arr['id'] = $r[0]['id']; - else - return; - } - - // this is a lot like storing the post except for subtle differences, like parent_mid, flags, author_xchan, - // and we don't have a comment edited field so use creation date - - $arr['uid'] = $channel['channel_account_id']; - $arr['aid'] = $channel['channel_id']; - $arr['mid'] = $comment['guid']; - $arr['parent_mid'] = $post['mid']; - $arr['created'] = $comment['created']; - $arr['edited'] = $comment['created']; - $arr['author_xchan'] = $hash; - $arr['owner_xchan'] = $channel['channel_hash']; - $arr['item_origin'] = 1; - $arr['item_wall'] = 1; - $arr['verb'] = ACTIVITY_POST; - $arr['comment_policy'] = 'contacts'; - - - $arr['title'] = html2bbcode($comment['title']); - $arr['title'] = htmlspecialchars($arr['title'],ENT_COMPAT,'UTF-8',false); - - - $arr['body'] = html2bbcode($comment['body']); - $arr['body'] = htmlspecialchars($arr['body'],ENT_COMPAT,'UTF-8',false); - $arr['body'] = preg_replace_callback("/\[url\=\/+article\/(.*?)\](.*?)\[url\]/",'reflect_article_callback',$arr['body']); - $arr['body'] = preg_replace_callback("/\[img(.*?)\](.*?)\[\/img\]/",'reflect_photo_callback',$arr['body']); - - // logger('comment: ' . print_r($arr,true)); - - if($arr['id']) - item_store_update($arr); - else - item_store($arr); - -} diff --git a/include/language.php b/include/language.php index f6f266685..d0ecd3a85 100644 --- a/include/language.php +++ b/include/language.php @@ -73,8 +73,35 @@ function get_best_language() { } } - if(! isset($preferred)) + + if(! isset($preferred)) { + + /* + * We could find no perfect match for any of the preferred languages. + * For cases where the preference is fr-fr and we have fr but *not* fr-fr + * run the test again and only look for the language base + * which should provide an interface they can sort of understand + */ + + if(isset($langs) && count($langs)) { + foreach ($langs as $lang => $v) { + if(strlen($lang) === 2) { + /* we have already checked this language */ + continue; + } + /* Check the base */ + $lang = strtolower(substr($lang,0,2)); + if(is_dir("view/$lang")) { + $preferred = $lang; + break; + } + } + } + } + + if(! isset($preferred)) { $preferred = 'unset'; + } $arr = array('langs' => $langs, 'preferred' => $preferred); @@ -86,6 +113,12 @@ function get_best_language() { return ((isset(App::$config['system']['language'])) ? App::$config['system']['language'] : 'en'); } +/* + * push_lang and pop_lang let you temporarily override the default language. + * Often used to email the administrator during a session created in another language. + * The stack is one level deep - so you must pop after every push. + */ + function push_lang($language) { |