001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
<?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; } ?>