Merge branch 'rhymix:master' into master

This commit is contained in:
Lastorder 2025-05-14 18:42:06 +09:00 committed by GitHub
commit 0739f82c49
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
28 changed files with 160 additions and 58 deletions

View file

@ -1,7 +1,7 @@
actor: Tester
paths:
tests: tests
log: tests/_output
output: tests/_output
data: tests/_data
helpers: tests/_support
bootstrap: _bootstrap.php

View file

@ -28,6 +28,7 @@ a img {
} @else {
word-break: $default_word_break;
word-wrap: break-word;
overflow-wrap: anywhere;
}
p {
margin: 0 0 $default_paragraph_spacing 0;

View file

@ -30,6 +30,7 @@ return array(
'homepage' => true,
'multidomain' => true,
'seo' => true,
'syndication' => true,
'trackback' => true,
),

View file

@ -453,8 +453,8 @@ class Formatter
}
if ($import_type === 'scss')
{
$import_content = preg_replace('!//.*?\n!s', '', $import_content);
$import_content = preg_replace('![\r\n]+!', ' ', $import_content);
$import_content = preg_replace('@(?<!:)//.*?\n@s', '', $import_content);
$import_content = preg_replace('@[\r\n]@', ' ', $import_content);
}
return trim($import_content);
}, $content);

View file

@ -91,7 +91,11 @@ class HTTP
$target_dir = dirname($target_filename);
if (!Storage::isDirectory($target_dir) && !Storage::createDirectory($target_dir))
{
return false;
return new Helpers\HTTPHelper(new Exception('Cannot create directory: ' . $target_dir));
}
if (!Storage::isWritable($target_dir) && (!Storage::exists($target_filename) || !Storage::isWritable($target_filename)))
{
return new Helpers\HTTPHelper(new Exception('No permission to write file: ' . $target_filename));
}
// Pass to request() with appropriate settings for the filename.

View file

@ -205,6 +205,7 @@
var menu_id = params.menu_id;
var menus = ret_obj.menus;
var html = "";
var isMobile = navigator.userAgent.match(/mobile/i);
if(this.loaded_popup_menus[menu_id]) {
html = this.loaded_popup_menus[menu_id];
@ -234,7 +235,11 @@
var matches = [];
/* if(icon) styleText = " style=\"background-image:url('"+icon+"')\" "; */
if (target === 'popup') {
click_str = 'onclick="popopen(this.href, \''+target+'\'); return false;"';
if (isMobile) {
click_str = 'onclick="openFullScreenIframe(this.href, \''+target+'\'); return false;"';
} else {
click_str = 'onclick="popopen(this.href, \''+target+'\'); return false;"';
}
classText += 'popup ';
} else if (target === 'javascript') {
click_str = 'onclick="'+url+'; return false; "';
@ -737,6 +742,23 @@ function zbxe_folder_close(id) {
jQuery("#folder_"+id).hide();
}
/**
* 팝업창 대신 전체 화면 iframe을 띄우는 함수
*/
function openFullScreenIframe(url, target) {
const iframe = document.createElement('iframe');
const iframe_sequence = String(Date.now()) + Math.round(Math.random() * 1000000);
iframe.setAttribute('id', '_rx_iframe_' + iframe_sequence);
iframe.setAttribute('name', target || ('_rx_iframe_' + iframe_sequence))
iframe.setAttribute('src', url + '&iframe_sequence=' + iframe_sequence);
iframe.setAttribute('width', '100%');
iframe.setAttribute('height', '100%');
iframe.setAttribute('frameborder', '0');
iframe.setAttribute('scrolling', 'no');
iframe.setAttribute('style', 'position:fixed; top:0; left:0; width:100%; height:100%; z-index:999999999; background-color: #fff; overflow-y:auto');
$(document.body).append(iframe);
}
/**
* @brief 팝업의 경우 내용에 맞춰 윈도우의 크기를 조절해줌
* 팝업의 내용에 맞게 크기를 늘리는 것은... 쉽게 되지는 않음.. .
@ -930,7 +952,12 @@ var objForSavedDoc = null;
function doDocumentLoad(obj) {
// 저장된 게시글 목록 불러오기
objForSavedDoc = obj.form;
popopen(request_uri.setQuery('module','document').setQuery('act','dispTempSavedList'));
var popup_url = request_uri.setQuery('module','document').setQuery('act','dispTempSavedList');
if (navigator.userAgent.match(/mobile/i)) {
openFullScreenIframe(popup_url);
} else {
popopen(popup_url);
}
}
/* 저장된 게시글의 선택 */
@ -940,7 +967,7 @@ function doDocumentSelect(document_srl, module) {
return;
}
if(module===undefined) {
if(module === undefined) {
module = 'document';
}
@ -961,7 +988,7 @@ function doDocumentSelect(document_srl, module) {
opener.location.href = url;
break;
default :
opener.location.href = opener.current_url.setQuery('document_srl', document_srl).setQuery('act', 'dispBoardWrite');
opener.location.href = opener.current_url.setQuery('act', 'dispBoardWrite').setQuery('document_srl', document_srl);
break;
}
window.close();

View file

@ -1,12 +1,41 @@
@version(2)
@load('../../modules/admin/tpl/css/admin.bootstrap.css')
@load('../../modules/admin/tpl/css/admin.css')
<div class="x popup">
{!! $content !!}
</div>
<script>
jQuery(function() {
setTimeout(setFixedPopupSize, 500);
});
var _isPoped = true;
</script>
@if (isset($iframe_sequence) && preg_match('/^\w+$/', $iframe_sequence))
<script>
const iframe_sequence = '{{ $iframe_sequence }}';
window.opener = window.parent;
window.close = function() {
const iframe = parent.document.getElementById('_rx_iframe_' + iframe_sequence);
if (iframe) {
iframe.remove();
}
};
</script>
<style>
.x.popup {
width: 100vw; height: 100vh;
display: flex; flex-direction: column;
}
.x.popup > form {
width: 100vw; height: 100vh;
display: flex; flex-direction: column;
margin: 0 !important;
}
.x_modal-header { flex: 0 0 auto; }
.x_modal-body { flex: 1; overflow: scroll; }
.x_modal-footer { padding-bottom: 24px !important; }
</style>
@else
<script>
jQuery(function() {
setTimeout(setFixedPopupSize, 500);
});
var _isPoped = true;
</script>
@endif

View file

@ -914,6 +914,7 @@ class BoardView extends Board
$oDocument->setDocument($document_srl);
$savedDoc = ($oDocument->get('module_srl') == $oDocument->get('member_srl'));
$oDocument->add('origin_module_srl', $oDocument->get('module_srl'));
$oDocument->add('module_srl', $this->module_srl);
if($oDocument->isExists())

View file

@ -12,8 +12,9 @@
<input type="hidden" name="xe_validator_id" value="modules/comment/tpl/1" />
<div class="x_modal-header">
<h1>{$lang->improper_comment_declare} <!--@if($type == 'cancel')-->{$lang->cmd_cancel}<!--@end--></h1>
<a class="close_window" href="javascript:window.close()">&times;</a>
</div>
<div class="x_modal-body x_form-horizontal" style="max-height:none">
<div class="x_modal-body">
<blockquote>
<section class="target_article">
<h1>{$lang->replies}</h1>
@ -32,11 +33,11 @@
</div>
</div>
<!--@end-->
<div class="x_modal-footer">
<span class="x_btn-group x_pull-right">
<button type="submit" class="x_btn x_btn-primary"><!--@if($type == 'cancel')-->{$lang->cmd_cancel_declare}<!--@else-->{$lang->cmd_submit}<!--@end--></button>
</span>
</div>
</div>
<div class="x_modal-footer">
<span class="x_btn-group x_pull-right">
<button type="submit" class="x_btn x_btn-primary"><!--@if($type == 'cancel')-->{$lang->cmd_cancel_declare}<!--@else-->{$lang->cmd_submit}<!--@end--></button>
</span>
</div>
</form>
<script cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/comment/tpl/1'">

View file

@ -21,7 +21,7 @@ class counterAdminView extends counter
}
/**
* Admin page
* Admin page
*
* @return Object
*/

View file

@ -15,7 +15,7 @@ class counter extends ModuleObject
*/
function moduleInstall()
{
}
/**
@ -30,7 +30,7 @@ class counter extends ModuleObject
{
return true;
}
return false;
}
@ -55,7 +55,7 @@ class counter extends ModuleObject
*/
function recompileCache()
{
}
}

View file

@ -70,11 +70,11 @@ class counterController extends counter
{
$oDB = DB::getInstance();
$oDB->begin();
$args = new stdClass();
$args->regdate = [0, $date = date('Ymd')];
executeQuery('counter.updateCounterUnique', $args);
$affected_rows = $oDB->getAffectedRows();
if ($affected_rows == 1)
{
@ -88,9 +88,9 @@ class counterController extends counter
$args->regdate = 0;
executeQuery('counter.insertTodayStatus', $args);
}
$this->insertLog();
$oDB->commit();
}
@ -119,15 +119,15 @@ class counterController extends counter
*/
public function insertTotalStatus()
{
}
/**
* @deprecated
*/
public function deleteSiteCounterLogs()
{
}
}
/* End of file counter.controller.php */

View file

@ -29,7 +29,7 @@ class counterModel extends counter
{
return true;
}
$args = new stdClass();
$args->regdate = $date;
$args->ipaddress = \RX_CLIENT_IP;
@ -39,24 +39,24 @@ class counterModel extends counter
{
$_SESSION['counter_logged'][$date] = true;
}
return $iplogged;
}
/**
* Check if a row of today's counter status exists
* Check if a row of today's counter status exists
*
* @deprecated
*/
public static function isInsertedTodayStatus()
{
}
/**
* Get access statistics for a given date
*
* @param mixed $selected_date Date(YYYYMMDD) list
* @param mixed $selected_date Date(YYYYMMDD) list
* @return Object
*/
public static function getStatus($selected_date)
@ -212,7 +212,7 @@ class counterModel extends counter
$status->max = $max;
$status->sum = $sum;
return $status;
}

View file

@ -12,6 +12,7 @@
<input type="hidden" name="xe_validator_id" value="modules/document/tpl/1" />
<div class="x_modal-header">
<h1>{$lang->improper_document_declare} <!--@if($type == 'cancel')-->{$lang->cmd_cancel}<!--@end--></h1>
<a class="close_window" href="javascript:window.close()">&times;</a>
</div>
<div class="x_modal-body x_form-horizontal" style="max-height:none">
<blockquote>

View file

@ -1,6 +1,8 @@
{@Context::addMetaTag('viewport', 'width=device-width', FALSE);}
<div>
<div class="x_modal-header">
<h1>{$lang->cmd_view_saved_document}</h1>
<a class="close_window" href="javascript:window.close()">&times;</a>
</div>
<div class="x_modal-body">
<!-- 목록 -->
@ -41,6 +43,7 @@
<a href="{getUrl('page',$page_navigation->last_page,'module_srl','')}" class="direction">{$lang->last_page} &rsaquo;</a>
</div>
</div>
</div>
<script type="text/javascript">
$(function() {

View file

@ -9,6 +9,7 @@
<div class="x_modal-header">
<h1>{$component_info->title}</h1>
<a class="close_window" href="javascript:window.close()">&times;</a>
</div>
<div class="x_modal-body">

View file

@ -4,6 +4,7 @@
{@Context::addMetaTag('viewport', 'width=device-width', FALSE);}
<div class="x_modal-header">
<h1>{$component_info->title}</h1>
<a class="close_window" href="javascript:window.close()">&times;</a>
</div>
<div class="x_modal-body">
<form action="./" method="get" onSubmit="return false" id="fo" class="x_form-horizontal">

View file

@ -4,6 +4,7 @@
{@Context::addMetaTag('viewport', 'width=device-width', FALSE);}
<div class="x_modal-header">
<h1>{$component_info->title}</h1>
<a class="close_window" href="javascript:window.close()">&times;</a>
</div>
<div class="x_modal-body">
<form action="./" method="get" onSubmit="return false" id="fo" class="x_form-horizontal">

View file

@ -11,6 +11,7 @@
</script>
<div class="x_modal-header">
<h1>{$component_info->title}</h1>
<a class="close_window" href="javascript:window.close()">&times;</a>
</div>
<div class="x_modal-body">
<form action="./" method="post" id="fo_component" onSubmit="procFilter(this, insert_poll); return false;" class="x_form-horizontal">
@ -89,12 +90,12 @@
<th scope="row"><div>{$lang->poll_title}</div></th>
<td><input type="text" name="title_tidx" /></td>
</tr>
<tr>
<th scope="row"><div>{$lang->poll_item} 1</div></th>
<td><input type="text" name="item_tidx_1" /></td>
</tr>
<tr>
<th scope="row"><div>{$lang->poll_item} 2</div></th>
<td><input type="text" name="item_tidx_2" /></td>

View file

@ -55,12 +55,23 @@ class EditorView extends Editor
{
// add a css file
Context::loadFile($this->module_path."tpl/css/editor.css", true);
// List variables
$editor_sequence = Context::get('editor_sequence');
$component = Context::get('component');
$iframe_sequence = Context::get('iframe_sequence');
if (empty($editor_sequence) || !ctype_alnum($editor_sequence))
{
return new BaseObject(-1, 'msg_invalid_request');
}
if (isset($iframe_sequence) && !ctype_alnum($iframe_sequence))
{
return new BaseObject(-1, 'msg_invalid_request');
}
$component = Context::get('component');
$site_module_info = Context::get('site_module_info');
$site_srl = (int)$site_module_info->site_srl;
// Get compoenet object
$oComponent = EditorModel::getComponentObject($component, $editor_sequence, $site_srl);
if(!$oComponent->toBool())

View file

@ -87,7 +87,6 @@ $(function() {
// Patch for iOS: https://github.com/rhymix/rhymix/issues/932
if (config.ios_patch) {
settings.loadXeComponent = false;
$('head').append('<style>'
+ '.cke_wysiwyg_div { padding: 8px !important; }'
+ 'html { min-width: unset; min-height: unset; width: unset; height: unset; margin: unset; padding: unset; }'
@ -102,7 +101,7 @@ $(function() {
{ name: 'styles', items: [ 'Font', 'FontSize', '-', 'Bold', 'Italic', 'Underline', 'Strike', 'TextColor', 'BGColor' ] },
{ name: 'paragraph', items: [ 'JustifyLeft', 'JustifyCenter', 'JustifyRight' ] },
{ name: 'clipboard', items: [ 'Cut', 'Copy', 'Paste' ] },
{ name: 'insert', items: [ 'Link', 'Image', 'Table' ] },
{ name: 'insert', items: [ 'Link', 'Image', 'Table', 'poll_maker' ] },
{ name: 'tools', items: [ 'Maximize', '-', 'Source' ] }
];
}

View file

@ -210,7 +210,11 @@ function openComponent(component_name, editor_sequence, manual_url) {
if(typeof(manual_url)!="undefined" && manual_url) popup_url += "&manual_url="+escape(manual_url);
if(typeof(current_mid)!="undefined" && current_mid) popup_url += "&mid="+escape(current_mid);
popopen(popup_url, 'editorComponent');
if (navigator.userAgent.match(/mobile/i)) {
openFullScreenIframe(popup_url, 'editorComponent');
} else {
popopen(popup_url, 'editorComponent');
}
}
// 더블클릭 이벤트 발생시에 본문내에 포함된 컴포넌트를 찾는 함수
@ -238,7 +242,12 @@ function editorSearchComponent(evt) {
editorPrevNode = obj;
if(editorMode[editor_sequence]=='html') return;
popopen(request_uri+"?module=widget&act=dispWidgetGenerateCodeInPage&selected_widget="+widget+"&module_srl="+editor_sequence,'GenerateCodeInPage');
var popup_url = request_uri+"?module=widget&act=dispWidgetGenerateCodeInPage&selected_widget="+widget+"&module_srl="+editor_sequence
if (navigator.userAgent.match(/mobile/i)) {
openFullScreenIframe(popup_url, 'GenerateCodeInPage');
} else {
popopen(popup_url, 'GenerateCodeInPage');
}
return;
}

View file

@ -1,3 +1 @@
<div>
{$popup_content|noescape}
</div>

View file

@ -391,7 +391,7 @@ class importerAdminController extends importer
$obj->signature = base64_decode($xmlObj->member->signature->body);
$obj->regdate = base64_decode($xmlObj->member->regdate->body);
$obj->last_login = base64_decode($xmlObj->member->last_login->body);
$obj->extra_vars = new stdClass();
if($xmlObj->member->extra_vars)
{
foreach($xmlObj->member->extra_vars as $key => $val)
@ -416,7 +416,6 @@ class importerAdminController extends importer
{
$obj->email_address = $obj->user_id . '@example.com';
}
list($obj->email_id, $obj->email_host) = explode('@', $obj->email);
// Set the mailing option
if($obj->allow_mailing!='Y') $obj->allow_mailing = 'N';
// Set the message option
@ -426,10 +425,8 @@ class importerAdminController extends importer
if(!$obj->last_login) $obj->last_login = $obj->regdate;
// Set the list order
$obj->list_order = -1 * $obj->member_srl;
// List extra vars
$extra_vars = $obj->extra_vars;
unset($obj->extra_vars);
$obj->extra_vars = serialize($extra_vars);
// Serialize extra vars
$obj->extra_vars = serialize($obj->extra_vars);
// Check if the same user ID exists
$args = new stdClass;
$args->user_id = $obj->user_id;
@ -455,9 +452,18 @@ class importerAdminController extends importer
$obj->email_address = $obj->user_id . '@example.com';
}
list($obj->email_id, $obj->email_host) = explode('@', $obj->email_address);
if (!$obj->email_id)
{
$obj->email_id = '';
}
if (!$obj->email_host)
{
$obj->email_host = '';
}
// Add a member
$output = executeQuery('member.insertMember', $obj);
if($output->toBool() && !($obj->password))
{
// Send a mail telling the user to reset his password.

View file

@ -9,6 +9,7 @@
<div class="x_modal-header">
<h1>{$lang->cmd_spammer}</h1>
<a class="close_window" href="javascript:window.close()">&times;</a>
</div>
<form action="./" method="post" id="fo_management" onsubmit="return doSpammerManage();">
@ -79,14 +80,14 @@ function progressSpammerManage( data ) {
setTimeout( function() {
var info = data.progress + '%';
jQuery('#progressBar').width(data.progress + '%');
if( data.total_count != undefined && parseInt( data.total_count ) > 0 ) {
var doc_count = parseInt( data.total_count ) - parseInt( data.remain_count );
info = info + ' (' + doc_count + ' / ' + data.total_count + ')';
}
jQuery('#progress-info').text( info );
if(data.remain_count <= 0 || bSpammerManageProc === false) {
jQuery('.stop').hide();
if(data.remain_count <= 0) {
@ -96,7 +97,7 @@ function progressSpammerManage( data ) {
}
return;
}
doSpammerManage( data );
}, 500 );
}

View file

@ -4,6 +4,9 @@
.inc1 {
margin: 5px;
}
.inc1 > a[href^="https://rhymix.org/abc"] {
text-decoration: none;
}
.inc2 {
padding-left: 10px;
}

View file

@ -1,2 +1,2 @@
@charset "UTF-8";
@import url("//fonts.googleapis.com/css?family=Raleway:700,400");@import url("https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,700;1,400;1,700&display=swap");.inc1{margin:5px}.inc2{padding-left:10px}.partial1{display:flex}.partial2{display:none}.rhymix{color:#123456;background:url("../_data/formatter/foo/bar.jpg")}.rhymix span{font-family:"테스트", Raleway, monospace;margin:320px}/*# sourceMappingURL=scss.target2.map */
@import url("//fonts.googleapis.com/css?family=Raleway:700,400");@import url("https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,700;1,400;1,700&display=swap");.inc1{margin:5px}.inc1>a[href^="https://rhymix.org/abc"]{text-decoration:none}.inc2{padding-left:10px}.partial1{display:flex}.partial2{display:none}.rhymix{color:#123456;background:url("../_data/formatter/foo/bar.jpg")}.rhymix span{font-family:"테스트", Raleway, monospace;margin:320px}/*# sourceMappingURL=scss.target2.map */

View file

@ -1,3 +1,6 @@
.inc1 {
margin: $setting;
& > a[href^="https://rhymix.org/abc"] {
text-decoration:none;
}
}