[javascript] 자바 스크립트 heredoc

JavaScript에서 heredoc과 같은 것이 필요합니다. 이것에 대한 아이디어가 있습니까? 브라우저 간 기능이 필요합니다.

나는 이것을 찾았다:

heredoc = '\
<div>\
    <ul>\
        <li><a href="#zzz">zzz</a></li>\
    </ul>\
</div>';

나는 그것이 나를 위해 일할 것이라고 생각합니다. 🙂



답변

시도 ES6 문자열 템플릿 , 당신은 뭔가를 할 수 있습니다

var hereDoc = `
This
is
a
Multiple
Line
String
`.trim()


hereDoc == 'This\nis\na\nMultiple\nLine\nString'

=> true

당신과 함께 오늘이 위대한 기능을 사용할 수 있습니다 6to5 또는 타이프 라이터


답변

아니요, 안타깝게도 JavaScript는 heredoc과 같은 것을 지원하지 않습니다.


답변

이건 어때요:

function MyHereDoc(){
/*HERE
<div>
   <p>
      This is written in the HEREDOC, notice the multilines :D.
   </p>
   <p>
      HERE
   </p>
   <p>
      And Here
   </p>
</div>
HERE*/
    var here = "HERE";
    var reobj = new RegExp("/\\*"+here+"\\n[\\s\\S]*?\\n"+here+"\\*/", "m");
    str = reobj.exec(MyHereDoc).toString();
    str = str.replace(new RegExp("/\\*"+here+"\\n",'m'),'').toString();
    return str.replace(new RegExp("\\n"+here+"\\*/",'m'),'').toString();
}

//Usage 
document.write(MyHereDoc());

“/ * HERE”및 “HERE * /”를 선택한 단어로 바꾸십시오.


답변

Zv_oDD의 답변을 바탕으로 쉽게 재사용 할 수 있도록 유사한 기능을 만들었습니다.

경고 : 이것은 많은 JS 인터프리터의 비표준 기능이며 언젠가는 제거 될 것입니다.하지만 Chrome에서만 사용할 스크립트를 빌드 할 때 사용하고 있습니다! 클라이언트를 향한 웹 사이트를 위해 절대로 이것에 의존 하지 마십시오 !

// Multiline Function String - Nate Ferrero - Public Domain
function heredoc(fn) {
  return fn.toString().match(/\/\*\s*([\s\S]*?)\s*\*\//m)[1];
};

사용하다:

var txt = heredoc(function () {/*
A test of horrible
Multi-line strings!
*/});

보고:

"A test of horrible
Multi-line strings!"

노트:

  1. 텍스트는 양쪽 끝이 잘 리므로 양쪽 끝의 추가 공백은 괜찮습니다.

편집 :

2014 년 2 월 2 일-Function 프로토 타입을 전혀 엉망으로 만들지 않고 heredoc라는 이름을 대신 사용하도록 변경되었습니다.

2017 년 5 월 26 일-최신 코딩 표준을 반영하기 위해 공백이 업데이트되었습니다.


답변

실행중인 JS / JS 엔진 (SpiderMonkey, AS3)의 종류에 따라 heredoc과 같이 여러 줄에 텍스트를 배치 할 수있는 인라인 XML을 간단히 작성할 수 있습니다.

var xml = <xml>
    Here
    is
    some
    multiline
    text!
</xml>

console.log(xml.toXMLString())
console.log(xml.toString()) // just gets the content


답변

ES6 템플릿 문자열 에는 heredoc 기능이 있습니다.

역틱 (“)으로 묶인 문자열을 선언 할 수 있으며 여러 줄로 확장 할 수 있습니다.

var str = `This is my template string...
and is working across lines`;

템플릿 문자열 내에 표현식을 포함 할 수도 있습니다. 이들은 달러 기호와 중괄호 ( ${expression})로 표시됩니다.

var js = "Java Script";
var des = `Template strings can now be used in ${js} with lot of additional features`;

console.log(des); //"Template strings can now be used in Java Script with lot of additional features"

실제로 Tagged Temple Strings 및 Raw Strings와 같은 더 많은 기능이 있습니다. 설명서를 찾으십시오.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings


답변

@NateFerrero의 답변에 대한 확장에 대한 별도의 답변을 작성하는 것이 좋지 않습니다. 않지만 그의 답변을 편집하는 것도 적절하다고 생각하지 않으므로이 답변이 유용하다면 @NateFerrero를 찬성하십시오.

tl; dr- heredoc 내에서 블록 주석을 사용하려는 사람들을 위해 …

나는 주로 CSS의 블록 저장하기 위해 자바 스크립트 heredocs 필요 예를

var css = heredoc(function() {/*
    /**
     * Nuke rounded corners.
     */
    body div {
        border-top-left-radius: 0 !important;
        border-top-right-radius: 0 !important;
        border-bottom-right-radius: 0 !important;
        border-bottom-left-radius: 0 !important;
    }
*/});

그러나 보시다시피 CSS에 주석을 달고 싶습니다. 불행히도 (구문 강조 표시에서 알 수 있듯이) 첫 번째 */는 전체 주석을 끝내고 heredoc을 깨뜨립니다.


이 특정 목적 (CSS)의 경우 해결 방법은

.replace(/(\/\*[\s\S]*?\*) \//g, '$1/')

@NateFerrero의 내부 체인에 heredoc; 완전한 형태 :

function heredoc (f) {
    return f.toString().match(/\/\*\s*([\s\S]*?)\s*\*\//m)[1].replace(/(\/\*[\s\S]*?\*) \//g, '$1/');
};

다음과 같이 “내부”블록 주석을 위해 *와 사이에 공백을 추가하여 사용합니다 /.

var css = heredoc(function() {/*
    /**
     * Nuke rounded corners.
     * /
    body div {
        border-top-left-radius: 0 !important;
        border-top-right-radius: 0 !important;
        border-bottom-right-radius: 0 !important;
        border-bottom-left-radius: 0 !important;
    }
*/});

replace단순히 /* ... * /만들 공간을 찾아서 제거하여 /* ... */호출 될 때까지 heredoc을 보존합니다.


물론 다음을 사용하여 주석을 모두 제거 할 수 있습니다.

.replace(/\/\*[\s\S]*?\* \//g, '')

//주석을 체인에 추가하는 경우 에도 지원할 수 있습니다 .

.replace(/^\s*\/\/.*$/mg, '')

또한 다음 */같이 와 사이의 단일 공백 ​​이외의 다른 작업을 수행 할 수 있습니다 -.

    /**
     * Nuke rounded corners.
     *-/

정규식을 적절하게 업데이트하는 경우 :

.replace(/(\/\*[\s\S]*?\*)-\//g, '$1/')
                          ^

아니면 단일 공백 ​​대신 임의의 양의 공백을 원하십니까?

.replace(/(\/\*[\s\S]*?\*)\s+\//g, '$1/')
                          ^^^