Skip to content

Commit 005dc7c

Browse files
authored
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.
1 parent 3e5af46 commit 005dc7c

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

src/Text/Pandoc/Readers/RST.hs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -919,14 +919,22 @@ addNewRole roleText fields = do
919919
(baseRole, baseFmt, baseAttr) =
920920
getBaseRole (parentRole, Nothing, nullAttr) customRoles
921921
fmt = if parentRole == "raw" then lookup "format" fields else baseFmt
922-
annotate :: [Text] -> [Text]
923-
annotate = maybe id (:) $
924-
if baseRole == "code"
925-
then lookup "language" fields
926-
else Nothing
927-
attr = let (ident, classes, keyValues) = baseAttr
928-
-- nub in case role name & language class are the same
929-
in (ident, nub . (role :) . annotate $ classes, keyValues)
922+
923+
updateClasses :: [Text] -> [Text]
924+
updateClasses oldClasses = let
925+
926+
codeLanguageClass = if baseRole == "code"
927+
then maybeToList (lookup "language" fields)
928+
else []
929+
930+
-- if no ":class:" field is given, the default is the role name
931+
classFieldClasses = maybe [role] T.words (lookup "class" fields)
932+
933+
-- nub in case role name & language class are the same
934+
in nub (classFieldClasses ++ codeLanguageClass ++ oldClasses)
935+
936+
attr = let (ident, baseClasses, keyValues) = baseAttr
937+
in (ident, updateClasses baseClasses, keyValues)
930938

931939
-- warn about syntax we ignore
932940
forM_ fields $ \(key, _) -> case key of

test/Tests/Readers/RST.hs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,15 @@ tests = [ "line block with blank line" =:
179179
, "custom code role with language field"
180180
=: ".. role:: lhs(code)\n :language: haskell\n\n:lhs:`a`"
181181
=?> para (codeWith ("", ["lhs", "haskell"], []) "a")
182+
, "custom role with class field"
183+
=: ".. role:: classy\n :class: myclass\n\n:classy:`a`"
184+
=?> para (spanWith ("", ["myclass"], []) "a")
185+
, "custom role with class field containing multiple whitespace-separated classes"
186+
=: ".. role:: classy\n :class: myclass1 myclass2\n myclass3\n\n:classy:`a`"
187+
=?> para (spanWith ("", ["myclass1", "myclass2", "myclass3"], []) "a")
188+
, "custom role with inherited class field"
189+
=: ".. role:: classy\n :class: myclass1\n.. role:: classier(classy)\n :class: myclass2\n\n:classier:`a`"
190+
=?> para (spanWith ("", ["myclass2", "myclass1"], []) "a")
182191
, "custom role with unspecified parent role"
183192
=: ".. role:: classy\n\n:classy:`text`"
184193
=?> para (spanWith ("", ["classy"], []) "text")

0 commit comments

Comments
 (0)