function ical_wrapper($ev) { if (!(is_array($ev) && count($ev))) { return ''; } $o .= "BEGIN:VCALENDAR"; $o .= "\r\nVERSION:2.0"; $o .= "\r\nMETHOD:PUBLISH"; $o .= "\r\nPRODID:-//" . get_config('system', 'sitename') . "//" . get_platform_name() . "//" . strtoupper(get_app()->language) . "\r\n"; if (array_key_exists('start', $ev)) { $o .= format_event_ical($ev); } else { foreach ($ev as $e) { $o .= format_event_ical($e); } } $o .= "\r\nEND:VCALENDAR\r\n"; return $o; }
function get_site_info() { global $db; global $a; $register_policy = array('REGISTER_CLOSED', 'REGISTER_APPROVE', 'REGISTER_OPEN'); $directory_mode = array('DIRECTORY_MODE_NORMAL', 'DIRECTORY_MODE_SECONDARY', 'DIRECTORY_MODE_PRIMARY', 256 => 'DIRECTORY_MODE_STANDALONE'); $sql_extra = ''; $r = q("select * from channel left join account on account_id = channel_account_id where ( account_roles & 4096 )>0 and account_default_channel = channel_id"); if ($r) { $admin = array(); foreach ($r as $rr) { if ($rr['channel_pageflags'] & PAGE_HUBADMIN) { $admin[] = array('name' => $rr['channel_name'], 'address' => $rr['channel_address'] . '@' . get_app()->get_hostname(), 'channel' => z_root() . '/channel/' . $rr['channel_address']); } } if (!$admin) { foreach ($r as $rr) { $admin[] = array('name' => $rr['channel_name'], 'address' => $rr['channel_address'] . '@' . get_app()->get_hostname(), 'channel' => z_root() . '/channel/' . $rr['channel_address']); } } } else { $admin = false; } $def_service_class = get_config('system', 'default_service_class'); if ($def_service_class) { $service_class = get_config('service_class', $def_service_class); } else { $service_class = false; } $visible_plugins = array(); if (is_array($a->plugins) && count($a->plugins)) { $r = q("select * from addon where hidden = 0"); if (count($r)) { foreach ($r as $rr) { $visible_plugins[] = $rr['name']; } } } sort($visible_plugins); if (@is_dir('.git') && function_exists('shell_exec')) { $commit = trim(@shell_exec('git log -1 --format="%h"')); } if (!isset($commit) || strlen($commit) > 16) { $commit = ''; } $site_info = get_config('system', 'info'); $site_name = get_config('system', 'sitename'); if (!get_config('system', 'hidden_version_siteinfo')) { $version = get_project_version(); $tag = get_std_version(); if (@is_dir('.git') && function_exists('shell_exec')) { $commit = trim(@shell_exec('git log -1 --format="%h"')); } if (!isset($commit) || strlen($commit) > 16) { $commit = ''; } } else { $version = $commit = ''; } //Statistics $channels_total_stat = intval(get_config('system', 'channels_total_stat')); $channels_active_halfyear_stat = intval(get_config('system', 'channels_active_halfyear_stat')); $channels_active_monthly_stat = intval(get_config('system', 'channels_active_monthly_stat')); $local_posts_stat = intval(get_config('system', 'local_posts_stat')); $hide_in_statistics = intval(get_config('system', 'hide_in_statistics')); $site_expire = intval(get_config('system', 'default_expire_days')); load_config('feature_lock'); $locked_features = array(); if (is_array($a->config['feature_lock']) && count($a->config['feature_lock'])) { foreach ($a->config['feature_lock'] as $k => $v) { if ($k === 'config_loaded') { continue; } $locked_features[$k] = intval($v); } } $data = array('version' => $version, 'version_tag' => $tag, 'commit' => $commit, 'url' => z_root(), 'plugins' => $visible_plugins, 'register_policy' => $register_policy[get_config('system', 'register_policy')], 'invitation_only' => intval(get_config('system', 'invitation_only')), 'directory_mode' => $directory_mode[get_config('system', 'directory_mode')], 'language' => get_config('system', 'language'), 'rss_connections' => intval(get_config('system', 'feed_contacts')), 'expiration' => $site_expire, 'default_service_restrictions' => $service_class, 'locked_features' => $locked_features, 'admin' => $admin, 'site_name' => $site_name ? $site_name : '', 'platform' => get_platform_name(), 'dbdriver' => $db->getdriver(), 'lastpoll' => get_config('system', 'lastpoll'), 'info' => $site_info ? $site_info : '', 'channels_total' => $channels_total_stat, 'channels_active_halfyear' => $channels_active_halfyear_stat, 'channels_active_monthly' => $channels_active_monthly_stat, 'local_posts' => $local_posts_stat, 'hide_in_statistics' => $hide_in_statistics); return $data; }
/** * @brief * * @param array $channel * @param string $observer_hash * @param array $params * @return string */ function get_feed_for($channel, $observer_hash, $params) { if (!channel) { http_status_exit(401); } if ($params['pages']) { if (!perm_is_allowed($channel['channel_id'], $observer_hash, 'view_pages')) { http_status_exit(403); } } else { if (!perm_is_allowed($channel['channel_id'], $observer_hash, 'view_stream')) { http_status_exit(403); } } $items = items_fetch(array('wall' => '1', 'datequery' => $params['begin'], 'datequery2' => $params['end'], 'start' => $params['start'], 'records' => $params['records'], 'direction' => $params['direction'], 'pages' => $params['pages'], 'order' => 'post', 'top' => $params['top'], 'cat' => $params['cat']), $channel, $observer_hash, CLIENT_MODE_NORMAL, get_app()->module); $feed_template = get_markup_template('atom_feed.tpl'); $atom = ''; $atom .= replace_macros($feed_template, array('$version' => xmlify(get_project_version()), '$red' => xmlify(get_platform_name()), '$feed_id' => xmlify($channel['xchan_url']), '$feed_title' => xmlify($channel['channel_name']), '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now', ATOM_TIME)), '$hub' => '', '$salmon' => '', '$name' => xmlify($channel['channel_name']), '$profile_page' => xmlify($channel['xchan_url']), '$mimephoto' => xmlify($channel['xchan_photo_mimetype']), '$photo' => xmlify($channel['xchan_photo_l']), '$thumb' => xmlify($channel['xchan_photo_m']), '$picdate' => '', '$uridate' => '', '$namdate' => '', '$birthday' => '', '$community' => '')); call_hooks('atom_feed', $atom); if ($items) { $type = 'html'; foreach ($items as $item) { if ($item['item_private']) { continue; } /** @BUG $owner is undefined in this call */ $atom .= atom_entry($item, $type, null, $owner, true); } } call_hooks('atom_feed_end', $atom); $atom .= '</feed>' . "\r\n"; return $atom; }
function help_content(&$a) { nav_set_selected('help'); if ($_REQUEST['search']) { $o .= '<div id="help-content" class="generic-content-wrapper">'; $o .= '<h2>' . t('Documentation Search') . ' - ' . htmlspecialchars($_REQUEST['search']) . '</h2>'; $r = search_doc_files($_REQUEST['search']); if ($r) { $o .= '<ul class="help-searchlist">'; foreach ($r as $rr) { $dirname = dirname($rr['sid']); $fname = basename($rr['sid']); $fname = substr($fname, 0, strrpos($fname, '.')); $path = trim(substr($dirname, 4), '/'); $o .= '<li><a href="help/' . ($path ? $path . '/' : '') . $fname . '" >' . ucwords(str_replace('_', ' ', notags($fname))) . '</a><br />' . str_replace('$Projectname', get_platform_name(), substr($rr['text'], 0, 200)) . '...<br /><br /></li>'; } $o .= '</ul>'; $o .= '</div>'; } return $o; } global $lang; $doctype = 'markdown'; $text = ''; if (argc() > 1) { $path = ''; for ($x = 1; $x < argc(); $x++) { if (strlen($path)) { $path .= '/'; } $path .= argv($x); } $title = basename($path); $text = load_doc_file('doc/' . $path . '.md'); $a->page['title'] = t('Help:') . ' ' . ucwords(str_replace('-', ' ', notags($title))); if (!$text) { $text = load_doc_file('doc/' . $path . '.bb'); if ($text) { $doctype = 'bbcode'; } $a->page['title'] = t('Help:') . ' ' . ucwords(str_replace('_', ' ', notags($title))); } if (!$text) { $text = load_doc_file('doc/' . $path . '.html'); if ($text) { $doctype = 'html'; } $a->page['title'] = t('Help:') . ' ' . ucwords(str_replace('-', ' ', notags($title))); } } if (!$text) { $text = load_doc_file('doc/Site.md'); $a->page['title'] = t('Help'); } if (!$text) { $doctype = 'bbcode'; $text = load_doc_file('doc/main.bb'); $a->page['title'] = t('Help'); } if (!strlen($text)) { header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . t('Not Found')); $tpl = get_markup_template("404.tpl"); return replace_macros($tpl, array('$message' => t('Page not found.'))); } if ($doctype === 'html') { $content = $text; } if ($doctype === 'markdown') { require_once 'library/markdown.php'; # escape #include tags $text = preg_replace('/#include/ism', '%%include', $text); $content = Markdown($text); $content = preg_replace('/%%include/ism', '#include', $content); } if ($doctype === 'bbcode') { require_once 'include/bbcode.php'; $content = bbcode($text); // bbcode retargets external content to new windows. This content is internal. $content = str_replace(' target="_blank"', '', $content); } $content = preg_replace_callback("/#include (.*?)\\;/ism", 'preg_callback_help_include', $content); return replace_macros(get_markup_template("help.tpl"), array('$title' => t('$Projectname Documentation'), '$content' => translate_projectname($content))); }
function zotinfo($arr) { $ret = array('success' => false); $zhash = x($arr, 'guid_hash') ? $arr['guid_hash'] : ''; $zguid = x($arr, 'guid') ? $arr['guid'] : ''; $zguid_sig = x($arr, 'guid_sig') ? $arr['guid_sig'] : ''; $zaddr = x($arr, 'address') ? $arr['address'] : ''; $ztarget = x($arr, 'target') ? $arr['target'] : ''; $zsig = x($arr, 'target_sig') ? $arr['target_sig'] : ''; $zkey = x($arr, 'key') ? $arr['key'] : ''; $mindate = x($arr, 'mindate') ? $arr['mindate'] : ''; $feed = x($arr, 'feed') ? intval($arr['feed']) : 0; if ($ztarget) { if (!$zkey || !$zsig || !rsa_verify($ztarget, base64url_decode($zsig), $zkey)) { logger('zfinger: invalid target signature'); $ret['message'] = t("invalid target signature"); return $ret; } } $r = null; if (strlen($zhash)) { $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash \n\t\t\twhere channel_hash = '%s' limit 1", dbesc($zhash)); } elseif (strlen($zguid) && strlen($zguid_sig)) { $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash \n\t\t\twhere channel_guid = '%s' and channel_guid_sig = '%s' limit 1", dbesc($zguid), dbesc($zguid_sig)); } elseif (strlen($zaddr)) { if (strpos($zaddr, '[system]') === false) { /* normal address lookup */ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash\n\t\t\t\twhere ( channel_address = '%s' or xchan_addr = '%s' ) limit 1", dbesc($zaddr), dbesc($zaddr)); } else { /** * The special address '[system]' will return a system channel if one has been defined, * Or the first valid channel we find if there are no system channels. * * This is used by magic-auth if we have no prior communications with this site - and * returns an identity on this site which we can use to create a valid hub record so that * we can exchange signed messages. The precise identity is irrelevant. It's the hub * information that we really need at the other end - and this will return it. * */ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash\n\t\t\t\twhere channel_system = 1 order by channel_id limit 1"); if (!$r) { $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash\n\t\t\t\t\twhere channel_removed = 0 order by channel_id limit 1"); } } } else { $ret['message'] = 'Invalid request'; return $ret; } if (!$r) { $ret['message'] = 'Item not found.'; return $ret; } $e = $r[0]; $id = $e['channel_id']; $sys_channel = intval($e['channel_system']) ? true : false; $special_channel = $e['channel_pageflags'] & PAGE_PREMIUM ? true : false; $adult_channel = $e['channel_pageflags'] & PAGE_ADULT ? true : false; $censored = $e['channel_pageflags'] & PAGE_CENSORED ? true : false; $searchable = $e['channel_pageflags'] & PAGE_HIDDEN ? false : true; $deleted = intval($e['xchan_deleted']) ? true : false; if ($deleted || $censored || $sys_channel) { $searchable = false; } $public_forum = false; $role = get_pconfig($e['channel_id'], 'system', 'permissions_role'); if ($role === 'forum' || $role === 'repository') { $public_forum = true; } else { // check if it has characteristics of a public forum based on custom permissions. $t = q("select abook_my_perms from abook where abook_channel = %d and abook_self = 1 limit 1", intval($e['channel_id'])); if ($t && ($t[0]['abook_my_perms'] & PERMS_W_TAGWALL && !($t[0]['abook_my_perms'] & PERMS_W_STREAM))) { $public_forum = true; } } // This is for birthdays and keywords, but must check access permissions $p = q("select * from profile where uid = %d and is_default = 1", intval($e['channel_id'])); $profile = array(); if ($p) { if (!intval($p[0]['publish'])) { $searchable = false; } $profile['description'] = $p[0]['pdesc']; $profile['birthday'] = $p[0]['dob']; if ($profile['birthday'] != '0000-00-00' && ($bd = z_birthday($p[0]['dob'], $e['channel_timezone'])) !== '') { $profile['next_birthday'] = $bd; } if ($age = age($p[0]['dob'], $e['channel_timezone'], '')) { $profile['age'] = $age; } $profile['gender'] = $p[0]['gender']; $profile['marital'] = $p[0]['marital']; $profile['sexual'] = $p[0]['sexual']; $profile['locale'] = $p[0]['locality']; $profile['region'] = $p[0]['region']; $profile['postcode'] = $p[0]['postal_code']; $profile['country'] = $p[0]['country_name']; $profile['about'] = $p[0]['about']; $profile['homepage'] = $p[0]['homepage']; $profile['hometown'] = $p[0]['hometown']; if ($p[0]['keywords']) { $tags = array(); $k = explode(' ', $p[0]['keywords']); if ($k) { foreach ($k as $kk) { if (trim($kk, " \t\n\r\v,")) { $tags[] = trim($kk, " \t\n\r\v,"); } } } if ($tags) { $profile['keywords'] = $tags; } } } $ret['success'] = true; // Communication details $ret['guid'] = $e['xchan_guid']; $ret['guid_sig'] = $e['xchan_guid_sig']; $ret['key'] = $e['xchan_pubkey']; $ret['name'] = $e['xchan_name']; $ret['name_updated'] = $e['xchan_name_date']; $ret['address'] = $e['xchan_addr']; $ret['photo_mimetype'] = $e['xchan_photo_mimetype']; $ret['photo'] = $e['xchan_photo_l']; $ret['photo_updated'] = $e['xchan_photo_date']; $ret['url'] = $e['xchan_url']; $ret['connections_url'] = $e['xchan_connurl'] ? $e['xchan_connurl'] : z_root() . '/poco/' . $e['channel_address']; $ret['target'] = $ztarget; $ret['target_sig'] = $zsig; $ret['searchable'] = $searchable; $ret['adult_content'] = $adult_channel; $ret['public_forum'] = $public_forum; if ($deleted) { $ret['deleted'] = $deleted; } if (intval($e['channel_removed'])) { $ret['deleted_locally'] = true; } // premium or other channel desiring some contact with potential followers before connecting. // This is a template - %s will be replaced with the follow_url we discover for the return channel. if ($special_channel) { $ret['connect_url'] = z_root() . '/connect/' . $e['channel_address']; } // This is a template for our follow url, %s will be replaced with a webbie $ret['follow_url'] = z_root() . '/follow?f=&url=%s'; $ztarget_hash = $ztarget && $zsig ? make_xchan_hash($ztarget, $zsig) : ''; $permissions = get_all_perms($e['channel_id'], $ztarget_hash, false); if ($ztarget_hash) { $permissions['connected'] = false; $b = q("select * from abook where abook_xchan = '%s' and abook_channel = %d limit 1", dbesc($ztarget_hash), intval($e['channel_id'])); if ($b) { $permissions['connected'] = true; } } $ret['permissions'] = $ztarget && $zkey ? crypto_encapsulate(json_encode($permissions), $zkey) : $permissions; if ($permissions['view_profile']) { $ret['profile'] = $profile; } // array of (verified) hubs this channel uses $x = zot_encode_locations($e); if ($x) { $ret['locations'] = $x; } $ret['site'] = array(); $ret['site']['url'] = z_root(); $ret['site']['url_sig'] = base64url_encode(rsa_sign(z_root(), $e['channel_prvkey'])); $ret['site']['zot_auth'] = z_root() . '/magic'; $dirmode = get_config('system', 'directory_mode'); if ($dirmode === false || $dirmode == DIRECTORY_MODE_NORMAL) { $ret['site']['directory_mode'] = 'normal'; } if ($dirmode == DIRECTORY_MODE_PRIMARY) { $ret['site']['directory_mode'] = 'primary'; } elseif ($dirmode == DIRECTORY_MODE_SECONDARY) { $ret['site']['directory_mode'] = 'secondary'; } elseif ($dirmode == DIRECTORY_MODE_STANDALONE) { $ret['site']['directory_mode'] = 'standalone'; } if ($dirmode != DIRECTORY_MODE_NORMAL) { $ret['site']['directory_url'] = z_root() . '/dirsearch'; } // hide detailed site information if you're off the grid if ($dirmode != DIRECTORY_MODE_STANDALONE) { $register_policy = intval(get_config('system', 'register_policy')); if ($register_policy == REGISTER_CLOSED) { $ret['site']['register_policy'] = 'closed'; } if ($register_policy == REGISTER_APPROVE) { $ret['site']['register_policy'] = 'approve'; } if ($register_policy == REGISTER_OPEN) { $ret['site']['register_policy'] = 'open'; } $access_policy = intval(get_config('system', 'access_policy')); if ($access_policy == ACCESS_PRIVATE) { $ret['site']['access_policy'] = 'private'; } if ($access_policy == ACCESS_PAID) { $ret['site']['access_policy'] = 'paid'; } if ($access_policy == ACCESS_FREE) { $ret['site']['access_policy'] = 'free'; } if ($access_policy == ACCESS_TIERED) { $ret['site']['access_policy'] = 'tiered'; } $ret['site']['accounts'] = account_total(); require_once 'include/identity.php'; $ret['site']['channels'] = channel_total(); $ret['site']['version'] = get_platform_name() . ' ' . RED_VERSION . '[' . DB_UPDATE_VERSION . ']'; $ret['site']['admin'] = get_config('system', 'admin_email'); $a = get_app(); $visible_plugins = array(); if (is_array($a->plugins) && count($a->plugins)) { $r = q("select * from addon where hidden = 0"); if ($r) { foreach ($r as $rr) { $visible_plugins[] = $rr['name']; } } } $ret['site']['plugins'] = $visible_plugins; $ret['site']['sitehash'] = get_config('system', 'location_hash'); $ret['site']['sitename'] = get_config('system', 'sitename'); $ret['site']['sellpage'] = get_config('system', 'sellpage'); $ret['site']['location'] = get_config('system', 'site_location'); $ret['site']['realm'] = get_directory_realm(); $ret['site']['project'] = get_platform_name(); } check_zotinfo($e, $x, $ret); call_hooks('zot_finger', $ret); return $ret; }
/** * @brief translate product name * Merging strings from different project names is problematic so we'll do that with a string replacement */ function translate_projectname($s) { return str_replace(array('$projectname', '$Projectname'), array(get_platform_name(), ucfirst(get_platform_name())), $s); }
function build_pagehead() { $user_scalable = local_channel() ? get_pconfig(local_channel(), 'system', 'user_scalable') : 1; if ($user_scalable === false) { $user_scalable = 1; } $interval = local_channel() ? get_pconfig(local_channel(), 'system', 'update_interval') : 80000; if ($interval < 10000) { $interval = 80000; } if (!x($this->page, 'title')) { $this->page['title'] = $this->config['system']['sitename']; } /* put the head template at the beginning of page['htmlhead'] * since the code added by the modules frequently depends on it * being first */ $tpl = get_markup_template('head.tpl'); $this->page['htmlhead'] = replace_macros($tpl, array('$user_scalable' => $user_scalable, '$baseurl' => $this->get_baseurl(), '$local_channel' => local_channel(), '$generator' => get_platform_name() . (get_project_version() ? ' ' . get_project_version() : ''), '$update_interval' => $interval, '$icon' => head_get_icon(), '$head_css' => head_get_css(), '$head_js' => head_get_js(), '$js_strings' => js_strings(), '$zid' => get_my_address(), '$channel_id' => $this->profile['uid'])) . $this->page['htmlhead']; // always put main.js at the end $this->page['htmlhead'] .= head_get_main_js(); }
function api_statusnet_config(&$a, $type) { load_config('system'); $name = get_config('system', 'sitename'); $server = $a->get_hostname(); $logo = $a->get_baseurl() . '/images/rm-64.png'; $email = get_config('system', 'admin_email'); $closed = get_config('system', 'register_policy') == REGISTER_CLOSED ? 'true' : 'false'; $private = get_config('system', 'block_public') ? 'true' : 'false'; $textlimit = (string) (get_config('system', 'max_import_size') ? get_config('system', 'max_import_size') : 200000); if (get_config('system', 'api_import_size')) { $texlimit = string(get_config('system', 'api_import_size')); } $ssl = get_config('system', 'have_ssl') ? 'true' : 'false'; $sslserver = $ssl === 'true' ? str_replace('http:', 'https:', $a->get_baseurl()) : ''; $config = array('site' => array('name' => $name, 'server' => $server, 'theme' => 'default', 'path' => '', 'logo' => $logo, 'fancy' => 'true', 'language' => 'en', 'email' => $email, 'broughtby' => '', 'broughtbyurl' => '', 'timezone' => 'UTC', 'closed' => $closed, 'inviteonly' => 'false', 'private' => $private, 'textlimit' => $textlimit, 'sslserver' => $sslserver, 'ssl' => $ssl, 'shorturllength' => '30', 'hubzilla' => array('PLATFORM_NAME' => get_platform_name(), 'RED_VERSION' => get_project_version(), 'ZOT_REVISION' => ZOT_REVISION, 'DB_UPDATE_VERSION' => get_update_version()))); return api_apply_template('config', $type, array('$config' => $config)); }
function linkinfo_content(&$a) { logger('linkinfo: ' . print_r($_REQUEST, true)); $text = null; $str_tags = ''; $br = "\n"; if (x($_GET, 'binurl')) { $url = trim(hex2bin($_GET['binurl'])); } else { $url = trim($_GET['url']); } if (substr($url, 0, 1) != '/' && substr($url, 0, 4) != 'http') { $url = 'http://' . $url; } if ($_GET['title']) { $title = strip_tags(trim($_GET['title'])); } if ($_GET['description']) { $text = strip_tags(trim($_GET['description'])); } if ($_GET['tags']) { $arr_tags = str_getcsv($_GET['tags']); if (count($arr_tags)) { array_walk($arr_tags, 'arr_add_hashes'); $str_tags = $br . implode(' ', $arr_tags) . $br; } } logger('linkinfo: ' . $url); $result = z_fetch_url($url, false, 0, array('novalidate' => true, 'nobody' => true)); if ($result['success']) { $hdrs = array(); $h = explode("\n", $result['header']); foreach ($h as $l) { list($k, $v) = array_map("trim", explode(":", trim($l), 2)); $hdrs[$k] = $v; } if (array_key_exists('Content-Type', $hdrs)) { $type = $hdrs['Content-Type']; } if ($type) { $zrl = is_matrix_url($url); if (stripos($type, 'image/') !== false) { if ($zrl) { echo $br . '[zmg]' . $url . '[/zmg]' . $br; } else { echo $br . '[img]' . $url . '[/img]' . $br; } killme(); } if (stripos($type, 'video/') !== false) { if ($zrl) { echo $br . '[zvideo]' . $url . '[/zvideo]' . $br; } else { echo $br . '[video]' . $url . '[/video]' . $br; } killme(); } if (stripos($type, 'audio/') !== false) { if ($zrl) { echo $br . '[zaudio]' . $url . '[/zaudio]' . $br; } else { echo $br . '[audio]' . $url . '[/audio]' . $br; } killme(); } } } $template = $br . '#^[url=%s]%s[/url]%s' . $br; $arr = array('url' => $url, 'text' => ''); call_hooks('parse_link', $arr); if (strlen($arr['text'])) { echo $arr['text']; killme(); } $x = oembed_process($url); if ($x) { echo $x; killme(); } if ($url && $title && $text) { $text = $br . '[quote]' . trim($text) . '[/quote]' . $br; $title = str_replace(array("\r", "\n"), array('', ''), $title); $result = sprintf($template, $url, $title ? $title : $url, $text) . $str_tags; logger('linkinfo (unparsed): returns: ' . $result); echo $result; killme(); } $siteinfo = parseurl_getsiteinfo($url); // If this is a Red site, use zrl rather than url so they get zids sent to them by default if (x($siteinfo, 'generator') && strpos($siteinfo['generator'], get_platform_name() . ' ') === 0) { $template = str_replace('url', 'zrl', $template); } if ($siteinfo["title"] == "") { echo sprintf($template, $url, $url, '') . $str_tags; killme(); } else { $text = $siteinfo["text"]; $title = $siteinfo["title"]; } $image = ""; if (sizeof($siteinfo["images"]) > 0) { /* Execute below code only if image is present in siteinfo */ $total_images = 0; $max_images = get_config('system', 'max_bookmark_images'); if ($max_images === false) { $max_images = 2; } else { $max_images = intval($max_images); } foreach ($siteinfo["images"] as $imagedata) { if ($url) { $image .= sprintf('[url=%s]', $url); } $image .= '[img=' . $imagedata["width"] . 'x' . $imagedata["height"] . ']' . $imagedata["src"] . '[/img]'; if ($url) { $image .= '[/url]'; } $image .= "\n"; $total_images++; if ($max_images && $max_images >= $total_images) { break; } } } if (strlen($text)) { $text = $br . '[quote]' . trim($text) . '[/quote]' . $br; } if ($image) { $text = $br . $br . $image . $text; } $title = str_replace(array("\r", "\n"), array('', ''), $title); $result = sprintf($template, $url, $title ? $title : $url, $text) . $str_tags; logger('linkinfo: returns: ' . $result, LOGGER_DEBUG); echo trim($result); killme(); }