Skip to content

Commit 7ade901

Browse files
authored
add flexmark-ext-resizable-image (#489)
* add extension to resize image * add extension to resize image * minor fixes * Revert "Make support for relative paths to images as an extension" * add flexmark-ext-resizable-image * fix folders * fix spaces * some fixes test, but not last( * fix spec file * fix spec file * add Sample * delete comments
1 parent 3eccbef commit 7ade901

File tree

29 files changed

+432
-0
lines changed

29 files changed

+432
-0
lines changed

.idea/compiler.xml

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/modules.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

VERSION-TODO.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1612,6 +1612,7 @@ Please give feedback on the upcoming changes if you have concerns about breaking
16121612
* `flexmark-ext-jekyll-tag/src/test/resources/com.vladsch.flexmark.ext.jekyll.tag.txt`
16131613
* `flexmark-ext-macros/src/test/resources/com.vladsch.flexmark.ext.macros.txt`
16141614
* `flexmark-ext-media-tags/src/test/resources/com.vladsch.flexmark.ext.media.tags.txt`
1615+
* `flexmark-ext-resizable-image/src/test/resources/com.vladsch.flexmark.ext.resizable.image.txt`
16151616
* `flexmark-ext-spec-example/src/test/resources/com.vladsch.flexmark.ext.spec.example.txt`
16161617
* `flexmark-ext-superscript/src/test/resources/com.vladsch.flexmark.ext.superscript.txt`
16171618
* `flexmark-ext-tables/src/test/resources/com.vladsch.flexmark.ext.tables.txt`

VERSION.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,6 +1208,7 @@ Please give feedback on the upcoming changes if you have concerns about breaking
12081208
* `flexmark-ext-jekyll-tag/src/test/resources/com.vladsch.flexmark.ext.jekyll.tag.txt`
12091209
* `flexmark-ext-macros/src/test/resources/com.vladsch.flexmark.ext.macros.txt`
12101210
* `flexmark-ext-media-tags/src/test/resources/com.vladsch.flexmark.ext.media.tags.txt`
1211+
* `flexmark-ext-resizable-image/src/test/resources/com.vladsch.flexmark.ext.resizable.image.txt`
12111212
* `flexmark-ext-spec-example/src/test/resources/com.vladsch.flexmark.ext.spec.example.txt`
12121213
* `flexmark-ext-superscript/src/test/resources/com.vladsch.flexmark.ext.superscript.txt`
12131214
* `flexmark-ext-tables/src/test/resources/com.vladsch.flexmark.ext.tables.txt`

flexmark-all/flexmark-all.iml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,5 +72,6 @@
7272
<orderEntry type="module" module-name="flexmark-ext-gitlab" />
7373
<orderEntry type="module" module-name="flexmark-ext-macros" />
7474
<orderEntry type="module" module-name="flexmark-ext-media-tags" />
75+
<orderEntry type="module" module-name="flexmark-ext-resizable-image" />
7576
</component>
7677
</module>

flexmark-all/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,11 @@
118118
<artifactId>flexmark-ext-media-tags</artifactId>
119119
<version>${project.version}</version>
120120
</dependency>
121+
<dependency>
122+
<groupId>com.vladsch.flexmark</groupId>
123+
<artifactId>flexmark-ext-resizable-image</artifactId>
124+
<version>${project.version}</version>
125+
</dependency>
121126
<dependency>
122127
<groupId>com.vladsch.flexmark</groupId>
123128
<artifactId>flexmark-ext-macros</artifactId>

flexmark-all/src/assembly/bin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<include>com.vladsch.flexmark:flexmark-ext-ins</include>
3434
<include>com.vladsch.flexmark:flexmark-ext-macros</include>
3535
<include>com.vladsch.flexmark:flexmark-ext-media-tags</include>
36+
<include>com.vladsch.flexmark:flexmark-ext-resizable-image</include>
3637
<include>com.vladsch.flexmark:flexmark-ext-xwiki-macros</include>
3738
<include>com.vladsch.flexmark:flexmark-ext-superscript</include>
3839
<include>com.vladsch.flexmark:flexmark-ext-tables</include>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module type="JAVA_MODULE" version="4">
3+
<component name="NewModuleRootManager" inherit-compiler-output="true">
4+
<content url="file://$MODULE_DIR$">
5+
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
6+
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
7+
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
8+
<excludeFolder url="file://$MODULE_DIR$/target" />
9+
</content>
10+
<orderEntry type="inheritedJdk" />
11+
<orderEntry type="sourceFolder" forTests="false" />
12+
<orderEntry type="module" module-name="flexmark" />
13+
<orderEntry type="module" module-name="flexmark-util-ast" />
14+
<orderEntry type="module" module-name="flexmark-util-builder" />
15+
<orderEntry type="module" module-name="flexmark-util-data" />
16+
<orderEntry type="module" module-name="flexmark-util-dependency" />
17+
<orderEntry type="module" module-name="flexmark-util-html" />
18+
<orderEntry type="module" module-name="flexmark-util-misc" />
19+
<orderEntry type="module" module-name="flexmark-util-sequence" />
20+
<orderEntry type="module" module-name="flexmark-util-visitor" />
21+
<orderEntry type="module" module-name="flexmark-test-util" scope="TEST" />
22+
<orderEntry type="module" module-name="flexmark-core-test" scope="TEST" />
23+
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
24+
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
25+
<orderEntry type="library" name="org.jetbrains:annotations" level="project" />
26+
</component>
27+
</module>

flexmark-ext-resizable-image/pom.xml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<parent>
5+
<groupId>com.vladsch.flexmark</groupId>
6+
<artifactId>flexmark-java</artifactId>
7+
<version>0.62.2</version>
8+
</parent>
9+
10+
<artifactId>flexmark-ext-resizable-image</artifactId>
11+
<name>flexmark-java extension for image's size</name>
12+
<description>flexmark-java extension to set the size of the images</description>
13+
14+
<dependencies>
15+
<dependency>
16+
<groupId>com.vladsch.flexmark</groupId>
17+
<artifactId>flexmark</artifactId>
18+
</dependency>
19+
<dependency>
20+
<groupId>com.vladsch.flexmark</groupId>
21+
<artifactId>flexmark-test-util</artifactId>
22+
<scope>test</scope>
23+
</dependency>
24+
<dependency>
25+
<groupId>com.vladsch.flexmark</groupId>
26+
<artifactId>flexmark-core-test</artifactId>
27+
<scope>test</scope>
28+
</dependency>
29+
</dependencies>
30+
</project>
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.vladsch.flexmark.ext.resizable.image;
2+
3+
import com.vladsch.flexmark.util.ast.DoNotDecorate;
4+
import com.vladsch.flexmark.util.ast.Node;
5+
import com.vladsch.flexmark.util.sequence.BasedSequence;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
public class ResizableImage extends Node implements DoNotDecorate {
9+
protected BasedSequence source = BasedSequence.NULL;
10+
protected BasedSequence text = BasedSequence.NULL;
11+
protected BasedSequence width = BasedSequence.NULL;
12+
protected BasedSequence height = BasedSequence.NULL;
13+
14+
@NotNull
15+
@Override
16+
public BasedSequence[] getSegments() {
17+
return new BasedSequence[] { text, source, width, height };
18+
}
19+
20+
public ResizableImage(BasedSequence text, BasedSequence source, BasedSequence width, BasedSequence height) {
21+
super(spanningChars(text, source, width, height));
22+
this.source = source;
23+
this.text = text;
24+
this.width = width;
25+
this.height = height;
26+
}
27+
28+
public BasedSequence getText() {
29+
return text;
30+
}
31+
32+
public BasedSequence getSource() {
33+
return source;
34+
}
35+
36+
public BasedSequence getWidth() {
37+
return width;
38+
}
39+
40+
public BasedSequence getHeight() {
41+
return height;
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.vladsch.flexmark.ext.resizable.image;
2+
3+
import com.vladsch.flexmark.ext.resizable.image.internal.ResizableImageInlineParserExtension;
4+
import com.vladsch.flexmark.ext.resizable.image.internal.ResizableImageNodeRenderer;
5+
import com.vladsch.flexmark.html.HtmlRenderer;
6+
import com.vladsch.flexmark.parser.Parser;
7+
import com.vladsch.flexmark.util.data.MutableDataHolder;
8+
9+
import org.jetbrains.annotations.NotNull;
10+
11+
public class ResizableImageExtension implements Parser.ParserExtension, HtmlRenderer.HtmlRendererExtension {
12+
13+
private ResizableImageExtension() {
14+
}
15+
16+
public static ResizableImageExtension create() {
17+
return new ResizableImageExtension();
18+
}
19+
20+
@Override
21+
public void rendererOptions(@NotNull MutableDataHolder options) {
22+
23+
}
24+
25+
@Override
26+
public void parserOptions(MutableDataHolder options) {
27+
28+
}
29+
30+
@Override
31+
public void extend(Parser.Builder parserBuilder) {
32+
parserBuilder.customInlineParserExtensionFactory(new ResizableImageInlineParserExtension.Factory());
33+
}
34+
35+
@Override
36+
public void extend(@NotNull HtmlRenderer.Builder htmlRendererBuilder, @NotNull String rendererType) {
37+
if (htmlRendererBuilder.isRendererType("HTML")) {
38+
htmlRendererBuilder.nodeRendererFactory(new ResizableImageNodeRenderer.Factory());
39+
} else if (htmlRendererBuilder.isRendererType("JIRA")) {
40+
return;
41+
}
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.vladsch.flexmark.ext.resizable.image;
2+
3+
public interface ResizableImageVisitor {
4+
void visit(ResizableImage node);
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.vladsch.flexmark.ext.resizable.image;
2+
3+
import com.vladsch.flexmark.util.ast.VisitHandler;
4+
5+
public class ResizableImageVisitorExt {
6+
public static <V extends ResizableImageVisitor> VisitHandler<?>[] VISIT_HANDLERS(V visitor) {
7+
return new VisitHandler<?>[] {
8+
new VisitHandler<>(ResizableImage.class, visitor::visit),
9+
};
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.vladsch.flexmark.ext.resizable.image.internal;
2+
3+
import com.vladsch.flexmark.ext.resizable.image.ResizableImage;
4+
import com.vladsch.flexmark.parser.InlineParser;
5+
import com.vladsch.flexmark.parser.InlineParserExtension;
6+
import com.vladsch.flexmark.parser.InlineParserExtensionFactory;
7+
import com.vladsch.flexmark.parser.LightInlineParser;
8+
import com.vladsch.flexmark.util.sequence.BasedSequence;
9+
import org.jetbrains.annotations.NotNull;
10+
import org.jetbrains.annotations.Nullable;
11+
12+
import java.util.Set;
13+
import java.util.regex.Pattern;
14+
15+
public class ResizableImageInlineParserExtension implements InlineParserExtension {
16+
final public static Pattern IMAGE_PATTERN = Pattern.compile("\\!\\[(\\S*)\\]\\((\\S*)\\s*=*(\\d*)x*(\\d*)\\)",
17+
Pattern.CASE_INSENSITIVE);
18+
19+
public ResizableImageInlineParserExtension(LightInlineParser inlineParser) {
20+
}
21+
22+
@Override
23+
public void finalizeDocument(@NotNull InlineParser inlineParser) {
24+
}
25+
26+
@Override
27+
public void finalizeBlock(@NotNull InlineParser inlineParser) {
28+
}
29+
30+
@Override
31+
public boolean parse(@NotNull LightInlineParser inlineParser) {
32+
int index = inlineParser.getIndex();
33+
char c = inlineParser.getInput().charAt(index + 1);
34+
if (c == '[') {
35+
BasedSequence[] matches = inlineParser.matchWithGroups(IMAGE_PATTERN);
36+
if (matches != null) {
37+
inlineParser.flushTextNode();
38+
39+
BasedSequence text = matches[1];
40+
BasedSequence source = matches[2];
41+
BasedSequence width = matches[3];
42+
BasedSequence height = matches[4];
43+
44+
ResizableImage image = new ResizableImage(text, source, width, height);
45+
inlineParser.getBlock().appendChild(image);
46+
return true;
47+
}
48+
}
49+
return false;
50+
}
51+
52+
public static class Factory implements InlineParserExtensionFactory {
53+
@Nullable
54+
@Override
55+
public Set<Class<?>> getAfterDependents() {
56+
return null;
57+
}
58+
59+
@NotNull
60+
@Override
61+
public CharSequence getCharacters() {
62+
return "!";
63+
}
64+
65+
@Nullable
66+
@Override
67+
public Set<Class<?>> getBeforeDependents() {
68+
return null;
69+
}
70+
71+
@NotNull
72+
@Override
73+
public InlineParserExtension apply(@NotNull LightInlineParser lightInlineParser) {
74+
return new ResizableImageInlineParserExtension(lightInlineParser);
75+
}
76+
77+
@Override
78+
public boolean affectsGlobalScope() {
79+
return false;
80+
}
81+
}
82+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.vladsch.flexmark.ext.resizable.image.internal;
2+
3+
import com.vladsch.flexmark.ext.resizable.image.ResizableImage;
4+
import com.vladsch.flexmark.html.HtmlWriter;
5+
import com.vladsch.flexmark.html.renderer.LinkType;
6+
import com.vladsch.flexmark.html.renderer.NodeRenderer;
7+
import com.vladsch.flexmark.html.renderer.NodeRendererContext;
8+
import com.vladsch.flexmark.html.renderer.NodeRendererFactory;
9+
import com.vladsch.flexmark.html.renderer.NodeRenderingHandler;
10+
import com.vladsch.flexmark.html.renderer.ResolvedLink;
11+
import com.vladsch.flexmark.util.data.DataHolder;
12+
import org.jetbrains.annotations.NotNull;
13+
14+
import java.util.HashSet;
15+
import java.util.Set;
16+
17+
public class ResizableImageNodeRenderer implements NodeRenderer
18+
{
19+
public ResizableImageNodeRenderer(DataHolder options) {
20+
}
21+
22+
@Override
23+
public Set<NodeRenderingHandler<?>> getNodeRenderingHandlers() {
24+
Set<NodeRenderingHandler<?>> set = new HashSet<>();
25+
// @formatter:off
26+
set.add(new NodeRenderingHandler<>(ResizableImage.class, ResizableImageNodeRenderer.this::render));
27+
// @formatter:on
28+
return set;
29+
}
30+
31+
public void render(ResizableImage node, NodeRendererContext context, HtmlWriter html) {
32+
if (context.isDoNotRenderLinks()) {
33+
context.renderChildren(node);
34+
} else {
35+
ResolvedLink link = context.resolveLink(LinkType.IMAGE, node.getSource(), true);
36+
html.srcPos(node.getChars())
37+
.attr("src", link.getUrl());
38+
if (node.getText().isNotEmpty()){
39+
html.attr("alt", node.getText());
40+
}
41+
if (node.getWidth().isNotEmpty()){
42+
html.attr("width", node.getWidth() + "px");
43+
}
44+
if (node.getHeight().isNotEmpty()){
45+
html.attr("height", node.getHeight() + "px");
46+
}
47+
html.withAttr().tag("img");
48+
html.tag("/img");
49+
}
50+
}
51+
52+
public static class Factory implements NodeRendererFactory {
53+
@NotNull
54+
@Override
55+
public NodeRenderer apply(@NotNull DataHolder options) {
56+
return new ResizableImageNodeRenderer(options);
57+
}
58+
}
59+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<html>
2+
<head>
3+
<meta charset="UTF-8">
4+
</head>
5+
<body>
6+
<p><strong>flexmark-java extension enables to set width and height for images by stating them
7+
as ![text](/src =WxH) which is used in Azure DevOps markdown.</strong></p>
8+
<p>Converts ![text](/src =WxH) into image with width = W and height = H.
9+
Also added support for image`s relative paths from Azure DevOps repository.</p>
10+
</body>
11+
</html>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
**flexmark-java extension enables to set width and height for images by stating them as ![text](/src =WxH) which is used in Azure DevOps markdown.**
2+
3+
Converts ![text](/src =WxH) into image with width = W and height = H.
4+
Also added support for image`s relative paths from Azure DevOps repository.

0 commit comments

Comments
 (0)