Skip to content

Commit cef5728

Browse files
committed
Refactor DSV parsing functions to consolidate variable ID and delimiter parsing into a single utility function
1 parent 7724b46 commit cef5728

1 file changed

Lines changed: 55 additions & 46 deletions

File tree

  • packages/markdown/src/plugins

packages/markdown/src/plugins/dsv.ts

Lines changed: 55 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

8898
function 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

Comments
 (0)