티스토리에 코드 하이라이팅 스타일 라이브러리 설치하는 방법

티스토리에 개발 관련 글을 올릴 때 코드가 평범한 텍스트처럼 보이면 글의 완성도가 많이 떨어집니다. 특히 HTML, CSS, JavaScript처럼 구조와 문법이 중요한 코드는 색상 구분이 있어야 읽기 훨씬 편합니다.
이럴 때 많이 사용하는 방식이 코드 하이라이팅 라이브러리 적용입니다. 티스토리에서는 별도의 빌드 환경 없이도 스킨 편집만으로 적용할 수 있고, 그중에서 가장 무난한 선택지가 Prism.js입니다.
이번 글에서는 티스토리에 Prism.js를 적용하는 방법부터, 실제로 하이라이팅이 안 될 때 확인해야 할 핵심 원인까지 정리해보겠습니다.
왜 Prism.js를 많이 사용할까
Prism.js는 가볍고 구조가 단순합니다. CSS 파일로 테마를 불러오고, JS 파일로 문법 하이라이팅을 활성화한 뒤, 코드 블록에 언어 클래스를 붙이면 됩니다.
즉, 기본 구조는 아래 세 가지입니다.
- Prism 테마 CSS 불러오기
- Prism JS와 필요한 언어 컴포넌트 불러오기
- 본문 코드 블록에 올바른 언어 클래스 적용하기
설정 방식이 복잡하지 않아서 티스토리 같은 블로그 환경에도 잘 맞습니다.
티스토리에 Prism.js 적용하는 기본 방법
티스토리 관리자에서 아래 경로로 들어갑니다.
티스토리 관리자 → 꾸미기 → 스킨 편집 → HTML 편집
여기서 스킨의 HTML에 Prism 관련 코드를 추가하면 됩니다.
1. <head> 안에 Prism 테마 CSS 추가
먼저 코드 블록 디자인에 필요한 테마 CSS를 넣습니다.
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
이 코드는 <head> 태그 안에 넣으면 됩니다.
prism-tomorrow.min.css는 어두운 배경 기반이라 코드 가독성이 좋은 편입니다. 다른 테마를 쓰고 싶다면 해당 파일만 바꾸면 됩니다.
2. </body> 바로 위에 Prism JS 추가
이제 문법 하이라이팅을 실제로 동작시키기 위한 JS 파일을 넣습니다.
<script>
window.Prism = window.Prism || {};
Prism.manual = true;
</script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-javascript.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-css.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-markup.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
Prism.highlightAll();
});
</script>
이 코드는 </body> 태그 바로 위에 넣으면 됩니다.
여기서 중요한 점은 prism.min.js만 넣는다고 모든 언어가 자동으로 하이라이팅되는 것은 아니라는 점입니다. 자주 쓰는 언어별 컴포넌트도 함께 불러와야 합니다.
글 본문에서 코드 블록 작성하는 방법
Prism.js를 연결했더라도, 글 본문 코드 블록의 HTML 구조가 맞지 않으면 하이라이팅은 적용되지 않습니다.
가장 기본적인 형태는 아래와 같습니다.
<pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre>
HTML 예제는 이렇게 작성합니다.
<pre><code class="language-html">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
</code></pre>
CSS 예제는 이렇게 작성합니다.
<pre><code class="language-css">
body {
background: #111;
color: #fff;
}
</code></pre>
즉, 핵심은 language-언어명 클래스를 정확하게 붙이는 것입니다.
티스토리에서 하이라이팅이 안 되는 가장 흔한 이유
여기서 많은 분들이 헷갈리는 부분이 있습니다. Prism 파일을 연결했는데도 코드 하이라이팅이 안 되는 경우, 실제 원인은 보통 아래 둘 중 하나입니다.
1. 코드 블록이 Prism 형식으로 출력되지 않는 경우
Prism은 아래 같은 구조를 기대합니다.
<pre class="language-html"><code class="language-html">...</code></pre>
그런데 티스토리 에디터나 일부 스킨에서는 이런 식으로 출력되는 경우가 있습니다.
<pre class="xml"><code>...</code></pre>
또는
<pre class="routeros"><code>...</code></pre>
또는
<pre class="typescript"><code>...</code></pre>
이 경우 Prism은 제대로 인식하지 못할 수 있습니다.
이유는 Prism이 xml, routeros, typescript 같은 단순 클래스가 아니라, language-html, language-css, language-javascript 같은 형식을 기준으로 동작하기 때문입니다.
2. 코드 종류와 클래스명이 맞지 않는 경우
예를 들어 아래 코드는 HTML 코드입니다.
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
그런데 이 코드를 아래처럼 감싸면 맞지 않습니다.
<pre class="routeros"><code>...</code></pre>
이 코드는 RouterOS 문법이 아니라 HTML 마크업이기 때문에, routeros로 지정하면 하이라이팅이 제대로 되지 않는 것이 정상입니다.
이럴 때는 아래처럼 바꿔야 합니다.
<pre class="language-html"><code class="language-html"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
또는 이렇게 작성해도 됩니다.
<pre class="language-markup"><code class="language-markup"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
실제로 자주 틀리는 예시
아래처럼 작성하면 하이라이팅이 안 될 수 있습니다.
<pre class="xml"><code><script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script></code></pre>
이유는 xml 클래스만 붙어 있고, Prism이 기대하는 language-html 또는 language-markup 형식이 아니기 때문입니다.
수정된 예시는 아래와 같습니다.
<pre class="language-html"><code class="language-html"><script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-javascript.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-css.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-markup.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js"></script></code></pre>
또 아래처럼 되어 있어도 문제가 됩니다.
<pre class="routeros"><code><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
이 코드의 실제 내용은 RouterOS가 아니라 HTML이므로, 아래처럼 바꿔야 맞습니다.
<pre class="language-html"><code class="language-html"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
코드 예시를 감싼 코드도 클래스가 맞아야 한다
이 부분도 자주 놓치는 문제입니다. 아래 코드는 겉보기에는 typescript 클래스로 감싸져 있습니다.
<pre class="typescript"><code><pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre></code></pre>
하지만 이 안의 실제 내용은 TypeScript 문법이 아닙니다. 이 코드는 “자바스크립트 코드 블록을 작성하는 HTML 예시”를 보여주는 문자열입니다.
즉, 이 경우에도 typescript보다는 language-html 또는 language-markup이 더 맞습니다.
수정 예시는 아래처럼 쓰는 편이 정확합니다.
<pre class="language-html"><code class="language-html"><pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre></code></pre>
핵심은 코드 블록 안에 JavaScript 코드가 들어 있다고 해서 바깥 블록까지 JavaScript나 TypeScript로 분류하는 것이 아니라, 현재 화면에 출력하려는 코드 문자열 자체가 어떤 문법인지 기준으로 클래스명을 정해야 한다는 점입니다.
즉:
- 실제 JavaScript 코드 자체를 보여주면
language-javascript - JavaScript 코드 블록을 만드는 HTML 예시를 보여주면
language-html또는language-markup
이 기준을 혼동하면 하이라이팅이 어색해지거나 적용되지 않을 수 있습니다.
티스토리 에디터가 예전 클래스명을 출력할 때 해결하는 방법
문제는 티스토리에서 글을 작성할 때 자동으로 pre.xml, pre.css, pre.javascript, pre.typescript 같은 예전 스타일 클래스를 출력하는 경우가 있다는 점입니다.
이럴 때는 Prism이 인식할 수 있도록 클래스를 변환하는 스크립트를 추가하면 됩니다.
아래 코드를 </body> 바로 위, Prism 스크립트 아래쪽에 넣으면 됩니다.
<script>
document.addEventListener('DOMContentLoaded', function () {
const map = {
xml: 'language-html',
html: 'language-html',
markup: 'language-markup',
css: 'language-css',
javascript: 'language-javascript',
js: 'language-javascript',
typescript: 'language-typescript',
ts: 'language-typescript',
bash: 'language-bash',
shell: 'language-bash',
sh: 'language-bash',
sql: 'language-sql',
mysql: 'language-sql',
pgsql: 'language-sql',
postgresql: 'language-sql',
sqlite: 'language-sql',
n1ql: 'language-sql',
json: 'language-json',
routeros: 'language-html'
};
document.querySelectorAll('pre').forEach(function (pre) {
Object.keys(map).forEach(function (oldClass) {
if (pre.classList.contains(oldClass)) {
pre.classList.remove(oldClass);
pre.classList.add(map[oldClass]);
const code = pre.querySelector('code');
if (code) {
code.classList.add(map[oldClass]);
}
}
});
});
Prism.highlightAll();
});
</script>
여기서 typescript를 language-html로 연결한 이유는, 위 예시처럼 실제 내용이 TypeScript가 아니라 HTML 마크업 예시였기 때문입니다.
단, 정말 TypeScript 코드를 올리는 경우라면 이 매핑은 다르게 봐야 합니다. 예를 들어 실제 TypeScript 코드를 자주 올릴 예정이라면 typescript를 language-typescript로 연결하고, Prism의 TypeScript 컴포넌트도 추가로 불러와야 합니다.
예를 들면 이런 식입니다.
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-typescript.min.js"></script>
즉, typescript라는 클래스가 붙어 있다고 해서 무조건 TypeScript로 처리하는 것이 아니라, 그 안에 들어 있는 실제 코드 내용이 무엇인지 보고 판단해야 합니다.
스킨 CSS와 충돌하는 경우도 있다
Prism이 적용되었는데도 디자인이 어색하거나 색상이 안 보이는 경우는 스킨 CSS가 pre, code 태그를 덮어쓰고 있을 가능성이 큽니다.
그럴 때는 아래처럼 보정 스타일을 추가하는 것이 좋습니다.
.article-view pre[class*="language-"] {
background: #2d2d2d;
padding: 1.2em;
border-radius: 12px;
overflow: auto;
margin: 1.5em 0;
}
.article-view code[class*="language-"] {
font-family: Consolas, Monaco, monospace;
text-shadow: none;
}
.article-view :not(pre) > code[class*="language-"],
.article-view pre[class*="language-"] {
background: #2d2d2d;
}
이렇게 하면 티스토리 기본 스킨 스타일과 충돌할 때도 코드 블록 모양이 더 안정적으로 보입니다.
티스토리에서 Prism.js 적용할 때 정리해야 할 핵심
결국 중요한 것은 아래 네 가지입니다.
<head>에 Prism 테마 CSS 추가</body>위에 Prism JS와 언어 파일 추가- 본문 코드 블록을
language-언어명형식으로 작성 - 티스토리가
xml,routeros,typescript같은 클래스를 뱉는 경우 변환 스크립트 추가
특히 아래처럼 잘못된 클래스는 바로 수정해야 합니다.
<pre class="xml"><code>...</code></pre>
<pre class="routeros"><code>...</code></pre>
<pre class="typescript"><code>...</code></pre>
이런 구조보다 아래처럼 맞추는 것이 정확합니다.
<pre class="language-html"><code class="language-html">...</code></pre>
마무리
티스토리에 코드 하이라이팅을 적용하는 작업 자체는 어렵지 않습니다. 하지만 실제로는 Prism 파일을 넣는 것보다, 글 본문에서 출력되는 코드 블록 HTML 구조가 더 중요합니다.
파일을 잘 연결했는데 하이라이팅이 안 된다면, 대개 아래 둘 중 하나입니다.
- 코드 블록 클래스가
language-...형식이 아님 - 코드 내용과 언어 클래스가 서로 맞지 않음
즉, Prism.js를 붙였는데도 동작하지 않는다면 라이브러리 문제보다 코드 블록 마크업 문제를 먼저 의심하는 편이 맞습니다.
원래 적용 방법만 보면 단순해 보이지만, 티스토리에서는 pre.xml, pre.routeros, pre.typescript처럼 출력되는 경우가 생각보다 흔해서 이 부분까지 같이 잡아줘야 실제로 제대로 작동합니다.

When you publish development articles on Tistory, the article feels much less polished if code appears as plain text. Code where structure and syntax matter, such as HTML, CSS, and JavaScript, is much easier to read when it has color-based syntax distinction.
A common way to handle this is to apply a code highlighting library. In Tistory, you can apply it by editing the skin without a separate build environment, and one of the most reasonable choices is Prism.js.
This article covers how to apply Prism.js to Tistory and the key causes to check when highlighting does not actually work.
Why Do People Use Prism.js Often?
Prism.js is lightweight and simple in structure. You load a theme with a CSS file, activate syntax highlighting with a JS file, and add the language class to the code block.
The basic structure is these three parts.
- Load a Prism theme CSS
- Load Prism JS and the required language components
- Apply the correct language class to code blocks in the post body
Because the setup is not complicated, it works well in blog environments like Tistory.
Basic Method for Applying Prism.js to Tistory
In the Tistory admin, go to this path.
Tistory Admin -> Customize -> Skin Edit -> HTML Edit
Here, add Prism-related code to the skin HTML.
1. Add Prism Theme CSS inside <head>
First, add the theme CSS needed for code block design.
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
Put this code inside the <head> tag.
prism-tomorrow.min.css is based on a dark background and generally has good readability. If you want another theme, you can change only that file.
2. Add Prism JS Right above </body>
Now add the JS files that actually make syntax highlighting work.
<script>
window.Prism = window.Prism || {};
Prism.manual = true;
</script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-javascript.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-css.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-markup.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
Prism.highlightAll();
});
</script>
Put this code right above the </body> tag.
The important point is that adding only prism.min.js does not automatically highlight every language. You also need to load components for the languages you frequently use.
How to Write Code Blocks in the Post Body
Even if Prism.js is connected, highlighting will not apply if the HTML structure of the code block in the post body is wrong.
The most basic form is:
<pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre>
An HTML example is written like this.
<pre><code class="language-html">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
</code></pre>
A CSS example is written like this.
<pre><code class="language-css">
body {
background: #111;
color: #fff;
}
</code></pre>
The key is to attach the language-languageName class accurately.
The Most Common Reasons Highlighting Does Not Work in Tistory
This is where many people get confused. If Prism files are connected but code highlighting still does not work, the actual cause is usually one of the following two.
1. The Code Block Is Not Output in Prism Format
Prism expects a structure like this.
<pre class="language-html"><code class="language-html">...</code></pre>
However, the Tistory editor or some skins may output something like this.
<pre class="xml"><code>...</code></pre>
Or:
<pre class="routeros"><code>...</code></pre>
Or:
<pre class="typescript"><code>...</code></pre>
In this case, Prism may not recognize it correctly.
The reason is that Prism operates based on formats such as language-html, language-css, and language-javascript, not simple classes like xml, routeros, or typescript.
2. The Code Type and Class Name Do Not Match
For example, the code below is HTML code.
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
But wrapping it like this is incorrect.
<pre class="routeros"><code>...</code></pre>
This is not RouterOS syntax but HTML markup, so it is normal for highlighting to fail if it is marked as routeros.
In this case, change it like this.
<pre class="language-html"><code class="language-html"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
Or you can write it like this.
<pre class="language-markup"><code class="language-markup"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
Common Mistakes
If you write it like this, highlighting may not work.
<pre class="xml"><code><script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script></code></pre>
The reason is that only the xml class is attached, and it is not the language-html or language-markup format Prism expects.
A corrected example is:
<pre class="language-html"><code class="language-html"><script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-javascript.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-css.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-markup.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js"></script></code></pre>
This is also a problem.
<pre class="routeros"><code><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
The actual content of this code is HTML, not RouterOS, so it should be changed like this.
<pre class="language-html"><code class="language-html"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
The Class Must Match Even When the Code Shows Wrapped Code Examples
This is another issue people often miss. The code below is wrapped with a typescript class at first glance.
<pre class="typescript"><code><pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre></code></pre>
But the actual content inside is not TypeScript syntax. This code is a string that shows an “HTML example for writing a JavaScript code block.”
So in this case, language-html or language-markup is more accurate than typescript.
A corrected example should be written like this.
<pre class="language-html"><code class="language-html"><pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre></code></pre>
The key is not to classify the outer block as JavaScript or TypeScript just because JavaScript code appears inside it. You should choose the class based on the syntax of the code string currently being displayed on screen.
That means:
- If you show actual JavaScript code itself, use
language-javascript - If you show an HTML example that creates a JavaScript code block, use
language-htmlorlanguage-markup
If you confuse this distinction, highlighting can look awkward or fail to apply.
How to Fix It When the Tistory Editor Outputs Old Class Names
The problem is that when writing posts in Tistory, it may automatically output old-style classes such as pre.xml, pre.css, pre.javascript, or pre.typescript.
In that case, add a script that converts the classes into a form Prism can recognize.
Put the code below right above </body>, below the Prism scripts.
<script>
document.addEventListener('DOMContentLoaded', function () {
const map = {
xml: 'language-html',
html: 'language-html',
markup: 'language-markup',
css: 'language-css',
javascript: 'language-javascript',
js: 'language-javascript',
typescript: 'language-typescript',
ts: 'language-typescript',
bash: 'language-bash',
shell: 'language-bash',
sh: 'language-bash',
sql: 'language-sql',
mysql: 'language-sql',
pgsql: 'language-sql',
postgresql: 'language-sql',
sqlite: 'language-sql',
n1ql: 'language-sql',
json: 'language-json',
routeros: 'language-html'
};
document.querySelectorAll('pre').forEach(function (pre) {
Object.keys(map).forEach(function (oldClass) {
if (pre.classList.contains(oldClass)) {
pre.classList.remove(oldClass);
pre.classList.add(map[oldClass]);
const code = pre.querySelector('code');
if (code) {
code.classList.add(map[oldClass]);
}
}
});
});
Prism.highlightAll();
});
</script>
The reason typescript was connected to language-html in the example above was that the actual content was not TypeScript but an HTML markup example.
However, if you are really posting TypeScript code, you should treat that mapping differently. For example, if you often post actual TypeScript code, map typescript to language-typescript and also load Prism’s TypeScript component.
For example:
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-typescript.min.js"></script>
In other words, even if the class is typescript, you should not automatically treat it as TypeScript. You need to judge based on what the actual code inside is.
Skin CSS Can Also Conflict
If Prism is applied but the design looks awkward or colors do not appear, the skin CSS may be overriding the pre and code tags.
In that case, it is useful to add corrective styles like this.
.article-view pre[class*="language-"] {
background: #2d2d2d;
padding: 1.2em;
border-radius: 12px;
overflow: auto;
margin: 1.5em 0;
}
.article-view code[class*="language-"] {
font-family: Consolas, Monaco, monospace;
text-shadow: none;
}
.article-view :not(pre) > code[class*="language-"],
.article-view pre[class*="language-"] {
background: #2d2d2d;
}
This makes code blocks look more stable even when they conflict with Tistory’s default skin styles.
Key Points When Applying Prism.js in Tistory
In the end, the important points are these four.
- Add Prism theme CSS inside
<head> - Add Prism JS and language files above
</body> - Write body code blocks in the
language-languageNameformat - If Tistory outputs classes like
xml,routeros, ortypescript, add a conversion script
In particular, incorrectly assigned classes like these should be fixed immediately.
<pre class="xml"><code>...</code></pre>
<pre class="routeros"><code>...</code></pre>
<pre class="typescript"><code>...</code></pre>
It is more accurate to align them like this.
<pre class="language-html"><code class="language-html">...</code></pre>
Closing
Applying code highlighting to Tistory itself is not difficult. But in practice, the HTML structure of the code block output in the post body is more important than simply adding Prism files.
If you connected the files correctly but highlighting does not work, it is usually one of these two issues.
- The code block class is not in the
language-...format - The code content and language class do not match
So if Prism.js is attached but still does not work, it is better to suspect the code block markup before suspecting the library.
The setup may look simple if you only look at the basic method, but in Tistory, outputs such as pre.xml, pre.routeros, and pre.typescript are more common than expected. You need to handle that part too for it to actually work correctly.

在 Tistory 发布开发相关文章时,如果代码看起来只是普通文本,文章的完成度会下降很多。尤其是 HTML、CSS、JavaScript 这类结构和语法很重要的代码,有颜色区分会更容易阅读。
这时常用的方法是应用代码高亮库。在 Tistory 中,不需要单独的构建环境,只通过编辑 skin 就能应用,而其中最稳妥的选择之一是 Prism.js。
本文会整理如何在 Tistory 中应用 Prism.js,以及实际高亮不生效时需要检查的核心原因。
为什么常用 Prism.js?
Prism.js 很轻量,结构也简单。通过 CSS 文件加载主题,通过 JS 文件启用语法高亮,然后给代码块添加语言 class 即可。
也就是说,基本结构是下面三项。
- 加载 Prism 主题 CSS
- 加载 Prism JS 和需要的语言组件
- 给正文代码块添加正确的语言 class
设置方式不复杂,所以也很适合 Tistory 这样的博客环境。
在 Tistory 中应用 Prism.js 的基本方法
在 Tistory 管理后台进入下面路径。
Tistory 管理 -> 装饰 -> Skin 编辑 -> HTML 编辑
在这里,把 Prism 相关代码添加到 skin 的 HTML 中。
1. 在 <head> 中添加 Prism 主题 CSS
首先加入代码块设计所需的主题 CSS。
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
这段代码放在 <head> 标签内即可。
prism-tomorrow.min.css 是基于深色背景的主题,代码可读性比较好。如果想使用其他主题,只要替换这个文件即可。
2. 在 </body> 正上方添加 Prism JS
接着添加实际让语法高亮工作的 JS 文件。
<script>
window.Prism = window.Prism || {};
Prism.manual = true;
</script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-javascript.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-css.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-markup.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
Prism.highlightAll();
});
</script>
这段代码放在 </body> 标签正上方即可。
需要注意的是,只加入 prism.min.js 并不代表所有语言都会自动高亮。还需要一起加载常用语言的组件。
在文章正文中如何写代码块
即使已经连接 Prism.js,如果正文代码块的 HTML 结构不正确,高亮也不会应用。
最基本的形式如下。
<pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre>
HTML 示例这样写。
<pre><code class="language-html">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
</code></pre>
CSS 示例这样写。
<pre><code class="language-css">
body {
background: #111;
color: #fff;
}
</code></pre>
核心是准确添加 language-语言名 class。
Tistory 中高亮不生效的最常见原因
这里是很多人容易混淆的地方。Prism 文件已经连接,却仍然没有代码高亮时,实际原因通常是下面两个之一。
1. 代码块没有以 Prism 格式输出
Prism 期待下面这样的结构。
<pre class="language-html"><code class="language-html">...</code></pre>
但 Tistory 编辑器或某些 skin 可能会输出成这样。
<pre class="xml"><code>...</code></pre>
或者:
<pre class="routeros"><code>...</code></pre>
或者:
<pre class="typescript"><code>...</code></pre>
这种情况下,Prism 可能无法正确识别。
原因是 Prism 的运行标准不是 xml、routeros、typescript 这样的简单 class,而是 language-html、language-css、language-javascript 这样的格式。
2. 代码类型和 class 名称不匹配
例如下面这段是 HTML 代码。
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
但如果像下面这样包裹,就不匹配。
<pre class="routeros"><code>...</code></pre>
这段代码不是 RouterOS 语法,而是 HTML markup,因此指定为 routeros 时高亮无法正确工作是正常的。
这种情况下应改成下面这样。
<pre class="language-html"><code class="language-html"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
也可以这样写。
<pre class="language-markup"><code class="language-markup"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
实际常见错误示例
如果像下面这样写,高亮可能不会生效。
<pre class="xml"><code><script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script></code></pre>
原因是只添加了 xml class,而不是 Prism 期待的 language-html 或 language-markup 格式。
修正示例如下。
<pre class="language-html"><code class="language-html"><script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-javascript.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-css.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-markup.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js"></script></code></pre>
下面这样也会有问题。
<pre class="routeros"><code><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
这段代码的实际内容是 HTML,不是 RouterOS,因此应该改成下面这样。
<pre class="language-html"><code class="language-html"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
包裹代码示例的代码块也要 class 正确
这也是经常被忽略的问题。下面这段从外观看是用 typescript class 包裹的。
<pre class="typescript"><code><pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre></code></pre>
但里面的实际内容不是 TypeScript 语法。 这段代码是在展示“如何写 JavaScript 代码块的 HTML 示例”。
也就是说,这种情况下 language-html 或 language-markup 比 typescript 更准确。
修正示例建议这样写。
<pre class="language-html"><code class="language-html"><pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre></code></pre>
核心是,不要因为代码块里面出现 JavaScript 代码,就把外层也分类成 JavaScript 或 TypeScript,而是要根据 当前画面上要显示的代码字符串本身属于哪种语法 来决定 class 名称。
也就是:
- 展示实际 JavaScript 代码本身时,用
language-javascript - 展示创建 JavaScript 代码块的 HTML 示例时,用
language-html或language-markup
如果混淆这个标准,高亮可能会变得奇怪,甚至不生效。
Tistory 编辑器输出旧 class 名称时的解决方法
问题在于,在 Tistory 写文章时,有时会自动输出 pre.xml、pre.css、pre.javascript、pre.typescript 这样的旧式 class。
这种情况下,可以添加转换 class 的脚本,让 Prism 能识别。
把下面代码放在 </body> 正上方、Prism 脚本下方即可。
<script>
document.addEventListener('DOMContentLoaded', function () {
const map = {
xml: 'language-html',
html: 'language-html',
markup: 'language-markup',
css: 'language-css',
javascript: 'language-javascript',
js: 'language-javascript',
typescript: 'language-typescript',
ts: 'language-typescript',
bash: 'language-bash',
shell: 'language-bash',
sh: 'language-bash',
sql: 'language-sql',
mysql: 'language-sql',
pgsql: 'language-sql',
postgresql: 'language-sql',
sqlite: 'language-sql',
n1ql: 'language-sql',
json: 'language-json',
routeros: 'language-html'
};
document.querySelectorAll('pre').forEach(function (pre) {
Object.keys(map).forEach(function (oldClass) {
if (pre.classList.contains(oldClass)) {
pre.classList.remove(oldClass);
pre.classList.add(map[oldClass]);
const code = pre.querySelector('code');
if (code) {
code.classList.add(map[oldClass]);
}
}
});
});
Prism.highlightAll();
});
</script>
这里把 typescript 连接到 language-html 的原因,是上面的示例中实际内容不是 TypeScript,而是 HTML markup 示例。
不过,如果真的要发布 TypeScript 代码,这个映射就应该另看。例如经常发布实际 TypeScript 代码时,应把 typescript 连接到 language-typescript,并额外加载 Prism 的 TypeScript 组件。
例如:
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-typescript.min.js"></script>
也就是说,不能因为 class 叫 typescript 就无条件按 TypeScript 处理,而要根据 里面实际包含的代码内容是什么 来判断。
也可能和 Skin CSS 冲突
如果 Prism 已应用,但设计看起来奇怪或颜色不显示,很可能是 skin CSS 覆盖了 pre、code 标签。
这种情况下,建议添加下面这样的补正样式。
.article-view pre[class*="language-"] {
background: #2d2d2d;
padding: 1.2em;
border-radius: 12px;
overflow: auto;
margin: 1.5em 0;
}
.article-view code[class*="language-"] {
font-family: Consolas, Monaco, monospace;
text-shadow: none;
}
.article-view :not(pre) > code[class*="language-"],
.article-view pre[class*="language-"] {
background: #2d2d2d;
}
这样即使和 Tistory 默认 skin 样式冲突,代码块外观也会更稳定。
在 Tistory 应用 Prism.js 时要整理的核心
最终重要的是下面四点。
- 在
<head>中添加 Prism 主题 CSS - 在
</body>上方添加 Prism JS 和语言文件 - 正文代码块按
language-语言名格式编写 - 如果 Tistory 输出
xml、routeros、typescript等 class,添加转换脚本
尤其是下面这样的错误 class 应立即修正。
<pre class="xml"><code>...</code></pre>
<pre class="routeros"><code>...</code></pre>
<pre class="typescript"><code>...</code></pre>
比起这种结构,更准确的是下面这样。
<pre class="language-html"><code class="language-html">...</code></pre>
结语
在 Tistory 中应用代码高亮本身并不难。 但实际更重要的不是加入 Prism 文件,而是文章正文中输出的代码块 HTML 结构。
如果文件连接正确但高亮不生效,通常是下面两个原因之一。
- 代码块 class 不是
language-...格式 - 代码内容和语言 class 不匹配
也就是说,已经接入 Prism.js 却不工作时,应该先怀疑代码块 markup,而不是先怀疑库本身。
只看原始应用方法会觉得很简单,但在 Tistory 中,pre.xml、pre.routeros、pre.typescript 这样的输出比想象中常见,所以必须一起处理这部分,才能真正正常工作。

Tistoryで開発系の記事を公開するとき、コードがただのテキストのように見えると、記事全体の完成度が大きく下がります。特にHTML、CSS、JavaScriptのように構造と文法が重要なコードは、色分けがあるほうがずっと読みやすくなります。
このようなときによく使う方法が、コードハイライト用ライブラリの導入です。Tistoryでは別のビルド環境を用意しなくても、スキン編集だけで適用できます。その中でも無難な選択肢の一つが Prism.js です。
この記事では、TistoryにPrism.jsを適用する方法から、実際にハイライトが効かないときに確認すべき主な原因まで整理します。
Prism.jsがよく使われる理由
Prism.jsは軽量で、構造もシンプルです。CSSファイルでテーマを読み込み、JSファイルでシンタックスハイライトを有効化し、コードブロックに言語classを付ければ動作します。
基本構成は次の3つです。
- PrismテーマCSSを読み込む
- Prism JSと必要な言語コンポーネントを読み込む
- 本文のコードブロックに正しい言語classを付ける
設定方法が複雑ではないため、Tistoryのようなブログ環境にもよく合います。
TistoryにPrism.jsを適用する基本方法
Tistory管理画面で、次の場所に移動します。
Tistory管理 -> デザイン -> スキン編集 -> HTML編集
ここでスキンのHTMLにPrism関連のコードを追加します。
1. <head>内にPrismテーマCSSを追加する
まず、コードブロックの見た目に必要なテーマCSSを入れます。
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
このコードは <head> タグ内に入れれば大丈夫です。
prism-tomorrow.min.css は暗い背景ベースのテーマで、コードの可読性も比較的良好です。別のテーマを使いたい場合は、このファイルだけ差し替えれば済みます。
2. </body>の直前にPrism JSを追加する
次に、実際にシンタックスハイライトを動かすためのJSファイルを入れます。
<script>
window.Prism = window.Prism || {};
Prism.manual = true;
</script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-javascript.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-css.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-markup.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
Prism.highlightAll();
});
</script>
このコードは </body> タグの直前に入れます。
重要なのは、prism.min.js だけを入れてもすべての言語が自動でハイライトされるわけではない点です。よく使う言語ごとのコンポーネントも一緒に読み込む必要があります。
記事本文でコードブロックを書く方法
Prism.jsを接続していても、本文のコードブロックのHTML構造が合っていなければ、ハイライトは適用されません。
最も基本的な形は次のとおりです。
<pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre>
HTMLの例はこのように書きます。
<pre><code class="language-html">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
</code></pre>
CSSの例はこのように書きます。
<pre><code class="language-css">
body {
background: #111;
color: #fff;
}
</code></pre>
つまり、重要なのは language-言語名 のclassを正確に付けることです。
Tistoryでハイライトが効かない最もよくある理由
ここで混乱する人が多いです。Prismファイルを読み込んだのにコードハイライトが効かない場合、実際の原因はたいてい次のどちらかです。
1. コードブロックがPrism形式で出力されていない
Prismは次のような構造を期待します。
<pre class="language-html"><code class="language-html">...</code></pre>
ところが、Tistoryエディタや一部のスキンでは次のように出力されることがあります。
<pre class="xml"><code>...</code></pre>
または:
<pre class="routeros"><code>...</code></pre>
または:
<pre class="typescript"><code>...</code></pre>
この場合、Prismが正しく認識できないことがあります。
理由は、Prismが xml、routeros、typescript のような単純なclassではなく、language-html、language-css、language-javascript のような形式を基準に動作するためです。
2. コードの種類とclass名が一致していない
たとえば、次のコードはHTMLコードです。
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
しかし、これを次のように包むと一致しません。
<pre class="routeros"><code>...</code></pre>
このコードはRouterOS文法ではなくHTMLマークアップなので、routeros と指定するとハイライトが正しく効かないのは自然です。
この場合は次のように変える必要があります。
<pre class="language-html"><code class="language-html"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
または、次のように書いてもかまいません。
<pre class="language-markup"><code class="language-markup"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
実際によくある間違い
次のように書くと、ハイライトが効かないことがあります。
<pre class="xml"><code><script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script></code></pre>
理由は、xml classだけが付いていて、Prismが期待する language-html または language-markup 形式ではないためです。
修正後の例は次のとおりです。
<pre class="language-html"><code class="language-html"><script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-javascript.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-css.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-markup.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js"></script></code></pre>
次のようになっていても問題になります。
<pre class="routeros"><code><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
このコードの実際の内容はRouterOSではなくHTMLなので、次のように変えるのが正確です。
<pre class="language-html"><code class="language-html"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
コード例を包む外側のコードブロックもclassを合わせる
ここもよく見落とされる問題です。次のコードは、一見すると typescript classで包まれています。
<pre class="typescript"><code><pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre></code></pre>
しかし、この中の実際の内容はTypeScript文法ではありません。 これは「JavaScriptコードブロックを書くためのHTML例」を示す文字列です。
つまり、この場合も typescript より language-html または language-markup のほうが正確です。
修正例は次のように書くのが適切です。
<pre class="language-html"><code class="language-html"><pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre></code></pre>
重要なのは、コードブロックの中にJavaScriptコードが入っているからといって、外側のブロックまでJavaScriptやTypeScriptに分類しないことです。画面に表示しようとしているコード文字列自体がどの文法なのかを基準にclass名を決める必要があります。
つまり:
- 実際のJavaScriptコードそのものを見せるなら
language-javascript - JavaScriptコードブロックを作るHTML例を見せるなら
language-htmlまたはlanguage-markup
この基準を混同すると、ハイライトが不自然になったり、適用されなかったりします。
Tistoryエディタが古いclass名を出力する場合の解決方法
問題は、Tistoryで記事を書くときに pre.xml、pre.css、pre.javascript、pre.typescript のような古い形式のclassが自動で出力される場合があることです。
この場合は、Prismが認識できる形にclassを変換するスクリプトを追加するとよいです。
次のコードを </body> の直前、Prismスクリプトの下側に入れます。
<script>
document.addEventListener('DOMContentLoaded', function () {
const map = {
xml: 'language-html',
html: 'language-html',
markup: 'language-markup',
css: 'language-css',
javascript: 'language-javascript',
js: 'language-javascript',
typescript: 'language-typescript',
ts: 'language-typescript',
bash: 'language-bash',
shell: 'language-bash',
sh: 'language-bash',
sql: 'language-sql',
mysql: 'language-sql',
pgsql: 'language-sql',
postgresql: 'language-sql',
sqlite: 'language-sql',
n1ql: 'language-sql',
json: 'language-json',
routeros: 'language-html'
};
document.querySelectorAll('pre').forEach(function (pre) {
Object.keys(map).forEach(function (oldClass) {
if (pre.classList.contains(oldClass)) {
pre.classList.remove(oldClass);
pre.classList.add(map[oldClass]);
const code = pre.querySelector('code');
if (code) {
code.classList.add(map[oldClass]);
}
}
});
});
Prism.highlightAll();
});
</script>
上の例で typescript を扱うときに注意が必要なのは、実際の内容がTypeScriptではなくHTMLマークアップ例であるケースがあるためです。
ただし、本当にTypeScriptコードを載せる場合は、このマッピングは別に考えるべきです。たとえば実際のTypeScriptコードをよく投稿するなら、typescript を language-typescript に接続し、PrismのTypeScriptコンポーネントも追加で読み込む必要があります。
たとえば次のようになります。
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-typescript.min.js"></script>
つまり、typescript というclassが付いているからといって無条件にTypeScriptとして処理するのではなく、その中に入っている実際のコード内容が何かを見て判断する必要があります。
スキンCSSと衝突する場合もある
Prismが適用されているのに見た目が不自然だったり色が表示されなかったりする場合は、スキンCSSが pre、code タグを上書きしている可能性が高いです。
その場合は、次のような補正スタイルを追加すると安定します。
.article-view pre[class*="language-"] {
background: #2d2d2d;
padding: 1.2em;
border-radius: 12px;
overflow: auto;
margin: 1.5em 0;
}
.article-view code[class*="language-"] {
font-family: Consolas, Monaco, monospace;
text-shadow: none;
}
.article-view :not(pre) > code[class*="language-"],
.article-view pre[class*="language-"] {
background: #2d2d2d;
}
こうすると、Tistoryの基本スキンスタイルと衝突する場合でも、コードブロックの見た目がより安定します。
TistoryでPrism.jsを適用するときの要点
結局、重要なのは次の4つです。
<head>にPrismテーマCSSを追加する</body>の上にPrism JSと言語ファイルを追加する- 本文のコードブロックを
language-言語名形式で書く - Tistoryが
xml、routeros、typescriptのようなclassを出力する場合は変換スクリプトを追加する
特に、次のような誤ったclassはすぐに修正する必要があります。
<pre class="xml"><code>...</code></pre>
<pre class="routeros"><code>...</code></pre>
<pre class="typescript"><code>...</code></pre>
このような構造より、次のように合わせるのが正確です。
<pre class="language-html"><code class="language-html">...</code></pre>
まとめ
Tistoryにコードハイライトを適用する作業そのものは難しくありません。 ただし実際には、Prismファイルを追加することよりも、記事本文で出力されるコードブロックのHTML構造のほうが重要です。
ファイルを正しく接続したのにハイライトが効かないなら、たいてい次のどちらかです。
- コードブロックのclassが
language-...形式ではない - コード内容と言語classが一致していない
つまり、Prism.jsを付けたのに動作しない場合は、ライブラリそのものより先にコードブロックのマークアップを疑うほうが現実的です。
基本の適用方法だけを見ると単純に見えますが、Tistoryでは pre.xml、pre.routeros、pre.typescript のように出力されることが思ったより多いため、この部分まで一緒に直してこそ正しく動作します。

Cuando publicas artículos de desarrollo en Tistory, si el código se ve como texto plano, el post pierde mucha calidad. En especial, el código cuya estructura y sintaxis importan, como HTML, CSS y JavaScript, se lee mucho mejor cuando tiene diferenciación por color.
Una forma habitual de resolverlo es aplicar una librería de resaltado de código. En Tistory se puede hacer editando el skin, sin preparar un entorno de build aparte, y una de las opciones más razonables es Prism.js.
En este artículo veremos cómo aplicar Prism.js en Tistory y cuáles son las causas principales que conviene revisar cuando el resaltado no funciona.
Por qué se usa tanto Prism.js
Prism.js es ligero y tiene una estructura simple. Cargas el tema con un archivo CSS, activas el resaltado de sintaxis con un archivo JS y añades la clase de lenguaje al bloque de código.
La estructura básica tiene estas tres partes.
- Cargar el CSS de un tema de Prism
- Cargar Prism JS y los componentes de lenguaje necesarios
- Aplicar la clase de lenguaje correcta a los bloques de código del cuerpo del post
Como la configuración no es complicada, encaja bien en entornos de blog como Tistory.
Método básico para aplicar Prism.js en Tistory
En el administrador de Tistory, entra en esta ruta.
Administrador de Tistory -> Personalización -> Editar skin -> Editar HTML
Ahí puedes añadir el código relacionado con Prism al HTML del skin.
1. Añade el CSS del tema de Prism dentro de <head>
Primero añade el CSS del tema necesario para diseñar los bloques de código.
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
Este código va dentro de la etiqueta <head>.
prism-tomorrow.min.css está basado en un fondo oscuro y suele ofrecer buena legibilidad. Si quieres usar otro tema, basta con cambiar ese archivo.
2. Añade Prism JS justo antes de </body>
Ahora añade los archivos JS que hacen funcionar el resaltado de sintaxis.
<script>
window.Prism = window.Prism || {};
Prism.manual = true;
</script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-javascript.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-css.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-markup.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
Prism.highlightAll();
});
</script>
Este código debe colocarse justo antes de la etiqueta </body>.
El punto importante es que añadir solo prism.min.js no resalta automáticamente todos los lenguajes. También necesitas cargar los componentes de los lenguajes que usas con frecuencia.
Cómo escribir bloques de código en el cuerpo del post
Aunque Prism.js esté conectado, el resaltado no se aplicará si la estructura HTML del bloque de código en el cuerpo del post no es correcta.
La forma más básica es esta.
<pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre>
Un ejemplo HTML se escribe así.
<pre><code class="language-html">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
</code></pre>
Un ejemplo CSS se escribe así.
<pre><code class="language-css">
body {
background: #111;
color: #fff;
}
</code></pre>
La clave es añadir con precisión la clase language-nombreDelLenguaje.
Las razones más comunes por las que el resaltado no funciona en Tistory
Aquí es donde mucha gente se confunde. Si los archivos de Prism están conectados pero el resaltado de código no funciona, la causa real suele ser una de estas dos.
1. El bloque de código no se está generando en formato Prism
Prism espera una estructura como esta.
<pre class="language-html"><code class="language-html">...</code></pre>
Pero el editor de Tistory o algunos skins pueden generar algo como esto.
<pre class="xml"><code>...</code></pre>
O:
<pre class="routeros"><code>...</code></pre>
O:
<pre class="typescript"><code>...</code></pre>
En ese caso, Prism puede no reconocerlo correctamente.
La razón es que Prism funciona con formatos como language-html, language-css y language-javascript, no con clases simples como xml, routeros o typescript.
2. El tipo de código y el nombre de la clase no coinciden
Por ejemplo, el siguiente código es HTML.
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
Pero envolverlo así no es correcto.
<pre class="routeros"><code>...</code></pre>
Este código no es sintaxis de RouterOS, sino markup HTML, así que es normal que el resaltado falle si se marca como routeros.
En ese caso, hay que cambiarlo así.
<pre class="language-html"><code class="language-html"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
También puedes escribirlo así.
<pre class="language-markup"><code class="language-markup"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
Errores comunes
Si lo escribes así, puede que el resaltado no funcione.
<pre class="xml"><code><script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script></code></pre>
La razón es que solo tiene la clase xml, y no el formato language-html o language-markup que Prism espera.
Un ejemplo corregido sería este.
<pre class="language-html"><code class="language-html"><script src="https://cdn.jsdelivr.net/npm/prismjs/prism.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-javascript.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-css.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-markup.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js"></script></code></pre>
Esto también es un problema.
<pre class="routeros"><code><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
El contenido real de este código es HTML, no RouterOS, así que debería cambiarse así.
<pre class="language-html"><code class="language-html"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css"></code></pre>
La clase también debe coincidir cuando el código muestra ejemplos de código envuelto
Este es otro problema que se suele pasar por alto. El siguiente código parece estar envuelto con una clase typescript.
<pre class="typescript"><code><pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre></code></pre>
Pero el contenido real no es sintaxis de TypeScript. Es una cadena que muestra un “ejemplo HTML para escribir un bloque de código JavaScript”.
Así que, en este caso, language-html o language-markup es más preciso que typescript.
Un ejemplo corregido debería escribirse así.
<pre class="language-html"><code class="language-html"><pre><code class="language-javascript">
const hello = "world";
console.log(hello);
</code></pre></code></pre>
La clave es no clasificar el bloque externo como JavaScript o TypeScript solo porque dentro aparezca código JavaScript. Debes elegir la clase según la sintaxis de la cadena de código que se está mostrando en pantalla.
Es decir:
- Si muestras código JavaScript real, usa
language-javascript - Si muestras un ejemplo HTML que crea un bloque de código JavaScript, usa
language-htmlolanguage-markup
Si confundes este criterio, el resaltado puede verse extraño o no aplicarse.
Cómo corregirlo cuando el editor de Tistory genera nombres de clase antiguos
El problema es que, al escribir posts en Tistory, a veces se generan automáticamente clases antiguas como pre.xml, pre.css, pre.javascript o pre.typescript.
En ese caso, puedes añadir un script que convierta las clases a un formato que Prism pueda reconocer.
Coloca el siguiente código justo antes de </body>, debajo de los scripts de Prism.
<script>
document.addEventListener('DOMContentLoaded', function () {
const map = {
xml: 'language-html',
html: 'language-html',
markup: 'language-markup',
css: 'language-css',
javascript: 'language-javascript',
js: 'language-javascript',
typescript: 'language-typescript',
ts: 'language-typescript',
bash: 'language-bash',
shell: 'language-bash',
sh: 'language-bash',
sql: 'language-sql',
mysql: 'language-sql',
pgsql: 'language-sql',
postgresql: 'language-sql',
sqlite: 'language-sql',
n1ql: 'language-sql',
json: 'language-json',
routeros: 'language-html'
};
document.querySelectorAll('pre').forEach(function (pre) {
Object.keys(map).forEach(function (oldClass) {
if (pre.classList.contains(oldClass)) {
pre.classList.remove(oldClass);
pre.classList.add(map[oldClass]);
const code = pre.querySelector('code');
if (code) {
code.classList.add(map[oldClass]);
}
}
});
});
Prism.highlightAll();
});
</script>
Con typescript hay que tener cuidado, porque en ejemplos como el anterior el contenido real puede no ser TypeScript, sino markup HTML.
Pero si realmente vas a publicar código TypeScript, ese mapeo debe tratarse de otra manera. Por ejemplo, si publicas código TypeScript real con frecuencia, conecta typescript con language-typescript y carga también el componente TypeScript de Prism.
Por ejemplo:
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-typescript.min.js"></script>
En otras palabras, no hay que tratar algo como TypeScript solo porque tenga la clase typescript. Debes decidirlo según cuál es el código real dentro del bloque.
El CSS del skin también puede entrar en conflicto
Si Prism está aplicado pero el diseño se ve raro o los colores no aparecen, es probable que el CSS del skin esté sobrescribiendo las etiquetas pre y code.
En ese caso, conviene añadir estilos de corrección como estos.
.article-view pre[class*="language-"] {
background: #2d2d2d;
padding: 1.2em;
border-radius: 12px;
overflow: auto;
margin: 1.5em 0;
}
.article-view code[class*="language-"] {
font-family: Consolas, Monaco, monospace;
text-shadow: none;
}
.article-view :not(pre) > code[class*="language-"],
.article-view pre[class*="language-"] {
background: #2d2d2d;
}
Así los bloques de código se ven más estables incluso cuando chocan con los estilos del skin predeterminado de Tistory.
Puntos clave al aplicar Prism.js en Tistory
Al final, lo importante se resume en cuatro puntos.
- Añadir el CSS del tema de Prism dentro de
<head> - Añadir Prism JS y los archivos de lenguaje antes de
</body> - Escribir los bloques de código del cuerpo en formato
language-nombreDelLenguaje - Si Tistory genera clases como
xml,routerosotypescript, añadir un script de conversión
En especial, las clases incorrectas como estas deben corregirse de inmediato.
<pre class="xml"><code>...</code></pre>
<pre class="routeros"><code>...</code></pre>
<pre class="typescript"><code>...</code></pre>
Es más preciso alinearlas así.
<pre class="language-html"><code class="language-html">...</code></pre>
Cierre
Aplicar resaltado de código en Tistory no es difícil en sí mismo. Pero en la práctica, la estructura HTML del bloque de código que se genera en el cuerpo del post es más importante que simplemente añadir los archivos de Prism.
Si conectaste bien los archivos pero el resaltado no funciona, normalmente ocurre una de estas dos cosas.
- La clase del bloque de código no está en formato
language-... - El contenido del código y la clase de lenguaje no coinciden
Así que, si Prism.js está añadido pero no funciona, conviene sospechar primero del markup del bloque de código antes que de la librería.
La configuración parece simple si solo miras el método básico, pero en Tistory son más comunes de lo esperado salidas como pre.xml, pre.routeros y pre.typescript. Hay que corregir también esa parte para que funcione correctamente.