diff --git a/gradle.properties b/gradle.properties
index 7b2ec60c9..1557065bd 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -10,4 +10,4 @@ org.jetbrains.intellij.platform.buildFeature.useBinaryReleases=false
jdk.level=17
ijp.target=241
-jewel.release.version=0.20.0
+jewel.release.version=0.21.0
diff --git a/markdown/core/api/core.api b/markdown/core/api/core.api
index d3a68a137..4c08ee61c 100644
--- a/markdown/core/api/core.api
+++ b/markdown/core/api/core.api
@@ -1,188 +1,102 @@
-public abstract interface class org/jetbrains/jewel/markdown/BlockWithInlineMarkdown {
- public abstract fun getInlineContent ()Ljava/lang/Iterable;
-}
-
public abstract interface class org/jetbrains/jewel/markdown/InlineMarkdown {
- public abstract fun getChildren ()Ljava/lang/Iterable;
- public abstract fun getNativeNode ()Lorg/commonmark/node/Node;
}
-public final class org/jetbrains/jewel/markdown/InlineMarkdown$Code : org/jetbrains/jewel/markdown/InlineMarkdown {
- public static final synthetic fun box-impl (Lorg/commonmark/node/Code;)Lorg/jetbrains/jewel/markdown/InlineMarkdown$Code;
- public static fun constructor-impl (Lorg/commonmark/node/Code;)Lorg/commonmark/node/Code;
+public final class org/jetbrains/jewel/markdown/InlineMarkdown$Code : org/jetbrains/jewel/markdown/InlineMarkdown, org/jetbrains/jewel/markdown/WithTextContent {
+ public static final field $stable I
+ public fun (Ljava/lang/String;)V
public fun equals (Ljava/lang/Object;)Z
- public static fun equals-impl (Lorg/commonmark/node/Code;Ljava/lang/Object;)Z
- public static final fun equals-impl0 (Lorg/commonmark/node/Code;Lorg/commonmark/node/Code;)Z
- public fun getChildren ()Ljava/lang/Iterable;
- public static fun getChildren-impl (Lorg/commonmark/node/Code;)Ljava/lang/Iterable;
- public fun getNativeNode ()Lorg/commonmark/node/Code;
- public synthetic fun getNativeNode ()Lorg/commonmark/node/Node;
+ public fun getContent ()Ljava/lang/String;
public fun hashCode ()I
- public static fun hashCode-impl (Lorg/commonmark/node/Code;)I
public fun toString ()Ljava/lang/String;
- public static fun toString-impl (Lorg/commonmark/node/Code;)Ljava/lang/String;
- public final synthetic fun unbox-impl ()Lorg/commonmark/node/Code;
}
-public final class org/jetbrains/jewel/markdown/InlineMarkdown$CustomNode : org/jetbrains/jewel/markdown/InlineMarkdown {
- public static final synthetic fun box-impl (Lorg/commonmark/node/CustomNode;)Lorg/jetbrains/jewel/markdown/InlineMarkdown$CustomNode;
- public static fun constructor-impl (Lorg/commonmark/node/CustomNode;)Lorg/commonmark/node/CustomNode;
- public fun equals (Ljava/lang/Object;)Z
- public static fun equals-impl (Lorg/commonmark/node/CustomNode;Ljava/lang/Object;)Z
- public static final fun equals-impl0 (Lorg/commonmark/node/CustomNode;Lorg/commonmark/node/CustomNode;)Z
- public fun getChildren ()Ljava/lang/Iterable;
- public static fun getChildren-impl (Lorg/commonmark/node/CustomNode;)Ljava/lang/Iterable;
- public fun getNativeNode ()Lorg/commonmark/node/CustomNode;
- public synthetic fun getNativeNode ()Lorg/commonmark/node/Node;
- public fun hashCode ()I
- public static fun hashCode-impl (Lorg/commonmark/node/CustomNode;)I
- public fun toString ()Ljava/lang/String;
- public static fun toString-impl (Lorg/commonmark/node/CustomNode;)Ljava/lang/String;
- public final synthetic fun unbox-impl ()Lorg/commonmark/node/CustomNode;
+public abstract interface class org/jetbrains/jewel/markdown/InlineMarkdown$CustomNode : org/jetbrains/jewel/markdown/InlineMarkdown {
+ public abstract fun contentOrNull ()Ljava/lang/String;
}
-public final class org/jetbrains/jewel/markdown/InlineMarkdown$DefaultImpls {
- public static fun getChildren (Lorg/jetbrains/jewel/markdown/InlineMarkdown;)Ljava/lang/Iterable;
+public final class org/jetbrains/jewel/markdown/InlineMarkdown$CustomNode$DefaultImpls {
+ public static fun contentOrNull (Lorg/jetbrains/jewel/markdown/InlineMarkdown$CustomNode;)Ljava/lang/String;
}
-public final class org/jetbrains/jewel/markdown/InlineMarkdown$Emphasis : org/jetbrains/jewel/markdown/InlineMarkdown {
- public static final synthetic fun box-impl (Lorg/commonmark/node/Emphasis;)Lorg/jetbrains/jewel/markdown/InlineMarkdown$Emphasis;
- public static fun constructor-impl (Lorg/commonmark/node/Emphasis;)Lorg/commonmark/node/Emphasis;
+public final class org/jetbrains/jewel/markdown/InlineMarkdown$Emphasis : org/jetbrains/jewel/markdown/InlineMarkdown, org/jetbrains/jewel/markdown/WithInlineMarkdown {
+ public static final field $stable I
+ public fun (Ljava/lang/String;Ljava/util/List;)V
+ public fun (Ljava/lang/String;[Lorg/jetbrains/jewel/markdown/InlineMarkdown;)V
public fun equals (Ljava/lang/Object;)Z
- public static fun equals-impl (Lorg/commonmark/node/Emphasis;Ljava/lang/Object;)Z
- public static final fun equals-impl0 (Lorg/commonmark/node/Emphasis;Lorg/commonmark/node/Emphasis;)Z
- public fun getChildren ()Ljava/lang/Iterable;
- public static fun getChildren-impl (Lorg/commonmark/node/Emphasis;)Ljava/lang/Iterable;
- public fun getNativeNode ()Lorg/commonmark/node/Emphasis;
- public synthetic fun getNativeNode ()Lorg/commonmark/node/Node;
+ public final fun getDelimiter ()Ljava/lang/String;
+ public fun getInlineContent ()Ljava/util/List;
public fun hashCode ()I
- public static fun hashCode-impl (Lorg/commonmark/node/Emphasis;)I
public fun toString ()Ljava/lang/String;
- public static fun toString-impl (Lorg/commonmark/node/Emphasis;)Ljava/lang/String;
- public final synthetic fun unbox-impl ()Lorg/commonmark/node/Emphasis;
}
public final class org/jetbrains/jewel/markdown/InlineMarkdown$HardLineBreak : org/jetbrains/jewel/markdown/InlineMarkdown {
- public static final synthetic fun box-impl (Lorg/commonmark/node/HardLineBreak;)Lorg/jetbrains/jewel/markdown/InlineMarkdown$HardLineBreak;
- public static fun constructor-impl (Lorg/commonmark/node/HardLineBreak;)Lorg/commonmark/node/HardLineBreak;
+ public static final field $stable I
+ public static final field INSTANCE Lorg/jetbrains/jewel/markdown/InlineMarkdown$HardLineBreak;
public fun equals (Ljava/lang/Object;)Z
- public static fun equals-impl (Lorg/commonmark/node/HardLineBreak;Ljava/lang/Object;)Z
- public static final fun equals-impl0 (Lorg/commonmark/node/HardLineBreak;Lorg/commonmark/node/HardLineBreak;)Z
- public fun getChildren ()Ljava/lang/Iterable;
- public static fun getChildren-impl (Lorg/commonmark/node/HardLineBreak;)Ljava/lang/Iterable;
- public fun getNativeNode ()Lorg/commonmark/node/HardLineBreak;
- public synthetic fun getNativeNode ()Lorg/commonmark/node/Node;
public fun hashCode ()I
- public static fun hashCode-impl (Lorg/commonmark/node/HardLineBreak;)I
public fun toString ()Ljava/lang/String;
- public static fun toString-impl (Lorg/commonmark/node/HardLineBreak;)Ljava/lang/String;
- public final synthetic fun unbox-impl ()Lorg/commonmark/node/HardLineBreak;
}
-public final class org/jetbrains/jewel/markdown/InlineMarkdown$HtmlInline : org/jetbrains/jewel/markdown/InlineMarkdown {
- public static final synthetic fun box-impl (Lorg/commonmark/node/HtmlInline;)Lorg/jetbrains/jewel/markdown/InlineMarkdown$HtmlInline;
- public static fun constructor-impl (Lorg/commonmark/node/HtmlInline;)Lorg/commonmark/node/HtmlInline;
+public final class org/jetbrains/jewel/markdown/InlineMarkdown$HtmlInline : org/jetbrains/jewel/markdown/InlineMarkdown, org/jetbrains/jewel/markdown/WithTextContent {
+ public static final field $stable I
+ public fun (Ljava/lang/String;)V
public fun equals (Ljava/lang/Object;)Z
- public static fun equals-impl (Lorg/commonmark/node/HtmlInline;Ljava/lang/Object;)Z
- public static final fun equals-impl0 (Lorg/commonmark/node/HtmlInline;Lorg/commonmark/node/HtmlInline;)Z
- public fun getChildren ()Ljava/lang/Iterable;
- public static fun getChildren-impl (Lorg/commonmark/node/HtmlInline;)Ljava/lang/Iterable;
- public fun getNativeNode ()Lorg/commonmark/node/HtmlInline;
- public synthetic fun getNativeNode ()Lorg/commonmark/node/Node;
+ public fun getContent ()Ljava/lang/String;
public fun hashCode ()I
- public static fun hashCode-impl (Lorg/commonmark/node/HtmlInline;)I
public fun toString ()Ljava/lang/String;
- public static fun toString-impl (Lorg/commonmark/node/HtmlInline;)Ljava/lang/String;
- public final synthetic fun unbox-impl ()Lorg/commonmark/node/HtmlInline;
}
-public final class org/jetbrains/jewel/markdown/InlineMarkdown$Image : org/jetbrains/jewel/markdown/InlineMarkdown {
- public static final synthetic fun box-impl (Lorg/commonmark/node/Image;)Lorg/jetbrains/jewel/markdown/InlineMarkdown$Image;
- public static fun constructor-impl (Lorg/commonmark/node/Image;)Lorg/commonmark/node/Image;
+public final class org/jetbrains/jewel/markdown/InlineMarkdown$Image : org/jetbrains/jewel/markdown/InlineMarkdown, org/jetbrains/jewel/markdown/WithInlineMarkdown {
+ public static final field $stable I
+ public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V
+ public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Lorg/jetbrains/jewel/markdown/InlineMarkdown;)V
public fun equals (Ljava/lang/Object;)Z
- public static fun equals-impl (Lorg/commonmark/node/Image;Ljava/lang/Object;)Z
- public static final fun equals-impl0 (Lorg/commonmark/node/Image;Lorg/commonmark/node/Image;)Z
- public fun getChildren ()Ljava/lang/Iterable;
- public static fun getChildren-impl (Lorg/commonmark/node/Image;)Ljava/lang/Iterable;
- public fun getNativeNode ()Lorg/commonmark/node/Image;
- public synthetic fun getNativeNode ()Lorg/commonmark/node/Node;
+ public final fun getAlt ()Ljava/lang/String;
+ public fun getInlineContent ()Ljava/util/List;
+ public final fun getSource ()Ljava/lang/String;
+ public final fun getTitle ()Ljava/lang/String;
public fun hashCode ()I
- public static fun hashCode-impl (Lorg/commonmark/node/Image;)I
public fun toString ()Ljava/lang/String;
- public static fun toString-impl (Lorg/commonmark/node/Image;)Ljava/lang/String;
- public final synthetic fun unbox-impl ()Lorg/commonmark/node/Image;
}
-public final class org/jetbrains/jewel/markdown/InlineMarkdown$Link : org/jetbrains/jewel/markdown/InlineMarkdown {
- public static final synthetic fun box-impl (Lorg/commonmark/node/Link;)Lorg/jetbrains/jewel/markdown/InlineMarkdown$Link;
- public static fun constructor-impl (Lorg/commonmark/node/Link;)Lorg/commonmark/node/Link;
+public final class org/jetbrains/jewel/markdown/InlineMarkdown$Link : org/jetbrains/jewel/markdown/InlineMarkdown, org/jetbrains/jewel/markdown/WithInlineMarkdown {
+ public static final field $stable I
+ public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V
+ public fun (Ljava/lang/String;Ljava/lang/String;[Lorg/jetbrains/jewel/markdown/InlineMarkdown;)V
public fun equals (Ljava/lang/Object;)Z
- public static fun equals-impl (Lorg/commonmark/node/Link;Ljava/lang/Object;)Z
- public static final fun equals-impl0 (Lorg/commonmark/node/Link;Lorg/commonmark/node/Link;)Z
- public fun getChildren ()Ljava/lang/Iterable;
- public static fun getChildren-impl (Lorg/commonmark/node/Link;)Ljava/lang/Iterable;
- public fun getNativeNode ()Lorg/commonmark/node/Link;
- public synthetic fun getNativeNode ()Lorg/commonmark/node/Node;
+ public final fun getDestination ()Ljava/lang/String;
+ public fun getInlineContent ()Ljava/util/List;
+ public final fun getTitle ()Ljava/lang/String;
public fun hashCode ()I
- public static fun hashCode-impl (Lorg/commonmark/node/Link;)I
public fun toString ()Ljava/lang/String;
- public static fun toString-impl (Lorg/commonmark/node/Link;)Ljava/lang/String;
- public final synthetic fun unbox-impl ()Lorg/commonmark/node/Link;
}
public final class org/jetbrains/jewel/markdown/InlineMarkdown$SoftLineBreak : org/jetbrains/jewel/markdown/InlineMarkdown {
- public static final synthetic fun box-impl (Lorg/commonmark/node/SoftLineBreak;)Lorg/jetbrains/jewel/markdown/InlineMarkdown$SoftLineBreak;
- public static fun constructor-impl (Lorg/commonmark/node/SoftLineBreak;)Lorg/commonmark/node/SoftLineBreak;
+ public static final field $stable I
+ public static final field INSTANCE Lorg/jetbrains/jewel/markdown/InlineMarkdown$SoftLineBreak;
public fun equals (Ljava/lang/Object;)Z
- public static fun equals-impl (Lorg/commonmark/node/SoftLineBreak;Ljava/lang/Object;)Z
- public static final fun equals-impl0 (Lorg/commonmark/node/SoftLineBreak;Lorg/commonmark/node/SoftLineBreak;)Z
- public fun getChildren ()Ljava/lang/Iterable;
- public static fun getChildren-impl (Lorg/commonmark/node/SoftLineBreak;)Ljava/lang/Iterable;
- public synthetic fun getNativeNode ()Lorg/commonmark/node/Node;
- public fun getNativeNode ()Lorg/commonmark/node/SoftLineBreak;
public fun hashCode ()I
- public static fun hashCode-impl (Lorg/commonmark/node/SoftLineBreak;)I
public fun toString ()Ljava/lang/String;
- public static fun toString-impl (Lorg/commonmark/node/SoftLineBreak;)Ljava/lang/String;
- public final synthetic fun unbox-impl ()Lorg/commonmark/node/SoftLineBreak;
}
-public final class org/jetbrains/jewel/markdown/InlineMarkdown$StrongEmphasis : org/jetbrains/jewel/markdown/InlineMarkdown {
- public static final synthetic fun box-impl (Lorg/commonmark/node/StrongEmphasis;)Lorg/jetbrains/jewel/markdown/InlineMarkdown$StrongEmphasis;
- public static fun constructor-impl (Lorg/commonmark/node/StrongEmphasis;)Lorg/commonmark/node/StrongEmphasis;
+public final class org/jetbrains/jewel/markdown/InlineMarkdown$StrongEmphasis : org/jetbrains/jewel/markdown/InlineMarkdown, org/jetbrains/jewel/markdown/WithInlineMarkdown {
+ public static final field $stable I
+ public fun (Ljava/lang/String;Ljava/util/List;)V
+ public fun (Ljava/lang/String;[Lorg/jetbrains/jewel/markdown/InlineMarkdown;)V
public fun equals (Ljava/lang/Object;)Z
- public static fun equals-impl (Lorg/commonmark/node/StrongEmphasis;Ljava/lang/Object;)Z
- public static final fun equals-impl0 (Lorg/commonmark/node/StrongEmphasis;Lorg/commonmark/node/StrongEmphasis;)Z
- public fun getChildren ()Ljava/lang/Iterable;
- public static fun getChildren-impl (Lorg/commonmark/node/StrongEmphasis;)Ljava/lang/Iterable;
- public synthetic fun getNativeNode ()Lorg/commonmark/node/Node;
- public fun getNativeNode ()Lorg/commonmark/node/StrongEmphasis;
+ public final fun getDelimiter ()Ljava/lang/String;
+ public fun getInlineContent ()Ljava/util/List;
public fun hashCode ()I
- public static fun hashCode-impl (Lorg/commonmark/node/StrongEmphasis;)I
public fun toString ()Ljava/lang/String;
- public static fun toString-impl (Lorg/commonmark/node/StrongEmphasis;)Ljava/lang/String;
- public final synthetic fun unbox-impl ()Lorg/commonmark/node/StrongEmphasis;
}
-public final class org/jetbrains/jewel/markdown/InlineMarkdown$Text : org/jetbrains/jewel/markdown/InlineMarkdown {
- public static final synthetic fun box-impl (Lorg/commonmark/node/Text;)Lorg/jetbrains/jewel/markdown/InlineMarkdown$Text;
- public static fun constructor-impl (Lorg/commonmark/node/Text;)Lorg/commonmark/node/Text;
+public final class org/jetbrains/jewel/markdown/InlineMarkdown$Text : org/jetbrains/jewel/markdown/InlineMarkdown, org/jetbrains/jewel/markdown/WithTextContent {
+ public static final field $stable I
+ public fun (Ljava/lang/String;)V
public fun equals (Ljava/lang/Object;)Z
- public static fun equals-impl (Lorg/commonmark/node/Text;Ljava/lang/Object;)Z
- public static final fun equals-impl0 (Lorg/commonmark/node/Text;Lorg/commonmark/node/Text;)Z
- public fun getChildren ()Ljava/lang/Iterable;
- public static fun getChildren-impl (Lorg/commonmark/node/Text;)Ljava/lang/Iterable;
- public synthetic fun getNativeNode ()Lorg/commonmark/node/Node;
- public fun getNativeNode ()Lorg/commonmark/node/Text;
+ public fun getContent ()Ljava/lang/String;
public fun hashCode ()I
- public static fun hashCode-impl (Lorg/commonmark/node/Text;)I
public fun toString ()Ljava/lang/String;
- public static fun toString-impl (Lorg/commonmark/node/Text;)Ljava/lang/String;
- public final synthetic fun unbox-impl ()Lorg/commonmark/node/Text;
-}
-
-public final class org/jetbrains/jewel/markdown/InlineMarkdownKt {
- public static final fun toInlineNode (Lorg/commonmark/node/Node;)Lorg/jetbrains/jewel/markdown/InlineMarkdown;
}
public abstract interface class org/jetbrains/jewel/markdown/MarkdownBlock {
@@ -191,9 +105,7 @@ public abstract interface class org/jetbrains/jewel/markdown/MarkdownBlock {
public final class org/jetbrains/jewel/markdown/MarkdownBlock$BlockQuote : org/jetbrains/jewel/markdown/MarkdownBlock {
public static final field $stable I
public fun (Ljava/util/List;)V
- public final fun component1 ()Ljava/util/List;
- public final fun copy (Ljava/util/List;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$BlockQuote;
- public static synthetic fun copy$default (Lorg/jetbrains/jewel/markdown/MarkdownBlock$BlockQuote;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$BlockQuote;
+ public fun ([Lorg/jetbrains/jewel/markdown/MarkdownBlock;)V
public fun equals (Ljava/lang/Object;)Z
public final fun getChildren ()Ljava/util/List;
public fun hashCode ()I
@@ -207,10 +119,6 @@ public abstract interface class org/jetbrains/jewel/markdown/MarkdownBlock$CodeB
public final class org/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$FencedCodeBlock : org/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock {
public static final field $stable I
public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun component2-EIRQHX8 ()Ljava/lang/String;
- public final fun copy-k5OzbWQ (Ljava/lang/String;Ljava/lang/String;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$FencedCodeBlock;
- public static synthetic fun copy-k5OzbWQ$default (Lorg/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$FencedCodeBlock;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$FencedCodeBlock;
public fun equals (Ljava/lang/Object;)Z
public fun getContent ()Ljava/lang/String;
public final fun getMimeType-EIRQHX8 ()Ljava/lang/String;
@@ -221,9 +129,6 @@ public final class org/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$FencedCo
public final class org/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$IndentedCodeBlock : org/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock {
public static final field $stable I
public fun (Ljava/lang/String;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun copy (Ljava/lang/String;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$IndentedCodeBlock;
- public static synthetic fun copy$default (Lorg/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$IndentedCodeBlock;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$IndentedCodeBlock;
public fun equals (Ljava/lang/Object;)Z
public fun getContent ()Ljava/lang/String;
public fun hashCode ()I
@@ -233,28 +138,20 @@ public final class org/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$Indented
public abstract interface class org/jetbrains/jewel/markdown/MarkdownBlock$CustomBlock : org/jetbrains/jewel/markdown/MarkdownBlock {
}
-public final class org/jetbrains/jewel/markdown/MarkdownBlock$Heading : org/jetbrains/jewel/markdown/BlockWithInlineMarkdown, org/jetbrains/jewel/markdown/MarkdownBlock {
- public static final synthetic fun box-impl (Lorg/commonmark/node/Heading;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$Heading;
- public static fun constructor-impl (Lorg/commonmark/node/Heading;)Lorg/commonmark/node/Heading;
+public final class org/jetbrains/jewel/markdown/MarkdownBlock$Heading : org/jetbrains/jewel/markdown/MarkdownBlock, org/jetbrains/jewel/markdown/WithInlineMarkdown {
+ public static final field $stable I
+ public fun (I[Lorg/jetbrains/jewel/markdown/InlineMarkdown;)V
+ public fun (Ljava/util/List;I)V
public fun equals (Ljava/lang/Object;)Z
- public static fun equals-impl (Lorg/commonmark/node/Heading;Ljava/lang/Object;)Z
- public static final fun equals-impl0 (Lorg/commonmark/node/Heading;Lorg/commonmark/node/Heading;)Z
- public fun getInlineContent ()Ljava/lang/Iterable;
- public static fun getInlineContent-impl (Lorg/commonmark/node/Heading;)Ljava/lang/Iterable;
- public static final fun getLevel-impl (Lorg/commonmark/node/Heading;)I
+ public fun getInlineContent ()Ljava/util/List;
+ public final fun getLevel ()I
public fun hashCode ()I
- public static fun hashCode-impl (Lorg/commonmark/node/Heading;)I
public fun toString ()Ljava/lang/String;
- public static fun toString-impl (Lorg/commonmark/node/Heading;)Ljava/lang/String;
- public final synthetic fun unbox-impl ()Lorg/commonmark/node/Heading;
}
public final class org/jetbrains/jewel/markdown/MarkdownBlock$HtmlBlock : org/jetbrains/jewel/markdown/MarkdownBlock {
public static final field $stable I
public fun (Ljava/lang/String;)V
- public final fun component1 ()Ljava/lang/String;
- public final fun copy (Ljava/lang/String;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$HtmlBlock;
- public static synthetic fun copy$default (Lorg/jetbrains/jewel/markdown/MarkdownBlock$HtmlBlock;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$HtmlBlock;
public fun equals (Ljava/lang/Object;)Z
public final fun getContent ()Ljava/lang/String;
public fun hashCode ()I
@@ -269,12 +166,7 @@ public abstract interface class org/jetbrains/jewel/markdown/MarkdownBlock$ListB
public final class org/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$OrderedList : org/jetbrains/jewel/markdown/MarkdownBlock$ListBlock {
public static final field $stable I
public fun (Ljava/util/List;ZILjava/lang/String;)V
- public final fun component1 ()Ljava/util/List;
- public final fun component2 ()Z
- public final fun component3 ()I
- public final fun component4 ()Ljava/lang/String;
- public final fun copy (Ljava/util/List;ZILjava/lang/String;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$OrderedList;
- public static synthetic fun copy$default (Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$OrderedList;Ljava/util/List;ZILjava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$OrderedList;
+ public fun (ZILjava/lang/String;[Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListItem;)V
public fun equals (Ljava/lang/Object;)Z
public fun getChildren ()Ljava/util/List;
public final fun getDelimiter ()Ljava/lang/String;
@@ -287,11 +179,7 @@ public final class org/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$OrderedL
public final class org/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$UnorderedList : org/jetbrains/jewel/markdown/MarkdownBlock$ListBlock {
public static final field $stable I
public fun (Ljava/util/List;ZLjava/lang/String;)V
- public final fun component1 ()Ljava/util/List;
- public final fun component2 ()Z
- public final fun component3 ()Ljava/lang/String;
- public final fun copy (Ljava/util/List;ZLjava/lang/String;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$UnorderedList;
- public static synthetic fun copy$default (Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$UnorderedList;Ljava/util/List;ZLjava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$UnorderedList;
+ public fun (ZLjava/lang/String;[Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListItem;)V
public fun equals (Ljava/lang/Object;)Z
public fun getChildren ()Ljava/util/List;
public final fun getMarker ()Ljava/lang/String;
@@ -303,33 +191,29 @@ public final class org/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$Unordere
public final class org/jetbrains/jewel/markdown/MarkdownBlock$ListItem : org/jetbrains/jewel/markdown/MarkdownBlock {
public static final field $stable I
public fun (Ljava/util/List;)V
- public final fun component1 ()Ljava/util/List;
- public final fun copy (Ljava/util/List;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListItem;
- public static synthetic fun copy$default (Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListItem;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListItem;
+ public fun ([Lorg/jetbrains/jewel/markdown/MarkdownBlock;)V
public fun equals (Ljava/lang/Object;)Z
public final fun getChildren ()Ljava/util/List;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
-public final class org/jetbrains/jewel/markdown/MarkdownBlock$Paragraph : org/jetbrains/jewel/markdown/BlockWithInlineMarkdown, org/jetbrains/jewel/markdown/MarkdownBlock {
- public static final synthetic fun box-impl (Lorg/commonmark/node/Paragraph;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$Paragraph;
- public static fun constructor-impl (Lorg/commonmark/node/Paragraph;)Lorg/commonmark/node/Paragraph;
+public final class org/jetbrains/jewel/markdown/MarkdownBlock$Paragraph : org/jetbrains/jewel/markdown/MarkdownBlock, org/jetbrains/jewel/markdown/WithInlineMarkdown {
+ public static final field $stable I
+ public fun (Ljava/util/List;)V
+ public fun ([Lorg/jetbrains/jewel/markdown/InlineMarkdown;)V
public fun equals (Ljava/lang/Object;)Z
- public static fun equals-impl (Lorg/commonmark/node/Paragraph;Ljava/lang/Object;)Z
- public static final fun equals-impl0 (Lorg/commonmark/node/Paragraph;Lorg/commonmark/node/Paragraph;)Z
- public fun getInlineContent ()Ljava/lang/Iterable;
- public static fun getInlineContent-impl (Lorg/commonmark/node/Paragraph;)Ljava/lang/Iterable;
+ public fun getInlineContent ()Ljava/util/List;
public fun hashCode ()I
- public static fun hashCode-impl (Lorg/commonmark/node/Paragraph;)I
public fun toString ()Ljava/lang/String;
- public static fun toString-impl (Lorg/commonmark/node/Paragraph;)Ljava/lang/String;
- public final synthetic fun unbox-impl ()Lorg/commonmark/node/Paragraph;
}
public final class org/jetbrains/jewel/markdown/MarkdownBlock$ThematicBreak : org/jetbrains/jewel/markdown/MarkdownBlock {
public static final field $stable I
public static final field INSTANCE Lorg/jetbrains/jewel/markdown/MarkdownBlock$ThematicBreak;
+ public fun equals (Ljava/lang/Object;)Z
+ public fun hashCode ()I
+ public fun toString ()Ljava/lang/String;
}
public final class org/jetbrains/jewel/markdown/MarkdownKt {
@@ -413,6 +297,14 @@ public final class org/jetbrains/jewel/markdown/SemanticsKt {
public static final fun setRawMarkdown (Landroidx/compose/ui/semantics/SemanticsPropertyReceiver;Ljava/lang/String;)V
}
+public abstract interface class org/jetbrains/jewel/markdown/WithInlineMarkdown {
+ public abstract fun getInlineContent ()Ljava/util/List;
+}
+
+public abstract interface class org/jetbrains/jewel/markdown/WithTextContent {
+ public abstract fun getContent ()Ljava/lang/String;
+}
+
public abstract interface class org/jetbrains/jewel/markdown/extensions/MarkdownBlockProcessorExtension {
public abstract fun canProcess (Lorg/commonmark/node/CustomBlock;)Z
public abstract fun processMarkdownBlock (Lorg/commonmark/node/CustomBlock;Lorg/jetbrains/jewel/markdown/processing/MarkdownProcessor;)Lorg/jetbrains/jewel/markdown/MarkdownBlock$CustomBlock;
@@ -423,6 +315,16 @@ public abstract interface class org/jetbrains/jewel/markdown/extensions/Markdown
public abstract fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$CustomBlock;Lorg/jetbrains/jewel/markdown/rendering/MarkdownBlockRenderer;Lorg/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
}
+public abstract interface class org/jetbrains/jewel/markdown/extensions/MarkdownInlineProcessorExtension {
+ public abstract fun canProcess (Lorg/commonmark/node/CustomNode;)Z
+ public abstract fun processInlineMarkdown (Lorg/commonmark/node/CustomNode;Lorg/jetbrains/jewel/markdown/processing/MarkdownProcessor;)Lorg/jetbrains/jewel/markdown/InlineMarkdown$CustomNode;
+}
+
+public abstract interface class org/jetbrains/jewel/markdown/extensions/MarkdownInlineRendererExtension {
+ public abstract fun canRender (Lorg/jetbrains/jewel/markdown/InlineMarkdown$CustomNode;)Z
+ public abstract fun render (Lorg/jetbrains/jewel/markdown/InlineMarkdown$CustomNode;Lorg/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer;Z)V
+}
+
public final class org/jetbrains/jewel/markdown/extensions/MarkdownKt {
public static final fun getLocalMarkdownBlockRenderer ()Landroidx/compose/runtime/ProvidableCompositionLocal;
public static final fun getLocalMarkdownProcessor ()Landroidx/compose/runtime/ProvidableCompositionLocal;
@@ -433,13 +335,27 @@ public final class org/jetbrains/jewel/markdown/extensions/MarkdownKt {
}
public abstract interface class org/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension {
+ public abstract fun getBlockProcessorExtension ()Lorg/jetbrains/jewel/markdown/extensions/MarkdownBlockProcessorExtension;
+ public abstract fun getInlineProcessorExtension ()Lorg/jetbrains/jewel/markdown/extensions/MarkdownInlineProcessorExtension;
public abstract fun getParserExtension ()Lorg/commonmark/parser/Parser$ParserExtension;
- public abstract fun getProcessorExtension ()Lorg/jetbrains/jewel/markdown/extensions/MarkdownBlockProcessorExtension;
public abstract fun getTextRendererExtension ()Lorg/commonmark/renderer/text/TextContentRenderer$TextContentRendererExtension;
}
+public final class org/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension$DefaultImpls {
+ public static fun getBlockProcessorExtension (Lorg/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension;)Lorg/jetbrains/jewel/markdown/extensions/MarkdownBlockProcessorExtension;
+ public static fun getInlineProcessorExtension (Lorg/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension;)Lorg/jetbrains/jewel/markdown/extensions/MarkdownInlineProcessorExtension;
+ public static fun getParserExtension (Lorg/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension;)Lorg/commonmark/parser/Parser$ParserExtension;
+ public static fun getTextRendererExtension (Lorg/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension;)Lorg/commonmark/renderer/text/TextContentRenderer$TextContentRendererExtension;
+}
+
public abstract interface class org/jetbrains/jewel/markdown/extensions/MarkdownRendererExtension {
public abstract fun getBlockRenderer ()Lorg/jetbrains/jewel/markdown/extensions/MarkdownBlockRendererExtension;
+ public abstract fun getInlineRenderer ()Lorg/jetbrains/jewel/markdown/extensions/MarkdownInlineRendererExtension;
+}
+
+public final class org/jetbrains/jewel/markdown/extensions/MarkdownRendererExtension$DefaultImpls {
+ public static fun getBlockRenderer (Lorg/jetbrains/jewel/markdown/extensions/MarkdownRendererExtension;)Lorg/jetbrains/jewel/markdown/extensions/MarkdownBlockRendererExtension;
+ public static fun getInlineRenderer (Lorg/jetbrains/jewel/markdown/extensions/MarkdownRendererExtension;)Lorg/jetbrains/jewel/markdown/extensions/MarkdownInlineRendererExtension;
}
public final class org/jetbrains/jewel/markdown/processing/MarkdownParserFactory {
@@ -454,8 +370,6 @@ public final class org/jetbrains/jewel/markdown/processing/MarkdownProcessor {
public fun ()V
public fun (Ljava/util/List;ZLorg/commonmark/parser/Parser;)V
public synthetic fun (Ljava/util/List;ZLorg/commonmark/parser/Parser;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
- public fun (Z[Lorg/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension;)V
- public synthetic fun (Z[Lorg/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun processChildren (Lorg/commonmark/node/Node;)Ljava/util/List;
public final fun processMarkdownDocument (Ljava/lang/String;)Ljava/util/List;
}
@@ -464,7 +378,6 @@ public class org/jetbrains/jewel/markdown/rendering/DefaultInlineMarkdownRendere
public static final field $stable I
public static final field Companion Lorg/jetbrains/jewel/markdown/rendering/DefaultInlineMarkdownRenderer$Companion;
public fun (Ljava/util/List;)V
- public fun ([Lorg/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension;)V
public fun renderAsAnnotatedString (Ljava/lang/Iterable;Lorg/jetbrains/jewel/markdown/rendering/InlinesStyling;ZLkotlin/jvm/functions/Function1;)Landroidx/compose/ui/text/AnnotatedString;
}
@@ -480,28 +393,22 @@ public class org/jetbrains/jewel/markdown/rendering/DefaultMarkdownBlockRenderer
public fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$FencedCodeBlock;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Code$Fenced;Landroidx/compose/runtime/Composer;I)V
public fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$IndentedCodeBlock;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Code$Indented;Landroidx/compose/runtime/Composer;I)V
public fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Code;Landroidx/compose/runtime/Composer;I)V
+ public fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$Heading;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Heading$HN;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
+ public fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$Heading;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Heading;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
public fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$HtmlBlock;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$HtmlBlock;Landroidx/compose/runtime/Composer;I)V
public fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$OrderedList;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$List$Ordered;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
public fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$UnorderedList;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$List$Unordered;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
public fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListBlock;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$List;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
public fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListItem;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
+ public fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$Paragraph;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Paragraph;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
public fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
- public fun render-EPtGD7Q (Lorg/commonmark/node/Heading;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Heading$HN;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
- public fun render-EPtGD7Q (Lorg/commonmark/node/Heading;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Heading;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
- public fun render-VUzZlgQ (Lorg/commonmark/node/Paragraph;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Paragraph;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
public fun renderThematicBreak (Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$ThematicBreak;Landroidx/compose/runtime/Composer;I)V
}
public abstract interface class org/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer {
- public static final field Companion Lorg/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer$Companion;
public abstract fun renderAsAnnotatedString (Ljava/lang/Iterable;Lorg/jetbrains/jewel/markdown/rendering/InlinesStyling;ZLkotlin/jvm/functions/Function1;)Landroidx/compose/ui/text/AnnotatedString;
}
-public final class org/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer$Companion {
- public final fun default (Ljava/util/List;)Lorg/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer;
- public static synthetic fun default$default (Lorg/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer$Companion;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer;
-}
-
public final class org/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer$DefaultImpls {
public static synthetic fun renderAsAnnotatedString$default (Lorg/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer;Ljava/lang/Iterable;Lorg/jetbrains/jewel/markdown/rendering/InlinesStyling;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Landroidx/compose/ui/text/AnnotatedString;
}
@@ -509,14 +416,20 @@ public final class org/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer
public final class org/jetbrains/jewel/markdown/rendering/InlinesStyling {
public static final field $stable I
public static final field Companion Lorg/jetbrains/jewel/markdown/rendering/InlinesStyling$Companion;
- public fun (Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/SpanStyle;Z)V
+ public fun (Landroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/SpanStyle;Landroidx/compose/ui/text/SpanStyle;Z)V
public fun equals (Ljava/lang/Object;)Z
public final fun getEmphasis ()Landroidx/compose/ui/text/SpanStyle;
public final fun getInlineCode ()Landroidx/compose/ui/text/SpanStyle;
public final fun getInlineHtml ()Landroidx/compose/ui/text/SpanStyle;
public final fun getLink ()Landroidx/compose/ui/text/SpanStyle;
+ public final fun getLinkDisabled ()Landroidx/compose/ui/text/SpanStyle;
+ public final fun getLinkFocused ()Landroidx/compose/ui/text/SpanStyle;
+ public final fun getLinkHovered ()Landroidx/compose/ui/text/SpanStyle;
+ public final fun getLinkPressed ()Landroidx/compose/ui/text/SpanStyle;
+ public final fun getLinkVisited ()Landroidx/compose/ui/text/SpanStyle;
public final fun getRenderInlineHtml ()Z
public final fun getStrongEmphasis ()Landroidx/compose/ui/text/SpanStyle;
+ public final fun getTextLinkStyles ()Landroidx/compose/ui/text/TextLinkStyles;
public final fun getTextStyle ()Landroidx/compose/ui/text/TextStyle;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
@@ -532,15 +445,15 @@ public abstract interface class org/jetbrains/jewel/markdown/rendering/MarkdownB
public abstract fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$FencedCodeBlock;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Code$Fenced;Landroidx/compose/runtime/Composer;I)V
public abstract fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock$IndentedCodeBlock;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Code$Indented;Landroidx/compose/runtime/Composer;I)V
public abstract fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$CodeBlock;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Code;Landroidx/compose/runtime/Composer;I)V
+ public abstract fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$Heading;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Heading$HN;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
+ public abstract fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$Heading;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Heading;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
public abstract fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$HtmlBlock;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$HtmlBlock;Landroidx/compose/runtime/Composer;I)V
public abstract fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$OrderedList;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$List$Ordered;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
public abstract fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListBlock$UnorderedList;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$List$Unordered;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
public abstract fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListBlock;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$List;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
public abstract fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$ListItem;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
+ public abstract fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock$Paragraph;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Paragraph;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
public abstract fun render (Lorg/jetbrains/jewel/markdown/MarkdownBlock;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
- public abstract fun render-EPtGD7Q (Lorg/commonmark/node/Heading;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Heading$HN;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
- public abstract fun render-EPtGD7Q (Lorg/commonmark/node/Heading;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Heading;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
- public abstract fun render-VUzZlgQ (Lorg/commonmark/node/Paragraph;Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$Paragraph;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;I)V
public abstract fun renderThematicBreak (Lorg/jetbrains/jewel/markdown/rendering/MarkdownStyling$ThematicBreak;Landroidx/compose/runtime/Composer;I)V
}
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/InlineMarkdown.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/InlineMarkdown.kt
index 1ec7ec3f9..9b0511c17 100644
--- a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/InlineMarkdown.kt
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/InlineMarkdown.kt
@@ -1,96 +1,80 @@
package org.jetbrains.jewel.markdown
-import org.commonmark.node.Node
-import org.jetbrains.jewel.markdown.InlineMarkdown.Code
-import org.jetbrains.jewel.markdown.InlineMarkdown.CustomNode
-import org.jetbrains.jewel.markdown.InlineMarkdown.Emphasis
-import org.jetbrains.jewel.markdown.InlineMarkdown.HardLineBreak
-import org.jetbrains.jewel.markdown.InlineMarkdown.HtmlInline
-import org.jetbrains.jewel.markdown.InlineMarkdown.Image
-import org.jetbrains.jewel.markdown.InlineMarkdown.Link
-import org.jetbrains.jewel.markdown.InlineMarkdown.SoftLineBreak
-import org.jetbrains.jewel.markdown.InlineMarkdown.StrongEmphasis
-import org.jetbrains.jewel.markdown.InlineMarkdown.Text
-import org.commonmark.node.Code as CMCode
-import org.commonmark.node.CustomNode as CMCustomNode
-import org.commonmark.node.Emphasis as CMEmphasis
-import org.commonmark.node.HardLineBreak as CMHardLineBreak
-import org.commonmark.node.HtmlInline as CMHtmlInline
-import org.commonmark.node.Image as CMImage
-import org.commonmark.node.Link as CMLink
-import org.commonmark.node.SoftLineBreak as CMSoftLineBreak
-import org.commonmark.node.StrongEmphasis as CMStrongEmphasis
-import org.commonmark.node.Text as CMText
+import org.jetbrains.jewel.foundation.GenerateDataFunctions
/**
* A run of inline Markdown used as content for
* [block-level elements][MarkdownBlock].
*/
public sealed interface InlineMarkdown {
- public val nativeNode: Node
-
- @JvmInline
- public value class Code(override val nativeNode: CMCode) : InlineMarkdown
-
- @JvmInline
- public value class CustomNode(override val nativeNode: CMCustomNode) : InlineMarkdown
-
- @JvmInline
- public value class Emphasis(override val nativeNode: CMEmphasis) : InlineMarkdown
-
- @JvmInline
- public value class HardLineBreak(override val nativeNode: CMHardLineBreak) : InlineMarkdown
-
- @JvmInline
- public value class HtmlInline(override val nativeNode: CMHtmlInline) : InlineMarkdown
-
- @JvmInline
- public value class Image(override val nativeNode: CMImage) : InlineMarkdown
-
- @JvmInline
- public value class Link(override val nativeNode: CMLink) : InlineMarkdown
-
- @JvmInline
- public value class SoftLineBreak(override val nativeNode: CMSoftLineBreak) : InlineMarkdown
+ @GenerateDataFunctions
+ public class Code(override val content: String) : InlineMarkdown, WithTextContent
+
+ public interface CustomNode : InlineMarkdown {
+ /**
+ * If this custom node has a text-based representation, this function
+ * should return it. Otherwise, it should return null.
+ */
+ public fun contentOrNull(): String? = null
+ }
- @JvmInline
- public value class StrongEmphasis(override val nativeNode: CMStrongEmphasis) : InlineMarkdown
+ @GenerateDataFunctions
+ public class Emphasis(
+ public val delimiter: String,
+ override val inlineContent: List,
+ ) : InlineMarkdown, WithInlineMarkdown {
+ public constructor(
+ delimiter: String,
+ vararg inlineContent: InlineMarkdown,
+ ) : this(delimiter, inlineContent.toList())
+ }
- @JvmInline
- public value class Text(override val nativeNode: CMText) : InlineMarkdown
+ public data object HardLineBreak : InlineMarkdown
+
+ @GenerateDataFunctions
+ public class HtmlInline(override val content: String) : InlineMarkdown, WithTextContent
+
+ @GenerateDataFunctions
+ public class Image(
+ public val source: String,
+ public val alt: String,
+ public val title: String?,
+ override val inlineContent: List,
+ ) : InlineMarkdown, WithInlineMarkdown {
+ public constructor(
+ source: String,
+ alt: String,
+ title: String?,
+ vararg inlineContent: InlineMarkdown,
+ ) : this(source, alt, title, inlineContent.toList())
+ }
- public val children: Iterable
- get() =
- object : Iterable {
- override fun iterator(): Iterator =
- object : Iterator {
- var current = this@InlineMarkdown.nativeNode.firstChild
+ @GenerateDataFunctions
+ public class Link(
+ public val destination: String,
+ public val title: String?,
+ override val inlineContent: List,
+ ) : InlineMarkdown, WithInlineMarkdown {
+ public constructor(
+ destination: String,
+ title: String?,
+ vararg inlineContent: InlineMarkdown,
+ ) : this(destination, title, inlineContent.toList())
+ }
- override fun hasNext(): Boolean = current != null
+ public data object SoftLineBreak : InlineMarkdown
+
+ @GenerateDataFunctions
+ public class StrongEmphasis(
+ public val delimiter: String,
+ override val inlineContent: List,
+ ) : InlineMarkdown, WithInlineMarkdown {
+ public constructor(
+ delimiter: String,
+ vararg inlineContent: InlineMarkdown,
+ ) : this(delimiter, inlineContent.toList())
+ }
- override fun next(): InlineMarkdown =
- if (hasNext()) {
- current.toInlineNode().also {
- current = current.next
- }
- } else {
- throw NoSuchElementException()
- }
- }
- }
+ @GenerateDataFunctions
+ public class Text(override val content: String) : InlineMarkdown, WithTextContent
}
-
-public fun Node.toInlineNode(): InlineMarkdown =
- when (this) {
- is CMText -> Text(this)
- is CMLink -> Link(this)
- is CMEmphasis -> Emphasis(this)
- is CMStrongEmphasis -> StrongEmphasis(this)
- is CMCode -> Code(this)
- is CMHtmlInline -> HtmlInline(this)
- is CMImage -> Image(this)
- is CMHardLineBreak -> HardLineBreak(this)
- is CMSoftLineBreak -> SoftLineBreak(this)
- is CMCustomNode -> CustomNode(this)
- else -> error("Unexpected block $this")
- }
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/Markdown.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/Markdown.kt
index 1fe15f369..d7288c40f 100644
--- a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/Markdown.kt
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/Markdown.kt
@@ -87,7 +87,7 @@ public fun Markdown(
}
} else {
Column(
- modifier.semantics { rawMarkdown = markdown },
+ modifier = modifier.semantics { rawMarkdown = markdown },
verticalArrangement = Arrangement.spacedBy(markdownStyling.blockVerticalSpacing),
) {
for (block in markdownBlocks) {
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/MarkdownBlock.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/MarkdownBlock.kt
index 08abe8d05..99b7c2c5a 100644
--- a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/MarkdownBlock.kt
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/MarkdownBlock.kt
@@ -1,90 +1,83 @@
package org.jetbrains.jewel.markdown
-import org.commonmark.node.Block
-import org.commonmark.node.Heading as CMHeading
-import org.commonmark.node.Paragraph as CMParagraph
+import org.jetbrains.jewel.foundation.GenerateDataFunctions
public sealed interface MarkdownBlock {
- public data class BlockQuote(val children: List) : MarkdownBlock
+ @GenerateDataFunctions
+ public class BlockQuote(public val children: List) : MarkdownBlock {
+ public constructor(vararg children: MarkdownBlock) : this(children.toList())
+ }
public sealed interface CodeBlock : MarkdownBlock {
public val content: String
- public data class IndentedCodeBlock(
- override val content: String,
- ) : CodeBlock
+ @GenerateDataFunctions
+ public class IndentedCodeBlock(override val content: String) : CodeBlock
- public data class FencedCodeBlock(
+ @GenerateDataFunctions
+ public class FencedCodeBlock(
override val content: String,
- val mimeType: MimeType?,
+ public val mimeType: MimeType?,
) : CodeBlock
}
public interface CustomBlock : MarkdownBlock
- @JvmInline
- public value class Heading(
- private val nativeBlock: CMHeading,
- ) : MarkdownBlock, BlockWithInlineMarkdown {
- override val inlineContent: Iterable
- get() = nativeBlock.inlineContent()
-
- public val level: Int
- get() = nativeBlock.level
+ @GenerateDataFunctions
+ public class Heading(
+ override val inlineContent: List,
+ public val level: Int,
+ ) : MarkdownBlock, WithInlineMarkdown {
+ public constructor(level: Int, vararg inlineContent: InlineMarkdown) : this(inlineContent.toList(), level)
}
- public data class HtmlBlock(val content: String) : MarkdownBlock
+ @GenerateDataFunctions
+ public class HtmlBlock(public val content: String) : MarkdownBlock
public sealed interface ListBlock : MarkdownBlock {
public val children: List
public val isTight: Boolean
- public data class OrderedList(
+ @GenerateDataFunctions
+ public class OrderedList(
override val children: List,
override val isTight: Boolean,
- val startFrom: Int,
- val delimiter: String,
- ) : ListBlock
-
- public data class UnorderedList(
+ public val startFrom: Int,
+ public val delimiter: String,
+ ) : ListBlock {
+ public constructor(
+ isTight: Boolean,
+ startFrom: Int,
+ delimiter: String,
+ vararg children: ListItem,
+ ) : this(children.toList(), isTight, startFrom, delimiter)
+ }
+
+ @GenerateDataFunctions
+ public class UnorderedList(
override val children: List,
override val isTight: Boolean,
- val marker: String,
- ) : ListBlock
+ public val marker: String,
+ ) : ListBlock {
+ public constructor(
+ isTight: Boolean,
+ marker: String,
+ vararg children: ListItem,
+ ) : this(children.toList(), isTight, marker)
+ }
}
- public data class ListItem(
- val children: List,
- ) : MarkdownBlock
-
- public object ThematicBreak : MarkdownBlock
-
- @JvmInline
- public value class Paragraph(private val nativeBlock: CMParagraph) : MarkdownBlock, BlockWithInlineMarkdown {
- override val inlineContent: Iterable
- get() = nativeBlock.inlineContent()
+ @GenerateDataFunctions
+ public class ListItem(public val children: List) : MarkdownBlock {
+ public constructor(vararg children: MarkdownBlock) : this(children.toList())
}
-}
-
-public interface BlockWithInlineMarkdown {
- public val inlineContent: Iterable
-}
-
-private fun Block.inlineContent(): Iterable =
- object : Iterable {
- override fun iterator(): Iterator =
- object : Iterator {
- var current = this@inlineContent.firstChild
- override fun hasNext(): Boolean = current != null
+ public data object ThematicBreak : MarkdownBlock
- override fun next(): InlineMarkdown =
- if (hasNext()) {
- current.toInlineNode().also {
- current = current.next
- }
- } else {
- throw NoSuchElementException()
- }
- }
+ @GenerateDataFunctions
+ public class Paragraph(
+ override val inlineContent: List,
+ ) : MarkdownBlock, WithInlineMarkdown {
+ public constructor(vararg inlineContent: InlineMarkdown) : this(inlineContent.toList())
}
+}
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/WithInlineMarkdown.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/WithInlineMarkdown.kt
new file mode 100644
index 000000000..6259e4b58
--- /dev/null
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/WithInlineMarkdown.kt
@@ -0,0 +1,5 @@
+package org.jetbrains.jewel.markdown
+
+public interface WithInlineMarkdown {
+ public val inlineContent: List
+}
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/WithTextContent.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/WithTextContent.kt
new file mode 100644
index 000000000..d06a8c6ae
--- /dev/null
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/WithTextContent.kt
@@ -0,0 +1,5 @@
+package org.jetbrains.jewel.markdown
+
+public interface WithTextContent {
+ public val content: String
+}
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownInlineProcessorExtension.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownInlineProcessorExtension.kt
new file mode 100644
index 000000000..d9600fef0
--- /dev/null
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownInlineProcessorExtension.kt
@@ -0,0 +1,25 @@
+package org.jetbrains.jewel.markdown.extensions
+
+import org.commonmark.node.CustomNode
+import org.jetbrains.jewel.markdown.InlineMarkdown
+import org.jetbrains.jewel.markdown.processing.MarkdownProcessor
+
+public interface MarkdownInlineProcessorExtension {
+ /**
+ * Returns true if the [node] can be processed by this extension instance.
+ *
+ * @param node The [CustomNode] to parse
+ */
+ public fun canProcess(node: CustomNode): Boolean
+
+ /**
+ * Processes the [node] as a [InlineMarkdown.CustomNode], if possible. Note
+ * that you should always check that [canProcess] returns true for the same
+ * [node], as implementations might throw an exception for unsupported node
+ * types.
+ */
+ public fun processInlineMarkdown(
+ node: CustomNode,
+ processor: MarkdownProcessor,
+ ): InlineMarkdown.CustomNode?
+}
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownInlineRendererExtension.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownInlineRendererExtension.kt
new file mode 100644
index 000000000..1b7e7de90
--- /dev/null
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownInlineRendererExtension.kt
@@ -0,0 +1,24 @@
+package org.jetbrains.jewel.markdown.extensions
+
+import org.jetbrains.jewel.markdown.InlineMarkdown
+import org.jetbrains.jewel.markdown.InlineMarkdown.CustomNode
+import org.jetbrains.jewel.markdown.rendering.InlineMarkdownRenderer
+
+/**
+ * An extension for [InlineMarkdownRenderer] that can render one or more
+ * [InlineMarkdown.CustomNode]s.
+ */
+public interface MarkdownInlineRendererExtension {
+ /** Check whether the provided [inline] can be rendered by this extension. */
+ public fun canRender(inline: CustomNode): Boolean
+
+ /**
+ * Render a [CustomNode] as an annotated string. Note that if
+ * [canRender] returns `false` for [inline], the implementation might throw.
+ */
+ public fun render(
+ inline: CustomNode,
+ inlineRenderer: InlineMarkdownRenderer,
+ enabled: Boolean,
+ )
+}
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension.kt
index 039f5c895..81f70e8ad 100644
--- a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension.kt
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownProcessorExtension.kt
@@ -1,36 +1,58 @@
package org.jetbrains.jewel.markdown.extensions
-import org.commonmark.node.CustomBlock
import org.commonmark.parser.Parser.ParserExtension
import org.commonmark.renderer.text.TextContentRenderer.TextContentRendererExtension
import org.jetbrains.jewel.foundation.ExperimentalJewelApi
-import org.jetbrains.jewel.markdown.MarkdownBlock
/** An extension for the Jewel Markdown processing engine. */
@ExperimentalJewelApi
public interface MarkdownProcessorExtension {
/**
* A CommonMark [ParserExtension] that will be used to parse the extended
- * syntax represented by this extension instance. Null in the case where
- * parsing is already handled by an existing [org.commonmark.parser.Parser].
+ * syntax represented by this extension instance.
+ *
+ * Can be null if all required processing is already handled by an existing
+ * [org.commonmark.parser.Parser].
*/
public val parserExtension: ParserExtension?
+ get() = null
/**
* A CommonMark [TextContentRendererExtension] that will be used to render
- * the text content of the CommonMark [CustomBlock] produced by the
- * [parserExtension]. Null in the case where rendering is already
- * handled by an existing [org.commonmark.renderer.Renderer].
+ * the text content of the CommonMark [org.commonmark.node.CustomBlock]
+ * produced by the [parserExtension].
+ *
+ * Can be null if all required processing is already handled by an existing
+ * [org.commonmark.renderer.Renderer].
*/
public val textRendererExtension: TextContentRendererExtension?
+ get() = null
/**
* An extension for
- * [`MarkdownParser`][org.jetbrains.jewel.markdown.parsing.MarkdownParser]
- * that will transform a supported [CustomBlock] into the corresponding
- * [MarkdownBlock.CustomBlock]. Null in the case where processing
- * is already be handled by [org.jetbrains.jewel.markdown.processing.MarkdownProcessor]
- * or another [org.jetbrains.jewel.markdown.extensions.MarkdownProcessorExtension].
+ * [`MarkdownProcessor`][org.jetbrains.jewel.markdown.processing.MarkdownProcessor]
+ * that will transform a supported [org.commonmark.node.CustomBlock] into
+ * the corresponding
+ * [org.jetbrains.jewel.markdown.MarkdownBlock.CustomBlock].
+ *
+ * Can be null if all required processing is already handled by
+ * [org.jetbrains.jewel.markdown.processing.MarkdownProcessor] or another
+ * [org.jetbrains.jewel.markdown.extensions.MarkdownProcessorExtension].
*/
- public val processorExtension: MarkdownBlockProcessorExtension?
+ public val blockProcessorExtension: MarkdownBlockProcessorExtension?
+ get() = null
+
+ /**
+ * An extension for
+ * [`MarkdownProcessor`][org.jetbrains.jewel.markdown.processing.MarkdownProcessor]
+ * that will transform a supported [org.commonmark.node.CustomNode] into
+ * the corresponding
+ * [org.jetbrains.jewel.markdown.InlineMarkdown.CustomNode].
+ *
+ * Can be null if all required processing is already handled by
+ * [org.jetbrains.jewel.markdown.processing.MarkdownProcessor] or another
+ * [org.jetbrains.jewel.markdown.extensions.MarkdownProcessorExtension].
+ */
+ public val inlineProcessorExtension: MarkdownInlineProcessorExtension?
+ get() = null
}
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownRendererExtension.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownRendererExtension.kt
index f23471053..4da685756 100644
--- a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownRendererExtension.kt
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/extensions/MarkdownRendererExtension.kt
@@ -11,6 +11,21 @@ public interface MarkdownRendererExtension {
* that will render a supported
* [`CustomBlock`][org.jetbrains.jewel.markdown.MarkdownBlock.CustomBlock] into
* a native Jewel UI.
+ *
+ * Can be null if this extension doesn't support rendering blocks.
*/
- public val blockRenderer: MarkdownBlockRendererExtension
+ public val blockRenderer: MarkdownBlockRendererExtension?
+ get() = null
+
+ /**
+ * An extension for
+ * [`InlineMarkdownRenderer`][org.jetbrains.jewel.markdown.rendering.InlineMarkdownRenderer]
+ * that will render a supported
+ * [`CustomNode`][org.jetbrains.jewel.markdown.InlineMarkdown.CustomNode] into
+ * an annotated string.
+ *
+ * Can be null if this extension doesn't support rendering inline nodes.
+ */
+ public val inlineRenderer: MarkdownInlineRendererExtension?
+ get() = null
}
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/processing/MarkdownProcessor.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/processing/MarkdownProcessor.kt
index ff051e37c..289aecfba 100644
--- a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/processing/MarkdownProcessor.kt
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/processing/MarkdownProcessor.kt
@@ -19,6 +19,7 @@ import org.intellij.lang.annotations.Language
import org.jetbrains.annotations.TestOnly
import org.jetbrains.annotations.VisibleForTesting
import org.jetbrains.jewel.foundation.ExperimentalJewelApi
+import org.jetbrains.jewel.foundation.InternalJewelApi
import org.jetbrains.jewel.markdown.InlineMarkdown
import org.jetbrains.jewel.markdown.MarkdownBlock
import org.jetbrains.jewel.markdown.MarkdownBlock.CodeBlock
@@ -29,23 +30,33 @@ import org.jetbrains.jewel.markdown.rendering.DefaultInlineMarkdownRenderer
import org.commonmark.node.ListBlock as CMListBlock
/**
- * @param optimizeEdits Optional. Indicates whether the processing should
- * only update the changed blocks by keeping a previous state in memory.
- * Default is `true`, use `false` for immutable data.
+ * Reads raw Markdown strings and processes them into a list of
+ * [MarkdownBlock].
+ *
+ * @param extensions Extensions to use when processing the Markdown (e.g.,
+ * to support parsing custom block-level Markdown).
+ * @param optimizeEdits Indicates whether the processing should only update
+ * the changed blocks by keeping a previous state in memory. Default is
+ * `false`; set this to `true` if this parser will be used in an editor
+ * scenario, where the raw Markdown is only ever going to change
+ * slightly but frequently (e.g., as the user types). Setting this to
+ * `true` has a memory cost, and can be a performance regression if the
+ * parse input is not always small variations of the same basic text.
+ * When this is `true`, the instance of [MarkdownProcessor] is **not**
+ * thread-safe!
+ * @param commonMarkParser The CommonMark [Parser] used to parse the
+ * Markdown. By default it's a vanilla instance provided by the
+ * [MarkdownParserFactory], but you can provide your own if you need to
+ * customize the parser — e.g., to ignore certain tags. If
+ * [optimizeEdits] is `true`, make sure you set
+ * `includeSourceSpans(IncludeSourceSpans.BLOCKS)` on the parser.
*/
@ExperimentalJewelApi
public class MarkdownProcessor(
private val extensions: List = emptyList(),
- private val optimizeEdits: Boolean = true,
+ private val optimizeEdits: Boolean = false,
private val commonMarkParser: Parser = MarkdownParserFactory.create(optimizeEdits, extensions),
) {
- public constructor(
- optimizeEdits: Boolean = true,
- vararg extensions: MarkdownProcessorExtension,
- ) : this(extensions.toList(), optimizeEdits)
-
- private data class State(val lines: List, val blocks: List, val indexes: List>)
-
private var currentState = State(emptyList(), emptyList(), emptyList())
@TestOnly
@@ -58,37 +69,20 @@ public class MarkdownProcessor(
* to an [androidx.compose.ui.text.AnnotatedString] by using
* [DefaultInlineMarkdownRenderer.renderAsAnnotatedString].
*
- * The contents of [InlineMarkdown] is equivalent to the original, but
- * normalized and simplified, and cleaned up as follows:
- * * Replace HTML entities with the corresponding character (escaped, if it
- * is necessary)
- * * Inline link and image references and omit the reference blocks
- * * Use the destination as text for links when no text is set (escaped, if
- * it is necessary)
- * * Normalize link titles to always use double quotes as enclosing
- * character
- * * Normalize backticks in inline code runs
- * * Convert links in image descriptions to plain text
- * * Drop empty nodes with no visual representation (e.g., links with no
- * text and destination)
- * * Remove unnecessary escapes
- * * Escape non-formatting instances of ``*_`~<>[]()!`` for clarity
- *
- * The contents of code blocks aren't transformed in any way. HTML blocks
- * get their outer whitespace trimmed, and so does inline HTML.
- *
+ * @param rawMarkdown the raw Markdown string to process.
* @see DefaultInlineMarkdownRenderer
*/
public fun processMarkdownDocument(
@Language("Markdown") rawMarkdown: String,
): List {
- return if (!optimizeEdits) {
- textToBlocks(rawMarkdown)
- } else {
- processWithQuickEdits(rawMarkdown)
- }.mapNotNull { child ->
- child.tryProcessMarkdownBlock()
- }
+ val blocks =
+ if (optimizeEdits) {
+ processWithQuickEdits(rawMarkdown)
+ } else {
+ parseRawMarkdown(rawMarkdown)
+ }
+
+ return blocks.mapNotNull { child -> child.tryProcessMarkdownBlock() }
}
@VisibleForTesting
@@ -98,7 +92,8 @@ public class MarkdownProcessor(
val (previousLines, previousBlocks, previousIndexes) = currentState
val newLines = rawMarkdown.lines()
val nLinesDelta = newLines.size - previousLines.size
- // find a block prior to the first one changed in case some elements merge during the update
+
+ // Find a block prior to the first one changed in case some elements merge during the update
var firstBlock = 0
var firstLine = 0
var currFirstBlock = 0
@@ -115,7 +110,8 @@ public class MarkdownProcessor(
currFirstBlock = i + 1
currFirstLine = end + 1
}
- // find a block following the last one changed in case some elements merge during the update
+
+ // Find a block following the last one changed in case some elements merge during the update
var lastBlock = previousBlocks.size
var lastLine = previousLines.size
var currLastBlock = lastBlock
@@ -133,12 +129,14 @@ public class MarkdownProcessor(
currLastBlock = i
currLastLine = begin
}
+
if (firstLine > lastLine + nLinesDelta) {
// no change
return previousBlocks
}
+
val updatedText = newLines.subList(firstLine, lastLine + nLinesDelta).joinToString("\n", postfix = "\n")
- val updatedBlocks: List = textToBlocks(updatedText)
+ val updatedBlocks: List = parseRawMarkdown(updatedText)
val updatedIndexes =
updatedBlocks.map { node ->
// special case for a bug where LinkReferenceDefinition is a Node,
@@ -146,40 +144,45 @@ public class MarkdownProcessor(
if (node.sourceSpans.isEmpty()) {
node.sourceSpans = node.previous.sourceSpans
}
- (node.sourceSpans.first().lineIndex + firstLine) to
- (node.sourceSpans.last().lineIndex + firstLine)
+
+ val firstLineIndex = node.sourceSpans.first().lineIndex + firstLine
+ val lastLineIndex = node.sourceSpans.last().lineIndex + firstLine
+
+ firstLineIndex to lastLineIndex
}
+
val suffixIndexes =
previousIndexes.subList(lastBlock, previousBlocks.size).map {
(it.first + nLinesDelta) to (it.second + nLinesDelta)
}
- val newBlocks = (
+
+ val newBlocks =
previousBlocks.subList(0, firstBlock) +
updatedBlocks +
previousBlocks.subList(lastBlock, previousBlocks.size)
- )
+
val newIndexes = previousIndexes.subList(0, firstBlock) + updatedIndexes + suffixIndexes
currentState = State(newLines, newBlocks, newIndexes)
+
return newBlocks
}
- private fun textToBlocks(strings: String): List {
+ private fun parseRawMarkdown(
+ @Language("Markdown") rawMarkdown: String,
+ ): List {
val document =
- commonMarkParser.parse(strings) as? Document
+ commonMarkParser.parse(rawMarkdown) as? Document
?: error("This doesn't look like a Markdown document")
- val updatedBlocks: List =
- buildList {
- document.forEachChild { child ->
- (child as? Block)?.let { add(it) }
- }
- }
- return updatedBlocks
+
+ return buildList {
+ document.forEachChild { child -> if (child is Block) add(child) }
+ }
}
private fun Node.tryProcessMarkdownBlock(): MarkdownBlock? =
// Non-Block children are ignored
when (this) {
- is Paragraph -> MarkdownBlock.Paragraph(this)
+ is Paragraph -> toMarkdownParagraph()
is Heading -> toMarkdownHeadingOrNull()
is BulletList -> toMarkdownListOrNull()
is OrderedList -> toMarkdownListOrNull()
@@ -189,24 +192,29 @@ public class MarkdownProcessor(
is ThematicBreak -> MarkdownBlock.ThematicBreak
is HtmlBlock -> toMarkdownHtmlBlockOrNull()
is CustomBlock -> {
- extensions.find { it.processorExtension?.canProcess(this) == true }
- ?.processorExtension?.processMarkdownBlock(this, this@MarkdownProcessor)
+ extensions.find { it.blockProcessorExtension?.canProcess(this) == true }
+ ?.blockProcessorExtension?.processMarkdownBlock(this, this@MarkdownProcessor)
}
else -> null
}
+ private fun Paragraph.toMarkdownParagraph(): MarkdownBlock.Paragraph = MarkdownBlock.Paragraph(readInlineContent().toList())
+
private fun BlockQuote.toMarkdownBlockQuote(): MarkdownBlock.BlockQuote = MarkdownBlock.BlockQuote(processChildren(this))
private fun Heading.toMarkdownHeadingOrNull(): MarkdownBlock.Heading? {
if (level < 1 || level > 6) return null
- return MarkdownBlock.Heading(this)
+ return MarkdownBlock.Heading(
+ inlineContent = readInlineContent().toList(),
+ level = level,
+ )
}
private fun FencedCodeBlock.toMarkdownCodeBlockOrNull(): CodeBlock.FencedCodeBlock =
CodeBlock.FencedCodeBlock(
- literal.trimEnd('\n'),
- MimeType.Known.fromMarkdownLanguageName(info),
+ content = literal.trimEnd('\n'),
+ mimeType = MimeType.Known.fromMarkdownLanguageName(info),
)
private fun IndentedCodeBlock.toMarkdownCodeBlockOrNull(): CodeBlock.IndentedCodeBlock = CodeBlock.IndentedCodeBlock(literal.trimEnd('\n'))
@@ -215,14 +223,23 @@ public class MarkdownProcessor(
val children = processListItems()
if (children.isEmpty()) return null
- return ListBlock.UnorderedList(children, isTight, marker)
+ return ListBlock.UnorderedList(
+ children = children,
+ isTight = isTight,
+ marker = marker,
+ )
}
private fun OrderedList.toMarkdownListOrNull(): ListBlock.OrderedList? {
val children = processListItems()
if (children.isEmpty()) return null
- return ListBlock.OrderedList(children, isTight, markerStartNumber, markerDelimiter)
+ return ListBlock.OrderedList(
+ children = children,
+ isTight = isTight,
+ startFrom = markerStartNumber,
+ delimiter = markerDelimiter,
+ )
}
private fun CMListBlock.processListItems() =
@@ -233,12 +250,18 @@ public class MarkdownProcessor(
}
}
+ /**
+ * Processes the children of a CommonMark [Node]. This function is public
+ * so that it can be accessed from [MarkdownProcessorExtension]s, but
+ * should not be used in other scenarios.
+ */
+ @InternalJewelApi
public fun processChildren(node: Node): List =
buildList {
node.forEachChild { child ->
val parsedBlock = child.tryProcessMarkdownBlock()
if (parsedBlock != null) {
- this.add(parsedBlock)
+ add(parsedBlock)
}
}
}
@@ -254,6 +277,10 @@ public class MarkdownProcessor(
private fun HtmlBlock.toMarkdownHtmlBlockOrNull(): MarkdownBlock.HtmlBlock? {
if (literal.isBlank()) return null
- return MarkdownBlock.HtmlBlock(content = literal.trimEnd('\n'))
+ return MarkdownBlock.HtmlBlock(literal.trimEnd('\n'))
}
+
+ private fun Block.readInlineContent() = readInlineContent(this@MarkdownProcessor, extensions)
+
+ private data class State(val lines: List, val blocks: List, val indexes: List>)
}
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/processing/ProcessingUtil.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/processing/ProcessingUtil.kt
new file mode 100644
index 000000000..bb5c95b31
--- /dev/null
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/processing/ProcessingUtil.kt
@@ -0,0 +1,122 @@
+package org.jetbrains.jewel.markdown.processing
+
+import org.commonmark.node.Node
+import org.jetbrains.annotations.VisibleForTesting
+import org.jetbrains.jewel.markdown.InlineMarkdown
+import org.jetbrains.jewel.markdown.WithInlineMarkdown
+import org.jetbrains.jewel.markdown.WithTextContent
+import org.jetbrains.jewel.markdown.extensions.MarkdownProcessorExtension
+import org.commonmark.node.Code as CMCode
+import org.commonmark.node.CustomNode as CMCustomNode
+import org.commonmark.node.Emphasis as CMEmphasis
+import org.commonmark.node.HardLineBreak as CMHardLineBreak
+import org.commonmark.node.HtmlInline as CMHtmlInline
+import org.commonmark.node.Image as CMImage
+import org.commonmark.node.Link as CMLink
+import org.commonmark.node.SoftLineBreak as CMSoftLineBreak
+import org.commonmark.node.StrongEmphasis as CMStrongEmphasis
+import org.commonmark.node.Text as CMText
+
+@VisibleForTesting
+internal fun Node.readInlineContent(
+ markdownProcessor: MarkdownProcessor,
+ extensions: List,
+): List =
+ object : Iterable {
+ override fun iterator(): Iterator =
+ object : Iterator {
+ var current = this@readInlineContent.firstChild
+
+ override fun hasNext(): Boolean = current != null
+
+ override fun next(): InlineMarkdown {
+ while (hasNext()) {
+ val inline = current.toInlineMarkdownOrNull(markdownProcessor, extensions)
+
+ current = current.next
+
+ if (inline == null) {
+ continue
+ } else {
+ return inline
+ }
+ }
+
+ throw NoSuchElementException()
+ }
+ }
+ }.toList()
+
+@VisibleForTesting
+internal fun Node.toInlineMarkdownOrNull(
+ markdownProcessor: MarkdownProcessor,
+ extensions: List,
+) = when (this) {
+ is CMText -> InlineMarkdown.Text(literal)
+ is CMLink ->
+ InlineMarkdown.Link(
+ destination = destination,
+ title = title,
+ inlineContent = readInlineContent(markdownProcessor, extensions),
+ )
+
+ is CMEmphasis ->
+ InlineMarkdown.Emphasis(
+ delimiter = openingDelimiter,
+ inlineContent = readInlineContent(markdownProcessor, extensions),
+ )
+
+ is CMStrongEmphasis ->
+ InlineMarkdown.StrongEmphasis(
+ openingDelimiter,
+ readInlineContent(markdownProcessor, extensions),
+ )
+
+ is CMCode -> InlineMarkdown.Code(literal)
+ is CMHtmlInline -> InlineMarkdown.HtmlInline(literal)
+ is CMImage -> {
+ val inlineContent = readInlineContent(markdownProcessor, extensions)
+ InlineMarkdown.Image(
+ source = destination,
+ alt = inlineContent.renderAsSimpleText().trim(),
+ title = title,
+ inlineContent = inlineContent,
+ )
+ }
+
+ is CMHardLineBreak -> InlineMarkdown.HardLineBreak
+ is CMSoftLineBreak -> InlineMarkdown.SoftLineBreak
+ is CMCustomNode ->
+ extensions.find { it.inlineProcessorExtension?.canProcess(this) == true }
+ ?.inlineProcessorExtension?.processInlineMarkdown(this, markdownProcessor)
+
+ else -> error("Unexpected block $this")
+}
+
+/**
+ * Used to render content as simple plain text, used when creating image
+ * alt text.
+ */
+internal fun List.renderAsSimpleText(): String =
+ buildString {
+ for (node in this@renderAsSimpleText) {
+ when (node) {
+ is WithInlineMarkdown -> append(node.inlineContent.renderAsSimpleText())
+ is WithTextContent -> append(node.content)
+
+ is InlineMarkdown.CustomNode -> {
+ val textContent = node.contentOrNull()
+ if (textContent != null) {
+ append(' ')
+ append(textContent)
+ }
+ }
+
+ is InlineMarkdown.HardLineBreak -> append('\n')
+ is InlineMarkdown.SoftLineBreak -> append(' ')
+ else -> {
+ // Ignore other nodes
+ }
+ }
+ }
+ }
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/DefaultInlineMarkdownRenderer.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/DefaultInlineMarkdownRenderer.kt
index 26dfc56e5..3aa840207 100644
--- a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/DefaultInlineMarkdownRenderer.kt
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/DefaultInlineMarkdownRenderer.kt
@@ -7,23 +7,14 @@ import androidx.compose.ui.text.AnnotatedString.Builder
import androidx.compose.ui.text.LinkAnnotation
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
-import org.commonmark.renderer.text.TextContentRenderer
import org.jetbrains.jewel.foundation.ExperimentalJewelApi
import org.jetbrains.jewel.markdown.InlineMarkdown
-import org.jetbrains.jewel.markdown.extensions.MarkdownProcessorExtension
+import org.jetbrains.jewel.markdown.extensions.MarkdownRendererExtension
@ExperimentalJewelApi
public open class DefaultInlineMarkdownRenderer(
- rendererExtensions: List,
+ private val rendererExtensions: List,
) : InlineMarkdownRenderer {
- public constructor(vararg extensions: MarkdownProcessorExtension) : this(extensions.toList())
-
- private val plainTextRenderer =
- TextContentRenderer
- .builder()
- .extensions(rendererExtensions.map { it.textRendererExtension })
- .build()
-
public override fun renderAsAnnotatedString(
inlineMarkdown: Iterable,
styling: InlinesStyling,
@@ -42,12 +33,12 @@ public open class DefaultInlineMarkdownRenderer(
) {
for (child in inlineMarkdown) {
when (child) {
- is InlineMarkdown.Text -> append(child.nativeNode.literal)
+ is InlineMarkdown.Text -> append(child.content)
is InlineMarkdown.Emphasis -> {
withStyles(styling.emphasis.withEnabled(enabled), child) {
appendInlineMarkdownFrom(
- it.children,
+ it.inlineContent,
styling,
enabled,
)
@@ -55,29 +46,33 @@ public open class DefaultInlineMarkdownRenderer(
}
is InlineMarkdown.StrongEmphasis -> {
- withStyles(
- styling.strongEmphasis.withEnabled(enabled),
- child,
- ) { appendInlineMarkdownFrom(it.children, styling, enabled) }
+ withStyles(styling.strongEmphasis.withEnabled(enabled), child) {
+ appendInlineMarkdownFrom(it.inlineContent, styling, enabled)
+ }
}
is InlineMarkdown.Link -> {
- withStyles(styling.link.withEnabled(enabled), child) {
+ val index =
if (enabled) {
- val destination = it.nativeNode.destination
+ val destination = child.destination
val link =
LinkAnnotation.Clickable(
tag = destination,
linkInteractionListener = { _ -> onUrlClicked?.invoke(destination) },
+ styles = styling.textLinkStyles,
)
pushLink(link)
+ } else {
+ pushStyle(styling.linkDisabled)
}
- appendInlineMarkdownFrom(it.children, styling, enabled)
- }
+ appendInlineMarkdownFrom(child.inlineContent, styling, enabled)
+ pop(index)
}
is InlineMarkdown.Code -> {
- withStyles(styling.inlineCode.withEnabled(enabled), child) { append(it.nativeNode.literal) }
+ withStyles(styling.inlineCode.withEnabled(enabled), child) {
+ append(it.content)
+ }
}
is InlineMarkdown.HardLineBreak -> appendLine()
@@ -88,18 +83,29 @@ public open class DefaultInlineMarkdownRenderer(
withStyles(
styling.inlineHtml.withEnabled(enabled),
child,
- ) { append(it.nativeNode.literal.trim()) }
+ ) { append(it.content.trim()) }
}
}
is InlineMarkdown.Image -> {
appendInlineContent(
INLINE_IMAGE,
- child.nativeNode.destination + "\n" + plainTextRenderer.render(child.nativeNode),
+ buildString {
+ appendLine(child.source)
+ append(child.alt)
+ if (!child.title.isNullOrBlank()) {
+ appendLine()
+ append(child.title)
+ }
+ },
)
}
- is InlineMarkdown.CustomNode -> error("InlineMarkdown.CustomNode render is not implemented")
+ is InlineMarkdown.CustomNode ->
+ rendererExtensions
+ .find { it.inlineRenderer?.canRender(child) == true }
+ ?.inlineRenderer
+ ?.render(child, inlineRenderer = this@DefaultInlineMarkdownRenderer, enabled)
}
}
}
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/DefaultMarkdownBlockRenderer.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/DefaultMarkdownBlockRenderer.kt
index 4f0ea7757..530d0952a 100644
--- a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/DefaultMarkdownBlockRenderer.kt
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/DefaultMarkdownBlockRenderer.kt
@@ -34,6 +34,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.drawBehind
+import androidx.compose.ui.focus.focusProperties
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.isSpecified
@@ -50,7 +51,6 @@ import androidx.compose.ui.unit.dp
import org.jetbrains.jewel.foundation.ExperimentalJewelApi
import org.jetbrains.jewel.foundation.modifier.onHover
import org.jetbrains.jewel.foundation.theme.LocalContentColor
-import org.jetbrains.jewel.markdown.BlockWithInlineMarkdown
import org.jetbrains.jewel.markdown.MarkdownBlock
import org.jetbrains.jewel.markdown.MarkdownBlock.BlockQuote
import org.jetbrains.jewel.markdown.MarkdownBlock.CodeBlock
@@ -65,6 +65,7 @@ import org.jetbrains.jewel.markdown.MarkdownBlock.ListBlock.UnorderedList
import org.jetbrains.jewel.markdown.MarkdownBlock.ListItem
import org.jetbrains.jewel.markdown.MarkdownBlock.Paragraph
import org.jetbrains.jewel.markdown.MarkdownBlock.ThematicBreak
+import org.jetbrains.jewel.markdown.WithInlineMarkdown
import org.jetbrains.jewel.markdown.extensions.MarkdownRendererExtension
import org.jetbrains.jewel.ui.Orientation.Horizontal
import org.jetbrains.jewel.ui.component.Divider
@@ -74,7 +75,7 @@ import org.jetbrains.jewel.ui.component.Text
public open class DefaultMarkdownBlockRenderer(
private val rootStyling: MarkdownStyling,
private val rendererExtensions: List = emptyList(),
- private val inlineRenderer: InlineMarkdownRenderer = DefaultInlineMarkdownRenderer(),
+ private val inlineRenderer: InlineMarkdownRenderer = DefaultInlineMarkdownRenderer(rendererExtensions),
) : MarkdownBlockRenderer {
@Composable
override fun render(
@@ -110,7 +111,7 @@ public open class DefaultMarkdownBlockRenderer(
ThematicBreak -> renderThematicBreak(rootStyling.thematicBreak)
is CustomBlock -> {
rendererExtensions
- .find { it.blockRenderer.canRender(block) }
+ .find { it.blockRenderer?.canRender(block) == true }
?.blockRenderer
?.render(block, blockRenderer = this, inlineRenderer, enabled, onUrlClick, onTextClick)
}
@@ -141,11 +142,13 @@ public open class DefaultMarkdownBlockRenderer(
Text(
modifier =
- Modifier.clickable(
- interactionSource = interactionSource,
- indication = null,
- onClick = onTextClick,
- ),
+ Modifier
+ .focusProperties { canFocus = false }
+ .clickable(
+ interactionSource = interactionSource,
+ indication = null,
+ onClick = onTextClick,
+ ),
text = renderedContent,
style = mergedStyle,
)
@@ -212,6 +215,7 @@ public open class DefaultMarkdownBlockRenderer(
Text(
text = renderedContent,
style = mergedStyle,
+ modifier = Modifier.focusProperties { canFocus = false },
)
if (underlineWidth > 0.dp && underlineColor.isSpecified) {
@@ -295,6 +299,7 @@ public open class DefaultMarkdownBlockRenderer(
color = styling.numberStyle.color.takeOrElse { LocalContentColor.current },
modifier =
Modifier
+ .focusProperties { canFocus = false }
.widthIn(min = styling.numberMinWidth)
.pointerHoverIcon(PointerIcon.Default, overrideDescendants = true),
textAlign = styling.numberTextAlign,
@@ -333,7 +338,9 @@ public open class DefaultMarkdownBlockRenderer(
text = styling.bullet.toString(),
style = styling.bulletStyle,
color = styling.bulletStyle.color.takeOrElse { LocalContentColor.current },
- modifier = Modifier.pointerHoverIcon(PointerIcon.Default, overrideDescendants = true),
+ modifier =
+ Modifier.focusProperties { canFocus = false }
+ .pointerHoverIcon(PointerIcon.Default, overrideDescendants = true),
)
Spacer(Modifier.width(styling.bulletContentGap))
@@ -384,7 +391,7 @@ public open class DefaultMarkdownBlockRenderer(
style = styling.editorTextStyle,
color = styling.editorTextStyle.color.takeOrElse { LocalContentColor.current },
modifier =
- Modifier
+ Modifier.focusProperties { canFocus = false }
.padding(styling.padding)
.pointerHoverIcon(PointerIcon.Default, overrideDescendants = true),
)
@@ -418,7 +425,9 @@ public open class DefaultMarkdownBlockRenderer(
text = block.content,
style = styling.editorTextStyle,
color = styling.editorTextStyle.color.takeOrElse { LocalContentColor.current },
- modifier = Modifier.pointerHoverIcon(PointerIcon.Default, overrideDescendants = true),
+ modifier =
+ Modifier.focusProperties { canFocus = false }
+ .pointerHoverIcon(PointerIcon.Default, overrideDescendants = true),
)
if (block.mimeType != null && styling.infoPosition.verticalAlignment == Alignment.Bottom) {
@@ -447,6 +456,7 @@ public open class DefaultMarkdownBlockRenderer(
text = infoText,
style = textStyle,
color = textStyle.color.takeOrElse { LocalContentColor.current },
+ modifier = Modifier.focusProperties { canFocus = false },
)
}
}
@@ -467,7 +477,7 @@ public open class DefaultMarkdownBlockRenderer(
@Composable
private fun rememberRenderedContent(
- block: BlockWithInlineMarkdown,
+ block: WithInlineMarkdown,
styling: InlinesStyling,
enabled: Boolean,
onUrlClick: ((String) -> Unit)? = null,
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer.kt
index 67b7c0ff5..73fea2efe 100644
--- a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer.kt
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/InlineMarkdownRenderer.kt
@@ -3,7 +3,6 @@ package org.jetbrains.jewel.markdown.rendering
import androidx.compose.ui.text.AnnotatedString
import org.jetbrains.jewel.foundation.ExperimentalJewelApi
import org.jetbrains.jewel.markdown.InlineMarkdown
-import org.jetbrains.jewel.markdown.extensions.MarkdownProcessorExtension
@ExperimentalJewelApi
public interface InlineMarkdownRenderer {
@@ -17,10 +16,4 @@ public interface InlineMarkdownRenderer {
enabled: Boolean,
onUrlClicked: ((String) -> Unit)? = null,
): AnnotatedString
-
- public companion object {
- /** Create a default inline renderer, with the [extensions] provided. */
- public fun default(extensions: List = emptyList()): InlineMarkdownRenderer =
- DefaultInlineMarkdownRenderer(extensions)
- }
}
diff --git a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/MarkdownStyling.kt b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/MarkdownStyling.kt
index 34cb39114..b04464f4b 100644
--- a/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/MarkdownStyling.kt
+++ b/markdown/core/src/main/kotlin/org/jetbrains/jewel/markdown/rendering/MarkdownStyling.kt
@@ -8,6 +8,7 @@ import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.SpanStyle
+import androidx.compose.ui.text.TextLinkStyles
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Dp
@@ -269,11 +270,24 @@ public class InlinesStyling(
public val textStyle: TextStyle,
public val inlineCode: SpanStyle,
public val link: SpanStyle,
+ public val linkDisabled: SpanStyle,
+ public val linkFocused: SpanStyle,
+ public val linkHovered: SpanStyle,
+ public val linkPressed: SpanStyle,
+ public val linkVisited: SpanStyle,
public val emphasis: SpanStyle,
public val strongEmphasis: SpanStyle,
public val inlineHtml: SpanStyle,
public val renderInlineHtml: Boolean,
) {
+ public val textLinkStyles: TextLinkStyles =
+ TextLinkStyles(
+ style = link,
+ focusedStyle = linkFocused,
+ hoveredStyle = linkHovered,
+ pressedStyle = linkPressed,
+ )
+
public companion object
}
diff --git a/markdown/core/src/test/kotlin/org/jetbrains/jewel/markdown/MarkdownProcessorDocumentParsingExtraTest.kt b/markdown/core/src/test/kotlin/org/jetbrains/jewel/markdown/MarkdownProcessorDocumentParsingExtraTest.kt
index d5b22672b..8e2a89336 100644
--- a/markdown/core/src/test/kotlin/org/jetbrains/jewel/markdown/MarkdownProcessorDocumentParsingExtraTest.kt
+++ b/markdown/core/src/test/kotlin/org/jetbrains/jewel/markdown/MarkdownProcessorDocumentParsingExtraTest.kt
@@ -1,5 +1,10 @@
package org.jetbrains.jewel.markdown
+import org.jetbrains.jewel.markdown.InlineMarkdown.Emphasis
+import org.jetbrains.jewel.markdown.InlineMarkdown.Link
+import org.jetbrains.jewel.markdown.InlineMarkdown.StrongEmphasis
+import org.jetbrains.jewel.markdown.InlineMarkdown.Text
+import org.jetbrains.jewel.markdown.MarkdownBlock.Paragraph
import org.jetbrains.jewel.markdown.processing.MarkdownProcessor
import org.junit.Test
@@ -14,7 +19,7 @@ class MarkdownProcessorDocumentParsingExtraTest {
* Expected HTML:
*
*/
- parsed.assertEquals(paragraph("*_*foo *bar* a*_*"))
+ parsed.assertEquals(
+ Paragraph(
+ Emphasis(
+ "*",
+ Emphasis(
+ "_",
+ Emphasis(
+ "*",
+ Text("foo "),
+ Emphasis("*", Text("bar")),
+ Text(" a"),
+ ),
+ ),
+ ),
+ ),
+ )
}
}
diff --git a/markdown/core/src/test/kotlin/org/jetbrains/jewel/markdown/MarkdownProcessorDocumentParsingTest.kt b/markdown/core/src/test/kotlin/org/jetbrains/jewel/markdown/MarkdownProcessorDocumentParsingTest.kt
index af9d12100..d40cd14ac 100644
--- a/markdown/core/src/test/kotlin/org/jetbrains/jewel/markdown/MarkdownProcessorDocumentParsingTest.kt
+++ b/markdown/core/src/test/kotlin/org/jetbrains/jewel/markdown/MarkdownProcessorDocumentParsingTest.kt
@@ -1,14 +1,24 @@
package org.jetbrains.jewel.markdown
+import org.jetbrains.jewel.markdown.InlineMarkdown.Code
+import org.jetbrains.jewel.markdown.InlineMarkdown.Emphasis
+import org.jetbrains.jewel.markdown.InlineMarkdown.HardLineBreak
+import org.jetbrains.jewel.markdown.InlineMarkdown.HtmlInline
+import org.jetbrains.jewel.markdown.InlineMarkdown.Image
+import org.jetbrains.jewel.markdown.InlineMarkdown.Link
+import org.jetbrains.jewel.markdown.InlineMarkdown.SoftLineBreak
+import org.jetbrains.jewel.markdown.InlineMarkdown.StrongEmphasis
+import org.jetbrains.jewel.markdown.InlineMarkdown.Text
+import org.jetbrains.jewel.markdown.MarkdownBlock.Heading
+import org.jetbrains.jewel.markdown.MarkdownBlock.Paragraph
import org.jetbrains.jewel.markdown.processing.MarkdownProcessor
-import org.junit.Ignore
import org.junit.Test
/**
- * This class tests that all the snippets in the CommonMark 0.31.2 specs are
- * rendered correctly into MarkdownBlocks, matching what the CommonMark
- * 0.20 HTML renderer tests also validate.
- *
+ * This class tests that all the snippets in the CommonMark 0.31.2 specs
+ * are rendered correctly into MarkdownBlocks, matching what the CommonMark
+ * 0.20 HTML renderer tests also validate. Test cases are extracted from
+ * [here]( https://spec.commonmark.org/0.31.2/spec.json).
*
* Note that the reference HTML output is only there as information; our
* parsing logic performs various transformations that CommonMark wouldn't.
@@ -23,6 +33,7 @@ import org.junit.Test
"MarkdownUnresolvedFileReference",
"MarkdownUnresolvedLinkLabel",
"MarkdownUnresolvedHeaderReference",
+ "MarkdownIncorrectlyNumberedListItem",
"LargeClass", // Detekt hates huge test suites I guess
) // All used in purposefully odd Markdown
class MarkdownProcessorDocumentParsingTest {
@@ -198,7 +209,7 @@ class MarkdownProcessorDocumentParsingTest {
* Expected HTML:
*
*/
- parsed.assertEquals(paragraph("\\!\"#\$%&'\\(\\)\\*+,-./:;\\<=\\>?@\\[\\\\\\]^\\_\\`{|}\\~"))
+ parsed.assertEquals(paragraph("!\"#\$%&'()*+,-./:;<=>?@[\\]^_`{|}~"))
}
@Test
@@ -242,16 +253,16 @@ class MarkdownProcessorDocumentParsingTest {
val parsed =
processor.processMarkdownDocument(
"""
- |\*not emphasized*
- |\ not a tag
- |\[not a link](/foo)
- |\`not code`
- |1\. not a list
- |\* not a list
- |\# not a heading
- |\[foo]: /url "not a reference"
- |\ö not a character entity
- """
+ |\*not emphasized*
+ |\ not a tag
+ |\[not a link](/foo)
+ |\`not code`
+ |1\. not a list
+ |\* not a list
+ |\# not a heading
+ |\[foo]: /url "not a reference"
+ |\ö not a character entity
+ """
.trimMargin(),
)
@@ -268,16 +279,24 @@ class MarkdownProcessorDocumentParsingTest {
* ö not a character entity
*/
parsed.assertEquals(
- paragraph(
- "\\*not emphasized\\* " +
- "\\ not a tag " +
- "\\[not a link\\]\\(/foo\\) " +
- "\\`not code\\` " +
- "1. not a list " +
- "\\* not a list " +
- "# not a heading " +
- "\\[foo\\]: /url \"not a reference\" " +
- "\\ö not a character entity",
+ Paragraph(
+ Text("*not emphasized*"),
+ SoftLineBreak,
+ Text(" not a tag"),
+ SoftLineBreak,
+ Text("[not a link](/foo)"),
+ SoftLineBreak,
+ Text("`not code`"),
+ SoftLineBreak,
+ Text("1. not a list"),
+ SoftLineBreak,
+ Text("* not a list"),
+ SoftLineBreak,
+ Text("# not a heading"),
+ SoftLineBreak,
+ Text("[foo]: /url \"not a reference\""),
+ SoftLineBreak,
+ Text("ö not a character entity"),
),
)
}
@@ -290,7 +309,7 @@ class MarkdownProcessorDocumentParsingTest {
* Expected HTML:
*
*/
- parsed.assertEquals(paragraph("\\*\\* is not an empty emphasis"))
+ parsed.assertEquals(paragraph("** is not an empty emphasis"))
}
@Test
@@ -9143,7 +9550,7 @@ class MarkdownProcessorDocumentParsingTest {
* Expected HTML:
*
**** is not an empty strong emphasis
*/
- parsed.assertEquals(paragraph("\\*\\*\\*\\* is not an empty strong emphasis"))
+ parsed.assertEquals(paragraph("**** is not an empty strong emphasis"))
}
@Test
@@ -9154,7 +9561,15 @@ class MarkdownProcessorDocumentParsingTest {
* Expected HTML:
*
*/
- parsed.assertEquals(paragraph("\\_\\_ is not an empty emphasis"))
+ parsed.assertEquals(paragraph("__ is not an empty emphasis"))
}
@Test
@@ -9313,7 +9828,7 @@ class MarkdownProcessorDocumentParsingTest {
* Expected HTML:
*
____ is not an empty strong emphasis
*/
- parsed.assertEquals(paragraph("\\_\\_\\_\\_ is not an empty strong emphasis"))
+ parsed.assertEquals(paragraph("____ is not an empty strong emphasis"))
}
@Test
@@ -9324,7 +9839,7 @@ class MarkdownProcessorDocumentParsingTest {
* Expected HTML:
*