2017-10-31 12 views
2

Pandoc 버전 2.0부터 Lua Filters을 쓸 수있는 기능이 있습니다. 그러나 Pandoc 2.0에서 요소 테이블에 Lua의 pairs을 사용하면 테이블의 모든 키가 표시되지 않습니다.Pandoc Lua 필터 : 쌍에 표의 모든 키가 표시되지 않습니다.

여기에 그 요점을 설명하기위한 최소한의 예가 나와 있습니다. filter.lua에서 나는이 : 명령 줄에서 지금

function Para(elem) 
    io.stderr:write("A: " .. type(elem) .. "\n") 
    for k, v in pairs(elem) do 
    io.stderr:write("B: " .. k .. "\n") 
    end 
    io.stderr:write("C: " .. elem["t"] .. "\n") 
    io.stderr:write("D: " .. tostring(elem["c"]) .. "\n") 
    -- Return elem unchanged 
    return nil 
end 

, 내가 실행

A: table 
B: c 
C: Para 
D: table: 0x53adb40 
[Para [Str "Hello."]] 

내가 그래서 그 -t native-t json에 변경할 수 있습니다 :이 출력을 생성

echo "Hello." | pandoc -f markdown -t native --lua-filter filter.lua 

마지막 줄은 다음과 같습니다.

{"blocks":[{"t":"Para","c":[{"t":"Str","c":"Hello."}]}],"pandoc-api-version":[1,17,2],"meta":{}} 

따라서 (B)의 결과에서 elem의 유일한 키는 c이지만, t은 도 키가되므로 Para을 얻을 수있는 열쇠입니다. 여기서 무슨 일이 일어나고 t 키가 루프에서 숨겨진 이유가 pairs입니까?

+0

아무도 대답이 없다면, 아마도 pandoc-discuss ... – mb21

답변

2

t 값은 각 요소에 t 값을 할당하는 대신 요소의 메타 테이블에 숨겨져 있습니다. pandoc은 각 요소에 대해 메타 테이블을 설정합니다. 그 이유는 사용 성과 성능 사이의 균형을 찾는 것입니다.

문자열 인덱스 값을 액세스하는 것보다 숫자 테이블 인덱스를 하스켈로 다시 가져 오는 것이 상당히 빠릅니다. 그러나 사용자는 읽을 수있는 문자열 속성을 통해 요소 구성 요소에 액세스하면서 직접적인 객체 지향 방식으로 요소를 사용할 수 있어야합니다. 이것이 우리가 각 요소에 메타 테이블을 할당하는 이유입니다. 메타 테이블에는 요소 유형에 대한 정보 (예 : Plain vs. Para 등)가 있으며 접근자를 정의합니다 (예 : content은 Plain 및 Para 요소에서 0의 색인을 지정하는 별칭 임).

elem.t을 호출하여 elem 요소의 유형을 가져올 수는 있지만 요소 자체에는 해당 키가 없기 때문에 메타 테이블은 해당 항목을 갖습니다. 그렇기 때문에 tpairs을 사용하여 요소를 반복 할 때 표시되지 않습니다. getmetatable 함수를 사용하여 메타 테이블을 수신 할 수 있습니다.

접근 자 이름 (문서화되지 않았으며 변경 될 수 있음)을 얻는 방법은 다음과 같습니다.

for k, _ in pairs(getmetatable(elem).getters) do 
    print k 
end 

또는 lua 필터 설명서의 "Module pandoc"섹션에는 각 요소 유형에 대한 접근자가 나열되어 있습니다.