svmarkdown 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -182,6 +182,16 @@ const parseOptions: SvmdParseOptions = {
182
182
  />
183
183
  ```
184
184
 
185
+ ### Link component layout (inline vs standalone)
186
+
187
+ ```svelte
188
+ <!-- when overriding `a` -->
189
+ <script lang="ts">
190
+ export let linkLayout // 'inline' | 'standalone'
191
+ export let linkStandalone // boolean
192
+ </script>
193
+ ```
194
+
185
195
  ### Control component inference
186
196
 
187
197
  ```svelte
package/README.zh-CN.md CHANGED
@@ -180,6 +180,16 @@ const options: SvmdParseOptions = {
180
180
  />
181
181
  ```
182
182
 
183
+ ### 链接组件的行内/独立布局
184
+
185
+ ```svelte
186
+ <!-- 当覆写 `a` 时 -->
187
+ <script lang="ts">
188
+ export let linkLayout // 'inline' | 'standalone'
189
+ export let linkStandalone // boolean
190
+ </script>
191
+ ```
192
+
183
193
  ### 关闭组件块自动推断
184
194
 
185
195
  ```svelte
@@ -439,6 +439,14 @@ function RenderNode($$anchor, $$props) {
439
439
  function renderSoftBreak() {
440
440
  return $$props.renderOptions?.softBreak ?? "space";
441
441
  }
442
+ function linkLayout(node) {
443
+ if (node.name !== "a") return "inline";
444
+ if (!$$props.parent || $$props.parent.kind !== "element") return "inline";
445
+ if (!$$props.parent.block) return "inline";
446
+ if ($$props.parent.children.length !== 1) return "inline";
447
+ if ($$props.parent.children[0] !== node) return "inline";
448
+ return "standalone";
449
+ }
442
450
  var fragment = $.comment();
443
451
  var node_1 = $.first_child(fragment);
444
452
  var consequent = ($$anchor$1) => {
@@ -446,7 +454,7 @@ function RenderNode($$anchor, $$props) {
446
454
  $.template_effect(() => $.set_text(text, $$props.node.value));
447
455
  $.append($$anchor$1, text);
448
456
  };
449
- var alternate_14 = ($$anchor$1) => {
457
+ var alternate_15 = ($$anchor$1) => {
450
458
  var fragment_2 = $.comment();
451
459
  var node_2 = $.first_child(fragment_2);
452
460
  var consequent_4 = ($$anchor$2) => {
@@ -494,7 +502,7 @@ function RenderNode($$anchor, $$props) {
494
502
  });
495
503
  $.append($$anchor$2, fragment_3);
496
504
  };
497
- var alternate_13 = ($$anchor$2) => {
505
+ var alternate_14 = ($$anchor$2) => {
498
506
  var fragment_8 = $.comment();
499
507
  var node_6 = $.first_child(fragment_8);
500
508
  var consequent_6 = ($$anchor$3) => {
@@ -517,7 +525,7 @@ function RenderNode($$anchor, $$props) {
517
525
  });
518
526
  $.append($$anchor$3, fragment_9);
519
527
  };
520
- var alternate_12 = ($$anchor$3) => {
528
+ var alternate_13 = ($$anchor$3) => {
521
529
  var fragment_12 = $.comment();
522
530
  var node_9 = $.first_child(fragment_12);
523
531
  var consequent_9 = ($$anchor$4) => {
@@ -588,7 +596,7 @@ function RenderNode($$anchor, $$props) {
588
596
  });
589
597
  $.append($$anchor$4, fragment_13);
590
598
  };
591
- var alternate_11 = ($$anchor$4) => {
599
+ var alternate_12 = ($$anchor$4) => {
592
600
  var fragment_16 = $.comment();
593
601
  var node_13 = $.first_child(fragment_16);
594
602
  var consequent_14 = ($$anchor$5) => {
@@ -622,6 +630,9 @@ function RenderNode($$anchor, $$props) {
622
630
  },
623
631
  get renderOptions() {
624
632
  return $$props.renderOptions;
633
+ },
634
+ get parent() {
635
+ return $$props.node;
625
636
  }
626
637
  });
627
638
  };
@@ -648,6 +659,9 @@ function RenderNode($$anchor, $$props) {
648
659
  },
649
660
  get renderOptions() {
650
661
  return $$props.renderOptions;
662
+ },
663
+ get parent() {
664
+ return $$props.node;
651
665
  }
652
666
  });
653
667
  };
@@ -680,63 +694,122 @@ function RenderNode($$anchor, $$props) {
680
694
  });
681
695
  $.append($$anchor$5, fragment_17);
682
696
  };
683
- var alternate_10 = ($$anchor$5) => {
697
+ var alternate_11 = ($$anchor$5) => {
684
698
  const ElementRenderer = $.derived(() => components()[$$props.node.name]);
685
699
  var fragment_24 = $.comment();
686
700
  var node_19 = $.first_child(fragment_24);
687
- var consequent_16 = ($$anchor$6) => {
701
+ var consequent_18 = ($$anchor$6) => {
688
702
  var fragment_25 = $.comment();
689
703
  var node_20 = $.first_child(fragment_25);
690
- $.component(node_20, () => $.get(ElementRenderer), ($$anchor$7, ElementRenderer_1) => {
691
- ElementRenderer_1($$anchor$7, $.spread_props(() => $$props.node.attrs, {
692
- get node() {
693
- return $$props.node;
694
- },
695
- children: ($$anchor$8, $$slotProps) => {
696
- var fragment_26 = $.comment();
697
- var node_21 = $.first_child(fragment_26);
698
- var consequent_15 = ($$anchor$9) => {
699
- RenderNodes($$anchor$9, {
700
- get nodes() {
701
- return $$props.node.children;
702
- },
703
- get components() {
704
- return components();
705
- },
706
- get renderOptions() {
707
- return $$props.renderOptions;
708
- }
704
+ var consequent_16 = ($$anchor$7) => {
705
+ var fragment_26 = $.comment();
706
+ var node_21 = $.first_child(fragment_26);
707
+ {
708
+ let $0 = $.derived(() => linkLayout($$props.node));
709
+ let $1 = $.derived(() => linkLayout($$props.node) === "standalone");
710
+ $.component(node_21, () => $.get(ElementRenderer), ($$anchor$8, ElementRenderer_1) => {
711
+ ElementRenderer_1($$anchor$8, $.spread_props(() => $$props.node.attrs, {
712
+ get node() {
713
+ return $$props.node;
714
+ },
715
+ get linkLayout() {
716
+ return $.get($0);
717
+ },
718
+ get linkStandalone() {
719
+ return $.get($1);
720
+ },
721
+ children: ($$anchor$9, $$slotProps) => {
722
+ var fragment_27 = $.comment();
723
+ var node_22 = $.first_child(fragment_27);
724
+ var consequent_15 = ($$anchor$10) => {
725
+ RenderNodes($$anchor$10, {
726
+ get nodes() {
727
+ return $$props.node.children;
728
+ },
729
+ get components() {
730
+ return components();
731
+ },
732
+ get renderOptions() {
733
+ return $$props.renderOptions;
734
+ },
735
+ get parent() {
736
+ return $$props.node;
737
+ }
738
+ });
739
+ };
740
+ $.if(node_22, ($$render) => {
741
+ if ($$props.node.children.length > 0) $$render(consequent_15);
742
+ });
743
+ $.append($$anchor$9, fragment_27);
744
+ },
745
+ $$slots: { default: true }
746
+ }));
747
+ });
748
+ }
749
+ $.append($$anchor$7, fragment_26);
750
+ };
751
+ var alternate_8 = ($$anchor$7) => {
752
+ var fragment_29 = $.comment();
753
+ var node_23 = $.first_child(fragment_29);
754
+ $.component(node_23, () => $.get(ElementRenderer), ($$anchor$8, ElementRenderer_2) => {
755
+ ElementRenderer_2($$anchor$8, $.spread_props(() => $$props.node.attrs, {
756
+ get node() {
757
+ return $$props.node;
758
+ },
759
+ children: ($$anchor$9, $$slotProps) => {
760
+ var fragment_30 = $.comment();
761
+ var node_24 = $.first_child(fragment_30);
762
+ var consequent_17 = ($$anchor$10) => {
763
+ RenderNodes($$anchor$10, {
764
+ get nodes() {
765
+ return $$props.node.children;
766
+ },
767
+ get components() {
768
+ return components();
769
+ },
770
+ get renderOptions() {
771
+ return $$props.renderOptions;
772
+ },
773
+ get parent() {
774
+ return $$props.node;
775
+ }
776
+ });
777
+ };
778
+ $.if(node_24, ($$render) => {
779
+ if ($$props.node.children.length > 0) $$render(consequent_17);
709
780
  });
710
- };
711
- $.if(node_21, ($$render) => {
712
- if ($$props.node.children.length > 0) $$render(consequent_15);
713
- });
714
- $.append($$anchor$8, fragment_26);
715
- },
716
- $$slots: { default: true }
717
- }));
781
+ $.append($$anchor$9, fragment_30);
782
+ },
783
+ $$slots: { default: true }
784
+ }));
785
+ });
786
+ $.append($$anchor$7, fragment_29);
787
+ };
788
+ $.if(node_20, ($$render) => {
789
+ if ($$props.node.name === "a") $$render(consequent_16);
790
+ else $$render(alternate_8, false);
718
791
  });
719
792
  $.append($$anchor$6, fragment_25);
720
793
  };
721
- var alternate_9 = ($$anchor$6) => {
722
- var fragment_28 = $.comment();
723
- var node_22 = $.first_child(fragment_28);
724
- var consequent_17 = ($$anchor$7) => {
725
- var fragment_29 = $.comment();
726
- var node_23 = $.first_child(fragment_29);
727
- $.element(node_23, () => $$props.node.name, false, ($$element, $$anchor$8) => {
794
+ var alternate_10 = ($$anchor$6) => {
795
+ var fragment_32 = $.comment();
796
+ var node_25 = $.first_child(fragment_32);
797
+ var consequent_19 = ($$anchor$7) => {
798
+ var fragment_33 = $.comment();
799
+ var node_26 = $.first_child(fragment_33);
800
+ $.element(node_26, () => $$props.node.name, false, ($$element, $$anchor$8) => {
728
801
  $.attribute_effect($$element, () => ({ ...$$props.node.attrs }));
729
802
  });
730
- $.append($$anchor$7, fragment_29);
803
+ $.append($$anchor$7, fragment_33);
731
804
  };
732
- var alternate_8 = ($$anchor$7) => {
733
- var fragment_30 = $.comment();
734
- var node_24 = $.first_child(fragment_30);
735
- $.element(node_24, () => $$props.node.name, false, ($$element_1, $$anchor$8) => {
805
+ var alternate_9 = ($$anchor$7) => {
806
+ var fragment_34 = $.comment();
807
+ var node_27 = $.first_child(fragment_34);
808
+ $.element(node_27, () => $$props.node.name, false, ($$element_1, $$anchor$8) => {
736
809
  $.attribute_effect($$element_1, () => ({ ...$$props.node.attrs }));
737
- var fragment_31 = $.comment();
738
- var node_25 = $.first_child(fragment_31);
739
- var consequent_18 = ($$anchor$9) => {
810
+ var fragment_35 = $.comment();
811
+ var node_28 = $.first_child(fragment_35);
812
+ var consequent_20 = ($$anchor$9) => {
740
813
  RenderNodes($$anchor$9, {
741
814
  get nodes() {
742
815
  return $$props.node.children;
@@ -746,55 +819,58 @@ function RenderNode($$anchor, $$props) {
746
819
  },
747
820
  get renderOptions() {
748
821
  return $$props.renderOptions;
822
+ },
823
+ get parent() {
824
+ return $$props.node;
749
825
  }
750
826
  });
751
827
  };
752
- $.if(node_25, ($$render) => {
753
- if ($$props.node.children.length > 0) $$render(consequent_18);
828
+ $.if(node_28, ($$render) => {
829
+ if ($$props.node.children.length > 0) $$render(consequent_20);
754
830
  });
755
- $.append($$anchor$8, fragment_31);
831
+ $.append($$anchor$8, fragment_35);
756
832
  });
757
- $.append($$anchor$7, fragment_30);
833
+ $.append($$anchor$7, fragment_34);
758
834
  };
759
- $.if(node_22, ($$render) => {
760
- if (isVoidElement($$props.node)) $$render(consequent_17);
761
- else $$render(alternate_8, false);
835
+ $.if(node_25, ($$render) => {
836
+ if (isVoidElement($$props.node)) $$render(consequent_19);
837
+ else $$render(alternate_9, false);
762
838
  }, true);
763
- $.append($$anchor$6, fragment_28);
839
+ $.append($$anchor$6, fragment_32);
764
840
  };
765
841
  $.if(node_19, ($$render) => {
766
- if ($.get(ElementRenderer)) $$render(consequent_16);
767
- else $$render(alternate_9, false);
842
+ if ($.get(ElementRenderer)) $$render(consequent_18);
843
+ else $$render(alternate_10, false);
768
844
  });
769
845
  $.append($$anchor$5, fragment_24);
770
846
  };
771
847
  $.if(node_13, ($$render) => {
772
848
  if ($$props.node.kind === "component") $$render(consequent_14);
773
- else $$render(alternate_10, false);
849
+ else $$render(alternate_11, false);
774
850
  }, true);
775
851
  $.append($$anchor$4, fragment_16);
776
852
  };
777
853
  $.if(node_9, ($$render) => {
778
854
  if ($$props.node.kind === "code") $$render(consequent_9);
779
- else $$render(alternate_11, false);
855
+ else $$render(alternate_12, false);
780
856
  }, true);
781
857
  $.append($$anchor$3, fragment_12);
782
858
  };
783
859
  $.if(node_6, ($$render) => {
784
860
  if ($$props.node.kind === "html") $$render(consequent_6);
785
- else $$render(alternate_12, false);
861
+ else $$render(alternate_13, false);
786
862
  }, true);
787
863
  $.append($$anchor$2, fragment_8);
788
864
  };
789
865
  $.if(node_2, ($$render) => {
790
866
  if ($$props.node.kind === "break") $$render(consequent_4);
791
- else $$render(alternate_13, false);
867
+ else $$render(alternate_14, false);
792
868
  }, true);
793
869
  $.append($$anchor$1, fragment_2);
794
870
  };
795
871
  $.if(node_1, ($$render) => {
796
872
  if ($$props.node.kind === "text") $$render(consequent);
797
- else $$render(alternate_14, false);
873
+ else $$render(alternate_15, false);
798
874
  });
799
875
  $.append($$anchor, fragment);
800
876
  $.pop();
@@ -816,6 +892,9 @@ function RenderNodes($$anchor, $$props) {
816
892
  },
817
893
  get renderOptions() {
818
894
  return $$props.renderOptions;
895
+ },
896
+ get parent() {
897
+ return $$props.parent;
819
898
  }
820
899
  });
821
900
  });
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import { a as parseMarkdown, i as inferComponentBlocksFromMap, n as Markdown, r as createParser, t as SvmdChildren } from "./SvmdChildren-D_VMjuB6.js";
1
+ import { a as parseMarkdown, i as inferComponentBlocksFromMap, n as Markdown, r as createParser, t as SvmdChildren } from "./SvmdChildren-Bf8r1vF0.js";
2
2
 
3
3
  export { Markdown, SvmdChildren, createParser, inferComponentBlocksFromMap, parseMarkdown };
@@ -3,6 +3,7 @@ interface Props {
3
3
  node: SvmdNode;
4
4
  components?: SvmdComponentMap;
5
5
  renderOptions?: SvmdRenderOptions;
6
+ parent?: SvmdNode;
6
7
  }
7
8
  declare const RenderNode: import("svelte").Component<Props, {}, "">;
8
9
  type RenderNode = ReturnType<typeof RenderNode>;
@@ -3,6 +3,7 @@ interface Props {
3
3
  nodes: SvmdNode[];
4
4
  components?: SvmdComponentMap;
5
5
  renderOptions?: SvmdRenderOptions;
6
+ parent?: SvmdNode;
6
7
  }
7
8
  declare const RenderNodes: import("svelte").Component<Props, {}, "">;
8
9
  type RenderNodes = ReturnType<typeof RenderNodes>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "svmarkdown",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.3",
5
5
  "description": "Runtime markdown renderer for Svelte based on markdown-it and AST blocks.",
6
6
  "author": "grtsinry43",
7
7
  "license": "MIT",
@@ -29,9 +29,10 @@
29
29
  node: SvmdNode
30
30
  components?: SvmdComponentMap
31
31
  renderOptions?: SvmdRenderOptions
32
+ parent?: SvmdNode
32
33
  }
33
34
 
34
- let { node, components = {}, renderOptions }: Props = $props()
35
+ let { node, components = {}, renderOptions, parent }: Props = $props()
35
36
 
36
37
  function isVoidElement(elementNode: SvmdElementNode): boolean {
37
38
  return VOID_TAGS.has(elementNode.name)
@@ -48,6 +49,30 @@
48
49
  function renderSoftBreak(): 'space' | 'newline' | 'br' {
49
50
  return renderOptions?.softBreak ?? 'space'
50
51
  }
52
+
53
+ function linkLayout(node: SvmdElementNode): 'inline' | 'standalone' {
54
+ if (node.name !== 'a') {
55
+ return 'inline'
56
+ }
57
+
58
+ if (!parent || parent.kind !== 'element') {
59
+ return 'inline'
60
+ }
61
+
62
+ if (!parent.block) {
63
+ return 'inline'
64
+ }
65
+
66
+ if (parent.children.length !== 1) {
67
+ return 'inline'
68
+ }
69
+
70
+ if (parent.children[0] !== node) {
71
+ return 'inline'
72
+ }
73
+
74
+ return 'standalone'
75
+ }
51
76
  </script>
52
77
 
53
78
  {#if node.kind === 'text'}
@@ -95,12 +120,12 @@
95
120
  {#if ComponentRenderer}
96
121
  <ComponentRenderer {...node.props} node={node} syntax={node.syntax} source={node.source}>
97
122
  {#if node.children.length > 0}
98
- <RenderNodes nodes={node.children} {components} {renderOptions} />
123
+ <RenderNodes nodes={node.children} {components} {renderOptions} parent={node} />
99
124
  {/if}
100
125
  </ComponentRenderer>
101
126
  {:else}
102
127
  {#if node.children.length > 0}
103
- <RenderNodes nodes={node.children} {components} {renderOptions} />
128
+ <RenderNodes nodes={node.children} {components} {renderOptions} parent={node} />
104
129
  {:else if node.source}
105
130
  <pre><code>{node.source}</code></pre>
106
131
  {/if}
@@ -109,17 +134,30 @@
109
134
  {@const ElementRenderer = components[node.name]}
110
135
 
111
136
  {#if ElementRenderer}
112
- <ElementRenderer {...node.attrs} node={node}>
113
- {#if node.children.length > 0}
114
- <RenderNodes nodes={node.children} {components} {renderOptions} />
115
- {/if}
116
- </ElementRenderer>
137
+ {#if node.name === 'a'}
138
+ <ElementRenderer
139
+ {...node.attrs}
140
+ node={node}
141
+ linkLayout={linkLayout(node)}
142
+ linkStandalone={linkLayout(node) === 'standalone'}
143
+ >
144
+ {#if node.children.length > 0}
145
+ <RenderNodes nodes={node.children} {components} {renderOptions} parent={node} />
146
+ {/if}
147
+ </ElementRenderer>
148
+ {:else}
149
+ <ElementRenderer {...node.attrs} node={node}>
150
+ {#if node.children.length > 0}
151
+ <RenderNodes nodes={node.children} {components} {renderOptions} parent={node} />
152
+ {/if}
153
+ </ElementRenderer>
154
+ {/if}
117
155
  {:else if isVoidElement(node)}
118
156
  <svelte:element this={node.name} {...node.attrs} />
119
157
  {:else}
120
158
  <svelte:element this={node.name} {...node.attrs}>
121
159
  {#if node.children.length > 0}
122
- <RenderNodes nodes={node.children} {components} {renderOptions} />
160
+ <RenderNodes nodes={node.children} {components} {renderOptions} parent={node} />
123
161
  {/if}
124
162
  </svelte:element>
125
163
  {/if}
@@ -6,11 +6,12 @@
6
6
  nodes: SvmdNode[]
7
7
  components?: SvmdComponentMap
8
8
  renderOptions?: SvmdRenderOptions
9
+ parent?: SvmdNode
9
10
  }
10
11
 
11
- let { nodes, components = {}, renderOptions }: Props = $props()
12
+ let { nodes, components = {}, renderOptions, parent }: Props = $props()
12
13
  </script>
13
14
 
14
15
  {#each nodes as node (node.key)}
15
- <RenderNode {node} {components} {renderOptions} />
16
+ <RenderNode {node} {components} {renderOptions} {parent} />
16
17
  {/each}