Reco Everything you wanna value. 자세히보기

카테고리 없음

인터넷 HTML/Web 에서 코드 예쁘게 출력하기 - prism.js (Code prettifier | Syntax Highlighter)

kipid 2026. 2. 13. 01:15
# 인터넷 HTML/Web 에서 코드 예쁘게 출력하기 - prism.js (Code prettifier | Syntax Highlighter) Google code prettify 가 유지보수가 더이상 안되어서 prism.js 로 갈아탐. docuK SEE (Super Easy Edit) pure SEE (Super Easy Edit) of docuK (Markdown): 사용 설명서 (Manual | Documentation | Tutorial). 에 적용시켜 놓음. ## PH
  • 2025-07-05 : First posting.
## TOC ## 사용법 : CSS and js to be loaded 아래와 같이 CSS, js 파일들을 load 해주고, script 를 제일 아래와 같이 작성해 주면 됨. (설정이 html/javascript/css 를 모르는 분이 보면 어려울 수 있는데, 설정이 어렵다면 제가 만든 MarkDown 언어인 DocuK 쓰시는걸 추천드려요.) ```[.lang-html] <link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-okaidia.min.css" rel="stylesheet" /> <link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.css" rel="stylesheet" /> <link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism.min.css" rel="stylesheet" /> <div id="scripts-in-blog"> </div> <script> let $scripts_in_blog = $("#scripts-in-blog"); let $script = document.createElement("script"); $script.id = `script-prism`; $script.defer = true; $script.src = "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"; $script.onload = () => { // Prism.highlightElement(element); Prism.highlightAll(); }; $scripts_in_blog.append($script); $script = document.createElement("script"); $script.id = `script-prism-plugins-line-numbers`; $script.defer = true; $script.src = "https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js"; $scripts_in_blog.append($script); const langs = ["javascript", "typescript", "markup", "css", "json", "sql", "bash", "python", "java", "c", "cpp", "csharp", "php", "batch", "git", "markdown", "env"]; for (const lang of langs) { $script = document.createElement("script"); $script.id = `script-prism-${lang}`; $script.defer = true; $script.src = `https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-${lang}.min.js`; $scripts_in_blog.append($script); } </script> ```/ ## HTML 코드 예시 다음과 같이 작성하시면 ```[.lang-html] <pre><code class="prettyprint line-numbers lang-html">&lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt; &lt;title&gt;Prettier &amp; Prism.js Example&lt;/title&gt; &lt;link rel="stylesheet" href="style.css"&gt; &lt;/head&gt; &lt;body&gt; &lt;header&gt; &lt;h1&gt;Welcome to My Page&lt;/h1&gt; &lt;/header&gt; &lt;main&gt; &lt;p&gt;This is a sample paragraph.&lt;/p&gt; &lt;button id="myButton"&gt;Click Me&lt;/button&gt; &lt;/main&gt; &lt;footer&gt; &lt;p&gt;&amp;copy; 2025 My Website&lt;/p&gt; &lt;/footer&gt; &lt;script src="script.js"&gt;&lt;/script&gt; &lt;/body&gt; &lt;/html&gt; </code></pre> ```/ , 아래와 같이 출력됩니다.
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Prettier & Prism.js Example</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <header>
    <h1>Welcome to My Page</h1>
  </header>
  <main>
    <p>This is a sample paragraph.</p>
    <button id="myButton">Click Me</button>
  </main>
  <footer>
    <p>&copy; 2025 My Website</p>
  </footer>
  <script src="script.js"></script>
</body>
</html>
### DocuK 에서의 적용 방법 다음과 같이 작성하시면 ```[.lang-html] ```[.lang-html] &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt; &lt;title&gt;Prettier &amp; Prism.js Example&lt;/title&gt; &lt;link rel="stylesheet" href="style.css"&gt; &lt;/head&gt; &lt;body&gt; &lt;header&gt; &lt;h1&gt;Welcome to My Page&lt;/h1&gt; &lt;/header&gt; &lt;main&gt; &lt;p&gt;This is a sample paragraph.&lt;/p&gt; &lt;button id="myButton"&gt;Click Me&lt;/button&gt; &lt;/main&gt; &lt;footer&gt; &lt;p&gt;&amp;copy; 2025 My Website&lt;/p&gt; &lt;/footer&gt; &lt;script src="script.js"&gt;&lt;/script&gt; &lt;/body&gt; &lt;/html&gt; ```\/ <-- 여기에서 '\' 를 빼세요. ```/ , 아래와 같이 출력됩니다. ```[.lang-html] <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Prettier & Prism.js Example</title> <link rel="stylesheet" href="style.css"> </head> <body> <header> <h1>Welcome to My Page</h1> </header> <main> <p>This is a sample paragraph.</p> <button id="myButton">Click Me</button> </main> <footer> <p>&copy; 2025 My Website</p> </footer> <script src="script.js"></script> </body> </html> ```/ ## CSS 코드 예시 다음과 같이 입력하시면 ```[.lang-html] <pre><code class="prettyprint line-numbers lang-css">/* 기본 스타일 */ body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: #333; background-color: #f8f8f8; margin: 0; padding: 0; } /* 헤더 스타일 */ header { background-color: #2c3e50; color: #fff; padding: 1rem 0; text-align: center; } h1 { margin: 0; font-size: 2.5em; } /* 버튼 스타일 */ #myButton { background-color: #3498db; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; transition: background-color 0.3s ease; } #myButton:hover { background-color: #2980b9; } </code></pre> ```/ , 아래와 같이 출력됩니다.
/* 기본 스타일 */
body {
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  line-height: 1.6;
  color: #333;
  background-color: #f8f8f8;
  margin: 0;
  padding: 0;
}

/* 헤더 스타일 */
header {
  background-color: #2c3e50;
  color: #fff;
  padding: 1rem 0;
  text-align: center;
}

h1 {
  margin: 0;
  font-size: 2.5em;
}

/* 버튼 스타일 */
#myButton {
  background-color: #3498db;
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  cursor: pointer;
  transition: background-color 0.3s ease;
}

#myButton:hover {
  background-color: #2980b9;
}
### DocuK 에서의 적용 방법 다음과 같이 입력하시면 ```[.lang-css] ```[.lang-css] /* 기본 스타일 */ body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: #333; background-color: #f8f8f8; margin: 0; padding: 0; } /* 헤더 스타일 */ header { background-color: #2c3e50; color: #fff; padding: 1rem 0; text-align: center; } h1 { margin: 0; font-size: 2.5em; } /* 버튼 스타일 */ #myButton { background-color: #3498db; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; transition: background-color 0.3s ease; } #myButton:hover { background-color: #2980b9; } ```\/ <-- 여기에서 '\' 를 빼세요. ```/ , 아래와 같이 출력됩니다. ```[.lang-css] /* 기본 스타일 */ body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: #333; background-color: #f8f8f8; margin: 0; padding: 0; } /* 헤더 스타일 */ header { background-color: #2c3e50; color: #fff; padding: 1rem 0; text-align: center; } h1 { margin: 0; font-size: 2.5em; } /* 버튼 스타일 */ #myButton { background-color: #3498db; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; transition: background-color 0.3s ease; } #myButton:hover { background-color: #2980b9; } ```/ ## JavaScript 코드 예시 다음과 같이 입력하시면 ```[.lang-html] <pre><code class="prettyprint line-numbers lang-js">document.addEventListener('DOMContentLoaded', () => { const myButton = document.getElementById('myButton'); if (myButton) { myButton.addEventListener('click', () => { alert('버튼이 클릭되었습니다!'); console.log('버튼 클릭 이벤트 발생!'); }); } else { console.warn('ID가 "myButton"인 요소를 찾을 수 없습니다.'); } // 간단한 비동기 함수 예시 async function fetchData() { try { const response = await fetch('https://jsonplaceholder.typicode.com/todos/1'); const data = await response.json(); console.log('데이터 가져오기 성공:', data); } catch (error) { console.error('데이터 가져오기 오류:', error); } } fetchData(); }); </code></pre> ```/ , 아래와 같이 출력됩니다.
document.addEventListener('DOMContentLoaded', () => {
  const myButton = document.getElementById('myButton');

  if (myButton) {
    myButton.addEventListener('click', () => {
      alert('버튼이 클릭되었습니다!');
      console.log('버튼 클릭 이벤트 발생!');
    });
  } else {
    console.warn('ID가 "myButton"인 요소를 찾을 수 없습니다.');
  }

  // 간단한 비동기 함수 예시
  async function fetchData() {
    try {
      const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
      const data = await response.json();
      console.log('데이터 가져오기 성공:', data);
    } catch (error) {
      console.error('데이터 가져오기 오류:', error);
    }
  }

  fetchData();
});
### DocuK 에서의 적용 방법 다음과 같이 입력하시면 ```[.lang-js] ```[.lang-js] document.addEventListener('DOMContentLoaded', () => { const myButton = document.getElementById('myButton'); if (myButton) { myButton.addEventListener('click', () => { alert('버튼이 클릭되었습니다!'); console.log('버튼 클릭 이벤트 발생!'); }); } else { console.warn('ID가 "myButton"인 요소를 찾을 수 없습니다.'); } // 간단한 비동기 함수 예시 async function fetchData() { try { const response = await fetch('https://jsonplaceholder.typicode.com/todos/1'); const data = await response.json(); console.log('데이터 가져오기 성공:', data); } catch (error) { console.error('데이터 가져오기 오류:', error); } } fetchData(); }); ```\/ <-- 여기에서 '\' 를 빼세요. ```/ , 아래와 같이 출력됩니다. ```[.lang-js] document.addEventListener('DOMContentLoaded', () => { const myButton = document.getElementById('myButton'); if (myButton) { myButton.addEventListener('click', () => { alert('버튼이 클릭되었습니다!'); console.log('버튼 클릭 이벤트 발생!'); }); } else { console.warn('ID가 "myButton"인 요소를 찾을 수 없습니다.'); } // 간단한 비동기 함수 예시 async function fetchData() { try { const response = await fetch('https://jsonplaceholder.typicode.com/todos/1'); const data = await response.json(); console.log('데이터 가져오기 성공:', data); } catch (error) { console.error('데이터 가져오기 오류:', error); } } fetchData(); }); ```/ ## JAVA 코드 예시 다음과 같이 입력하시면 (JAVA code 들에서는 여는 꺽쇠에 주의해야 함. html 의 tag 로 인식될 수 있기 때문에 '&lt;' 으로 escape 해줘야 함.) ```[.scrollable.lang-html] <pre class="scrollable"><code class="prettyprint line-numbers lang-java">package recoeve.db; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class FileMapWithVar { public static final String VERSION = "1.2.0"; public static final Pattern PTN_VARIABLE = Pattern.compile("\\{--[^\\{\\}]+?--\\}"); public static ArrayList&lt;String> strToList(String fileStr) { if (fileStr == null) { return null; } int start = 0; Matcher matchReplacer = PTN_VARIABLE.matcher(fileStr); ArrayList&lt;String> strList = new ArrayList&lt;>(); while (start &lt; fileStr.length()) { if (matchReplacer.find(start)) { strList.add(fileStr.substring(start, matchReplacer.start())); strList.add(matchReplacer.group()); start = matchReplacer.end(); } else { strList.add(fileStr.substring(start)); start = fileStr.length(); } } return strList; } public String replaceStr(ArrayList&lt;String> strList, Map&lt;String, String> varMap) { String strReplaced = ""; String replaced; for (int i = 0; i &lt; strList.size(); i++) { if (i % 2 == 0) { strReplaced += strList.get(i); } else { replaced = varMap.get(strList.get(i)); if (replaced == null) { replaced = strList.get(i); } strReplaced += replaced; } } return strReplaced; } public final Map&lt;String, Map&lt;String, ArrayList&lt;String>>> FILEMAP_TO_ARRAY_STR; // FILEMAP_TO_ARRAY_STR.get("fileName").get("lang") public FileMapWithVar() { FILEMAP_TO_ARRAY_STR = new HashMap&lt;>(FileMap.TXT_FILEMAP_SIZE); for (File fileName : FileMap.TXT_FILENAMES) { String fileNameStr = fileName.getName(); Map&lt;String, String> fileLangMap = FileMap.TXT_FILEMAP.get(fileNameStr); if (fileLangMap != null) { Map&lt;String, ArrayList&lt;String>> fileLangMapToStrArray = new HashMap&lt;>(FileMap.FILE_LANGMAP_SIZE); fileLangMapToStrArray.put("df", strToList(fileLangMap.get("df"))); int colSize = FileMap.LANGMAP.getColSizeAtRow(0); for (int k = 2; k &lt; colSize; k++) { String lang = FileMap.LANGMAP.get(0, k); if (!lang.equals("desc")) { fileLangMapToStrArray.put(lang, strToList(fileLangMap.get(lang))); } } FILEMAP_TO_ARRAY_STR.put(fileNameStr, fileLangMapToStrArray); } } } public String getFileWithLangAndVars(String fileName, String lang, Map&lt;String, String> varMap) { Map&lt;String, ArrayList&lt;String>> fileLangMapToStrArray = FILEMAP_TO_ARRAY_STR.get(fileName); if (fileLangMapToStrArray == null) { return "File: " + fileName + " does not exist."; } ArrayList&lt;String> strList = fileLangMapToStrArray.get(lang); if (strList == null) { strList = fileLangMapToStrArray.get("en"); } if (strList == null) { return "Lang: " + lang + " does not exist."; } return replaceStr(strList, varMap); } public static void main(String... args) { Map&lt;String, String> varMap = new HashMap&lt;>(); varMap.put("{--myIndex--}", "11111"); varMap.put("{--myId--}", "kipid"); varMap.put("{--userIndex--}", "10000"); varMap.put("{--userId--}", "id"); varMap.put("{--user email--}", "id@gmail.com"); varMap.put("{--myCatList--}", """ [Recoeve] static multiline [Music/Break]"""); varMap.put("{--catList--}", """ [IT/Programming] HTML CSS JavaScript"""); varMap.put("{--kipid-catList--}", """ [Poop] [Ding Dong]"""); FileMapWithVar fileMapWithVar = new FileMapWithVar(); System.out.println(fileMapWithVar.getFileWithLangAndVars("user-page.html", "ko", varMap)); // for (File fileName : FileMap.TXT_FILENAMES) { // System.out.println(fileName.getName()); // } } } </code></pre> ```/ , 아래와 같이 출력됩니다.
package recoeve.db;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FileMapWithVar {
	public static final String VERSION = "1.2.0";
	public static final Pattern PTN_VARIABLE = Pattern.compile("\\{--[^\\{\\}]+?--\\}");

	public static ArrayList<String> strToList(String fileStr) {
		if (fileStr == null) {
			return null;
		}
		int start = 0;
		Matcher matchReplacer = PTN_VARIABLE.matcher(fileStr);
		ArrayList<String> strList = new ArrayList<>();
		while (start < fileStr.length()) {
			if (matchReplacer.find(start)) {
				strList.add(fileStr.substring(start, matchReplacer.start()));
				strList.add(matchReplacer.group());
				start = matchReplacer.end();
			} else {
				strList.add(fileStr.substring(start));
				start = fileStr.length();
			}
		}
		return strList;
	}

	public String replaceStr(ArrayList<String> strList, Map<String, String> varMap) {
		String strReplaced = "";
		String replaced;
		for (int i = 0; i < strList.size(); i++) {
			if (i % 2 == 0) {
				strReplaced += strList.get(i);
			} else {
				replaced = varMap.get(strList.get(i));
				if (replaced == null) {
					replaced = strList.get(i);
				}
				strReplaced += replaced;
			}
		}
		return strReplaced;
	}

	public final Map<String, Map<String, ArrayList<String>>> FILEMAP_TO_ARRAY_STR;
	// FILEMAP_TO_ARRAY_STR.get("fileName").get("lang")
	public FileMapWithVar() {
		FILEMAP_TO_ARRAY_STR = new HashMap<>(FileMap.TXT_FILEMAP_SIZE);

		for (File fileName : FileMap.TXT_FILENAMES) {
			String fileNameStr = fileName.getName();
			Map<String, String> fileLangMap = FileMap.TXT_FILEMAP.get(fileNameStr);
			if (fileLangMap != null) {
				Map<String, ArrayList<String>> fileLangMapToStrArray = new HashMap<>(FileMap.FILE_LANGMAP_SIZE);
				fileLangMapToStrArray.put("df", strToList(fileLangMap.get("df")));
				int colSize = FileMap.LANGMAP.getColSizeAtRow(0);
				for (int k = 2; k < colSize; k++) {
					String lang = FileMap.LANGMAP.get(0, k);
					if (!lang.equals("desc")) {
						fileLangMapToStrArray.put(lang, strToList(fileLangMap.get(lang)));
					}
				}
				FILEMAP_TO_ARRAY_STR.put(fileNameStr, fileLangMapToStrArray);
			}
		}
	}

	public String getFileWithLangAndVars(String fileName, String lang, Map<String, String> varMap) {
		Map<String, ArrayList<String>> fileLangMapToStrArray = FILEMAP_TO_ARRAY_STR.get(fileName);
		if (fileLangMapToStrArray == null) {
			return "File: " + fileName + " does not exist.";
		}
		ArrayList<String> strList = fileLangMapToStrArray.get(lang);
		if (strList == null) {
			strList = fileLangMapToStrArray.get("en");
		}
		if (strList == null) {
			return "Lang: " + lang + " does not exist.";
		}
		return replaceStr(strList, varMap);
	}

	public static void main(String... args) {
		Map<String, String> varMap = new HashMap<>();
		varMap.put("{--myIndex--}", "11111");
		varMap.put("{--myId--}", "kipid");
		varMap.put("{--userIndex--}", "10000");
		varMap.put("{--userId--}", "id");
		varMap.put("{--user email--}", "id@gmail.com");
		varMap.put("{--myCatList--}", """
[Recoeve]
	static
	multiline
[Music/Break]""");
		varMap.put("{--catList--}", """
[IT/Programming]
	HTML
	CSS
	JavaScript""");
		varMap.put("{--kipid-catList--}", """
[Poop]
[Ding Dong]""");
		FileMapWithVar fileMapWithVar = new FileMapWithVar();
		System.out.println(fileMapWithVar.getFileWithLangAndVars("user-page.html", "ko", varMap));
		// for (File fileName : FileMap.TXT_FILENAMES) {
		// 	System.out.println(fileName.getName());
		// }
	}
}
### DocuK 에서의 적용 방법 다음과 같이 입력하시면 (JAVA code 들에서는 여는 꺽쇠에 주의해야 함. html 의 tag 로 인식될 수 있기 때문에 '&lt;' 으로 escape 해줘야 함.) ```[.scrollable.lang-java] ```[.scrollable.lang-java] package recoeve.db; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class FileMapWithVar { public static final String VERSION = "1.2.0"; public static final Pattern PTN_VARIABLE = Pattern.compile("\\{--[^\\{\\}]+?--\\}"); public static ArrayList&lt;String> strToList(String fileStr) { if (fileStr == null) { return null; } int start = 0; Matcher matchReplacer = PTN_VARIABLE.matcher(fileStr); ArrayList&lt;String> strList = new ArrayList&lt;>(); while (start &lt; fileStr.length()) { if (matchReplacer.find(start)) { strList.add(fileStr.substring(start, matchReplacer.start())); strList.add(matchReplacer.group()); start = matchReplacer.end(); } else { strList.add(fileStr.substring(start)); start = fileStr.length(); } } return strList; } public String replaceStr(ArrayList&lt;String> strList, Map&lt;String, String> varMap) { String strReplaced = ""; String replaced; for (int i = 0; i &lt; strList.size(); i++) { if (i % 2 == 0) { strReplaced += strList.get(i); } else { replaced = varMap.get(strList.get(i)); if (replaced == null) { replaced = strList.get(i); } strReplaced += replaced; } } return strReplaced; } public final Map&lt;String, Map&lt;String, ArrayList&lt;String>>> FILEMAP_TO_ARRAY_STR; // FILEMAP_TO_ARRAY_STR.get("fileName").get("lang") public FileMapWithVar() { FILEMAP_TO_ARRAY_STR = new HashMap&lt;>(FileMap.TXT_FILEMAP_SIZE); for (File fileName : FileMap.TXT_FILENAMES) { String fileNameStr = fileName.getName(); Map&lt;String, String> fileLangMap = FileMap.TXT_FILEMAP.get(fileNameStr); if (fileLangMap != null) { Map&lt;String, ArrayList&lt;String>> fileLangMapToStrArray = new HashMap&lt;>(FileMap.FILE_LANGMAP_SIZE); fileLangMapToStrArray.put("df", strToList(fileLangMap.get("df"))); int colSize = FileMap.LANGMAP.getColSizeAtRow(0); for (int k = 2; k &lt; colSize; k++) { String lang = FileMap.LANGMAP.get(0, k); if (!lang.equals("desc")) { fileLangMapToStrArray.put(lang, strToList(fileLangMap.get(lang))); } } FILEMAP_TO_ARRAY_STR.put(fileNameStr, fileLangMapToStrArray); } } } public String getFileWithLangAndVars(String fileName, String lang, Map&lt;String, String> varMap) { Map&lt;String, ArrayList&lt;String>> fileLangMapToStrArray = FILEMAP_TO_ARRAY_STR.get(fileName); if (fileLangMapToStrArray == null) { return "File: " + fileName + " does not exist."; } ArrayList&lt;String> strList = fileLangMapToStrArray.get(lang); if (strList == null) { strList = fileLangMapToStrArray.get("en"); } if (strList == null) { return "Lang: " + lang + " does not exist."; } return replaceStr(strList, varMap); } public static void main(String... args) { Map&lt;String, String> varMap = new HashMap&lt;>(); varMap.put("{--myIndex--}", "11111"); varMap.put("{--myId--}", "kipid"); varMap.put("{--userIndex--}", "10000"); varMap.put("{--userId--}", "id"); varMap.put("{--user email--}", "id@gmail.com"); varMap.put("{--myCatList--}", """ [Recoeve] static multiline [Music/Break]"""); varMap.put("{--catList--}", """ [IT/Programming] HTML CSS JavaScript"""); varMap.put("{--kipid-catList--}", """ [Poop] [Ding Dong]"""); FileMapWithVar fileMapWithVar = new FileMapWithVar(); System.out.println(fileMapWithVar.getFileWithLangAndVars("user-page.html", "ko", varMap)); // for (File fileName : FileMap.TXT_FILENAMES) { // System.out.println(fileName.getName()); // } } } ```\/ <-- 여기에서 '\' 를 빼세요. ```/ , 아래와 같이 출력됩니다. ```[.scrollable.lang-java] package recoeve.db; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class FileMapWithVar { public static final String VERSION = "1.2.0"; public static final Pattern PTN_VARIABLE = Pattern.compile("\\{--[^\\{\\}]+?--\\}"); public static ArrayList<String> strToList(String fileStr) { if (fileStr == null) { return null; } int start = 0; Matcher matchReplacer = PTN_VARIABLE.matcher(fileStr); ArrayList<String> strList = new ArrayList<>(); while (start < fileStr.length()) { if (matchReplacer.find(start)) { strList.add(fileStr.substring(start, matchReplacer.start())); strList.add(matchReplacer.group()); start = matchReplacer.end(); } else { strList.add(fileStr.substring(start)); start = fileStr.length(); } } return strList; } public String replaceStr(ArrayList<String> strList, Map<String, String> varMap) { String strReplaced = ""; String replaced; for (int i = 0; i < strList.size(); i++) { if (i % 2 == 0) { strReplaced += strList.get(i); } else { replaced = varMap.get(strList.get(i)); if (replaced == null) { replaced = strList.get(i); } strReplaced += replaced; } } return strReplaced; } public final Map<String, Map<String, ArrayList<String>>> FILEMAP_TO_ARRAY_STR; // FILEMAP_TO_ARRAY_STR.get("fileName").get("lang") public FileMapWithVar() { FILEMAP_TO_ARRAY_STR = new HashMap<>(FileMap.TXT_FILEMAP_SIZE); for (File fileName : FileMap.TXT_FILENAMES) { String fileNameStr = fileName.getName(); Map<String, String> fileLangMap = FileMap.TXT_FILEMAP.get(fileNameStr); if (fileLangMap != null) { Map<String, ArrayList<String>> fileLangMapToStrArray = new HashMap<>(FileMap.FILE_LANGMAP_SIZE); fileLangMapToStrArray.put("df", strToList(fileLangMap.get("df"))); int colSize = FileMap.LANGMAP.getColSizeAtRow(0); for (int k = 2; k < colSize; k++) { String lang = FileMap.LANGMAP.get(0, k); if (!lang.equals("desc")) { fileLangMapToStrArray.put(lang, strToList(fileLangMap.get(lang))); } } FILEMAP_TO_ARRAY_STR.put(fileNameStr, fileLangMapToStrArray); } } } public String getFileWithLangAndVars(String fileName, String lang, Map<String, String> varMap) { Map<String, ArrayList<String>> fileLangMapToStrArray = FILEMAP_TO_ARRAY_STR.get(fileName); if (fileLangMapToStrArray == null) { return "File: " + fileName + " does not exist."; } ArrayList<String> strList = fileLangMapToStrArray.get(lang); if (strList == null) { strList = fileLangMapToStrArray.get("en"); } if (strList == null) { return "Lang: " + lang + " does not exist."; } return replaceStr(strList, varMap); } public static void main(String... args) { Map<String, String> varMap = new HashMap<>(); varMap.put("{--myIndex--}", "11111"); varMap.put("{--myId--}", "kipid"); varMap.put("{--userIndex--}", "10000"); varMap.put("{--userId--}", "id"); varMap.put("{--user email--}", "id@gmail.com"); varMap.put("{--myCatList--}", """ [Recoeve] static multiline [Music/Break]"""); varMap.put("{--catList--}", """ [IT/Programming] HTML CSS JavaScript"""); varMap.put("{--kipid-catList--}", """ [Poop] [Ding Dong]"""); FileMapWithVar fileMapWithVar = new FileMapWithVar(); System.out.println(fileMapWithVar.getFileWithLangAndVars("user-page.html", "ko", varMap)); // for (File fileName : FileMap.TXT_FILENAMES) { // System.out.println(fileName.getName()); // } } } ```/ ## DocuK 에서의 <pre><code></code></pre> nesting 이 없는 추가 처리. 예전엔 Google code prettify 를 썼었어서, <pre><code></code></pre> nesting 없이 바로 <pre class="prettyprint scrollable lang-js"></pre> 안에 코드를 넣으면 pretty-printed 되게 만들었었음. Backward 호환을 위해서 pre tag 하나만 써서 적은 code 들도 prettyprint 되도록 만듬. 예제: 다음과 같이 작성하면 ```[.scrollable.lang-html]
package recoeve.db;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FileMapWithVar {
	public static final String VERSION = "1.2.0";
	public static final Pattern PTN_VARIABLE = Pattern.compile("\\{--[^\\{\\}]+?--\\}");

	public static ArrayList&lt;String> strToList(String fileStr) {
		if (fileStr == null) {
			return null;
		}
		int start = 0;
		Matcher matchReplacer = PTN_VARIABLE.matcher(fileStr);
		ArrayList&lt;String> strList = new ArrayList&lt;>();
		while (start &lt; fileStr.length()) {
			if (matchReplacer.find(start)) {
				strList.add(fileStr.substring(start, matchReplacer.start()));
				strList.add(matchReplacer.group());
				start = matchReplacer.end();
			} else {
				strList.add(fileStr.substring(start));
				start = fileStr.length();
			}
		}
		return strList;
	}

	public String replaceStr(ArrayList&lt;String> strList, Map&lt;String, String> varMap) {
		String strReplaced = "";
		String replaced;
		for (int i = 0; i &lt; strList.size(); i++) {
			if (i % 2 == 0) {
				strReplaced += strList.get(i);
			} else {
				replaced = varMap.get(strList.get(i));
				if (replaced == null) {
					replaced = strList.get(i);
				}
				strReplaced += replaced;
			}
		}
		return strReplaced;
	}

	public final Map&lt;String, Map&lt;String, ArrayList&lt;String>>> FILEMAP_TO_ARRAY_STR;
	// FILEMAP_TO_ARRAY_STR.get("fileName").get("lang")
	public FileMapWithVar() {
		FILEMAP_TO_ARRAY_STR = new HashMap&lt;>(FileMap.TXT_FILEMAP_SIZE);

		for (File fileName : FileMap.TXT_FILENAMES) {
			String fileNameStr = fileName.getName();
			Map&lt;String, String> fileLangMap = FileMap.TXT_FILEMAP.get(fileNameStr);
			if (fileLangMap != null) {
				Map&lt;String, ArrayList&lt;String>> fileLangMapToStrArray = new HashMap&lt;>(FileMap.FILE_LANGMAP_SIZE);
				fileLangMapToStrArray.put("df", strToList(fileLangMap.get("df")));
				int colSize = FileMap.LANGMAP.getColSizeAtRow(0);
				for (int k = 2; k &lt; colSize; k++) {
					String lang = FileMap.LANGMAP.get(0, k);
					if (!lang.equals("desc")) {
						fileLangMapToStrArray.put(lang, strToList(fileLangMap.get(lang)));
					}
				}
				FILEMAP_TO_ARRAY_STR.put(fileNameStr, fileLangMapToStrArray);
			}
		}
	}

	public String getFileWithLangAndVars(String fileName, String lang, Map&lt;String, String> varMap) {
		Map&lt;String, ArrayList&lt;String>> fileLangMapToStrArray = FILEMAP_TO_ARRAY_STR.get(fileName);
		if (fileLangMapToStrArray == null) {
			return "File: " + fileName + " does not exist.";
		}
		ArrayList&lt;String> strList = fileLangMapToStrArray.get(lang);
		if (strList == null) {
			strList = fileLangMapToStrArray.get("en");
		}
		if (strList == null) {
			return "Lang: " + lang + " does not exist.";
		}
		return replaceStr(strList, varMap);
	}

	public static void main(String... args) {
		Map&lt;String, String> varMap = new HashMap&lt;>();
		varMap.put("{--myIndex--}", "11111");
		varMap.put("{--myId--}", "kipid");
		varMap.put("{--userIndex--}", "10000");
		varMap.put("{--userId--}", "id");
		varMap.put("{--user email--}", "id@gmail.com");
		varMap.put("{--myCatList--}", """
[Recoeve]
	static
	multiline
[Music/Break]""");
		varMap.put("{--catList--}", """
[IT/Programming]
	HTML
	CSS
	JavaScript""");
		varMap.put("{--kipid-catList--}", """
[Poop]
[Ding Dong]""");
		FileMapWithVar fileMapWithVar = new FileMapWithVar();
		System.out.println(fileMapWithVar.getFileWithLangAndVars("user-page.html", "ko", varMap));
		// for (File fileName : FileMap.TXT_FILENAMES) {
		// 	System.out.println(fileName.getName());
		// }
	}
}
```/ , 아래와 같이 출력됩니다.
package recoeve.db;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FileMapWithVar {
	public static final String VERSION = "1.2.0";
	public static final Pattern PTN_VARIABLE = Pattern.compile("\\{--[^\\{\\}]+?--\\}");

	public static ArrayList<String> strToList(String fileStr) {
		if (fileStr == null) {
			return null;
		}
		int start = 0;
		Matcher matchReplacer = PTN_VARIABLE.matcher(fileStr);
		ArrayList<String> strList = new ArrayList<>();
		while (start < fileStr.length()) {
			if (matchReplacer.find(start)) {
				strList.add(fileStr.substring(start, matchReplacer.start()));
				strList.add(matchReplacer.group());
				start = matchReplacer.end();
			} else {
				strList.add(fileStr.substring(start));
				start = fileStr.length();
			}
		}
		return strList;
	}

	public String replaceStr(ArrayList<String> strList, Map<String, String> varMap) {
		String strReplaced = "";
		String replaced;
		for (int i = 0; i < strList.size(); i++) {
			if (i % 2 == 0) {
				strReplaced += strList.get(i);
			} else {
				replaced = varMap.get(strList.get(i));
				if (replaced == null) {
					replaced = strList.get(i);
				}
				strReplaced += replaced;
			}
		}
		return strReplaced;
	}

	public final Map<String, Map<String, ArrayList<String>>> FILEMAP_TO_ARRAY_STR;
	// FILEMAP_TO_ARRAY_STR.get("fileName").get("lang")
	public FileMapWithVar() {
		FILEMAP_TO_ARRAY_STR = new HashMap<>(FileMap.TXT_FILEMAP_SIZE);

		for (File fileName : FileMap.TXT_FILENAMES) {
			String fileNameStr = fileName.getName();
			Map<String, String> fileLangMap = FileMap.TXT_FILEMAP.get(fileNameStr);
			if (fileLangMap != null) {
				Map<String, ArrayList<String>> fileLangMapToStrArray = new HashMap<>(FileMap.FILE_LANGMAP_SIZE);
				fileLangMapToStrArray.put("df", strToList(fileLangMap.get("df")));
				int colSize = FileMap.LANGMAP.getColSizeAtRow(0);
				for (int k = 2; k < colSize; k++) {
					String lang = FileMap.LANGMAP.get(0, k);
					if (!lang.equals("desc")) {
						fileLangMapToStrArray.put(lang, strToList(fileLangMap.get(lang)));
					}
				}
				FILEMAP_TO_ARRAY_STR.put(fileNameStr, fileLangMapToStrArray);
			}
		}
	}

	public String getFileWithLangAndVars(String fileName, String lang, Map<String, String> varMap) {
		Map<String, ArrayList<String>> fileLangMapToStrArray = FILEMAP_TO_ARRAY_STR.get(fileName);
		if (fileLangMapToStrArray == null) {
			return "File: " + fileName + " does not exist.";
		}
		ArrayList<String> strList = fileLangMapToStrArray.get(lang);
		if (strList == null) {
			strList = fileLangMapToStrArray.get("en");
		}
		if (strList == null) {
			return "Lang: " + lang + " does not exist.";
		}
		return replaceStr(strList, varMap);
	}

	public static void main(String... args) {
		Map<String, String> varMap = new HashMap<>();
		varMap.put("{--myIndex--}", "11111");
		varMap.put("{--myId--}", "kipid");
		varMap.put("{--userIndex--}", "10000");
		varMap.put("{--userId--}", "id");
		varMap.put("{--user email--}", "id@gmail.com");
		varMap.put("{--myCatList--}", """
[Recoeve]
	static
	multiline
[Music/Break]""");
		varMap.put("{--catList--}", """
[IT/Programming]
	HTML
	CSS
	JavaScript""");
		varMap.put("{--kipid-catList--}", """
[Poop]
[Ding Dong]""");
		FileMapWithVar fileMapWithVar = new FileMapWithVar();
		System.out.println(fileMapWithVar.getFileWithLangAndVars("user-page.html", "ko", varMap));
		// for (File fileName : FileMap.TXT_FILENAMES) {
		// 	System.out.println(fileName.getName());
		// }
	}
}
## RRA
  1. kipid's blog :: Super Easy Edit (SEE) of docuK (MarkDown): 사용 설명서 (Manual | Documentation | Tutorial).
  2. https://prismjs.com/
  3. kipid's blog :: 인터넷에서 예쁘게 코드 입력하기 (google code prettify)
반응형