mirror of
https://github.com/jgm/pandoc.git
synced 2026-08-30 17:59:17 +08:00
RST reader: handle class attribute for for custom roles (#7700)
Previously the class attribute was ignored, and the name of the role used as the class. Closes #7699.
This commit is contained in:
@@ -919,14 +919,22 @@ addNewRole roleText fields = do
|
||||
(baseRole, baseFmt, baseAttr) =
|
||||
getBaseRole (parentRole, Nothing, nullAttr) customRoles
|
||||
fmt = if parentRole == "raw" then lookup "format" fields else baseFmt
|
||||
annotate :: [Text] -> [Text]
|
||||
annotate = maybe id (:) $
|
||||
if baseRole == "code"
|
||||
then lookup "language" fields
|
||||
else Nothing
|
||||
attr = let (ident, classes, keyValues) = baseAttr
|
||||
-- nub in case role name & language class are the same
|
||||
in (ident, nub . (role :) . annotate $ classes, keyValues)
|
||||
|
||||
updateClasses :: [Text] -> [Text]
|
||||
updateClasses oldClasses = let
|
||||
|
||||
codeLanguageClass = if baseRole == "code"
|
||||
then maybeToList (lookup "language" fields)
|
||||
else []
|
||||
|
||||
-- if no ":class:" field is given, the default is the role name
|
||||
classFieldClasses = maybe [role] T.words (lookup "class" fields)
|
||||
|
||||
-- nub in case role name & language class are the same
|
||||
in nub (classFieldClasses ++ codeLanguageClass ++ oldClasses)
|
||||
|
||||
attr = let (ident, baseClasses, keyValues) = baseAttr
|
||||
in (ident, updateClasses baseClasses, keyValues)
|
||||
|
||||
-- warn about syntax we ignore
|
||||
forM_ fields $ \(key, _) -> case key of
|
||||
|
||||
@@ -179,6 +179,15 @@ tests = [ "line block with blank line" =:
|
||||
, "custom code role with language field"
|
||||
=: ".. role:: lhs(code)\n :language: haskell\n\n:lhs:`a`"
|
||||
=?> para (codeWith ("", ["lhs", "haskell"], []) "a")
|
||||
, "custom role with class field"
|
||||
=: ".. role:: classy\n :class: myclass\n\n:classy:`a`"
|
||||
=?> para (spanWith ("", ["myclass"], []) "a")
|
||||
, "custom role with class field containing multiple whitespace-separated classes"
|
||||
=: ".. role:: classy\n :class: myclass1 myclass2\n myclass3\n\n:classy:`a`"
|
||||
=?> para (spanWith ("", ["myclass1", "myclass2", "myclass3"], []) "a")
|
||||
, "custom role with inherited class field"
|
||||
=: ".. role:: classy\n :class: myclass1\n.. role:: classier(classy)\n :class: myclass2\n\n:classier:`a`"
|
||||
=?> para (spanWith ("", ["myclass2", "myclass1"], []) "a")
|
||||
, "custom role with unspecified parent role"
|
||||
=: ".. role:: classy\n\n:classy:`text`"
|
||||
=?> para (spanWith ("", ["classy"], []) "text")
|
||||
|
||||
Reference in New Issue
Block a user