Add sample and documentation for inline-parser
This commit is contained in:
		
							parent
							
								
									93a14b4731
								
							
						
					
					
						commit
						f2f5026694
					
				| @ -2,6 +2,7 @@ | |||||||
| 
 | 
 | ||||||
| # 4.2.0-SNAPSHOT | # 4.2.0-SNAPSHOT | ||||||
| * `MarkwonEditor` to highlight markdown input whilst editing (new module: `markwon-editor`) | * `MarkwonEditor` to highlight markdown input whilst editing (new module: `markwon-editor`) | ||||||
|  | * `MarkwonInlineParser` to customize inline parsing (new module: `markwon-inline-parser`) | ||||||
| * `Markwon#configuration` method to expose `MarkwonConfiguration` via public API | * `Markwon#configuration` method to expose `MarkwonConfiguration` via public API | ||||||
| * `HeadingSpan#getLevel` getter | * `HeadingSpan#getLevel` getter | ||||||
| * Add `SvgPictureMediaDecoder` in `image` module to deal with SVG without dimensions ([#165]) | * Add `SvgPictureMediaDecoder` in `image` module to deal with SVG without dimensions ([#165]) | ||||||
|  | |||||||
| @ -104,6 +104,7 @@ module.exports = { | |||||||
|                 '/docs/v4/image/', |                 '/docs/v4/image/', | ||||||
|                 '/docs/v4/image-glide/', |                 '/docs/v4/image-glide/', | ||||||
|                 '/docs/v4/image-picasso/', |                 '/docs/v4/image-picasso/', | ||||||
|  |                 '/docs/v4/inline-parser/', | ||||||
|                 '/docs/v4/linkify/', |                 '/docs/v4/linkify/', | ||||||
|                 '/docs/v4/recycler/', |                 '/docs/v4/recycler/', | ||||||
|                 '/docs/v4/recycler-table/', |                 '/docs/v4/recycler-table/', | ||||||
|  | |||||||
							
								
								
									
										78
									
								
								docs/docs/v4/inline-parser/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								docs/docs/v4/inline-parser/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,78 @@ | |||||||
|  | # Inline Parser <Badge text="4.2.0" /> | ||||||
|  | 
 | ||||||
|  | **Experimental** commonmark-java inline parser that allows customizing  | ||||||
|  | core features and/or extend with own.  | ||||||
|  | 
 | ||||||
|  | Usage of _internal_ classes: | ||||||
|  | ```java | ||||||
|  | import org.commonmark.internal.Bracket; | ||||||
|  | import org.commonmark.internal.Delimiter; | ||||||
|  | import org.commonmark.internal.ReferenceParser; | ||||||
|  | import org.commonmark.internal.util.Escaping; | ||||||
|  | import org.commonmark.internal.util.Html5Entities; | ||||||
|  | import org.commonmark.internal.util.Parsing; | ||||||
|  | import org.commonmark.internal.inline.AsteriskDelimiterProcessor; | ||||||
|  | import org.commonmark.internal.inline.UnderscoreDelimiterProcessor; | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | ```java | ||||||
|  | // all default (like current commonmark-java InlineParserImpl)  | ||||||
|  | final InlineParserFactory factory = MarkwonInlineParser.factoryBuilder() | ||||||
|  |         .includeDefaults() | ||||||
|  |         .build(); | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ```java | ||||||
|  | // disable images (current markdown images will be considered as links): | ||||||
|  | final InlineParserFactory factory = MarkwonInlineParser.factoryBuilder() | ||||||
|  |         .includeDefaults() | ||||||
|  |         .excludeInlineProcessor(BangInlineProcessor.class) | ||||||
|  |         .build(); | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ```java | ||||||
|  | // disable core delimiter processors for `*`|`_` and `**`|`__` | ||||||
|  | final InlineParserFactory factory = MarkwonInlineParser.factoryBuilder() | ||||||
|  |         .includeDefaults() | ||||||
|  |         .excludeDelimiterProcessor(AsteriskDelimiterProcessor.class) | ||||||
|  |         .excludeDelimiterProcessor(UnderscoreDelimiterProcessor.class) | ||||||
|  |         .build(); | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ```java | ||||||
|  | // disable _all_ markdown inlines except for links (open and close bracket handling `[` & `]`) | ||||||
|  | final InlineParserFactory inlineParserFactory = MarkwonInlineParser.factoryBuilder() | ||||||
|  |         // note that there is no `includeDefaults` method call | ||||||
|  |         .referencesEnabled(true) | ||||||
|  |         .addInlineProcessor(new OpenBracketInlineProcessor()) | ||||||
|  |         .addInlineProcessor(new CloseBracketInlineProcessor()) | ||||||
|  |         .build(); | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | To use custom InlineParser: | ||||||
|  | ```java | ||||||
|  | final Markwon markwon = Markwon.builder(this) | ||||||
|  |         .usePlugin(new AbstractMarkwonPlugin() { | ||||||
|  |             @Override | ||||||
|  |             public void configureParser(@NonNull Parser.Builder builder) { | ||||||
|  |                 builder.inlineParserFactory(inlineParserFactory); | ||||||
|  |             } | ||||||
|  |         }) | ||||||
|  |         .build(); | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | The list of available inline processors: | ||||||
|  | 
 | ||||||
|  | * `AutolinkInlineProcessor` (`<` => `<me@mydoma.in>`) | ||||||
|  | * `BackslashInlineProcessor` (`\\`) | ||||||
|  | * `BackticksInlineProcessor` (<code>`</code> => <code>`code`</code>) | ||||||
|  | * `BangInlineProcessor` (`!` => ``) | ||||||
|  | * `CloseBracketInlineProcessor` (`]` => `[link](#href)`, ``) | ||||||
|  | * `EntityInlineProcessor` (`&` => `&`) | ||||||
|  | * `HtmlInlineProcessor` (`<` => `<html></html>`) | ||||||
|  | * `NewLineInlineProcessor` (`\n`) | ||||||
|  | * `OpenBracketInlineProcessor` (`[` => `[link](#href)`) | ||||||
| @ -4,17 +4,13 @@ | |||||||
| 
 | 
 | ||||||
| ```java | ```java | ||||||
| import org.commonmark.internal.Bracket; | import org.commonmark.internal.Bracket; | ||||||
|  | import org.commonmark.internal.Delimiter; | ||||||
|  | import org.commonmark.internal.ReferenceParser; | ||||||
| import org.commonmark.internal.util.Escaping; | import org.commonmark.internal.util.Escaping; | ||||||
| import org.commonmark.internal.util.Html5Entities; | import org.commonmark.internal.util.Html5Entities; | ||||||
| import org.commonmark.internal.util.Parsing; | import org.commonmark.internal.util.Parsing; | ||||||
| import org.commonmark.internal.Bracket; |  | ||||||
| import org.commonmark.internal.Delimiter; |  | ||||||
| import org.commonmark.internal.ReferenceParser; |  | ||||||
| import org.commonmark.internal.inline.AsteriskDelimiterProcessor; | import org.commonmark.internal.inline.AsteriskDelimiterProcessor; | ||||||
| import org.commonmark.internal.inline.UnderscoreDelimiterProcessor; | import org.commonmark.internal.inline.UnderscoreDelimiterProcessor; | ||||||
| import org.commonmark.internal.util.Escaping; |  | ||||||
| import org.commonmark.internal.Bracket; |  | ||||||
| import org.commonmark.internal.Delimiter; |  | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| `StaggeredDelimiterProcessor` class source is copied (required for InlineParser) | `StaggeredDelimiterProcessor` class source is copied (required for InlineParser) | ||||||
| @ -1,7 +0,0 @@ | |||||||
| package io.noties.markwon.inlineparser; |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * @since 4.2.0-SNAPSHOT |  | ||||||
|  */ |  | ||||||
| public class AsteriskDelimiterProcessor extends org.commonmark.internal.inline.AsteriskDelimiterProcessor { |  | ||||||
| } |  | ||||||
| @ -6,6 +6,8 @@ import androidx.annotation.Nullable; | |||||||
| import org.commonmark.internal.Bracket; | import org.commonmark.internal.Bracket; | ||||||
| import org.commonmark.internal.Delimiter; | import org.commonmark.internal.Delimiter; | ||||||
| import org.commonmark.internal.ReferenceParser; | import org.commonmark.internal.ReferenceParser; | ||||||
|  | import org.commonmark.internal.inline.AsteriskDelimiterProcessor; | ||||||
|  | import org.commonmark.internal.inline.UnderscoreDelimiterProcessor; | ||||||
| import org.commonmark.internal.util.Escaping; | import org.commonmark.internal.util.Escaping; | ||||||
| import org.commonmark.node.Link; | import org.commonmark.node.Link; | ||||||
| import org.commonmark.node.Node; | import org.commonmark.node.Node; | ||||||
|  | |||||||
| @ -1,7 +0,0 @@ | |||||||
| package io.noties.markwon.inlineparser; |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * @since 4.2.0-SNAPSHOT |  | ||||||
|  */ |  | ||||||
| public class UnderscoreDelimiterProcessor extends org.commonmark.internal.inline.UnderscoreDelimiterProcessor { |  | ||||||
| } |  | ||||||
| @ -33,6 +33,8 @@ | |||||||
|             android:name=".editor.EditorActivity" |             android:name=".editor.EditorActivity" | ||||||
|             android:windowSoftInputMode="adjustResize" /> |             android:windowSoftInputMode="adjustResize" /> | ||||||
| 
 | 
 | ||||||
|  |         <activity android:name=".inlineparser.InlineParserActivity" /> | ||||||
|  | 
 | ||||||
|     </application> |     </application> | ||||||
| 
 | 
 | ||||||
| </manifest> | </manifest> | ||||||
| @ -24,6 +24,7 @@ import io.noties.markwon.sample.customextension.CustomExtensionActivity; | |||||||
| import io.noties.markwon.sample.customextension2.CustomExtensionActivity2; | import io.noties.markwon.sample.customextension2.CustomExtensionActivity2; | ||||||
| import io.noties.markwon.sample.editor.EditorActivity; | import io.noties.markwon.sample.editor.EditorActivity; | ||||||
| import io.noties.markwon.sample.html.HtmlActivity; | import io.noties.markwon.sample.html.HtmlActivity; | ||||||
|  | import io.noties.markwon.sample.inlineparser.InlineParserActivity; | ||||||
| import io.noties.markwon.sample.latex.LatexActivity; | import io.noties.markwon.sample.latex.LatexActivity; | ||||||
| import io.noties.markwon.sample.precomputed.PrecomputedActivity; | import io.noties.markwon.sample.precomputed.PrecomputedActivity; | ||||||
| import io.noties.markwon.sample.recycler.RecyclerActivity; | import io.noties.markwon.sample.recycler.RecyclerActivity; | ||||||
| @ -122,6 +123,10 @@ public class MainActivity extends Activity { | |||||||
|                 activity = EditorActivity.class; |                 activity = EditorActivity.class; | ||||||
|                 break; |                 break; | ||||||
| 
 | 
 | ||||||
|  |             case INLINE_PARSER: | ||||||
|  |                 activity = InlineParserActivity.class; | ||||||
|  |                 break; | ||||||
|  | 
 | ||||||
|             default: |             default: | ||||||
|                 throw new IllegalStateException("No Activity is associated with sample-item: " + item); |                 throw new IllegalStateException("No Activity is associated with sample-item: " + item); | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -23,7 +23,9 @@ public enum Sample { | |||||||
| 
 | 
 | ||||||
|     PRECOMPUTED_TEXT(R.string.sample_precomputed_text), |     PRECOMPUTED_TEXT(R.string.sample_precomputed_text), | ||||||
| 
 | 
 | ||||||
|     EDITOR(R.string.sample_editor); |     EDITOR(R.string.sample_editor), | ||||||
|  | 
 | ||||||
|  |     INLINE_PARSER(R.string.sample_inline_parser); | ||||||
| 
 | 
 | ||||||
|     private final int textResId; |     private final int textResId; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -0,0 +1,119 @@ | |||||||
|  | package io.noties.markwon.sample.inlineparser; | ||||||
|  | 
 | ||||||
|  | import android.app.Activity; | ||||||
|  | import android.os.Bundle; | ||||||
|  | import android.widget.TextView; | ||||||
|  | 
 | ||||||
|  | import androidx.annotation.NonNull; | ||||||
|  | import androidx.annotation.Nullable; | ||||||
|  | 
 | ||||||
|  | import org.commonmark.node.Block; | ||||||
|  | import org.commonmark.node.BlockQuote; | ||||||
|  | import org.commonmark.node.Heading; | ||||||
|  | import org.commonmark.node.HtmlBlock; | ||||||
|  | import org.commonmark.node.ListBlock; | ||||||
|  | import org.commonmark.node.ThematicBreak; | ||||||
|  | import org.commonmark.parser.InlineParserFactory; | ||||||
|  | import org.commonmark.parser.Parser; | ||||||
|  | 
 | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.HashSet; | ||||||
|  | import java.util.Set; | ||||||
|  | 
 | ||||||
|  | import io.noties.markwon.AbstractMarkwonPlugin; | ||||||
|  | import io.noties.markwon.Markwon; | ||||||
|  | import io.noties.markwon.inlineparser.BackticksInlineProcessor; | ||||||
|  | import io.noties.markwon.inlineparser.CloseBracketInlineProcessor; | ||||||
|  | import io.noties.markwon.inlineparser.MarkwonInlineParser; | ||||||
|  | import io.noties.markwon.inlineparser.OpenBracketInlineProcessor; | ||||||
|  | import io.noties.markwon.sample.R; | ||||||
|  | 
 | ||||||
|  | public class InlineParserActivity extends Activity { | ||||||
|  | 
 | ||||||
|  |     private TextView textView; | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     protected void onCreate(@Nullable Bundle savedInstanceState) { | ||||||
|  |         super.onCreate(savedInstanceState); | ||||||
|  |         setContentView(R.layout.activity_text_view); | ||||||
|  | 
 | ||||||
|  |         this.textView = findViewById(R.id.text_view); | ||||||
|  | 
 | ||||||
|  | //        links_only(); | ||||||
|  | 
 | ||||||
|  |         disable_code(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void links_only() { | ||||||
|  | 
 | ||||||
|  |         // create an inline-parser-factory that will _ONLY_ parse links | ||||||
|  |         //  this would mean: | ||||||
|  |         //  * no emphasises (strong and regular aka bold and italics), | ||||||
|  |         //  * no images, | ||||||
|  |         //  * no code, | ||||||
|  |         //  * no HTML entities (&) | ||||||
|  |         //  * no HTML tags | ||||||
|  |         // markdown blocks are still parsed | ||||||
|  |         final InlineParserFactory inlineParserFactory = MarkwonInlineParser.factoryBuilder() | ||||||
|  |                 .referencesEnabled(true) | ||||||
|  |                 .addInlineProcessor(new OpenBracketInlineProcessor()) | ||||||
|  |                 .addInlineProcessor(new CloseBracketInlineProcessor()) | ||||||
|  |                 .build(); | ||||||
|  | 
 | ||||||
|  |         final Markwon markwon = Markwon.builder(this) | ||||||
|  |                 .usePlugin(new AbstractMarkwonPlugin() { | ||||||
|  |                     @Override | ||||||
|  |                     public void configureParser(@NonNull Parser.Builder builder) { | ||||||
|  |                         builder.inlineParserFactory(inlineParserFactory); | ||||||
|  |                     } | ||||||
|  |                 }) | ||||||
|  |                 .build(); | ||||||
|  | 
 | ||||||
|  |         // note that image is considered a link now | ||||||
|  |         final String md = "**bold_bold-italic_** <u>html-u</u>, [link](#)  `code`"; | ||||||
|  |         markwon.setMarkdown(textView, md); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void disable_code() { | ||||||
|  |         // parses all as usual, but ignores code (inline and block) | ||||||
|  | 
 | ||||||
|  |         final InlineParserFactory inlineParserFactory = MarkwonInlineParser.factoryBuilder() | ||||||
|  |                 .includeDefaults() | ||||||
|  |                 .excludeInlineProcessor(BackticksInlineProcessor.class) | ||||||
|  |                 .build(); | ||||||
|  | 
 | ||||||
|  |         // unfortunately there is no _exclude_ method for parser-builder | ||||||
|  |         final Set<Class<? extends Block>> enabledBlocks = new HashSet<Class<? extends Block>>() {{ | ||||||
|  |             // IndentedCodeBlock.class and FencedCodeBlock.class are missing | ||||||
|  |             // this is full list (including above) that can be passed to `enabledBlockTypes` method | ||||||
|  |             addAll(Arrays.asList( | ||||||
|  |                     BlockQuote.class, | ||||||
|  |                     Heading.class, | ||||||
|  |                     HtmlBlock.class, | ||||||
|  |                     ThematicBreak.class, | ||||||
|  |                     ListBlock.class)); | ||||||
|  |         }}; | ||||||
|  | 
 | ||||||
|  |         final Markwon markwon = Markwon.builder(this) | ||||||
|  |                 .usePlugin(new AbstractMarkwonPlugin() { | ||||||
|  |                     @Override | ||||||
|  |                     public void configureParser(@NonNull Parser.Builder builder) { | ||||||
|  |                         builder | ||||||
|  |                                 .inlineParserFactory(inlineParserFactory) | ||||||
|  |                                 .enabledBlockTypes(enabledBlocks); | ||||||
|  |                     } | ||||||
|  |                 }) | ||||||
|  |                 .build(); | ||||||
|  | 
 | ||||||
|  |         final String md = "# Head!\n\n" + | ||||||
|  |                 "* one\n" + | ||||||
|  |                 "+ two\n\n" + | ||||||
|  |                 "and **bold** to `you`!\n\n" + | ||||||
|  |                 "> a quote _em_\n\n" + | ||||||
|  |                 "```java\n" + | ||||||
|  |                 "final int i = 0;\n" + | ||||||
|  |                 "```\n\n" + | ||||||
|  |                 "**Good day!**"; | ||||||
|  |         markwon.setMarkdown(textView, md); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -27,4 +27,6 @@ | |||||||
| 
 | 
 | ||||||
|     <string name="sample_editor"># \# Editor\n\n`MarkwonEditor` sample usage to highlight user input in EditText</string> |     <string name="sample_editor"># \# Editor\n\n`MarkwonEditor` sample usage to highlight user input in EditText</string> | ||||||
| 
 | 
 | ||||||
|  |     <string name="sample_inline_parser"># \# Inline Parser\n\nUsage of custom inline parser</string> | ||||||
|  | 
 | ||||||
| </resources> | </resources> | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dimitry Ivanov
						Dimitry Ivanov