2017-12-20 4 views
1

Ich versuche, einen Pandoc-Filter zu erstellen, der mir hilft, Daten zusammenzufassen. Ich habe einige Filter gesehen, die Inhaltsverzeichnisse erstellen, aber ich möchte den Index basierend auf Inhalt in Kopfzeilen organisieren.Verketten von Stringfragmenten in Pandoc-Lua-Filtern

Zum Beispiel unten Ich mag eine Zusammenfassung des Inhalts auf Basis von getaggten Daten in Header (einige Header nicht Datumsangaben enthalten ...)

[[email protected] foo]$ cat test.md 
# 1 May 2018 
some info 

# not a date 
some data 

# 2 May 2018 
some more info 

Ich begann nach zu sehen versuchen, der Inhalt der Header. Die Absicht war, nur eine einfache Regex für verschiedene Datum/Zeit-Muster anzuwenden.

[[email protected] foo]$ cat test.lua 
function Header(el) 
    return pandoc.walk_block(el, { 
    Str = function(el) 
     print(el.text) 
    end }) 
end 

Leider ist dies den Druckzustand für jede durch Leerzeichen getrennte Zeichenfolge anzuwenden scheint, eher als eine Verkettung mir erlaubt, einen ganzen Inhalt des Headers zu analysieren:

[[email protected] foo]$ pandoc --lua-filter test.lua test.md 
1 
May 
2018 
not 
... 

Gibt es eine kanonische Weise zu tun das in Filtern? Ich habe noch keine Hilfsfunktion in der Lua-Filter-Dokumentation gesehen.

+0

Sie müssen sich auf dem 'Header', statt' Str' anzupassen. Siehe https://pandoc.org/lua-filters.html für weitere Informationen ... – mb21

Antwort

1

Update: Die Entwicklungsversion bietet jetzt die neuen Funktionen pandoc.utils.stringify und pandoc.utils.normalize_date. Sie werden Teil der nächsten Pandov-Veröffentlichung (wahrscheinlich 2.0.6). Mit diesen können Sie testen, ob ein Header ein Datum mit dem folgenden Code enthält:

function Header (el) 
    content_str = pandoc.utils.stringify(el.content) 
    if pandoc.utils.normalize_date(content_str) ~= nil then 
    print 'header contains a date' 
    else 
    print 'not a date' 
    end 
end 

Es gibt noch keine Hilfsfunktion ist, aber wir haben Pläne für eine pandoc.utils.tostring Funktion in der sehr nahen Zukunft.

In der Zwischenzeit wird der folgende Code-Schnipsel (von this discussion genommen) sollten Ihnen helfen, was Sie brauchen:

--- convert a list of Inline elements to a string. 
function inlines_tostring (inlines) 
    local strs = {} 
    for i = 1, #inlines do 
    strs[i] = tostring(inlines[i]) 
    end 
    return table.concat(strs) 
end 

-- Add a `__tostring` method to all Inline elements. Linebreaks 
-- are converted to spaces. 
for k, v in pairs(pandoc.Inline.constructor) do 
    v.__tostring = function (inln) 
    return ((inln.content and inlines_tostring(inln.content)) 
     or (inln.caption and inlines_tostring(inln.caption)) 
     or (inln.text and inln.text) 
     or " ") 
    end 
end 

function Header (el) 
    header_text = inlines_tostring(el.content) 
end