Merge branch 'dev' of https://github.com/redmatrix/hubzilla into dev_merge

This commit is contained in:
zotlabs 2017-10-23 22:29:29 -07:00
commit 59a9f6bf02
7 changed files with 152 additions and 95 deletions

View File

@ -12,6 +12,12 @@ class Display extends \Zotlabs\Web\Controller {
function get($update = 0, $load = false) { function get($update = 0, $load = false) {
if(argc() > 1) {
$module_format = substr(argv(1),strrpos(argv(1),'.') + 1);
if(! in_array($module_format,['atom','zot','json']))
$module_format = 'html';
}
$checkjs = new \Zotlabs\Web\CheckJS(1); $checkjs = new \Zotlabs\Web\CheckJS(1);
if($load) if($load)
@ -22,8 +28,12 @@ class Display extends \Zotlabs\Web\Controller {
return; return;
} }
if(argc() > 1 && argv(1) !== 'load') if(argc() > 1 && argv(1) !== 'load') {
$item_hash = argv(1); $item_hash = argv(1);
if($module_format !== 'html') {
$item_hash = substr($item_hash,0,strrpos($item_hash,'.'));
}
}
if($_REQUEST['mid']) if($_REQUEST['mid'])
$item_hash = $_REQUEST['mid']; $item_hash = $_REQUEST['mid'];
@ -44,28 +54,28 @@ class Display extends \Zotlabs\Web\Controller {
$channel_acl = array( $channel_acl = array(
'allow_cid' => $channel['channel_allow_cid'], 'allow_cid' => $channel['channel_allow_cid'],
'allow_gid' => $channel['channel_allow_gid'], 'allow_gid' => $channel['channel_allow_gid'],
'deny_cid' => $channel['channel_deny_cid'], 'deny_cid' => $channel['channel_deny_cid'],
'deny_gid' => $channel['channel_deny_gid'] 'deny_gid' => $channel['channel_deny_gid']
); );
$x = array( $x = array(
'is_owner' => true, 'is_owner' => true,
'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''), 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''),
'default_location' => $channel['channel_location'], 'default_location' => $channel['channel_location'],
'nickname' => $channel['channel_address'], 'nickname' => $channel['channel_address'],
'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'), 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
'acl' => populate_acl($channel_acl), 'acl' => populate_acl($channel_acl),
'permissions' => $channel_acl, 'permissions' => $channel_acl,
'bang' => '', 'bang' => '',
'visitor' => true, 'visitor' => true,
'profile_uid' => local_channel(), 'profile_uid' => local_channel(),
'return_path' => 'channel/' . $channel['channel_address'], 'return_path' => 'channel/' . $channel['channel_address'],
'expanded' => true, 'expanded' => true,
'editor_autocomplete' => true, 'editor_autocomplete' => true,
'bbco_autocomplete' => 'bbcode', 'bbco_autocomplete' => 'bbcode',
'bbcode' => true, 'bbcode' => true,
'jotnets' => true 'jotnets' => true
); );
$o = '<div id="jot-popup">'; $o = '<div id="jot-popup">';
@ -139,10 +149,11 @@ class Display extends \Zotlabs\Web\Controller {
$static = ((local_channel()) ? channel_manual_conv_update(local_channel()) : 1); $static = ((local_channel()) ? channel_manual_conv_update(local_channel()) : 1);
//if the target item is not a post (eg a like) we want to address its thread parent // if the target item is not a post (eg a like) we want to address its thread parent
$mid = ((($target_item['verb'] == ACTIVITY_LIKE) || ($target_item['verb'] == ACTIVITY_DISLIKE)) ? $target_item['thr_parent'] : $target_item['mid']); $mid = ((($target_item['verb'] == ACTIVITY_LIKE) || ($target_item['verb'] == ACTIVITY_DISLIKE)) ? $target_item['thr_parent'] : $target_item['mid']);
//if we got a decoded hash we must encode it again before handing to javascript // if we got a decoded hash we must encode it again before handing to javascript
if($decoded) if($decoded)
$mid = 'b64.' . base64url_encode($mid); $mid = 'b64.' . base64url_encode($mid);
@ -152,32 +163,32 @@ class Display extends \Zotlabs\Web\Controller {
\App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array( \App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
'$baseurl' => z_root(), '$baseurl' => z_root(),
'$pgtype' => 'display', '$pgtype' => 'display',
'$uid' => '0', '$uid' => '0',
'$gid' => '0', '$gid' => '0',
'$cid' => '0', '$cid' => '0',
'$cmin' => '0', '$cmin' => '0',
'$cmax' => '99', '$cmax' => '99',
'$star' => '0', '$star' => '0',
'$liked' => '0', '$liked' => '0',
'$conv' => '0', '$conv' => '0',
'$spam' => '0', '$spam' => '0',
'$fh' => '0', '$fh' => '0',
'$nouveau' => '0', '$nouveau' => '0',
'$wall' => '0', '$wall' => '0',
'$static' => $static, '$static' => $static,
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1), '$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0), '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$search' => '', '$search' => '',
'$xchan' => '', '$xchan' => '',
'$order' => '', '$order' => '',
'$file' => '', '$file' => '',
'$cats' => '', '$cats' => '',
'$tags' => '', '$tags' => '',
'$dend' => '', '$dend' => '',
'$dbegin' => '', '$dbegin' => '',
'$verb' => '', '$verb' => '',
'$mid' => $mid '$mid' => $mid
)); ));
head_add_link([ head_add_link([
@ -195,11 +206,11 @@ class Display extends \Zotlabs\Web\Controller {
$sql_extra = public_permissions_sql($observer_hash); $sql_extra = public_permissions_sql($observer_hash);
if(($update && $load) || ($checkjs->disabled())) { if(($update && $load) || ($checkjs->disabled()) || ($module_format !== 'html')) {
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']),intval(\App::$pager['start'])); $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']),intval(\App::$pager['start']));
if($load || ($checkjs->disabled())) { if($load || ($checkjs->disabled()) || ($module_format !== 'html')) {
$r = null; $r = null;
require_once('include/channel.php'); require_once('include/channel.php');
@ -311,13 +322,61 @@ class Display extends \Zotlabs\Web\Controller {
$items = array(); $items = array();
} }
if ($checkjs->disabled()) {
$o .= conversation($items, 'display', $update, 'traditional'); switch($module_format) {
if ($items[0]['title'])
\App::$page['title'] = $items[0]['title'] . " - " . \App::$page['title']; case 'html':
}
else { if ($checkjs->disabled()) {
$o .= conversation($items, 'display', $update, 'client'); $o .= conversation($items, 'display', $update, 'traditional');
if ($items[0]['title'])
\App::$page['title'] = $items[0]['title'] . " - " . \App::$page['title'];
}
else {
$o .= conversation($items, 'display', $update, 'client');
}
break;
case 'atom':
$atom = replace_macros(get_markup_template('atom_feed.tpl'), array(
'$version' => xmlify(\Zotlabs\Lib\System::get_project_version()),
'$red' => xmlify(\Zotlabs\Lib\System::get_platform_name()),
'$feed_id' => xmlify(\App::$cmd),
'$feed_title' => xmlify(t('Article')),
'$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now', ATOM_TIME)),
'$author' => '',
'$owner' => '',
'$profile_page' => xmlify(z_root() . '/display/' . $target_item['mid']),
));
$x = [ 'xml' => $atom, 'channel' => $channel, 'observer_hash' => $observer_hash, 'params' => $params ];
call_hooks('atom_feed_top',$x);
$atom = $x['xml'];
// a much simpler interface
call_hooks('atom_feed', $atom);
if($items) {
$type = 'html';
foreach($items as $item) {
if($item['item_private'])
continue;
$atom .= atom_entry($item, $type, null, '', true, '', false);
}
}
call_hooks('atom_feed_end', $atom);
$atom .= '</feed>' . "\r\n";
header('Content-type: application/atom+xml');
echo $atom;
killme();
} }
if($updateable) { if($updateable) {

View File

@ -511,48 +511,20 @@ class Item extends \Zotlabs\Web\Controller {
require_once('include/text.php'); require_once('include/text.php');
// Markdown doesn't work correctly. Do not re-enable unless you're willing to fix it and support it. if($uid && $uid == $profile_uid && feature_enabled($uid,'markdown')) {
require_once('include/markdown.php');
$body = preg_replace_callback('/\[share(.*?)\]/ism','\share_shield',$body);
$body = markdown_to_bb($body,true,['preserve_lf' => true]);
$body = preg_replace_callback('/\[share(.*?)\]/ism','\share_unshield',$body);
// Sample that will probably give you grief - you must preserve the linebreaks }
// and provide the correct markdown interpretation and you cannot allow unfiltered HTML
// Markdown
// ========
//
// **bold** abcde
// fghijkl
// *italic*
// <img src="javascript:alert('hacked');" />
// if($uid && $uid == $profile_uid && feature_enabled($uid,'markdown')) {
// require_once('include/markdown.php');
// $body = escape_tags(trim($body));
// $body = str_replace("\n",'<br />', $body);
// $body = preg_replace_callback('/\[share(.*?)\]/ism','\share_shield',$body);
// $body = markdown_to_bb($body,true);
// $body = preg_replace_callback('/\[share(.*?)\]/ism','\share_unshield',$body);
// }
// BBCODE alert: the following functions assume bbcode input // BBCODE alert: the following functions assume bbcode input
// and will require alternatives for alternative content-types (text/html, text/markdown, text/plain, etc.) // and will require alternatives for alternative content-types (text/html, text/markdown, text/plain, etc.)
// we may need virtual or template classes to implement the possible alternatives // we may need virtual or template classes to implement the possible alternatives
// Work around doubled linefeeds in Tinymce 3.5b2
// First figure out if it's a status post that would've been
// created using tinymce. Otherwise leave it alone.
$plaintext = true;
// $plaintext = ((feature_enabled($profile_uid,'richtext')) ? false : true);
// if((! $parent) && (! $api_source) && (! $plaintext)) {
// $body = fix_mce_lf($body);
// }
// If we're sending a private top-level message with a single @-taggable channel as a recipient, @-tag it, if our pconfig is set. // If we're sending a private top-level message with a single @-taggable channel as a recipient, @-tag it, if our pconfig is set.
if((! $parent) && (get_pconfig($profile_uid,'system','tagifonlyrecip')) && (substr_count($str_contact_allow,'<') == 1) && ($str_group_allow == '') && ($str_contact_deny == '') && ($str_group_deny == '')) { if((! $parent) && (get_pconfig($profile_uid,'system','tagifonlyrecip')) && (substr_count($str_contact_allow,'<') == 1) && ($str_group_allow == '') && ($str_contact_deny == '') && ($str_group_deny == '')) {
$x = q("select abook_id, abconfig.v from abook left join abconfig on abook_xchan = abconfig.xchan and abook_channel = abconfig.chan and cat= 'their_perms' and abconfig.k = 'tag_deliver' and abconfig.v = 1 and abook_xchan = '%s' and abook_channel = %d limit 1", $x = q("select abook_id, abconfig.v from abook left join abconfig on abook_xchan = abconfig.xchan and abook_channel = abconfig.chan and cat= 'their_perms' and abconfig.k = 'tag_deliver' and abconfig.v = 1 and abook_xchan = '%s' and abook_channel = %d limit 1",
dbesc(str_replace(array('<','>'),array('',''),$str_contact_allow)), dbesc(str_replace(array('<','>'),array('',''),$str_contact_allow)),

View File

@ -65,6 +65,10 @@ function categories_widget($baseurl,$selected = '') {
if(! feature_enabled(App::$profile['profile_uid'],'categories')) if(! feature_enabled(App::$profile['profile_uid'],'categories'))
return ''; return '';
require_once('include/security.php');
$sql_extra = item_permissions_sql(App::$profile['profile_uid']);
$item_normal = item_normal(); $item_normal = item_normal();
$terms = array(); $terms = array();
@ -77,6 +81,7 @@ function categories_widget($baseurl,$selected = '') {
and item.owner_xchan = '%s' and item.owner_xchan = '%s'
and item.item_wall = 1 and item.item_wall = 1
$item_normal $item_normal
$sql_extra
order by term.term asc", order by term.term asc",
intval(App::$profile['profile_uid']), intval(App::$profile['profile_uid']),
intval(TERM_CATEGORY), intval(TERM_CATEGORY),
@ -105,6 +110,8 @@ function cardcategories_widget($baseurl,$selected = '') {
if(! feature_enabled(App::$profile['profile_uid'],'categories')) if(! feature_enabled(App::$profile['profile_uid'],'categories'))
return ''; return '';
$sql_extra = item_permissions_sql(App::$profile['profile_uid']);
$item_normal = "and item.item_hidden = 0 and item.item_type = 6 and item.item_deleted = 0 $item_normal = "and item.item_hidden = 0 and item.item_type = 6 and item.item_deleted = 0
and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_pending_remove = 0 and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_pending_remove = 0
and item.item_blocked = 0 "; and item.item_blocked = 0 ";
@ -118,6 +125,7 @@ function cardcategories_widget($baseurl,$selected = '') {
and term.otype = %d and term.otype = %d
and item.owner_xchan = '%s' and item.owner_xchan = '%s'
$item_normal $item_normal
$sql_extra
order by term.term asc", order by term.term asc",
intval(App::$profile['profile_uid']), intval(App::$profile['profile_uid']),
intval(TERM_CATEGORY), intval(TERM_CATEGORY),

View File

@ -363,6 +363,15 @@ function get_features($filtered = true) {
t('Post/Comment Tools'), t('Post/Comment Tools'),
[
'markdown',
t('Markdown'),
t('Use markdown for editing posts'),
false,
get_config('feature_lock','markdown'),
feature_level('markdown',2),
],
[ [
'commtag', 'commtag',
t('Community Tagging'), t('Community Tagging'),

View File

@ -49,14 +49,17 @@ function markdown_to_bb($s, $use_zrl = false, $options = []) {
$s = $x['text']; $s = $x['text'];
// Escaping the hash tags - doesn't always seem to work // Escaping the hash tags
// $s = preg_replace('/\#([^\s\#])/','\\#$1',$s);
// This seems to work
$s = preg_replace('/\#([^\s\#])/','&#35;$1',$s); $s = preg_replace('/\#([^\s\#])/','&#35;$1',$s);
$s = MarkdownExtra::defaultTransform($s); $s = MarkdownExtra::defaultTransform($s);
$s = str_replace("\r","",$s); if($options && $options['preserve_lf']) {
$s = str_replace(["\r","\n"],["",'<br>'],$s);
}
else {
$s = str_replace("\r","",$s);
}
$s = str_replace('&#35;','#',$s); $s = str_replace('&#35;','#',$s);

View File

@ -716,6 +716,10 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
$scaled = str_replace($scale_replace[0], $scale_replace[1], $mtch[3]); $scaled = str_replace($scale_replace[0], $scale_replace[1], $mtch[3]);
else else
$scaled = $mtch[3]; $scaled = $mtch[3];
if(! strpbrk(substr($scaled,0,1),'zhfmt'))
continue;
$i = z_fetch_url($scaled,true); $i = z_fetch_url($scaled,true);

View File

@ -15,7 +15,9 @@
<title>{{$feed_title}}</title> <title>{{$feed_title}}</title>
<generator uri="http://hubzilla.org" version="{{$version}}">{{$red}}</generator> <generator uri="http://hubzilla.org" version="{{$version}}">{{$red}}</generator>
<link rel="license" href="http://creativecommons.org/licenses/by/3.0/" /> <link rel="license" href="http://creativecommons.org/licenses/by/3.0/" />
{{if $profile_page}}
<link rel="alternate" type="text/html" href="{{$profile_page}}" /> <link rel="alternate" type="text/html" href="{{$profile_page}}" />
{{/if}}
{{if $author}} {{if $author}}
{{$author}} {{$author}}
{{/if}} {{/if}}