T2Editor Ver 11.0.0-beta1.0.0
본문
T2Editor
T2Editor는 한국형 WYSIWYG 웹 에디터입니다.
모바일 친화적이고 직관적인 인터페이스와 강력한 텍스트 편집 기능을 통해 사용자가 고퀄리티의 콘텐츠를 쉽고 빠르게 작성할 수 있도록 도와줍니다.
글을 쓰는 화면 하나 바꾸는 일인데, 생각보다 손이 많이 갑니다.
이미지 올리면 깨지고, 표는 모바일에서 넘치고,
게시된 글은 편집기에서 보던 것과 다르게 나옵니다.
T2Editor 는 그 화면을 통째로 대신합니다.
내 서버 폴더에 넣으면, 그때부터 글쓰기 칸이 완성된 편집기가 됩니다.
가입할 계정도, 발급받을 키도, 내 글이 지나가야 하는 남의 서버도 없습니다.
■ 글을 쓰는 동안
굵게, 기울임, 밑줄, 취소선, 문단 정렬, 글자 크기.
글자 색과 배경 색은 팔레트로 고르거나 색상 값을 직접 넣을 수 있고,
방금 쓴 색은 따로 기억해 뒀다가 다시 꺼내 줍니다.
되돌리기와 다시 실행, 글자 수 세기, 다크 모드 전환이 기본으로 있습니다.
쓰는 도중에 자동으로 저장됩니다.
브라우저가 닫혀도, 다시 들어오면 "이어서 쓰시겠어요?" 하고 물어봅니다.
찾기와 바꾸기도 편집기 안에서 바로 됩니다.
■ 본문에 넣을 수 있는 것
이미지는 끌어다 놓으면 올라갑니다. 여러 장을 한 번에 놓아도 됩니다.
동영상은 파일을 올려도 되고 유튜브 같은 주소를 붙여도 되며,
어느 쪽이든 같은 플레이어로 재생됩니다.
음악 파일도, PDF도 글 안에서 바로 열립니다.
표는 행과 열을 자유롭게 늘리고 줄일 수 있습니다.
코드는 언어를 지정하면 색이 입혀진 코드 블록이 됩니다.
파일은 다운로드 칸으로 들어갑니다.
주소만 붙여 넣으면 제목과 설명을 읽어 와 보기 좋은 링크 카드로 만들어 줍니다.
긴 주소는 짧게 줄이고 QR 코드까지 만들어 줍니다.
그림도 편집기 안에서 그려 바로 넣을 수 있고, 밈 이미지도 찾아서 넣을 수 있습니다.
다른 편집기에서 쓰던 글을 그대로 붙여 넣어도 됩니다.
서식이 깨지지 않도록 T2Editor 의 구조로 옮겨 담습니다.
■ 여럿이 함께
같은 글을 여러 명이 동시에 고칠 수 있습니다.
누가 지금 어디를 보고 있는지 커서로 보이고, 옆에서 이야기도 나눌 수 있습니다.
자리가 다 차면 나중에 들어온 사람은 읽기로 들어옵니다. 문 앞에서 돌려보내지 않습니다.
■ T2Editor AI
문단을 다시 짜 달라고 하거나, 문장을 다듬어 달라고 하거나,
글 안에서 바로 대화하며 고칠 수 있습니다.
목차를 만들고, 표를 정리하고, 이미지를 만들고, 통계를 내는 일도 시킬 수 있습니다.
쓸지 말지, 어떤 모델을 붙일지는 전부 선택입니다. 기본은 꺼져 있습니다.
■ 화면
휴대폰에서도 태블릿에서도 데스크톱에서도 같은 편집기입니다.
작은 화면을 위해 기능을 덜어 낸 축소판이 아닙니다.
키보드만으로도 쓸 수 있고, 화면 낭독기와도 맞춰져 있습니다.
어두운 화면과 밝은 화면 둘 다 지원합니다.
한국어, 영어, 일본어, 중국어가 들어 있습니다.
■ 어디에 설치되나
그누보드5, 라이믹스, 그리고 CMS 없이 직접 만든 사이트.
같은 파일 하나가 이 셋에서 모두 돌아갑니다.
어느 자리인지 고르는 설정은 없습니다. 놓인 위치를 보고 알아서 판단합니다.
그누보드에서는 회원 등급, 로그인, 관리자 판정, IP 차단, 금지 단어가 자동으로 이어집니다.
라이믹스에서는 첨부 파일 시스템을 그대로 씁니다.
그래서 첨부 목록이나 용량 계산이 어긋나지 않습니다.
■ 가격
무료입니다.
코어와 함께 들어 있는 플러그인은 자유롭게 쓰고 고치고 다시 나눠 줄 수 있습니다.
다만 그렇게 나눠 주는 것도 무료여야 하고, 파는 것은 안 됩니다.
직접 만든 플러그인은 유료로 팔 수 있습니다.
■ 준비물
PHP 7.4 이상이면 돌아가고, 8.2 이상을 권합니다.
그 외에는 쓰기 권한이 있는 폴더 하나면 됩니다.
Apache, nginx, LiteSpeed 어디든 상관없습니다.
■ 받는 곳
https://dsclub.kr/service/editor
아래부터는 자세한 이야기입니다
[ 1. v10을 쓰고 있었다면, 먼저 이것부터 ]
세 가지가 크게 달라졌습니다.
첫째, 게시된 글의 서식이 깨지던 문제가 구조적으로 해결됐습니다.
v10 은 글을 저장할 때 본문 끝에 스타일시트 주소 한 줄을 붙였습니다.
그런데 CMS 의 HTML 필터가 그 줄을 지웁니다.
편집기 탓이 아닙니다. 남의 글에 외부 스타일시트를 심지 못하게 막는 것이
그 필터가 존재하는 이유입니다.
그래서 v10 에서는 스킨이나 레이아웃에 같은 줄을 손으로 넣어야 했습니다.
v11 은 그 줄을 본문에 넣지 않는 길을 만들었습니다.
라이믹스는 함께 들어 있는 애드온을 켜면 끝이고,
그누보드는 대부분 자동이며,
직접 만든 사이트는 head 에 한 줄만 넣으면 됩니다.
자세한 것은 3절에 있습니다.
둘째, 서버에서 거르는 XSS 필터가 생겼습니다.
편집기가 하는 검사는 전부 브라우저 안에 있습니다.
브라우저를 쓰지 않는 요청 앞에서는 없는 것과 같습니다.
CMS 위에 얹은 설치는 그 CMS 가 저장 지점에서 이미 걸러 줬지만,
직접 만든 사이트에는 그 자리가 비어 있었습니다.
v11 은 그 자리를 채웁니다. 기본으로 켜져 있습니다.
셋째, 첫 화면이 훨씬 가벼워졌습니다.
편집기를 띄울 때 나가던 요청이 139개에서 7개로,
전송량이 약 3MB 에서 약 413KB 로 줄었습니다.
느린 회선과 오래된 휴대폰에서 체감이 가장 큽니다.
이 외에 협업 정원이 늘었고, AI 가 도구를 실행할 수 있게 됐고,
마크다운으로 쓰는 모드가 선택으로 들어왔고,
관리 화면에서 편집기 겉모양을 바꾸는 층이 따로 생겼습니다.
[ 2. 설치 ]
── 그누보드5
배포본을 통째로 이 자리에 놓습니다.
g5/plugin/editor/t2editor/
권한은 이렇게 줍니다. (선택사항)
chown -R www-data:www-data g5/plugin/editor/t2editor
chmod -R 755 g5/plugin/editor/t2editor
그다음 관리자 화면에서 켭니다.
환경설정 → 기본환경설정 → 에디터 선택 → t2editor
게시판마다 다르게 쓰려면 게시판 관리 → 해당 게시판 → 에디터 사용에서 고릅니다.
폴더 이름이 곧 에디터 이름입니다. 바꾸면 선택 목록에 그 이름으로 나옵니다.
저장 위치는 그누보드의 배치를 따라갑니다.
업로드와 캐시는 g5/data/editor/, 내부 DB 는 g5/data/t2editor_db/ 로 갑니다.
편집기가 자기 폴더 안에 데이터를 쌓지 않습니다.
권한도 G5_DIR_PERMISSION 과 G5_FILE_PERMISSION 을 그대로 씁니다.
리버스 프록시가 Origin 헤더를 지우는 환경에서 저장이 막히면,
그누보드의 기존 설정을 그대로 쓰면 됩니다.
// g5/config.php
define('G5_DISABLE_ORIGIN_CHECK', true);
── 라이믹스
배포본을 이 자리에 놓습니다.
rhymix/modules/editor/skins/t2editor/
폴더 이름은 t2editor 로 고정입니다.
스킨 ID 와 경로 해석이 이 이름에 걸려 있어서, 바꾸면 목록에 나오지 않습니다.
고급 설정 → 에디터 → 에디터 스킨 → T2Editor
모듈(게시판)마다 다르게 쓰려면 그 모듈의 설정에서 고릅니다.
업로드는 편집기가 파일을 직접 놓지 않고 라이믹스의 업로드 창구로 넘깁니다.
그래서 첨부 파일 목록, 용량 계산, 삭제가 라이믹스 쪽과 어긋나지 않습니다.
── CMS 없이 (스탠드얼론)
배포본을 웹에서 보이는 아무 폴더에나 놓습니다.
/var/www/html/t2editor/
chown -R www-data:www-data /var/www/html/t2editor
chmod -R 755 /var/www/html/t2editor
chmod -R 775 /var/www/html/t2editor/data
data/ 폴더는 없으면 첫 요청에서 알아서 만들어집니다.
글쓰기 화면에서는 이렇게 부릅니다.
<?php require_once __DIR__ . '/t2editor/editor.lib.php'; ?>
<form method="post" action="/write.php">
<?php echo editor_html('content', $old_content ?? ''); ?>
<button type="submit">저장</button>
</form>
첫 인자가 곧 폼 필드 이름입니다.
위 예에서 저장 지점은 $_POST['content'] 로 본문을 받습니다.
그리고 저장하기 전에 반드시 한 번 거릅니다.
<?php
require_once __DIR__ . '/t2editor/config/t2_sanitize.php';
$row = T2Esanhtml($_POST['content'] ?? '');
if ($row['skipped'] !== '') {
http_response_code(400);
exit('본문을 검사하지 못했습니다.');
}
save_article($row['html']);
이 단계는 권고가 아닙니다.
편집기가 걸렀다는 사실은 저장 지점에서 아무것도 보장하지 않습니다.
curl 한 줄이면 편집기를 지나지 않고 바로 저장 지점에 닿습니다.
T2Esanhtml() 은 실제로 걸렀는지를 따로 알려 줍니다.
skipped 값이 비어 있지 않으면 그것은 "통과"가 아니라 "검사하지 못함"입니다.
── 설치 후 공통
이 주소를 한 번 엽니다.
https://내도메인/t2editor/endpoints/install-check.php
감지된 경로와 실제 주소가 맞는지 알려 주는 진단 화면입니다.
빨간 줄이 있으면 값을 못 박아 주면 됩니다.
define('T2EDITOR_BASE_PATH', '/var/www/html/t2editor');
define('T2EDITOR_BASE_URL', 'https://내도메인/t2editor');
이 값이 어긋났을 때의 대표 증상은 툴바에 아이콘 대신
dark_mode 같은 글자가 보이는 것입니다.
관리 화면은 여기입니다.
https://내도메인/t2editor/admin/index.php
첫 접속에서 관리자 비밀번호를 정합니다.
그 최초 설정을 마치기 전까지는 편집과 업로드는 정상으로 돌지만
바깥으로 나가는 AI 만 멈춰 있습니다.
[ 3. 게시 화면 서식 ]
편집기 안에서 예쁘던 표, 링크 카드, 미디어 블록이
막상 게시된 화면에서는 밋밋해지는 문제입니다.
v11 은 넷을 바꿨습니다.
하나. 스타일시트가 파일 한 장이 아니라 조립물이 되었습니다.
코어의 규칙, 각 플러그인이 가진 규칙, 확장의 규칙이 요청 시점에 합쳐집니다.
파일이 있으면 실립니다. 어딘가에 따로 등록하지 않습니다.
플러그인이 게시 화면에서 어떻게 보일지는 그 플러그인이 스스로 정합니다.
둘. 주소에 지문이 붙었습니다.
파일이 바뀌면 주소가 바뀌기 때문에,
브라우저가 옛 스타일시트를 계속 붙잡고 있는 일이 없습니다.
셋. 본문에 아무것도 넣지 않는 길이 생겼습니다.
사이트가 자기 head 에 직접 등록하면
저장되는 본문에는 표식이 하나도 들어가지 않습니다. 필터가 지울 것이 없습니다.
넷. 스스로 붙는 로더가 생겼습니다.
script 한 줄을 넣으면 그 스크립트가 알아서 스타일시트를 붙입니다.
이 주소에는 지문이 없어서 늙지 않습니다.
플러그인을 더 깔아도 이 줄을 고칠 일이 없습니다.
게다가 로더는 자기가 실제로 불려 온 주소에서 스타일시트 주소를 만들기 때문에,
nginx alias 나 리버스 프록시처럼 경로 추측이 빗나가는 배치에서도 맞습니다.
실제로 해야 할 일은 이렇습니다.
라이믹스
함께 들어 있는 애드온을 복사하고 켜면 끝입니다.
t2editor/integration/rhymix/addons/t2editor_content_style/
→ rhymix/addons/t2editor_content_style/
고급 설정 → 애드온에서 켜기
켜지 않아도 글이 깨지지는 않습니다.
편집기가 본문 끝에 표식을 붙이는 쪽으로 자연히 떨어집니다.
다만 그 표식은 라이믹스의 HTML 필터가 지울 수 있고,
그때가 정확히 v10 에서 겪던 상황입니다. 켜는 것이 정답입니다.
그누보드5
게시 화면에서 이 패키지의 PHP 가 살아 있으면 자동입니다.
본문에는 아무것도 들어가지 않습니다.
자동으로 안 되는 스킨이라면, 게시 화면 스크립트 맨 위
_common.php 를 부른 직후에 이 세 줄을 넣습니다.
require_once G5_PATH . '/plugin/editor/t2editor/config/t2_config.php';
require_once G5_PATH . '/plugin/editor/t2editor/config/t2_content_styles.php';
T2Econtentstyleattach();
부르는 자리가 중요합니다. head 안에서 부르면 이미 늦습니다.
직접 만든 사이트
PHP 를 부를 수 있는 페이지라면 head 안에서 태그를 찍습니다.
<?php
define('T2EDITOR_BASE_PATH', '/var/www/html/t2editor');
define('T2EDITOR_BASE_URL', 'https://내도메인/t2editor');
require_once '/var/www/html/t2editor/config/t2_config.php';
require_once '/var/www/html/t2editor/config/t2_content_styles.php';
echo T2Econtentstyletag();
?>
글쓰기 화면이 아니므로 editor.lib.php 는 부르지 않습니다.
게시 페이지에 편집기 전체를 실을 이유가 없습니다.
정적 HTML 이거나 PHP 를 부를 수 없는 자리라면 이 한 줄입니다.
<script src="/t2editor/endpoints/t2_css_min.php?bundle=content&format=js"></script>
목록이나 홈처럼 본문이 없는 페이지가 많다면 조건을 줄 수 있습니다.
주소 끝에 &when=content 를 붙이면
편집기가 만든 블록이 하나도 없는 페이지에서는 스타일시트를 받지 않습니다.
본문을 감싸는 특별한 클래스는 필요 없습니다.
스타일시트가 편집기가 만든 블록을 직접 겨냥합니다.
관리 화면에서는 에디터 기본 설정 → 발행 본문 스타일에서 방식을 고릅니다.
값은 auto, link, script, none 넷입니다.
기본값 auto 는 "사이트가 실제로 싣고 있으면 본문을 비우고, 아니면 표식을 붙인다" 입니다.
할 수 있다고 선언했는지가 아니라 그 요청에서 실제로 실었는지를 봅니다.
애드온을 복사만 하고 켜지 않은 설치에서 글이 전부 밋밋해지면 안 되기 때문입니다.
link 는 걸러 내면서 script 는 허용하는 게시판이 실제로 있습니다.
그때는 설정을 script 로 바꾸면 됩니다.
옛 css/content.css 는 아직 그대로 서비스됩니다.
v10 설치의 스킨과 정적으로 내보낸 HTML 에 그 주소가 박혀 있는데,
없애 버리면 어제까지 멀쩡하던 글이 오늘 깨지기 때문입니다.
[ 4. 서버단 XSS 필터 ]
허용목록 방식입니다.
남길 태그와 속성을 미리 세어 두고, 세어 두지 않은 것은 전부 지웁니다.
새로운 공격 방법이 나와도 허용목록에 없으면 이미 막혀 있습니다.
안쪽까지 통째로 지우는 것
script, style, object, embed, applet, base, link, meta,
frame, noscript, template, canvas, svg, math, xmp, marquee
껍데기만 벗기는 것
허용목록에 없는 나머지 태그. 안에 있던 글은 남습니다.
지우는 속성
on 으로 시작하는 이벤트 속성 전부, 그리고 허용목록 밖의 속성
다시 쓰는 값
style, srcset, 새 창 링크에 rel="noopener noreferrer"
붙이는 것
임베드에 sandbox, referrerpolicy, loading
svg 가 지우는 쪽에 있는 이유는, 그것이 그림이 아니라 문서이기 때문입니다.
svg 안에는 script 와 이벤트 속성이 그대로 들어갑니다.
주소는 자리마다 허용 스킴이 다릅니다.
javascript:, vbscript:, data:text/html, blob:, file: 은 어느 자리에서도 못 지나갑니다.
임베드는 http 또는 https 이면서 허용된 호스트여야 합니다.
임베드 허용 호스트는 셋의 합입니다.
코드에 들어 있는 기본 목록(유튜브, 비메오, 네이버TV, 카카오TV, 구글 문서 등),
호스트 CMS 가 이미 허용한 목록, 그리고 관리 화면에서 더한 목록.
*.example.com 같은 표기도 됩니다.
엔진은 둘입니다.
dom 확장이 있으면 브라우저와 같은 파서로 읽고 나무를 훑습니다.
없으면 거친 정규식 판으로 내려갑니다. 꺼지지는 않습니다.
"켜짐"이라고 적어 놓고 실제로는 꺼져 있는 상태를 만들지 않기 위해서입니다.
한 가지 알아 둘 점.
dom 판은 주소 속성의 한글을 퍼센트 인코딩합니다.
href="/글/1" 이 href="/%EA%B8%80/1" 이 됩니다. 주소는 같고 글자만 달라집니다.
기본 본문 상한은 2MB 이고, 관리 화면에서 조절할 수 있습니다.
자체 필터를 더하고 싶으면 지정된 폴더에 파일 하나를 놓으면 됩니다.
코어는 고치지 않습니다.
[ 5. CMS 의 보안을 그대로 쓴다 ]
CMS 위에 얹은 설치에서는, 그 CMS 가 이미 하고 있는 판정을 그대로 가져다 씁니다.
같은 사이트 안에서 검사가 두 벌이 되면
어느 쪽이 진짜인지 알 수 없게 되기 때문입니다.
그누보드5에서 이어지는 것
본문 XSS 필터 clean_xss_tags()
CSRF 토큰 get_token() 과 토큰 검증
요청 출처 검증 check_request_origin()
업로드 파일명 get_safe_filename()
업로드 내용 검사 SVG 판정
그 외 로그인·세션, 회원 등급, 관리자 판정, IP 차단(cf_intercept_ip · cf_possible_ip), 금지 단어(cf_filter)
라이믹스에서 이어지는 것
본문 XSS 필터 HTMLFilter::clean() — HTMLPurifier
임베드 허용목록 MediaFilter::getIframeWhitelist()
CSRF 토큰 Session::createToken() · verifyToken()
요청 출처 검증 Security::checkCSRF()
업로드 파일명 FilenameFilter::clean()
업로드 내용 검사 FileContentFilter::check()
그 외 로그인·세션, 회원 그룹, 관리자 판정,
차단 IP 대역, 금지 단어, 네이티브 첨부 시스템
호스트의 답은 셋입니다. 허용, 거부, 그리고 모름.
CMS 없이 쓰는 설치에서는 모든 답이 모름이고,
모름은 통과도 차단도 아닙니다. 그 자리를 편집기가 자기 것으로 메운다는 신호입니다.
지금 이 설치에서 무엇이 실제로 서 있는지는 이렇게 확인할 수 있습니다.
require_once '/경로/t2editor/config/t2_cms_security.php';
print_r(T2Ehostsecuritysnapshot());
[ 6. 함께 들어 있는 플러그인 17종 ]
Image 업로드, 주소 삽입, 미리보기, 안전 검사
Video 영상 파일과 외부 영상 주소를 공통 플레이어로
File 안전한 업로드와 다운로드 블록
Table 행·열·셀 구조와 표 편집
Code Block 언어 정보를 담은 코드 블록
Link 링크 생성과 편집
Link Card 웹 주소의 제목과 설명을 카드로
Drawing 편집기 안에서 그리고 바로 삽입
Export 독립 문서로 내보내기, 출처 보존
Search 내부 찾기·바꾸기와 설치된 검색 공급자를 한 화면에서
Collaboration 실시간 공동 편집과 참여자·채팅
T2Editor AI 대화형 응답, 문서 편집 지원, 도구 실행, 사용량 관리
T2Meme 밈 이미지 탐색과 삽입
Clip URL 주소 단축과 QR 코드 생성
T2Search DSc 검색 연동
t2CAPTCHA 설치본 안에서 도는 봇 방지. 외부 가입도 키 발급도 없음
Paste Migration 외부 편집기에서 붙여넣은 것을 문서 구조로 변환
전부 끄고 켤 수 있고, 툴바에서의 순서도 바꿀 수 있습니다.
[ 7. 편집 기능 상세 ]
자동 저장은 기본으로 켜져 있습니다.
글을 보낸 뒤 임시 저장본을 지우기까지의 지연 시간은 기본 90초이고 조절할 수 있습니다.
복원 안내는 "지금 복원 / 나중에 / 삭제" 셋으로 물어봅니다.
드래그 앤 드롭 업로드는 진행률을 보여 주고,
여러 장 중 일부만 실패하면 그 사실을 따로 알려 줍니다.
용량 초과, 지원하지 않는 형식, 플러그인 오류를 각각 다른 문구로 구분합니다.
편집기 본문 높이는 기본 350px 이고 관리 화면에서 바꿉니다.
다크 모드 버튼, 하단 로고, 버전 표시, 관리자 링크는 각각 끌 수 있습니다.
마크다운으로 쓰는 모드가 있습니다. 기본은 꺼짐입니다.
꺼져 있으면 관련 파일이 아예 로드되지 않아 무게가 0입니다.
켜도 정본은 언제나 문서 구조이고, 마크다운은 그 위에 얹힌 저작 방식입니다.
원시 HTML 이 문서 구조로 해석되는 경로는 없습니다. 보안 결정이라 예외를 두지 않습니다.
밑줄은 __…__ 이고 굵게는 **…** 하나만 씁니다.
표준과 다른 부분은 편집기 안의 가이드가 따로 짚어 줍니다.
플러그인이 자기 문법을 더할 수 있고,
그 가이드는 표준 문법과 이 설치에만 있는 문법을 함께 보여 줍니다.
[ 8. AI 상세 ]
바깥으로 나가는 문은 하나입니다.
어딘가 하나를 빠뜨려도 호출이 옆으로 새지 않게 하기 위해서입니다.
도구는 위험도로 나뉩니다.
Safe 읽기와 기억. 문서를 바꾸지 않는 조회성 동작
Extra 네트워크와 쓰기. 밖과 통신하거나 문서를 바꾸는 동작
Dangerous 실행. 내보내기나 세션 종료처럼 되돌리기 어려운 동작
들어 있는 도구는 문서 통계, 좌표 기반 편집, 텍스트 편집, 목차 삽입,
이미지 생성과 이미지 인식, 그림 삽입, 아티팩트, 로컬·웹 검색,
장기 기억과 기억 압축, 단위 변환, 날짜 계산, 주소 단축, 시각화 등입니다.
모델을 붙이는 길은 둘입니다.
보통은 설정한 제공자로 서버가 중계합니다.
다른 하나는 사용자 브라우저 안에서 도는 모델입니다.
이 경우 글은 어디로도 나가지 않습니다.
T2Editor 는 특정 엔진을 강요하지 않습니다. 정해 둔 것은 규격뿐입니다.
브라우저에서 도는 모델은 가중치가 수백 MB 에서 수 GB 이고,
저작권도 용량도 지원 기기도 전부 다릅니다.
하나를 골라 배포본에 박아 넣으면 그 판단을 운영하는 쪽에서 빼앗는 것입니다.
Web LLM 엔진이 하나 딸려 오지만, 켜기 전에는 내려받지 않습니다.
관리 화면에는 권장 모델 목록이 있습니다.
실시간 가격, 항목별 잠금(갱신이 덮어쓰지 못함), 작업당 비용 계산이 붙어 있습니다.
브라우저가 가격 서비스를 직접 부르는 일은 없습니다.
[ 9. 협업 상세 ]
편집자 16명
참가자(관람 포함) 32명
에이전트 편집자 8명
편집자 자리가 차면 관람자로 받습니다.
15명이 모인 회의에 늦게 들어온 사람을 내보내는 것보다 읽게 두는 편이 낫고,
"방이 꽉 찼다"는 화면이 회의를 멈추면 안 되기 때문입니다.
인원이 늘면 주고받는 주기가 따라 늘어납니다.
~5명 커서 80ms 묶음 120ms 서버 조회 1.5초 스냅샷 20초
~10명 커서 180ms 묶음 220ms 서버 조회 2.5초 스냅샷 30초
~16명 커서 300ms 묶음 340ms 서버 조회 4초 스냅샷 45초
~32명 커서 450ms 묶음 500ms 서버 조회 6초 스냅샷 60초
15명 방에서 80ms 로 커서를 계속 뿌리면 중계 쪽이 초당 2,600 프레임을 맞습니다.
정원, 입장 배분, 연산 합치기, 커서 위치 보정, 구역 임차는
전부 한 곳에서 판정합니다.
참가자마다 다른 답을 얻으면 그 어긋남이 화면에는 보이지 않고
문서가 깨진 뒤에야 드러나기 때문입니다.
[ 10. 안전, 권한, 금지 단어 ]
이미지 안전 검사(NSFW)는 사용자 브라우저 안에서 돕니다.
WebGPU, WebGL, WASM, CPU 순으로 내려갑니다. 기본은 꺼짐입니다.
경고, 차단, 상태 표시 화면은 공용으로 제공되어
플러그인마다 다르게 생기는 일이 없습니다.
등급 권한은 여섯 칸입니다.
guest 비회원 · member 회원 · trusted 인증회원
staff 운영진 · manager 관리진 · admin 관리자
이 계층은 보는 사람이 누구인지 스스로 알아내지 않습니다.
그누보드의 회원 등급이나 라이믹스의 그룹이 이 칸으로 번역되어 들어옵니다.
그래서 코어 안에 CMS 이름이 하나도 없고, 새 호스트를 붙일 때 코어를 고치지 않습니다.
기본값은 꺼짐입니다.
권한 기능이 생겼다는 이유로 갱신한 설치가 잠기면 안 되기 때문입니다.
정본은 서버입니다. 브라우저 쪽을 우회해도 서버가 다시 막습니다.
금지 단어는 글을 쓰는 동안 그 자리에 빨간 형광펜을 긋고
옆에 정보 아이콘을 세웁니다.
본문은 한 글자도 바뀌지 않습니다. 기본은 꺼짐입니다.
[ 11. 속도와 구조 ]
편집기 첫 화면 실측입니다.
이전 · 최소화 끔 139 요청 2,996,482 B
이전 · 최소화 켬 139 요청 2,128,796 B
지금 7 요청 412,570 B
묶음, 최소화, 전송이 각각 다른 층이고 따로 끌 수 있습니다.
내부적으로 v11 은 편집 엔진과 제품 화면을 분리했습니다.
엔진이 규격 뒤에 있어서, 엔진을 갈아도
플러그인 로더, 자동 저장, 마이그레이션, 화면을 다시 쓰지 않습니다.
이미지, 비디오, 파일, 코드, 표는 일반 태그에 표시만 붙인 것이 아니라
독립된 의미를 가진 조각입니다.
협업은 변경 사항만 주고받고, 전체 HTML 은 입장·복구·불일치 해소에만 씁니다.
코어와 플러그인 사이에는 통제기가 하나 있습니다.
막으려는 것은 잘못된 호출 하나가 아닙니다.
각각은 멀쩡한 동작 열 몇 개가 한 순간에 겹쳐
브라우저가 응답하지 않게 되는 상황입니다.
모바일은 축소판이 아니라 일급 대상이고, 실제 화면에서 측정해 검증합니다.
고정 100vh 는 쓰지 않고 100dvh 와 폴백, 노치 여백,
입력 글자 최소 16px, 터치 영역 44px, 키보드에 반응하는 처리를 씁니다.
1280·390·360 폭에서, 밝은 화면과 어두운 화면에서,
웹폰트가 오기 전과 후에서 각각 재고 나서야 고쳤다고 말합니다.
[ 12. 배포 프로필 넷 ]
Max
관리 화면, 최초 설정, AI 까지 전부 들어 있는 기본 배포본입니다.
Lite
관리 화면 자체가 없습니다.
따라서 관리자 로그인도, 관리자 API 라는 공격 표면도 존재하지 않습니다.
설정은 config/t2_hard_config.php 파일 하나뿐입니다.
중요한 것은 Lite 가 약화판이 아니라는 점입니다.
네트워크와 보안 층은 똑같이 켜진 채 돌고,
다만 설정할 필요가 없도록 고정값으로 동작합니다.
느슨해지는 것은 한도뿐입니다.
분당 요청 Max 240 → Lite 480
동시 처리 Max 12 → Lite 16
기본 타임아웃 Max 30초 → Lite 45초
풀어 줄 사람이 없는 배포본에서 평범한 사용이 한도에 걸려 멈추지 않게 한 값입니다.
tLite
Max 인데 최초 설정이 아직 안 끝난 상태입니다.
편집, 업로드, 플러그인은 정상이고 바깥으로 나가는 AI 만 멈춥니다.
지운 것이 아니라 보류한 것이라,
저장해 둔 제공자와 키는 그대로 남아 있다가 설정을 마치면 그대로 살아납니다.
Custom
설정을 파일로 미리 담아 배포한 설치입니다.
tLite 를 이기지는 않습니다. 최초 설정 전이면 무엇이 적혀 있든 tLite 로 돕니다.
적용하거나 내리기 직전 설정은 자동으로 백업됩니다.
지금 어느 상태인지는 편집기 하단 버전 뒤에 적혀 있습니다.
T2Editor Ver 11.0.0 Max
T2Editor Ver 11.0.0 Lite
T2Editor Ver 11.0.0 tLite
[ 13. 관리 화면에서 만질 수 있는 것 ]
구획은 대략 서른 개입니다.
대시보드, 에디터 기본, 툴바, 아이콘, 디자인, 스킨, 브랜드, HTML 조각,
플러그인, 모듈, 확장, 업로드, 저장소, 캐시, 권한, 보안, API,
AI, 어시스턴트, 이미지 안전 검사, 개인정보, 캡차, 금지 단어, 번역,
프로필, 라이선스, 개발, 진단, 설치, 업데이트.
간단 모드와 고급 모드가 있고,
설명 문서와 실제 설치 상태를 함께 검색할 수 있습니다.
겉모양을 바꾸는 층은 셋으로 나뉘어 있습니다.
색과 간격 editor_design
형상 — 어떤 줄이 어디에 서고 editor_skin
글 기둥이 얼마나 넓은가
하단 바 왼쪽의 로고 자리 editor_brand
기능은 그대로 두고 겉모양만 바꾸는 일이라,
이렇게 만든 설치도 정상적으로 업데이트를 계속 받습니다.
"플러그인을 하나 만든다" 와 "서버에 파일을 올린다" 사이에 세 번째 문도 있습니다.
관리 화면 개발 탭에서 script, style, 외부 시트 한 줄을 바로 붙이고,
거기서 끄고, 프로필로 옮길 수 있습니다.
버튼 하나 숨기기, 폰트 바꾸기 같은 일에 플러그인 한 벌을 만들 필요가 없습니다.
업로드 기본값
파일 하나 50MB
한 번에 5개 / 합계 200MB
이미지 픽셀 5천만
WebP 자동 변환 선택
허용 확장자는 넷으로 나뉘어 있고 관리 화면에서 조절합니다.
문서 pdf txt doc docx xls xlsx ppt pptx hwp odt ods odp rtf
이미지 jpg jpeg png gif webp bmp
영상 mp4 webm ogg mov avi mkv wmv flv m4v
기타 zip rar 7z tar gz bz2 mp3 m4a wav flac aac wma json xml csv
파일은 data/ 안에 유형별로 두거나, 유형별로 외부 저장 서버로 보낼 수 있습니다.
외부가 실패하면 로컬로 떨어집니다.
[ 14. 확장 만들기 ]
플러그인은 매니페스트로 선언하고 기본적으로 격리되어 돕니다.
Worker 안에서 도는 방식, 격리된 화면에 중계를 붙인 방식,
아예 화면을 호스트가 그려 주는 방식 셋 중 하나입니다.
외부 코드를 직접 실행하는 것은 예외적인 경로라,
ID 를 다시 입력하고 저장하고 관리 화면을 다시 불러야만 열립니다.
공용 API 가 있어서 같은 UI 를 다시 만들지 않습니다.
이미지 편집 API 는 자르기, 필터, 캔버스 내보내기, 모바일 화면 처리를 그대로 빌려주고,
이미지 안전 검사 API 는 경고·차단·상태·고지 화면 전부를 소유합니다.
삽입, 문서, 업로드, 알림, 모달도 마찬가지입니다.
개인정보 선언은 필수이고 중도적입니다.
이미지나 주소나 검색어가 그 자체로 개인정보인 것은 아닙니다.
식별 가능한 사람에 관한 정보를 기능 목적상 실제로 다룰 때 선언하고,
그러면 사용자에게 나가는 안내가 자동으로 만들어집니다.
번역은 영역이 엄격히 갈립니다.
코어는 locales/, 플러그인은 자기 폴더 안, 확장은 extend/locales/.
플러그인은 자기 폴더 이름과 같은 영역만 건드릴 수 있습니다.
번역 파일이 없거나 깨져 있어도 플러그인 등록과 실행은 계속됩니다.
플러그인을 만들어 주는 빌더도 있습니다.
빌더로 만든 플러그인도 보통 플러그인과 똑같은 경로로 설치·설정·갱신·삭제되고,
빌더가 설치되어 있어야만 돌아가는 일은 없습니다.
[ 15. 갱신 ]
1) data/ 를 그대로 둡니다. 설정·업로드·내부 DB 가 전부 여기 있습니다.
2) 나머지 파일을 새 배포본으로 덮습니다.
3) 손으로 고친 하드 설정 파일은 덮이지 않습니다.
새 설정 항목이 생겼으면 관리 화면 진단이 알려 줍니다.
4) endpoints/install-check.php 를 한 번 엽니다.
관리 화면이 있는 배포본에서는 관리자 → 업데이트에서
공용 데이터 폴더에 새 릴리스를 설치하는 방식도 쓸 수 있습니다.
원본 코어를 읽기 전용으로 유지한 채 새 판을 활성화하는 방식입니다.
다만 부트스트랩 파일 몇 개는 이 방식으로 바뀌지 않으므로 직접 교체합니다.
[ 16. 라이선스 ]
dsclub.kr 이 배포하는 코어와 기본 플러그인은
쓰고, 복사하고, 고치고, 다시 나눠 줄 수 있습니다.
다만 그렇게 나눠 주는 것도 무료여야 하고, 파는 것은 금지입니다.
직접 만든 플러그인은 유료로 팔 수 있고 구독형도 됩니다.
조건은 셋입니다.
코어는 무료로 유지될 것,
"T2Editor 호환 플러그인" 임을 밝히고 공식 제품으로 오인될 표현을 쓰지 말 것,
수익과 환불과 분쟁과 세금의 책임은 만든 쪽이 질 것.
T2Editor 를 바탕으로 다른 이름의 편집기를 만드는 것도 허용됩니다.
단 그 편집기도 이 라이선스를 우선 적용받고 원 저작자 표시를 유지해야 합니다.
소프트웨어는 있는 그대로 제공되며
적합성·안정성·지속 호환을 보증하지 않습니다.
코드와 API 는 사전 공지 없이 바뀔 수 있습니다.
저작권 고지와 readme.txt 는 제거하거나 바꿀 수 없습니다.
dsclub.kr 에 접속할 수 없거나 서비스가 영구 종료되면,
내가 받은 배포본 안의 라이선스 파일이 최후의 기준이 됩니다.
라이선스 파일이 모든 배포본 안에 함께 실려 나가는 이유가 정확히 그것입니다.
현재 라이선스는 3.0.0, 2026년 6월 29일부터 유효합니다.
[ 17. 이 프로젝트가 지키기로 한 것 ]
T2Editor 에는 성문 헌장이 있습니다.
누구도 장소·기기·환경의 차이 때문에 창작의 권리를 잃지 않아야 한다.
T2Editor 는 콘텐츠를 게시하거나 심판하는 주체가 아니라 창작을 돕는 도구다.
창작자의 존엄, 데이터에 대한 주권, 창작 기회의 실질적 평등,
이전 가능성, 개인정보 자기결정권, 기존 콘텐츠의 보존은
편의나 단기 이익을 이유로 버릴 수 없다.
어떠한 사업상 필요도, 관리자 선택도, 형식적인 동의도
사람을 기만하거나 창작물을 은밀하게 전용하는 것을 정당화하지 못한다.
하위 문서 여덟 개와 사례 해설이 이것을 구체적인 판단에 적용합니다.
위에서 설명한 선택 중 여럿이 여기서 나옵니다.
금지 단어가 본문을 고치지 않고 형광펜만 긋는 이유,
자리가 차면 문을 닫는 대신 읽기로 받는 이유,
브라우저 안에서 도는 AI 가 정식 선택지로 있는 이유,
없앴어도 되는 옛 스타일시트 경로를 아직 서비스하는 이유,
라이선스 파일이 배포본 안에 함께 들어 있는 이유입니다.
[ 18. v10 → v11 한눈에 ]
게시 화면 서식 스킨에 손으로 링크 → 본문에 아무것도 넣지 않는 길
서버단 XSS 필터 없음(CMS 에만 의존) → 기본 탑재, 허용목록 방식
CMS 보안 연동 로그인·등급 위주 → 토큰·출처·파일명·내용 검사까지
첫 화면 139 요청 / 약 3MB → 7 요청 / 약 413KB
협업 제한적 → 편집자 16 · 참가자 32
AI 문단 재구성 중심 → 도구 실행, 브라우저 구동 모델
마크다운 없음 → 선택 모드
겉모양 변경 CSS 직접 수정 → 디자인·스킨·브랜드 층 분리
배포 형태 단일 → Max · Lite · tLite · Custom
설치 자리 그누보드5 중심 → 그누보드5 · 라이믹스 · 스탠드얼론
첨부파일
등록된 댓글이 없습니다.






