diff --git a/src/Compiler.pir b/src/Compiler.pir
index db84e41..ee60814 100644
--- a/src/Compiler.pir
+++ b/src/Compiler.pir
@@ -239,6 +239,28 @@ Return generated HTML for all of its children.
.return (code)
.end
+=item html(Markdown::RefLink node)
+
+=cut
+
+.sub 'html' :method :multi(_,['Markdown';'RefLink'])
+ .param pmc node
+ .local pmc code
+ new code, 'CodeString'
+ $S0 = ""
+ $S1 = self.'html_children'(node)
+ if $S1 goto L1
+ $S1 = node.'key'()
+ $I0 = length $S1
+ $I0 -= 2
+ $S1 = substr $S1, 1, $I0
+ L1:
+ $S0 .= $S1
+ $S0 .= ""
+ set code, $S0
+ .return (code)
+.end
+
=item html(Markdown::Email node)
=cut
diff --git a/src/Node.pir b/src/Node.pir
index 8532146..61da11c 100644
--- a/src/Node.pir
+++ b/src/Node.pir
@@ -30,6 +30,7 @@ for Markdown.
p6meta.'new_class'('Markdown::ListItem', 'parent'=>base)
p6meta.'new_class'('Markdown::OrderedList', 'parent'=>base)
p6meta.'new_class'('Markdown::Para', 'parent'=>base)
+ p6meta.'new_class'('Markdown::RefLink', 'parent'=>base)
p6meta.'new_class'('Markdown::Space', 'parent'=>base)
p6meta.'new_class'('Markdown::Strong', 'parent'=>base)
p6meta.'new_class'('Markdown::Title', 'parent'=>base)
@@ -59,6 +60,15 @@ for Markdown.
.end
+.namespace [ 'Markdown';'RefLink' ]
+
+.sub 'key' :method
+ .param pmc value :optional
+ .param int has_value :opt_flag
+ .tailcall self.'attr'('key', value, has_value)
+.end
+
+
.namespace [ 'Markdown';'Title' ]
.sub 'level' :method
diff --git a/src/parser/actions.pm b/src/parser/actions.pm
index 51264c2..465e1d5 100644
--- a/src/parser/actions.pm
+++ b/src/parser/actions.pm
@@ -216,6 +216,22 @@ method Link($/, $key) {
make $( $/{$key} );
}
+method ReferenceLink($/, $key) {
+ make $( $/{$key} );
+}
+
+method ReferenceLinkDouble($/) {
+ my $mast := Markdown::RefLink.new( :key( ~$