2016-03-28 14:29:05 +00:00
< ? php
2022-08-09 17:21:42 +00:00
/**
2024-01-02 20:57:26 +00:00
* @ copyright Copyright ( C ) 2010 - 2024 , the Friendica project
2022-08-09 17:21:42 +00:00
*
* @ 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 14:29:05 +00:00
* Name : frio
2023-03-21 03:16:32 +00:00
* Description : Responsive theme based on a modern HTML / CSS / JavaScript framework .
2022-12-15 03:25:53 +00:00
* Version : V . 1.0
2016-03-28 14:29:05 +00:00
* Author : Rabuzarus < https :// friendica . kommune4 . de / profile / rabuzarus >
2022-12-15 03:25:53 +00:00
* Maintainer : Hypolite Petovan < https :// friendica . mrpetovan . com / profile / hypolite >
2016-03-28 14:29:05 +00:00
*/
2018-02-05 00:23:49 +00:00
2017-04-30 04:07:00 +00:00
use Friendica\App ;
2018-02-05 00:23:49 +00:00
use Friendica\Content\Text\Plaintext ;
2018-12-26 15:06:05 +00:00
use Friendica\Core\Hook ;
2018-10-29 21:20:46 +00:00
use Friendica\Core\Logger ;
2018-10-31 17:25:38 +00:00
use Friendica\Core\Renderer ;
2018-07-21 12:40:21 +00:00
use Friendica\Database\DBA ;
2019-12-15 23:36:31 +00:00
use Friendica\DI ;
2020-08-02 07:54:18 +00:00
use Friendica\Model\Contact ;
2023-01-14 02:10:59 +00:00
use Friendica\Model\Item ;
2022-09-12 21:12:11 +00:00
use Friendica\Model\Profile ;
2017-04-30 04:07:00 +00:00
2020-08-20 02:58:00 +00:00
const FRIO_SCHEME_ACCENT_BLUE = '#1e87c2' ;
2020-08-20 02:58:21 +00: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' ;
2024-02-29 14:17:09 +00:00
const FRIO_DEFAULT_SCHEME = 'light' ;
const FRIO_CUSTOM_SCHEME = '---' ;
2022-07-12 23:48:36 +00: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 20:05:09 +00:00
function frio_init ( App $a )
{
2019-01-20 02:54:10 +00:00
global $frio ;
$frio = 'view/theme/frio' ;
2021-07-25 19:39:10 +00:00
$a -> setThemeInfoValue ( 'videowidth' , 622 );
2016-06-20 11:44:11 +00:00
2018-10-31 17:25:38 +00:00
Renderer :: setActiveTemplateEngine ( 'smarty3' );
2016-03-28 14:29:05 +00:00
2016-05-28 11:07:24 +00:00
// if the device is a mobile device set js is_mobile
// variable so the js scripts can use this information
2019-12-16 00:12:07 +00:00
if ( DI :: mode () -> isMobile () || DI :: mode () -> isMobile ()) {
2019-12-30 19:02:09 +00:00
DI :: page ()[ 'htmlhead' ] .= <<< EOT
2017-10-20 13:21:42 +00:00
< script type = " text/javascript " >
2016-05-28 11:07:24 +00:00
var is_mobile = 1 ;
</ script >
EOT ;
2018-01-01 20:05:09 +00:00
}
2016-03-28 14:29:05 +00:00
}
2018-01-01 20:05:09 +00:00
function frio_install ()
{
2018-12-26 15:06:05 +00: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 14:29:05 +00:00
2021-10-25 19:27:21 +00:00
Logger :: info ( 'installed theme frio' );
2016-03-28 14:29:05 +00:00
}
2016-04-14 12:07:20 +00:00
/**
2020-01-19 06:05:23 +00:00
* Replace friendica photo links hook
2017-01-09 12:06:08 +00:00
*
2016-04-14 12:07:20 +00: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
2023-03-22 04:07:45 +00:00
* to the photo file . This function is necessary to use colorbox
2016-04-14 12:07:20 +00:00
* in the network stream
2017-01-09 12:06:08 +00:00
*
2016-04-14 12:07:20 +00:00
* @ param array $body_info The item and its html output
*/
2023-01-14 02:10:59 +00:00
function frio_item_photo_links ( & $body_info )
2017-11-29 12:52:27 +00:00
{
2018-02-05 00:23:49 +00:00
$occurence = 0 ;
2018-04-25 00:12:43 +00:00
$p = Plaintext :: getBoundariesPosition ( $body_info [ 'html' ], '<a' , '>' );
2018-01-01 20:05:09 +00:00
while ( $p !== false && ( $occurence ++ < 500 )) {
2016-04-14 12:07:20 +00:00
$link = substr ( $body_info [ 'html' ], $p [ 'start' ], $p [ 'end' ] - $p [ 'start' ]);
2018-01-15 13:05:12 +00:00
$matches = [];
2016-04-14 12:07:20 +00:00
2018-04-25 00:12:43 +00:00
preg_match ( '/\/photos\/[\w]+\/image\/([\w]+)/' , $link , $matches );
2018-01-01 20:05:09 +00:00
if ( $matches ) {
2016-04-14 12:07:20 +00: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 00:33:08 +00:00
$newlink = preg_replace ( '#href="([^"]+)/contact/redir/(\d+)&url=([^"]+)"#' , 'href="$1/contact/redir/$2&quiet=1&url=$3"' , $newlink );
2016-04-14 12:07:20 +00:00
2018-01-01 20:05:09 +00:00
// Having any arguments to the link for Colorbox causes it to fetch base64 code instead of the image
2018-04-25 00:12:43 +00:00
$newlink = preg_replace ( '/\/[?&]zrl=([^&"]+)/' , '' , $newlink );
2016-04-14 12:07:20 +00:00
$body_info [ 'html' ] = str_replace ( $link , $newlink , $body_info [ 'html' ]);
}
2018-04-25 00:12:43 +00:00
$p = Plaintext :: getBoundariesPosition ( $body_info [ 'html' ], '<a' , '>' , $occurence );
2016-04-14 12:07:20 +00:00
}
}
2016-04-16 22:55:43 +00:00
/**
2020-01-19 06:05:23 +00:00
* Replace links of the item_photo_menu hook
2017-01-09 12:06:08 +00:00
*
2022-08-09 17:21:42 +00:00
* This function replaces the original message links
2016-04-16 22:55:43 +00:00
* to call the addToModal javascript function so this pages can
* be loaded in a bootstrap modal
2017-01-09 12:06:08 +00:00
*
2016-04-16 22:55:43 +00:00
* @ param array $arr Contains item data and the original photo_menu
*/
2023-01-14 02:10:59 +00:00
function frio_item_photo_menu ( & $arr )
2018-01-01 20:05:09 +00:00
{
2018-04-25 00:12:43 +00:00
foreach ( $arr [ 'menu' ] as $k => $v ) {
2022-08-09 17:21:42 +00:00
if ( strpos ( $v , 'message/new/' ) === 0 ) {
2018-04-25 00:12:43 +00:00
$v = 'javascript:addToModal(\'' . $v . '\'); return false;' ;
$arr [ 'menu' ][ $k ] = $v ;
2016-04-16 22:55:43 +00:00
}
}
}
2016-04-19 00:06:02 +00:00
2016-04-20 17:32:19 +00:00
/**
2020-01-19 06:05:23 +00:00
* Replace links of the contact_photo_menu
2017-01-09 12:06:08 +00:00
*
2022-08-09 17:21:42 +00:00
* This function replaces the original message link
2016-04-20 17:32:19 +00:00
* to call the addToModal javascript function so this pages can
* be loaded in a bootstrap modal
2016-04-20 17:59:44 +00: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 12:06:08 +00:00
*
2016-04-20 17:32:19 +00:00
* @ param array $args Contains contact data and the original photo_menu
*/
2023-01-14 02:10:59 +00:00
function frio_contact_photo_menu ( & $args )
2018-01-01 20:05:09 +00:00
{
2018-04-25 00:12:43 +00:00
$cid = $args [ 'contact' ][ 'id' ];
2018-08-25 13:48:00 +00:00
2022-08-09 17:21:42 +00:00
if ( ! empty ( $args [ 'menu' ][ 'pm' ])) {
2018-08-25 13:48:00 +00:00
$pmlink = $args [ 'menu' ][ 'pm' ][ 1 ];
} else {
$pmlink = '' ;
}
2016-04-20 17:32:19 +00:00
2023-03-21 03:13:56 +00:00
// Set the indicator for opening the status, profile and photo pages
2016-04-20 17:59:44 +00:00
// in a new tab to false if the contact a dfrn (friendica) contact
2023-03-22 04:08:41 +00:00
// We do this because we can go back on foreign friendica pages through
2023-03-22 03:17:52 +00:00
// friendicas "magic-link" which indicates a friendica user on foreign
2016-04-20 17:59:44 +00:00
// friendica servers as remote user or visitor
//
2017-01-09 12:06:08 +00:00
// The value for opening in a new tab is e.g. when
2018-04-25 00:12:43 +00:00
// $args['menu']['status'][2] is true. If the value of the [2] key is true
2016-04-20 17:59:44 +00:00
// and if it's a friendica contact we set it to false
2018-04-25 00:12:43 +00: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 17:59:44 +00:00
}
}
2022-08-09 17:21:42 +00: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 12:15:35 +00:00
// contact/entry.tpl)
2018-01-01 20:05:09 +00:00
if ( strpos ( $pmlink , 'message/new/' . $cid ) !== false ) {
2018-04-25 00:12:43 +00:00
$args [ 'menu' ][ 'pm' ][ 3 ] = 'modal' ;
2018-01-01 20:05:09 +00:00
}
2016-04-20 17:32:19 +00:00
}
2016-04-19 00:06:02 +00:00
/**
2020-01-19 06:05:23 +00:00
* Construct remote nav menu
2017-01-09 12:06:08 +00:00
*
2016-04-19 00:06:02 +00:00
* It creates a remote baseurl form $_SESSION for remote users and friendica
2017-01-09 12:06:08 +00:00
* visitors . This url will be added to some of the nav links . With this behaviour
2016-04-19 00:06:02 +00: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 12:06:08 +00:00
*
2021-05-10 23:03:33 +00: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 00:06:02 +00:00
*/
2023-01-14 02:10:59 +00:00
function frio_remote_nav ( array & $nav_info )
2018-01-01 20:05:09 +00:00
{
2022-07-12 23:48:36 +00:00
if ( DI :: mode () -> has ( App\Mode :: MAINTENANCEDISABLED )) {
// get the homelink from $_SESSION
2024-05-14 08:37:10 +00:00
$homelink = DI :: userSession () -> getMyUrl ();
2022-07-12 23:48:36 +00:00
if ( ! $homelink ) {
2022-10-18 19:10:37 +00:00
$homelink = DI :: session () -> get ( 'visitor_home' , '' );
2022-07-12 23:48:36 +00:00
}
2016-04-19 00:06:02 +00:00
2022-07-12 23:48:36 +00: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' ];
2023-01-14 02:10:59 +00:00
if ( DI :: userSession () -> isAuthenticated ()) {
$remoteUser = Contact :: selectFirst ( $fields , [ 'uid' => DI :: userSession () -> getLocalUserId (), 'self' => true ]);
2022-10-20 21:45:14 +00:00
} elseif ( ! DI :: userSession () -> getLocalUserId () && DI :: userSession () -> getRemoteUserId ()) {
$remoteUser = Contact :: getById ( DI :: userSession () -> getRemoteUserId (), $fields );
2022-07-12 23:48:36 +00:00
$nav_info [ 'nav' ][ 'remote' ] = DI :: l10n () -> t ( 'Guest' );
2024-05-14 08:37:10 +00:00
} elseif ( DI :: userSession () -> getMyUrl ()) {
2022-07-12 23:48:36 +00:00
$remoteUser = Contact :: getByURL ( $homelink , null , $fields );
$nav_info [ 'nav' ][ 'remote' ] = DI :: l10n () -> t ( 'Visitor' );
} else {
$remoteUser = null ;
}
2016-04-19 00:06:02 +00:00
2022-07-12 23:48:36 +00:00
if ( DBA :: isResult ( $remoteUser )) {
$nav_info [ 'userinfo' ] = [
'icon' => Contact :: getMicro ( $remoteUser ),
'name' => $remoteUser [ 'name' ],
];
$server_url = $remoteUser [ 'baseurl' ];
}
2016-04-19 00:06:02 +00:00
2022-10-20 21:45:14 +00:00
if ( ! DI :: userSession () -> getLocalUserId () && ! empty ( $server_url ) && ! is_null ( $remoteUser )) {
2022-07-12 23:48:36 +00: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 22:15:07 +00: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-12 23:48:36 +00: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 01:35:09 +00:00
$nav_info [ 'nav' ][ 'usermenu' ][] = [ $server_url . '/calendar/' , DI :: l10n () -> t ( 'Calendar' ), '' , DI :: l10n () -> t ( 'Your calendar' )];
2016-04-19 00:06:02 +00:00
2022-07-12 23:48:36 +00:00
// navbar links
$nav_info [ 'nav' ][ 'network' ] = [ $server_url . '/network' , DI :: l10n () -> t ( 'Network' ), '' , DI :: l10n () -> t ( 'Conversations from your friends' )];
2022-11-06 01:35:09 +00:00
$nav_info [ 'nav' ][ 'calendar' ] = [ $server_url . '/calendar' , DI :: l10n () -> t ( 'Calendar' ), '' , DI :: l10n () -> t ( 'Calendar' )];
2022-07-12 23:48:36 +00: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 00:06:02 +00:00
}
}
2018-01-01 20:05:09 +00:00
2023-01-14 02:10:59 +00:00
function frio_display_item ( & $arr )
2018-01-01 20:05:09 +00:00
{
2021-01-30 20:51:27 +00:00
// Add follow to the item menu
$followThread = [];
2018-06-19 16:27:54 +00:00
if (
2022-10-20 21:45:14 +00:00
DI :: userSession () -> getLocalUserId ()
&& in_array ( $arr [ 'item' ][ 'uid' ], [ 0 , DI :: userSession () -> getLocalUserId ()])
2022-09-12 21:12:11 +00:00
&& $arr [ 'item' ][ 'gravity' ] == Item :: GRAVITY_PARENT
2021-02-28 12:44:36 +00:00
&& ! $arr [ 'item' ][ 'self' ]
&& ! $arr [ 'item' ][ 'mention' ]
) {
2021-01-30 20:51:27 +00:00
$followThread = [
2017-08-02 13:52:11 +00:00
'menu' => 'follow_thread' ,
2020-01-18 19:52:34 +00:00
'title' => DI :: l10n () -> t ( 'Follow Thread' ),
2021-01-30 20:51:27 +00:00
'action' => 'doFollowThread(' . $arr [ 'item' ][ 'id' ] . ');' ,
2017-08-02 13:52:11 +00:00
'href' => '#'
2018-01-15 13:05:12 +00:00
];
2017-08-02 13:52:11 +00:00
}
2021-01-30 20:51:27 +00:00
$arr [ 'output' ][ 'follow_thread' ] = $followThread ;
2017-08-02 13:52:11 +00:00
}