기본 콘텐츠로 건너뛰기

구글 블로거에서 HTML 모드 없이 쉽게 코드 블록 작성하기: 자바스크립트 구현 팁

구글블로거-커스텀


블로그 글을 작성하면서 구글 블로거의 코드 블록 사용에 어려움을 느꼈습니다. HTML 모드로 전환하여 <pre><code></code></pre> 태그를 사용하는 방식은 번거롭고 혼란스러웠습니다. 이를 개선하고자 마크다운 스타일의 백틱(```)을 사용하여 코드 블록을 쉽게 만들 수 있는 방법을 고안했습니다.

배경 기술

이 포스팅은 구글 블로거에서 마크다운 스타일의 코드 블록과 highlight.js를 활용하여 사용자 경험을 향상시키는 데 중점을 두었습니다. 마크다운은 간편한 문서 작성을 가능하게 하는 도구이며, highlight.js는 코드에 색상을 추가해 가독성을 높이는 라이브러리입니다. 이러한 기술을 결합함으로써, 블로거들은 코드를 쉽게 삽입하고 스타일링할 수 있으며, 독자들은 깔끔하고 전문적인 블로그 포스트를 경험할 수 있습니다.

구현 방법

1. 백틱 변환 함수 개선: 

백틱(```)으로 시작하고 끝나는 부분을 <pre><code></code></pre>로 변환하는 기능을 구현했습니다. 정규 표현식을 활용해 백틱으로 둘러싸인 부분을 찾고 변환합니다.
function convertBackticksToHTML(text) {
  return text.replace(/```(.*?)```/gs, "
$1
"); }

2. 언어 특정 클래스 추가: 

마크다운에서 특정 언어를 지정하는 것처럼, 예를 들어 ```sql 처럼 입력하면 SQL 형식으로 표시되도록 개선했습니다. 이를 위해 정규 표현식을 조정하여 언어에 맞는 클래스를 추가했습니다.
function convertBackticksToHTML(text) {
  return text.replace(/```(\w+)?\s([\s\S]*?)```/g, function(match, lang, code) {
    lang = lang || ''; // 언어가 지정되지 않았다면 빈 문자열 사용 
    code = code.trim();// 코드의 앞뒤 공백 제거
    return `
${code}
`; }); }

3. 멀티라인 코드 블록 문제 해결: 

한 줄짜리 코드 블록은 잘 작동했지만, 여러 줄로 된 코드 블록에서 문제가 발생했습니다. 이는 &nbsp;<p> 태그 때문이었고, 이를 해결하기 위해 1번과 2번의 로직을 결합했습니다.

4. 코드 정리: 

먼저 1번 방식으로 처리한 후, 불필요한 공백(&nbsp;)과 태그(<p></p>)를 제거했습니다. 그 후 2번 방식을 적용하여 최종적으로 정확한 형태로 변환되도록 했습니다.
text = text.replace(/```(.*?)```/gs, function(match){
  match = match.replace(/ /g, ' ');
  match = match.replace(/<\/p>

/g, '\n'); match = match.replace(/```(\w+)?\s([\s\S]*?)```/g, function(match, lang, code) { lang = lang || ''; // 언어가 지정되지 않았다면 빈 문자열 사용 code = code.trim(); // 코드의 앞뒤 공백 제거 return `

${code}
`; }); return match; });

5. 인라인 코드 블록 추가: 

백틱 하나(`)로 시작하는 인라인 코드 블록을 추가했습니다.
text = text.replace(/`(.*?)`/gs, function(match, code) {
  return `<code>${code}</code>`;
});

6. 플래그 추가

백틱(`)을 사용하는 동안, 때때로 코드 변환을 원치 않는 상황이 발생할 수 있습니다. 이러한 상황을 위해, 사용자가 스크립트의 자동 변환 기능을 제어할 수 있도록 플래그를 도입했습니다. 
if (text.includes("@donotuse")) {
  console.log("코드 블록 사용 안 함");
  return text; // @donotuse가 있으면 변환 작업을 수행하지 않고 원본 텍스트를 반환
}
이 플래그를 사용하고자 할 때는 다음과 같은 방법을 따르면 됩니다:

플래그 사용 방법

  • HTML 모드를 열고, 글의 첫 부분에 <div hint="@donotuse"></div> 태그를 추가합니다.
  • 이 태그가 포함된 글에서는 스크립트가 백틱(`)을 인라인 코드 블록으로 자동 변환하지 않습니다.
이 방법을 통해, 사용자는 필요에 따라 코드 블록 변환 기능을 켜거나 끌 수 있습니다. 예를 들어, 백틱을 문장의 일부로 사용하고자 할 때 유용합니다. 이러한 유연성은 사용자가 블로그 콘텐츠를 더 효과적으로 관리할 수 있게 해줍니다.

7. 적용 방법: 

변환 함수를 블로그의 메인 콘텐츠에 적용합니다. 페이지에 해당 ID가 있는지 확인한 후, 변환 함수를 적용합니다.
(수정) Blog1으로 할 경우 리스트 에서 예상 못한 코드 블록이 생성되었습니다. id가 post-body로 시작하는 것을 토대로 다시 수정하였습니다.
let postContent = document.querySelectorAll("[id^='post-body-']"); // 포스트 콘텐츠의 ID를 적절히 설정
postContent.forEach(function(element) {
    if (element) {
        element.innerHTML = convertBackticksToHTML(element.innerHTML);
    }
});

구글 블로거에 적용하기

1. 레이아웃에 스크립트 추가

  1. 블로거의 레이아웃 섹션으로 이동하여 HTML/JavaScript 가젯을 추가합니다.
  2. 아래의 최종 코드를 가젯에 붙여넣고, <script></script> 태그로 감싸 올바르게 실행되도록 합니다. 
  3. 저장 후, 블로그 포스트를 작성할 때 이 스크립트가 자동으로 백틱 기반의 코드 블록과 인라인 코드를 HTML 형식으로 변환합니다.
<script>
function convertBackticksToHTML(text) {
  if (text.includes("@donotuse")) {
    console.log("코드 블록 사용 안 함");
    return text; // @donotuse가 있으면 변환 작업을 수행하지 않고 원본 텍스트를 반환
  }
  // Block code block with ```
  text = text.replace(/```(.*?)```/gs, function(match){
    match = match.replace(/ /g, ' ');
    match = match.replace(/<\/p><p>/g, '\n');
    
    match = match.replace(/```(\w+)?\s([\s\S]*?)```/g, function(match, lang, code) {
      lang = lang || ''; // Use an empty string if no language is specified
      code = code.trim(); // Trim the code
      return `<pre><code class="${lang}">${code}</code></pre>`;
    });
      
    return match;
  });
  
  // Inline code block with `
  text = text.replace(/`(.*?)`/gs, function(match, code) {
    code = code.trim(); // Trim the code
    return `<code>${code}</code>`; // Replace with <code> tags
  });    
  return text;
}

let postContent = document.querySelectorAll("[id^='post-body-']"); // 포스트 콘텐츠의 ID를 적절히 설정
postContent.forEach(function(element) {
    if (element) {
        element.innerHTML = convertBackticksToHTML(element.innerHTML);
    }
});
</script>



2. CSS 스타일링 추가: 

사용자 경험을 향상시키고 코드 블록의 시각적 표현을 개선하기 위해, 사용자의 선호에 따라 CSS 스타일링을 추가하는 방법을 소개합니다. highlight.js 라이브러리를 활용하면 다양한 테마 중에서 선택하여 사용자의 블로그 디자인에 맞게 코드 블록 스타일을 조정할 수 있습니다.

Highlight.js 테마 선택

  • highlight.js에서 제공하는 다양한 디자인 중에서 선택할 수 있습니다.
  • highlight.js 데모 페이지에서는 다양한 언어로 코드를 작성하며 테마를 시험해 볼 수 있습니다.
  • highlight.js 예시 페이지를 통해 모든 언어에 대한 테마 적용 예시를 볼 수 있습니다. 저는 `arduino-light` 테마를 선택했습니다.

CDN 코드 적용

  • Highlight.js의 공식 사이트에서 CDN 코드를 복사하거나 아래의 코드를 복사하여, `default` 부분을 선택한 테마 이름으로 변경합니다.
  • 블로거 메뉴에서 '테마'를 선택하고 'HTML 편집'을 클릭한 다음, `<head>` 태그 사이에 위의 CDN 코드를 붙여넣습니다.
<!--Highlight.js 시작-->
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/(선택한테마명).min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script> 
<script>hljs.highlightAll();</script>
<!--Highlight.js 종료-->
     블로거 메뉴에서 '테마'를 선택하고 'HTML 편집'을 클릭하여, <head> 태그 사이에 위의 CDN 코드를 붙여넣습니다.

인라인 코드 블록 스타일 추가: 

  • 인라인 코드 블록에 대한 스타일링도 커스텀으로 진행했습니다.
  • 노션(Notion) 스타일을 참조하여 색상을 맞춘 스타일을 준비했습니다. 사용자는 원하는 CSS를 선택하거나 직접 커스텀하여 사용할 수 있습니다.

/* 코드 블록 CSS 수정 */
@font-face {
  font-family: 'D2Coding';
  src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_three@1.0/D2Coding.woff') format('woff');
  font-weight: normal;
  font-style: normal;
}
pre code {
  font-size: 14px;
  padding: 20px;
  font-family: D2Coding, SF Mono, Menlo, Consolas, Monaco, monospace;
  border: solid 1px #ebebeb;
  line-height: 1.71;
  overflow: auto;
}
code {
  padding: 0.25rem;
  border: solid 1px #ebebeb;
  color: #00979d;
  border-radius: 5px;
  font-size: 0.9rem;
  line-height: 1.1rem;
  margin: 0 5px;
  font-family: D2Coding, SF Mono, Menlo, Consolas, Monaco, monospace;
}

/* 노션 스타일 인라인 코드 블록 */
code {
  padding: 0.25rem;
  background-color: #EDEDEB;
  border: 1px solid #dadada;
  color: #EB5757;
  border-radius: 5px;
  font-size: 0.9rem;
  line-height: 1.1rem;
  margin: 0 5px;
}


이제 구글 블로거에서 마크다운 스타일의 코드 블록과 인라인 코드를 쉽게 추가하고, highlight.js를 이용해 멋진 스타일을 적용할 수 있습니다. 이런 개선을 통해 블로그의 기술적 컨텐츠가 더욱 돋보일 것입니다. 간단한 스크립트와 CSS 조정만으로도 사용자의 블로깅 경험이 크게 향상될 것입니다. 이제 이 기능들을 활용해 블로그를 더욱 풍부하고 전문적으로 만들어보세요.





댓글

이 블로그의 인기 게시물

에러코드 1020030014: 오즈 리포트에서의 java.io.IOException 연결 문제 해결하기

공공 SI 프로젝트에서 근무하며, 우리는 때때로 기대하지 못한 도전에 직면합니다. 이번 글에서는 특히 공공 분야의 IT 전문가들이라면 한 번쯤 마주쳤을 법한, 답답함의 극치를 보여주는 OZ 리포트 소프트웨어와의 경험을 나누고자 합니다. 여러분이 비슷한 상황에 처했을 때 조금이나마 도움이 되길 바라면서, 저의 경험과 해결 방법을 공유하려 합니다. 이 글이 그동안 답답한 마음을 조금이라도 해소해 드릴 수 있다면 기쁠 것입니다. 에러코드 직면 최근, 오즈 리포트 소프트웨어 사용 중에 예기치 못한 에러코드 1020030014에 직면했습니다. 에러코드: 1020030014 상세 메시지: java.io.IOException: Failed to get connection; IO 예외 상황. The Network Adapter could not establish the connection 이 에러는 왜 발생했을까요? 문제의 원인과 해결 과정을 아래와 같이 정리해 보았습니다. 1. 쿼리 디자이너 데이터베이스 연결 정보 수정 먼저, 데이터베이스 연결 정보를 수정했습니다. 이전에는 정보 이름이나 서버 정보를 직접 입력했었는데, 이를 db.properties 파일을 이용해 연결하는 방식으로 변경하였습니다. 쿼리 결과 값을 조회해 정상적인 결과가 나오는지 확인했고, 이 과정에서 문제가 없다면 적용이 제대로 된 것입니다. 만약 쿼리 결과에 문제가 있다면, db.properties 파일의 정보를 다시 확인하고 수정해야 합니다. (좌)직접 데이터를 입력하는 방식 → (우)db.properties 연결하는 방식 2. 리포트 디자이너에 수정된 쿼리디자이너(ODI) 적용 이어서, 리포트 디자이너에서 수정된 쿼리 디자이너를 적용했습니다. 실행 후 미리보기를 확인했을 때 에러가 발생했습니다. 공식 홈페이지 의 QnA를 참조하여 해결책을 찾았는데, 이 과정이 상당히 번거로웠습니다. 해결 방법 결국, 쿼리 디자이너의 `config/db.properties` 뿐만 아니라 리포트 디자이너의...

JavaScript에서 더블 NOT(!!) 연산자로 null과 undefined 확인하기

안녕하세요! 오늘은 JavaScript에서 변수가 null 이나 undefined 인지 간단하게 확인할 수 있는 유용한 Logical operator, 더블 NOT(!!) 연산자에 대해 알아보겠습니다. Double NOT (!!): JavaScript의 더블 NOT 연산자는 매우 간단하지만 강력한 툴입니다. 일반적인 NOT(!) 연산자는 Boolean 값을 부정합니다. 예를 들어, ` !true` 는 ` false` 를, ` !false` 는 ` true` 를 반환합니다. ``` !true;  // !t returns false !false; // !f returns true !"";    // !f returns true !"Cat"; // !t returns false !null;  // !f returns true ``` 하지만 ` !!` 연산자를 사용하면, 한번 부정된 Boolean 값을 다시 부정하여 원래의 truthy/falsy 여부를 얻을 수 있습니다. ``` !!true;  // !t returns true !!false; // !f returns false !!"";    // !f returns false !!"Cat"; // !t returns true !!null;  // !f returns false ``` null과 undefined 확인하기: JavaScript에서 `null`과 `undefined`는 둘 다 falsy한 값입니다. `null`은 명시적으로 값이 없음을 나타내는 반면, `undefined`는 값이 할당되지 않은 상태를 의미합니다. 더블 NOT 연산자를 사용하면 이러한 상태를 쉽게 확인할 수 있습니다. ``` var value1 = null; var value2 = undefined; var isValue1Null = !!value1; // !f returns false var isValue2Undefined = !!value2; // !f r...

보안 환경에서 XCOPY로 실무 파일 관리의 효율성 극대화

실무 환경에서는 때때로 보안상의 이유나 다른 제약으로 인해 SVN이나 Git과 같은 버전 관리 시스템에 접근이 어려울 수 있습니다. 이러한 상황에서 프로젝트 내에서 개발된 내용을 효과적으로 추출하고 관리하는 것이 중요합니다. 오늘은 이러한 상황에 도움이 될 수 있는 XCOPY 명령어를 사용한 파일 관리 방법에 대해 알아보겠습니다. XCOPY란? XCOPY는 하위 디렉터리를 포함한 파일 및 디렉터리를 복사하는 Windows 명령줄 도구입니다. 이 도구는 특히 대규모 파일과 폴더의 복사와 관리에 유용합니다. XCOPY를 사용하면 다음과 같은 두 가지 주요 작업을 수행할 수 있습니다: 수정일 이후의 파일 추출 : 특정 날짜 이후에 수정된 파일들만을 선택적으로 복사합니다. 커밋한 파일 이름 목록으로 추출 : 특정 파일 목록에 기반하여 파일을 복사합니다. XCOPY에는 여러 가지 유용한 옵션이 있으며, 각 옵션은 특정한 목적에 맞게 사용됩니다. 예를 들어: /s : 원본 폴더 내 비어있지 않는 하위폴더를 복사합니다. /h : 숨김 파일과 시스템 파일을 복사합니다. /t : 디렉터리 구조만을 복사합니다. (빈 폴더는 제외하며, 필요시 /e 옵션 추가) /e : 원본 폴더 내 모든 폴더를 복사합니다. /d:m-d-y : 지정된 날짜 이후에 변경된 파일만 복사합니다. /y : 복사 여부를 묻지 않고 진행합니다. 수정일 이후의 파일 추출 방법 xcopy "원본" "대상" /S /d:m-d-y # 예시: xcopy "C:\workspace\project\src" "C:\Users\Desktop\새 폴더" /S /D:30-07-2023 이 명령어는 원본에서 대상으로 입력된 날짜 이후에 수정된 모든 파일을 복사합니다. 이 방법은 특정 기간 동안의 변경사항만을 추출할 때 매우 유용합니다. 커밋한 파일 이름 목록으로 추출 특정 파일만 복사하려는 경우에는 파일 목록을 기반으로...