<?php // (2021.1.24, 차재복, Cha Jae Bok, http://www.ktword.co.kr)
// 이미지 삽입, 링크 삽입, mathjax 처리
function text_display ($no, $abbr, $embed_arr) {
// $embed_arr[] : in_no, type, origin, text, code
// embed 처리 '{[(' ')]}' (embed 개선용 신 배열 만듬)
$new_embed_arr = embed_process($abbr,$embed_arr);
// MathJax (용어해설 텍스트에 그대로 삽입된 mathjax 처리)
if ( (strpos($abbr,'[#') !== false and strpos($abbr,'#]') !== false)
or (strpos($abbr,'{#') !== false and strpos($abbr,'#}') !== false) ) {
$abbr = mathjax_process($no, $abbr, $new_embed_arr, '{#','#}'); // $embed_arr : call by reference
$abbr = mathjax_process($no, $abbr, $new_embed_arr, '[#','#]'); // $embed_arr : call by reference
}
// 이미지,링크 삽입된 항목들을 순회 처리
foreach($new_embed_arr as $embeded) {
$replaced ='';
// 이미지
if ( $embeded[type] == 'g' ) {
// 실제 이미지
$replaced .= "<img src='/img_data/".$embeded[origin]."' alt='{$embeded[no]}_{$embeded[in_no]}'
data-embed='core' data-in_no='{$embeded[in_no]}' style='border:1px gray dashed;'>";
// 이미지 편집 버튼
$replaced .= "<button class='edit_btn' data-embed='extra' data-url='{$url}' data-text='{$embeded[text]}'
data-no='{$embeded[no]}' data-in_no='{$embeded[in_no]}' data-type='{$embeded[type]}'
style='padding:0;font-style:italic;font-size:11px;' title='{$embeded[in_no]}'>편집 ∨</button>";
// 이미지 처리
$replaced .= "<div contenteditable='false' data-embed='extra' data-in_no='{$embeded[in_no]}' style='display:none;border:1px dotted gray;'>";
$replaced .= "<form action='file_upload.php' method='post' class='img_upload' enctype='multipart/form-data'>";
$replaced .= "<input type='file' name='fileToUpload' />"; // accept='.jpg, .jpeg, .png'
$replaced .= "<input type='hidden' name='no' value='{$embeded[no]}' />";
$replaced .= "<input type='hidden' name='in_no' value='{$embeded[in_no]}' />";
$replaced .= "<input type='submit' value='Submit' />";
$replaced .= "</form>";
$replaced .= "</div>";
// 링크
} else if ( $embeded[type] == 'l' ) {
// 실제 링크
$url_arr = parse_url($embeded[origin]); // parse_url : url 성분별 배열화
$url = ( !empty($url_arr[scheme]) ? $embeded[origin] : "http://".$embeded[origin] ); // 혹시, 'http://' 없으면
$replaced .= "<div contenteditable='false' data-embed='core' data-in_no='{$embeded[in_no]}'
style='display:inline-block;border:1px gray dotted;'>";
$replaced .= "<a href='".$url."' target=new>".$embeded[text]."</a>";
$replaced .= "</div>";
// link 편집 버튼
$replaced .= "<button class='edit_btn' data-embed='extra' data-url='{$url}' data-text='{$embeded[text]}'
data-no='{$embeded[no]}' data-in_no='{$embeded[in_no]}' data-type='{$embeded[type]}'
style='padding:0;font-style:italic;font-size:11px;' title='{$embeded[in_no]}'>편집 ∨</button>";
// mathjax
} else if ( $embeded[type] == 'm' ) {
// $replaced .= "<span style='margin:2px;'>";
// 실제 mathjax 변환 보여줌
$replaced .= "<div data-embed='core' data-in_no='{$embeded[in_no]}'
contentEditable='false'
style='display:inline-block;border:1px gray dotted;font-size:13px;'>";
$replaced .= $embeded[code];
$replaced .= "</div>";
// mathjax 편집 버튼
// 따옴표 처리
// $escaped_math = addcslashes($embeded[code],"'");
// $escaped_math = str_replace("'","'",$embeded[code]);
$escaped_math = htmlspecialchars($embeded[code], ENT_QUOTES);
$replaced .= "<button class='edit_btn' data-embed='extra'
data-math='{$escaped_math}' data-no='{$embeded[no]}' data-in_no='{$embeded[in_no]}'
data-type='{$embeded[type]}'
style='padding:0;font-style:italic;font-size:11px;' title='{$embeded[in_no]}'>편집 ∨</button>";
// $replaced .= "</span>";
}
// 해당 embed를 가리키는 스트링
$searched = "{[(".$embeded[in_no].")]}";
// 해당 embed를 가리키는 스트링으로 교체
$abbr = str_replace($searched, $replaced, $abbr);
}
return array('abbr'=>$abbr,'embed'=>$new_embed_arr);
}
// 기존 프로그램 개선을 위해, 새로운 배열 생성 후 리턴
function embed_process($abbr, $embed_arr) {
// 좌우 delimiter
$left = '{[(';
$right = ')]}';
// 신 embed 배열 선언
$new_embed_arr = [];
$right_pos = 0;
while ( ($left_pos=strpos($abbr,$left,$right_pos)) and ($right_pos=strpos($abbr,$right,$left_pos)) ) {
// 좌우 delimiter 찾음
$left_str = substr($abbr,0,$left_pos);
$right_str = substr($abbr,$right_pos+strlen($right));
// 내부 번호 in_no 추출
$pure_str = substr($abbr,$left_pos+strlen($left),$right_pos-$left_pos-strlen($left));
// 추출된 내부번호와 일치하는 embed 배열 원소들 만으로 신 embed 배열 만듬
foreach ($embed_arr as $item) {
if($item[in_no] == $pure_str) $new_embed_arr[] = $item;
}
$right_pos = $right_pos + strlen($right);
}
return $new_embed_arr;
}
// 본문 중 텍스트 원형 그대로 포함된 mathjax 처리 함수
function mathjax_process($no, $abbr,&$embed_arr,$left,$right) {
// $no = $embed_arr[0][no];
$arr_no = 100; // mathjax in_no start number
$right_pos=0;
while ( ($left_pos=strpos($abbr,$left,$right_pos)) and ($right_pos=strpos($abbr,$right,$left_pos)) ) {
$left_str = substr($abbr,0,$left_pos);
$right_str = substr($abbr,$right_pos+strlen($right));
$middle_str = substr($abbr,$left_pos,$right_pos-$left_pos+strlen($right));
$pure_str = substr($abbr,$left_pos+strlen($left),$right_pos-$left_pos-strlen($left));
// $arr_no = count($embed_arr)+1;
$embed_arr[] = array('no'=>$no,'in_no'=>$arr_no,'code'=>$pure_str,'type'=>'m');
// 따옴표 처리
$escaped_math = str_replace("'","'",$middle_str);
// $escaped_math = htmlspecialchars($middle_str, ENT_QUOTES);
// mathjax 수식 처리 결과 보여줌
$replaced_str = "<div contentEditable='false' data-embed='pre_math' data-math='{$escaped_math}' data-in_no='{$arr_no}'
style='display:inline-block;border:1px red dotted;'>";
$replaced_str .= $middle_str;
$replaced_str .= "</div>";
// mathjax 편집 버튼
$replaced_str .= "<button class='edit_btn' data-embed='pre_btn'
data-math='{$escaped_math}' data-no='{$no}' data-in_no='{$arr_no}'
data-type='m'
style='padding:0;font-style:italic;font-size:11px;color:red;'>편집 ∨</button>";
$arr_no += 1;
$abbr = $left_str . $replaced_str . $right_str;
$right_pos = $left_pos + strlen($replaced_str);
}
return $abbr;
}
?>