FreeDesktop 포맷을 Highlight.js에 추가하며 생각한 점

by gg582 · 2026-08-17 02:05:24 · 58 views

Table of contents

기여의 명분

우선 내가 이 프로젝트에 기여한 것이 무엇으로 기능하는지부터 볼 필요가 있다.

기존 관습은 FreeDesktop을 initoml로 두었다.

그러나 현재 이것은 desktop 키워드로 처리 가능하다.

둘을 비교해 보자.

INI

# FreeDesktop Entry & NetworkManager Configuration Showcase
# Demonstrates list-delimiter semicolons, locale keys, escaped characters, and action subsections.

[Desktop Entry]
Version=1.5
Type=Application
Name=Apex Code Studio
GenericName=Integrated Development Environment
Comment=Advanced IDE for Cloud-Native and Systems Development

# Locale-specific keys using English regional variants
Name[en_US]=Apex Code Studio
GenericName[en_GB]=Integrated Development Environment
Comment[en_CA]=Advanced IDE for Cloud-Native and Systems Development
Comment[en_AU@latin]=Advanced IDE for Cloud-Native and Systems Development

# Semicolon-delimited lists (must not be parsed as inline comments)
Categories=Development;IDE;TextEditor;Debugger;
Keywords=code;editor;systemd;cloud;profiler;git;
MimeType=text/plain;text/x-chdr;text/x-csrc;application/json;application/x-desktop;

# Values containing escaped semicolons and special characters
Exec=apex-studio %F --workspace-dir=%k/workspaces --custom-args="flag1=true\;flag2=false"
Icon=apex-studio-icon
Terminal=false
StartupNotify=true
StartupWMClass=ApexStudio
DBusActivatable=true

# Desktop actions list
Actions=NewWindow;OpenProfile;SafeMode;

# Action Subsections (Spaces inside section headers)
[Desktop Action NewWindow]
Name=Open New Window
Exec=apex-studio --new-window %U

[Desktop Action OpenProfile]
Name=Open with Selected Profile
Exec=apex-studio --select-profile --path=%f

[Desktop Action SafeMode]
Name=Launch in Safe Mode (No Plugins)
Exec=apex-studio --disable-extensions --log-level=debug

# NetworkManager Keyfile Section (Mixed syntax showcase)
[connection]
id=Nexus-Production-VPN
uuid=a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d
type=vpn
permissions=user:developer:;user:admin:;

[vpn]
service-type=org.freedesktop.NetworkManager.openvpn
data-routes=10.0.0.0/8;172.16.0.0/12;192.168.1.0/24;

; 부분에서 깨지며 강조 표시가 구문의 의미와 맞지 않는다.

FreeDesktop

# FreeDesktop Entry & NetworkManager Configuration Showcase
# Demonstrates list-delimiter semicolons, locale keys, escaped characters, and action subsections.

[Desktop Entry]
Version=1.5
Type=Application
Name=Apex Code Studio
GenericName=Integrated Development Environment
Comment=Advanced IDE for Cloud-Native and Systems Development

# Locale-specific keys using English regional variants
Name[en_US]=Apex Code Studio
GenericName[en_GB]=Integrated Development Environment
Comment[en_CA]=Advanced IDE for Cloud-Native and Systems Development
Comment[en_AU@latin]=Advanced IDE for Cloud-Native and Systems Development

# Semicolon-delimited lists (must not be parsed as inline comments)
Categories=Development;IDE;TextEditor;Debugger;
Keywords=code;editor;systemd;cloud;profiler;git;
MimeType=text/plain;text/x-chdr;text/x-csrc;application/json;application/x-desktop;

# Values containing escaped semicolons and special characters
Exec=apex-studio %F --workspace-dir=%k/workspaces --custom-args="flag1=true\;flag2=false"
Icon=apex-studio-icon
Terminal=false
StartupNotify=true
StartupWMClass=ApexStudio
DBusActivatable=true

# Desktop actions list
Actions=NewWindow;OpenProfile;SafeMode;

# Action Subsections (Spaces inside section headers)
[Desktop Action NewWindow]
Name=Open New Window
Exec=apex-studio --new-window %U

[Desktop Action OpenProfile]
Name=Open with Selected Profile
Exec=apex-studio --select-profile --path=%f

[Desktop Action SafeMode]
Name=Launch in Safe Mode (No Plugins)
Exec=apex-studio --disable-extensions --log-level=debug

# NetworkManager Keyfile Section (Mixed syntax showcase)
[connection]
id=Nexus-Production-VPN
uuid=a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d
type=vpn
permissions=user:developer:;user:admin:;

[vpn]
service-type=org.freedesktop.NetworkManager.openvpn
data-routes=10.0.0.0/8;172.16.0.0/12;192.168.1.0/24;

%U, 등호 기준의 좌변, true 등 많은 것들이 추가되었다.

그렇다면 '무엇을 추가로 강조한 것이고', 언제 강조해야 할 의미를 얻는가? 이를 한국어를 기준으로 말해 보자.

'말한다'가 객체의 주요 의미일 경우

문장 '병석이는 부모님이 케냐 사람이지만, 한국어를 말하고, 한국 사람이다.'가 있다. 이 때, 병석이는 객체가 되고,'말한다'는 객체의 의미가 된다.

이런 경우, '병석이는 부모님이 케냐 사람이지만, 한국어를 말하고, 한국 사람이다.'와 같이 구문 분석을 하게 된다.

그럼 실제로 강조되는 정보는 '병석이 부모님의 국적'가 손실되고, '병석이의 국적'이 손실되어서 '병석이는 말한다'에 해당한다. 그러나, 보통 우리가 이런 문장을 들을 때는 '병석이 부모님의 국적', '병석이가 말하는 언어', '병석이의 국적'까지 알고 싶어한다.

이 때, 파싱을 '1차 정보'와 '2차 정보', '3차 정보'로 나눠 보겠다.

1차 정보: 문장에서 바로 획득 가능한 의미 중 중요한 것

2차 정보: 1차 정보를 획득하기 위해서 추론 가능한 것

3차 정보: 맥락 상 추론할 수 있으나 불확실한 것

1차 정보

1차 정보를 표시해서 구문 강조를 해 보자.

'병석이부모님케냐 사람이지만, 한국말하고, 한국 사람이다.'

이렇게 하면 병석이가 한국 사람이고, 부모님이 케냐 사람이며, 병석이는 한국어를 말한다는 것이 정리된다.

객체 속성
병석 언어 한국어
병석 속성 사람(기본값, 상속)
병석 국적 대한민국
병석이네 부모님 속성 사람(기본값, 상속)
병석이네 부모님 국적 케냐

사람은 인류 이래로 상속되어온 기본값이기 때문에 사실 공통 속성인 '0차 정보'를 만들어 두어서 항상 사람이라고 가정하면, 한국어 기반의 언어 문법을 만들 수오 있다.

병석이는 부모님 국적이 케냐지만, 언어는 한국어를 말하고, 병석이의 국적은 대한민국이다.

같은 말을 하고 있다.

2차 정보

우선, 병석이의 부모님 국적은 아직 케냐이다.

이것을 통해서, 병석이의 부모님은 신분 상 '이민자'이며, 모종의 이유로 한국에 이민을 와서 살고 있음을 알 수 있다.

만약 귀화를 했다면 속성은 한국어로 완전히 대체되어 문장의 밀도는 낮아진다.

병석이의 부모님은 한국 사람이며, 한국어를 말하며, 병석이의 국적은 대한민국이다.

더 압축하면,

병석이는 최소 1세대 위까지 내국인인 한국인이며, 대한민국 공용어를 쓴다.

이 경우 '대한민국 공용어를 쓴다.'를 날려도 확률이 높은 3차 정보가 된다.

하지만, 우리가 보는 경우에는 병석이의 부모님은 아직 법적으로 한국인이 아니다.

그렇다면 이것을 추론할 수 있다.

'병석이네 부모님은 이민을 오셨다.'

3차 정보

3차 정보에서는 몇 가지 정보를 더 얻을 수 있다.

맥락 상 강한 추론과 중간 추론, 약한 추론이 있다.

맥락 상 강한 추론은, '병석이의 부모님도 한국어를 쓴다'에 해당한다.

병석이에게 한국어를 가르쳐 주기 위해서는 부모님도 한국어를 썼을 것이고, 한국 직장에서 일을 하거나 한국에서 사업을 하신다면 병석이네 부모님도 한국어를 할 수 있을 가능성이 높다.

이 추론은 병석이는 부모님으로부터 언어를 상속받았을 것이라는 역발상으로 따라갈 수 있는 강한 추론이다.

병석이의 부모님은 '케냐 사람이다'. 과반수가 넘는 케냐 사람은 갈색이나 구릿빛 피부를 가지고 있다. 따라서 병석이의 피부도 구릿빛 내지 갈색일 것이다.

이는 '케냐의 민족 구성'이라는 통계에 기반하나, 직접 근거는 약하다.

통계에서 내국인의 갈색-구릿빛 피부 비율이 충분히 높게 나왔을 때, 강한 추론이라고 분류할 것인가?

병석이네 부모님이 N세대 한인이거나, 유럽계 케냐인 등의 '희박한 경우'에 해당하지 않는다고 보장할 수 없으니, 병석이의 피부색에 대한 추론은 중간 추론이 되어야 하나?

약한 추론은 '병석이네 부모님은 직장의 권유로 한국에 파견을 왔다가 그대로 살게 되었다.' 이다.

이민 사유로 1차원적으로 생각할 수 있으나, 병석이의 부모님의 비자 정보를 보기 전 까지는 알기 어렵다.

추가적으로, 병석이네 집에 놀러 갔다고 했을 때 '혹시 비자를 볼 수 있을까요?'는 무례하고 취득하기 힘든 정보이다.

약한 추론이며, 근거를 모으는 것도 맥락 상 차단된다.

각 정보를 다뤄야 하는 계층

1차 정보를 다뤄야 하는 계층은 주로 구문 강조를 위한 단순한 스크립트나, 웹을 위한 경량 엔진 등에 있다.

2차 정보는 트리시터 등을 이용해 정밀하게 구문을 검사하고 전후 맥락을 통해 강조하는 경우, 때때로 사용된다.

3차 정보는 AI 등에 기반한 차세대 IDE 등이 표방할 수 있으나, 완전히 신뢰하기 힘들다.

따라서, highlight.js는 1차 정보까지만 다룬다.

그리고 이 포맷은 주로 1차 정보를 충분히 빼곡하게 담는다.

구문을 강조하는 것은 억양을 만든다

대구 사투리에서는 '억양'이 의미를 담는다.

좀 예스러운 사투리로 문장을 하나 들어 보자. 억양이 끊어지거나 낮게 유지되며 '밤'이라고 하면 '해가 떨어진 상태'가 되고, 억양이 쏘면서 올라가면서 끊으면서 '밤'이라고 하면 '먹는 밤'이 된다.

'낮'은 높고 강하게 찌르며 소리내고, '밤'은 아까처럼 낮게 소리낸다.

먹는 것, 밝은 것, 공격적인 것, 직접 자라나는 것 처럼 의미가 활력을 띠면 대체로 음고도 강하고, 어두운 것, 음침한 것, 주체에 의해 수동적으로 생산된 부산물은 대체로 음고가 약하다.

그리고 그 높낮이의 차는 대체로 일정 범위 안에서 '약속되어 있다'. 이 말은 대구 사투리가 '두 음간의 고저 차'를 자신의 목소리 높이에 맞게 조절하며 의미를 고정하는 역할을 강조한다는 뜻이다.

highlight.js의 구문 강조도 같은 맥락에 있다.

'어저께 밤에 군밤장수가 밤 몇 줌 파는데, 냄시가 꼬시가 좀 팔리 줬다. 노나 묵게 오소.'

라고 하면 '어저께', '밤 몇 줌'이 헷갈린다.

하지만 이처럼 구문 강조를 해보자.

'어저께 군밤장수가 밤 몇 줌 파는데, 냄시꼬시가팔리 줬다.

해가 지는 밤은 굵은 글씨, 군밤은 갈색 글씨이다.

이를 보고 '아하, 어두운 밤이구나', '아하, 먹는 밤이구나'가 드러난다.

만약 이처럼 색을 통제할 수 있다면 더욱 좋지만, 저 색이 멋대로 바뀌더라도 먹는 밤과 어두운 밤의 의미 경계가 생긴다.

"시경"의 고시가, 이규보의 시집, 고려가요나 민요 등을 보아도 의미와 운율은 한 몸이다.

우리가 구문 강조를 개발하기 위해서는, 이처럼 운율과 리듬을 구분 단위로 보아서 힘이 들어가는 곳에서 분절을 강화하는 것이 매우 중요하다.

Back

Comments

No comments yet.