2016-03-28 16:29:05 +02:00
< ? php
2022-08-09 19:21:42 +02:00
/**
* @ copyright Copyright ( C ) 2010 - 2022 , the Friendica project
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*
2016-03-28 16:29:05 +02:00
* Name : frio
2016-06-13 10:57:42 +02:00
* Description : Bootstrap V3 theme . The theme is currently under construction , so it is far from finished . For further information have a look at the < a href = " https://github.com/friendica/friendica/tree/develop/view/theme/frio/README.md " > ReadMe </ a >.
2018-09-05 18:31:09 +02:00
* Version : V . 0.8 . 5
2016-03-28 16:29:05 +02:00
* Author : Rabuzarus < https :// friendica . kommune4 . de / profile / rabuzarus >
*/
2018-02-05 01:23:49 +01:00
2017-04-30 06:07:00 +02:00
use Friendica\App ;
2018-02-05 01:23:49 +01:00
use Friendica\Content\Text\Plaintext ;
2018-01-15 15:50:06 +01:00
use Friendica\Content\Widget ;
2018-12-26 16:06:05 +01:00
use Friendica\Core\Hook ;
2018-10-29 22:20:46 +01:00
use Friendica\Core\Logger ;
2018-10-31 18:25:38 +01:00
use Friendica\Core\Renderer ;
2018-07-21 14:40:21 +02:00
use Friendica\Database\DBA ;
2019-12-16 00:36:31 +01:00
use Friendica\DI ;
2018-10-13 11:35:51 +02:00
use Friendica\Model ;
2022-09-12 23:12:11 +02:00
use Friendica\Model\Item ;
2020-08-02 09:54:18 +02:00
use Friendica\Model\Contact ;
2022-09-12 23:12:11 +02:00
use Friendica\Model\Profile ;
2018-10-14 20:03:22 +02:00
use Friendica\Module ;
2018-11-08 16:14:37 +01:00
use Friendica\Util\Strings ;
2017-04-30 06:07:00 +02:00
2020-08-20 04:58:00 +02:00
const FRIO_SCHEME_ACCENT_BLUE = '#1e87c2' ;
2020-08-20 04:58:21 +02:00
const FRIO_SCHEME_ACCENT_RED = '#b50404' ;
const FRIO_SCHEME_ACCENT_PURPLE = '#a54bad' ;
const FRIO_SCHEME_ACCENT_GREEN = '#218f39' ;
const FRIO_SCHEME_ACCENT_PINK = '#d900a9' ;
2022-07-13 01:48:36 +02:00
/*
* This script can be included even when the app is in maintenance mode which requires us to avoid any config call
*/
2018-01-01 21:05:09 +01:00
function frio_init ( App $a )
{
2019-01-20 03:54:10 +01:00
global $frio ;
$frio = 'view/theme/frio' ;
2016-06-20 13:44:11 +02:00
// disable the events module link in the profile tab
2021-07-25 21:39:10 +02:00
$a -> setThemeInfoValue ( 'events_in_profile' , false );
$a -> setThemeInfoValue ( 'videowidth' , 622 );
2016-06-20 13:44:11 +02:00
2018-10-31 18:25:38 +01:00
Renderer :: setActiveTemplateEngine ( 'smarty3' );
2016-03-28 16:29:05 +02:00
2016-05-28 13:07:24 +02:00
// if the device is a mobile device set js is_mobile
// variable so the js scripts can use this information
2019-12-16 01:12:07 +01:00
if ( DI :: mode () -> isMobile () || DI :: mode () -> isMobile ()) {
2019-12-30 20:02:09 +01:00
DI :: page ()[ 'htmlhead' ] .= <<< EOT
2017-10-20 15:21:42 +02:00
< script type = " text/javascript " >
2016-05-28 13:07:24 +02:00
var is_mobile = 1 ;
</ script >
EOT ;
2018-01-01 21:05:09 +01:00
}
2016-03-28 16:29:05 +02:00
}
2018-01-01 21:05:09 +01:00
function frio_install ()
{
2018-12-26 16:06:05 +01:00
Hook :: register ( 'prepare_body_final' , 'view/theme/frio/theme.php' , 'frio_item_photo_links' );
Hook :: register ( 'item_photo_menu' , 'view/theme/frio/theme.php' , 'frio_item_photo_menu' );
Hook :: register ( 'contact_photo_menu' , 'view/theme/frio/theme.php' , 'frio_contact_photo_menu' );
Hook :: register ( 'nav_info' , 'view/theme/frio/theme.php' , 'frio_remote_nav' );
Hook :: register ( 'display_item' , 'view/theme/frio/theme.php' , 'frio_display_item' );
2016-03-28 16:29:05 +02:00
2021-10-25 21:27:21 +02:00
Logger :: info ( 'installed theme frio' );
2016-03-28 16:29:05 +02:00
}
2016-04-14 14:07:20 +02:00
/**
2020-01-19 07:05:23 +01:00
* Replace friendica photo links hook
2017-01-09 13:06:08 +01:00
*
2016-04-14 14:07:20 +02:00
* This function does replace the links to photos
* of other friendica users . Original the photos are
* linked to the photo page . Now they will linked directly
* to the photo file . This function is nessesary to use colorbox
* in the network stream
2017-01-09 13:06:08 +01:00
*
* @ param App $a Unused but required by hook definition
2016-04-14 14:07:20 +02:00
* @ param array $body_info The item and its html output
*/
2017-11-29 13:52:27 +01:00
function frio_item_photo_links ( App $a , & $body_info )
{
2018-02-05 01:23:49 +01:00
$occurence = 0 ;
2018-04-25 02:12:43 +02:00
$p = Plaintext :: getBoundariesPosition ( $body_info [ 'html' ], '<a' , '>' );
2018-01-01 21:05:09 +01:00
while ( $p !== false && ( $occurence ++ < 500 )) {
2016-04-14 14:07:20 +02:00
$link = substr ( $body_info [ 'html' ], $p [ 'start' ], $p [ 'end' ] - $p [ 'start' ]);
2018-01-15 14:05:12 +01:00
$matches = [];
2016-04-14 14:07:20 +02:00
2018-04-25 02:12:43 +02:00
preg_match ( '/\/photos\/[\w]+\/image\/([\w]+)/' , $link , $matches );
2018-01-01 21:05:09 +01:00
if ( $matches ) {
2016-04-14 14:07:20 +02:00
// Replace the link for the photo's page with a direct link to the photo itself
$newlink = str_replace ( $matches [ 0 ], " /photo/ { $matches [ 1 ] } " , $link );
// Add a "quiet" parameter to any redir links to prevent the "XX welcomes YY" info boxes
2022-11-09 01:33:08 +01:00
$newlink = preg_replace ( '#href="([^"]+)/contact/redir/(\d+)&url=([^"]+)"#' , 'href="$1/contact/redir/$2&quiet=1&url=$3"' , $newlink );
2016-04-14 14:07:20 +02:00
2018-01-01 21:05:09 +01:00
// Having any arguments to the link for Colorbox causes it to fetch base64 code instead of the image
2018-04-25 02:12:43 +02:00
$newlink = preg_replace ( '/\/[?&]zrl=([^&"]+)/' , '' , $newlink );
2016-04-14 14:07:20 +02:00
$body_info [ 'html' ] = str_replace ( $link , $newlink , $body_info [ 'html' ]);
}
2018-04-25 02:12:43 +02:00
$p = Plaintext :: getBoundariesPosition ( $body_info [ 'html' ], '<a' , '>' , $occurence );
2016-04-14 14:07:20 +02:00
}
}
2016-04-17 00:55:43 +02:00
/**
2020-01-19 07:05:23 +01:00
* Replace links of the item_photo_menu hook
2017-01-09 13:06:08 +01:00
*
2022-08-09 19:21:42 +02:00
* This function replaces the original message links
2016-04-17 00:55:43 +02:00
* to call the addToModal javascript function so this pages can
* be loaded in a bootstrap modal
2017-01-09 13:06:08 +01:00
*
* @ param App $a Unused but required by the hook definition
2016-04-17 00:55:43 +02:00
* @ param array $arr Contains item data and the original photo_menu
*/
2018-01-01 21:05:09 +01:00
function frio_item_photo_menu ( App $a , & $arr )
{
2018-04-25 02:12:43 +02:00
foreach ( $arr [ 'menu' ] as $k => $v ) {
2022-08-09 19:21:42 +02:00
if ( strpos ( $v , 'message/new/' ) === 0 ) {
2018-04-25 02:12:43 +02:00
$v = 'javascript:addToModal(\'' . $v . '\'); return false;' ;
$arr [ 'menu' ][ $k ] = $v ;
2016-04-17 00:55:43 +02:00
}
}
}
2016-04-19 02:06:02 +02:00
2016-04-20 19:32:19 +02:00
/**
2020-01-19 07:05:23 +01:00
* Replace links of the contact_photo_menu
2017-01-09 13:06:08 +01:00
*
2022-08-09 19:21:42 +02:00
* This function replaces the original message link
2016-04-20 19:32:19 +02:00
* to call the addToModal javascript function so this pages can
* be loaded in a bootstrap modal
2016-04-20 19:59:44 +02:00
* Additionally the profile , status and photo page links will be changed
* to don ' t open in a new tab if the contact is a friendica contact .
2017-01-09 13:06:08 +01:00
*
2017-04-30 06:17:49 +02:00
* @ param App $a The app data
2016-04-20 19:32:19 +02:00
* @ param array $args Contains contact data and the original photo_menu
*/
2018-01-01 21:05:09 +01:00
function frio_contact_photo_menu ( App $a , & $args )
{
2018-04-25 02:12:43 +02:00
$cid = $args [ 'contact' ][ 'id' ];
2018-08-25 15:48:00 +02:00
2022-08-09 19:21:42 +02:00
if ( ! empty ( $args [ 'menu' ][ 'pm' ])) {
2018-08-25 15:48:00 +02:00
$pmlink = $args [ 'menu' ][ 'pm' ][ 1 ];
} else {
$pmlink = '' ;
}
2016-04-20 19:32:19 +02:00
2016-04-20 19:59:44 +02:00
// Set the the indicator for opening the status, profile and photo pages
// in a new tab to false if the contact a dfrn (friendica) contact
// We do this because we can go back on foreign friendica pages throuhg
// friendicas "magic-link" which indicates a friendica user on froreign
// friendica servers as remote user or visitor
//
2017-01-09 13:06:08 +01:00
// The value for opening in a new tab is e.g. when
2018-04-25 02:12:43 +02:00
// $args['menu']['status'][2] is true. If the value of the [2] key is true
2016-04-20 19:59:44 +02:00
// and if it's a friendica contact we set it to false
2018-04-25 02:12:43 +02:00
foreach ( $args [ 'menu' ] as $k => $v ) {
if ( $k === 'status' || $k === 'profile' || $k === 'photos' ) {
$v [ 2 ] = (( $args [ 'contact' ][ 'network' ] === 'dfrn' ) ? false : true );
$args [ 'menu' ][ $k ][ 2 ] = $v [ 2 ];
2016-04-20 19:59:44 +02:00
}
}
2022-08-09 19:21:42 +02:00
// Add to pm link a new key with the value 'modal'.
// Later we can make conditions in the corresponding templates (e.g.
2022-11-16 13:15:35 +01:00
// contact/entry.tpl)
2018-01-01 21:05:09 +01:00
if ( strpos ( $pmlink , 'message/new/' . $cid ) !== false ) {
2018-04-25 02:12:43 +02:00
$args [ 'menu' ][ 'pm' ][ 3 ] = 'modal' ;
2018-01-01 21:05:09 +01:00
}
2016-04-20 19:32:19 +02:00
}
2016-04-19 02:06:02 +02:00
/**
2020-01-19 07:05:23 +01:00
* Construct remote nav menu
2017-01-09 13:06:08 +01:00
*
2016-04-19 02:06:02 +02:00
* It creates a remote baseurl form $_SESSION for remote users and friendica
2017-01-09 13:06:08 +01:00
* visitors . This url will be added to some of the nav links . With this behaviour
2016-04-19 02:06:02 +02:00
* the user will come back to her / his own pages on his / her friendica server .
* Not all possible links are available ( notifications , administrator , manage ,
* notes aren ' t available because we have no way the check remote permissions ) ..
* Some links will point to the local pages because the user would expect
* local page ( these pages are : search , community , help , apps , directory ) .
2017-01-09 13:06:08 +01:00
*
2021-05-11 01:03:33 +02:00
* @ param App $a The App class
* @ param array $nav_info The original nav info array : nav , banner , userinfo , sitelocation
* @ throws Exception
2016-04-19 02:06:02 +02:00
*/
2021-05-11 01:03:33 +02:00
function frio_remote_nav ( App $a , array & $nav_info )
2018-01-01 21:05:09 +01:00
{
2022-07-13 01:48:36 +02:00
if ( DI :: mode () -> has ( App\Mode :: MAINTENANCEDISABLED )) {
// get the homelink from $_SESSION
2022-09-12 23:12:11 +02:00
$homelink = Profile :: getMyURL ();
2022-07-13 01:48:36 +02:00
if ( ! $homelink ) {
2022-10-18 21:10:37 +02:00
$homelink = DI :: session () -> get ( 'visitor_home' , '' );
2022-07-13 01:48:36 +02:00
}
2016-04-19 02:06:02 +02:00
2022-07-13 01:48:36 +02:00
// since $userinfo isn't available for the hook we write it to the nav array
// this isn't optimal because the contact query will be done now twice
$fields = [ 'id' , 'url' , 'avatar' , 'micro' , 'name' , 'nick' , 'baseurl' , 'updated' ];
if ( $a -> isLoggedIn ()) {
$remoteUser = Contact :: selectFirst ( $fields , [ 'uid' => $a -> getLoggedInUserId (), 'self' => true ]);
2022-10-20 23:45:14 +02:00
} elseif ( ! DI :: userSession () -> getLocalUserId () && DI :: userSession () -> getRemoteUserId ()) {
$remoteUser = Contact :: getById ( DI :: userSession () -> getRemoteUserId (), $fields );
2022-07-13 01:48:36 +02:00
$nav_info [ 'nav' ][ 'remote' ] = DI :: l10n () -> t ( 'Guest' );
2022-09-12 23:12:11 +02:00
} elseif ( Profile :: getMyURL ()) {
2022-07-13 01:48:36 +02:00
$remoteUser = Contact :: getByURL ( $homelink , null , $fields );
$nav_info [ 'nav' ][ 'remote' ] = DI :: l10n () -> t ( 'Visitor' );
} else {
$remoteUser = null ;
}
2016-04-19 02:06:02 +02:00
2022-07-13 01:48:36 +02:00
if ( DBA :: isResult ( $remoteUser )) {
$nav_info [ 'userinfo' ] = [
'icon' => Contact :: getMicro ( $remoteUser ),
'name' => $remoteUser [ 'name' ],
];
$server_url = $remoteUser [ 'baseurl' ];
}
2016-04-19 02:06:02 +02:00
2022-10-20 23:45:14 +02:00
if ( ! DI :: userSession () -> getLocalUserId () && ! empty ( $server_url ) && ! is_null ( $remoteUser )) {
2022-07-13 01:48:36 +02:00
// user menu
$nav_info [ 'nav' ][ 'usermenu' ][] = [ $server_url . '/profile/' . $remoteUser [ 'nick' ], DI :: l10n () -> t ( 'Status' ), '' , DI :: l10n () -> t ( 'Your posts and conversations' )];
$nav_info [ 'nav' ][ 'usermenu' ][] = [ $server_url . '/profile/' . $remoteUser [ 'nick' ] . '/profile' , DI :: l10n () -> t ( 'Profile' ), '' , DI :: l10n () -> t ( 'Your profile page' )];
2022-11-20 23:15:07 +01:00
// Kept for backwards-compatibility reasons, the remote server may not have updated to version 2022.12 yet
// @TODO Switch with the new routes by version 2023.12
//$nav_info['nav']['usermenu'][] = [$server_url . '/profile/' . $remoteUser['nick'] . '/photos', DI::l10n()->t('Photos'), '', DI::l10n()->t('Your photos')];
2022-07-13 01:48:36 +02:00
$nav_info [ 'nav' ][ 'usermenu' ][] = [ $server_url . '/photos/' . $remoteUser [ 'nick' ], DI :: l10n () -> t ( 'Photos' ), '' , DI :: l10n () -> t ( 'Your photos' )];
$nav_info [ 'nav' ][ 'usermenu' ][] = [ $server_url . '/profile/' . $remoteUser [ 'nick' ] . '/media' , DI :: l10n () -> t ( 'Media' ), '' , DI :: l10n () -> t ( 'Your postings with media' )];
2022-11-06 02:35:09 +01:00
$nav_info [ 'nav' ][ 'usermenu' ][] = [ $server_url . '/calendar/' , DI :: l10n () -> t ( 'Calendar' ), '' , DI :: l10n () -> t ( 'Your calendar' )];
2016-04-19 02:06:02 +02:00
2022-07-13 01:48:36 +02:00
// navbar links
$nav_info [ 'nav' ][ 'network' ] = [ $server_url . '/network' , DI :: l10n () -> t ( 'Network' ), '' , DI :: l10n () -> t ( 'Conversations from your friends' )];
2022-11-06 02:35:09 +01:00
$nav_info [ 'nav' ][ 'calendar' ] = [ $server_url . '/calendar' , DI :: l10n () -> t ( 'Calendar' ), '' , DI :: l10n () -> t ( 'Calendar' )];
2022-07-13 01:48:36 +02:00
$nav_info [ 'nav' ][ 'messages' ] = [ $server_url . '/message' , DI :: l10n () -> t ( 'Messages' ), '' , DI :: l10n () -> t ( 'Private mail' )];
$nav_info [ 'nav' ][ 'settings' ] = [ $server_url . '/settings' , DI :: l10n () -> t ( 'Settings' ), '' , DI :: l10n () -> t ( 'Account settings' )];
$nav_info [ 'nav' ][ 'contacts' ] = [ $server_url . '/contact' , DI :: l10n () -> t ( 'Contacts' ), '' , DI :: l10n () -> t ( 'Manage/edit friends and contacts' )];
$nav_info [ 'nav' ][ 'sitename' ] = DI :: config () -> get ( 'config' , 'sitename' );
}
2016-04-19 02:06:02 +02:00
}
}
2018-01-01 21:05:09 +01:00
function frio_display_item ( App $a , & $arr )
{
2021-01-30 21:51:27 +01:00
// Add follow to the item menu
$followThread = [];
2018-06-19 18:27:54 +02:00
if (
2022-10-20 23:45:14 +02:00
DI :: userSession () -> getLocalUserId ()
&& in_array ( $arr [ 'item' ][ 'uid' ], [ 0 , DI :: userSession () -> getLocalUserId ()])
2022-09-12 23:12:11 +02:00
&& $arr [ 'item' ][ 'gravity' ] == Item :: GRAVITY_PARENT
2021-02-28 13:44:36 +01:00
&& ! $arr [ 'item' ][ 'self' ]
&& ! $arr [ 'item' ][ 'mention' ]
) {
2021-01-30 21:51:27 +01:00
$followThread = [
2017-08-02 15:52:11 +02:00
'menu' => 'follow_thread' ,
2020-01-18 20:52:34 +01:00
'title' => DI :: l10n () -> t ( 'Follow Thread' ),
2021-01-30 21:51:27 +01:00
'action' => 'doFollowThread(' . $arr [ 'item' ][ 'id' ] . ');' ,
2017-08-02 15:52:11 +02:00
'href' => '#'
2018-01-15 14:05:12 +01:00
];
2017-08-02 15:52:11 +02:00
}
2021-01-30 21:51:27 +01:00
$arr [ 'output' ][ 'follow_thread' ] = $followThread ;
2017-08-02 15:52:11 +02:00
}