@@ -24,65 +24,75 @@ export interface DsvSpec {
2424}
2525
2626/**
27- * Utility function to parse variable ID from fence info.
28- * Supports both "pluginName variableId" and "pluginName variableId:name" formats.
29- * @param info The fence info string (e.g., "csv myData" or "csv variableId:myData")
27+ * Utility function to parse DSV fence info.
28+ * Supports formats like:
29+ * - "dsv products delimiter:|"
30+ * - "dsv delimiter:| variableId:products"
31+ * - "dsv delimiter: | variableId: products"
32+ * @param info The fence info string
3033 * @param pluginName The plugin name (csv, tsv, dsv)
3134 * @param index The fence index for default naming
32- * @returns Object with variableId and wasDefaultId flag
35+ * @returns Object with variableId, delimiter, and flags
3336 */
34- export function parseVariableId ( info : string , pluginName : string , index : number ) : { variableId : string ; wasDefaultId : boolean } {
37+ export function parseDsvInfo ( info : string , pluginName : string , index : number ) : {
38+ variableId : string ;
39+ delimiter : string ;
40+ wasDefaultId : boolean ;
41+ wasDefaultDelimiter : boolean ;
42+ } {
3543 const parts = info . trim ( ) . split ( / \s + / ) ;
3644
37- // Check for explicit variableId: parameter
38- for ( const part of parts ) {
45+ let variableId : string | null = null ;
46+ let delimiter : string | null = null ;
47+
48+ for ( let i = 0 ; i < parts . length ; i ++ ) {
49+ const part = parts [ i ] ;
50+
51+ // Parse variableId: parameter
3952 if ( part . startsWith ( 'variableId:' ) ) {
40- return {
41- variableId : part . slice ( 11 ) . trim ( ) , // Remove 'variableId:' prefix and trim spaces
42- wasDefaultId : false
43- } ;
53+ const value = part . slice ( 11 ) ;
54+ variableId = value || ( i + 1 < parts . length ? parts [ ++ i ] : null ) ;
55+ }
56+ // Parse delimiter: parameter
57+ else if ( part . startsWith ( 'delimiter:' ) ) {
58+ const value = part . slice ( 10 ) ;
59+ delimiter = value || ( i + 1 < parts . length ? parts [ ++ i ] : null ) ;
60+ }
61+ // Direct variableId format (not a parameter key)
62+ else if ( i > 0 && ! variableId && part !== 'variableId:' && part !== 'delimiter:' ) {
63+ variableId = part ;
4464 }
4565 }
4666
47- // Check for direct format (second parameter that's not a special parameter)
48- if ( parts . length >= 2 ) {
49- const secondPart = parts [ 1 ] ;
50- if ( ! secondPart . startsWith ( 'delimiter:' ) && ! secondPart . startsWith ( 'variableId:' ) ) {
51- return {
52- variableId : secondPart ,
53- wasDefaultId : false
54- } ;
55- }
67+ // Handle special delimiter characters
68+ if ( delimiter ) {
69+ if ( delimiter === '\\t' ) delimiter = '\t' ;
70+ if ( delimiter === '\\n' ) delimiter = '\n' ;
71+ if ( delimiter === '\\r' ) delimiter = '\r' ;
5672 }
5773
58- // Default variable ID
59- return {
60- variableId : `${ pluginName } Data${ index } ` ,
61- wasDefaultId : true
74+ return {
75+ variableId : variableId || `${ pluginName } Data${ index } ` ,
76+ delimiter : delimiter || ',' ,
77+ wasDefaultId : ! variableId ,
78+ wasDefaultDelimiter : ! delimiter
6279 } ;
6380}
6481
6582/**
66- * Utility function to parse delimiter from fence info.
67- * @param info The fence info string (e.g., "dsv delimiter:| variableId:myData")
68- * @returns Object with delimiter and wasDefaultDelimiter flag
83+ * Utility function to parse variable ID from fence info.
84+ * Used by CSV and TSV plugins.
85+ * @param info The fence info string (e.g., "csv myData" or "csv variableId:myData")
86+ * @param pluginName The plugin name (csv, tsv, dsv)
87+ * @param index The fence index for default naming
88+ * @returns Object with variableId and wasDefaultId flag
6989 */
70- export function parseDelimiter ( info : string ) : { delimiter : string ; wasDefaultDelimiter : boolean } {
71- const parts = info . trim ( ) . split ( / \s + / ) ;
72-
73- for ( const part of parts ) {
74- if ( part . startsWith ( 'delimiter:' ) ) {
75- let delimiter = part . slice ( 10 ) . trim ( ) ; // Remove 'delimiter:' prefix and trim spaces
76- // Handle special cases
77- if ( delimiter === '\\t' ) delimiter = '\t' ;
78- if ( delimiter === '\\n' ) delimiter = '\n' ;
79- if ( delimiter === '\\r' ) delimiter = '\r' ;
80- return { delimiter, wasDefaultDelimiter : false } ;
81- }
82- }
83-
84- // Default to comma
85- return { delimiter : ',' , wasDefaultDelimiter : true } ;
90+ export function parseVariableId ( info : string , pluginName : string , index : number ) : { variableId : string ; wasDefaultId : boolean } {
91+ const result = parseDsvInfo ( info , pluginName , index ) ;
92+ return {
93+ variableId : result . variableId ,
94+ wasDefaultId : result . wasDefaultId
95+ } ;
8696}
8797
8898function inspectDsvSpec ( spec : DsvSpec ) : RawFlaggableSpec < DsvSpec > {
@@ -115,9 +125,8 @@ export const dsvPlugin: Plugin<DsvSpec> = {
115125 const content = token . content . trim ( ) ;
116126 const info = token . info . trim ( ) ;
117127
118- // Use utility functions to parse delimiter and variable ID
119- const { delimiter, wasDefaultDelimiter } = parseDelimiter ( info ) ;
120- const { variableId, wasDefaultId } = parseVariableId ( info , 'dsv' , index ) ;
128+ // Parse both delimiter and variable ID in one pass
129+ const { variableId, delimiter, wasDefaultId, wasDefaultDelimiter } = parseDsvInfo ( info , 'dsv' , index ) ;
121130
122131 return sanitizedHTML ( 'pre' , {
123132 id : `${ pluginName } -${ index } ` ,
0 commit comments