CMS/프레임워크 | Rhymix 1.9 |
---|---|
개발 언어 | PHP 7.0 |
안녕하세요.
라이믹스(혹은 ckeditor)에서 내용 없이 빈 span 태그는 삭제가 잘 됩니다만 안에 내용이 있을 경우 style이나 기타 attribute가 없더라도(<span>만 있을 경우) 삭제되지 않고 남아 있습니다.
이를 없앨 수 있는 방법이 있을까요?
그러니까
<p><span>텍스트</span></p>
(혹은 <p><span><span>텍스트</span></span></p>)
를
<p>텍스트</p>
로 정리하고 싶습니다.
참고로 유저들이 한글 등 워드프로세서나 웹에서 복사한 글을 그대로 붙여 넣을 경우 붙는 쓸모없는 태그를 삭제하고 싶어 ckeditor의 config.js 파일에
config.disallowedContent = 'span[*lang*]{font-family,text-decoration,text-autospace,*spacing,white-space,text-transform,line-height}';
를 넣었기 때문에 생기는 상황입니다.
감사합니다.
댓글 8
ckeditor 일 경우 modules/editor/skins/ckeditor/editor.html 파일에 아래의 스크립트를 추가해 보세요.
<script>
var empty_span= xe.createPlugin("empty_span", {
API_BEFORE_VALIDATE : function(sender, params) {
$isEditorContent = jQuery(params[0]).find('input[name=content]');
if(!$isEditorContent.length) return true;
var editerValue = jQuery(params[0]).find('input[name=content]').val();
editerValue = editerValue.replace("<span>","");
editerValue = editerValue.replace("</span>","");
jQuery(params[0]).find('input[name=content]').val(editerValue);
return true;
}
});
jQuery(function($){
var oEmpty_span = new empty_span();
xe.getApp("Validator")[0].registerPlugin(oEmpty_span);
});
</script>
답변 감사합니다.
그런데 알려주신 방법은 반복된 <span>에는 작동하지 않습니다.
가령 사용자가 입력한 아래 원문이
제가 넣은 config.disallowedContent에서 필터링되면 ckeditor에서
가 되고, 알려주신 방법을 적용하여 저장한 글은
이 됩니다.
제가 개발자가 아니라 그냥 사이트 관리자라 조건 반복문을 만들 수가 없네요.ㅠㅠ
위 댓글의 스크립트는 form 전송전 처리를 하는것인데요.
에디터상에 소스가 질문의 내용처럼 "<p><span>텍스트</span></p>(혹은 <p><span><span>텍스트</span></span></p>)" 로 입력 되어있다면 답변의 스크립트가 작동될겁니다.
필터링을 거쳐서 내용이 D/B에 입력된후 "<span>문자</span>"에서 "<span>","</span>"을 제거하고 싶으시다면 애드온이나 모듈을 개발하셔서 처리하는 방법을 추천드립니다.
제가 원했던 것도 구름이 님께서 생각하신 그 방법(form 전송전 처리)입니다.
다만 루프가 제대로 돌지 않는 것 같아서 재차 질문 드렸던 거고요(for나 while이 없어도 루프가 도나요?).
첫 댓글의 스크립트를 적용하면 <p><span><span>텍스트</span></span></p>라도 마찬가지로 한 번만 삭제됩니다.
중간에 다른 게 끼어있지 않아도 그래요.
알려주셨던 방법을 적용해도
는
로 첫 문단의 <span> 하나만 제거됩니다.
어쨌든 친절하신 답변 감사드립니다!
<script>
var empty_span= xe.createPlugin("empty_span", {
API_BEFORE_VALIDATE : function(sender, params) {
$isEditorContent = jQuery(params[0]).find('input[name=content]');
if(!$isEditorContent.length) return true;
var editerValue = jQuery(params[0]).find('input[name=content]').val();
editerValue = replaceAllTest(editerValue,"<span>","");
editerValue = replaceAllTest(editerValue,"</span>","");
jQuery(params[0]).find('input[name=content]').val(editerValue);
return true;
}
});
function replaceAllTest(str, searchStr, replaceStr) {
return str.split(searchStr).join(replaceStr);
}
jQuery(function($){
var oEmpty_span = new empty_span();
xe.getApp("Validator")[0].registerPlugin(oEmpty_span);
});
</script>
잘 되네요.
다만 정상적인 <span style="~~~">을 닫는 </span>도 지워져서 그냥 editerValue = replaceAllTest(editerValue,"</span>",""); 이 부분을 빼버리고 적용했습니다.^^;
다시 한번 감사드립니다!
스타일이 포함된 경우를 정규식을 통해 replace 처리하시는게 좋습니다.
참고로 구름이 님께서 알려주신 방법 말고 ckeditor에 내장된 기능으로도 <span>을 제거할 수 있었습니다.
아래는 새롭게 알아내 적용한 방법입니다.
/modules/editor/skins/ckeditor/editor.html
106행 allowedContent: true, 주석 처리 혹은 삭제
/modules/editor/tpl/js/editor.app.js
42행 allowedContent: true, 주석 처리 혹은 삭제
https://ckeditor.com/docs/ckeditor4/latest/guide/dev_acf.html
allowedContent를 true로 하면 ckeditor의 Content Filtering (ACF)가 비활성화됨 -> 해당 설정 삭제로 ACF 다시 활성화.
왜 라이믹스에서 ckeditor의 ACF를 비활성화했는지는 모르겠는데(보안 문제?) 일단 당장은 문제가 보이지 않았습니다.