From 9b693cee4f3e90a7ab6c7e1569755a1dd36410d0 Mon Sep 17 00:00:00 2001 From: atsyplenkov Date: Fri, 12 Sep 2025 10:38:45 +1200 Subject: [PATCH] feat: add #fmt:skip for R tables (closes #16) --- package.json | 8 +++++--- src/paste-r.js | 36 ++++++++++++++++++------------------ 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 050140d..058e733 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,6 @@ "publisher": "atsyplenkov", "license": "MIT", "pricing": "Free", - "sponsor": { - "url": "https://github.com/sponsors/atsyplenkov" - }, "icon": "assets/logo.png", "repository": { "type": "git", @@ -106,6 +103,11 @@ "default": true, "markdownDescription": "Show the `Pastum: paste as default dataframe` command in the editor context menu *(i.e., right-click menu)*. It will only appear in R, Python, and Julia editors. The dataframe will be pasted according to the specified `pastum.defaultDataframeR` and `pastum.defaultDataframePy`." }, + "pastum.airFormat": { + "type": "boolean", + "default": true, + "markdownDescription": "Add comment to skip air formatting in R. (i.e., `# fmt:skip`) before the pasted dataframe." + }, "pastum.defaultDataframeR": { "type": "string", "enum": [ diff --git a/src/paste-r.js b/src/paste-r.js index 1b0f123..2e299b0 100644 --- a/src/paste-r.js +++ b/src/paste-r.js @@ -74,7 +74,11 @@ async function clipboardToRDataFrame(framework = null) { */ function createRDataFrame(tableData, framework) { const { headers, data, columnTypes } = tableData; - let code = ""; + const config = vscode.workspace.getConfiguration("pastum"); + const airFormat = config.get("airFormat"); + + let code = airFormat ? "# fmt:skip\n" : ""; + // let code = ""; /** * Formats a value according to its column type for R syntax @@ -118,26 +122,24 @@ function createRDataFrame(tableData, framework) { // Generate code based on selected framework if (framework === "base") { - code = `data.frame(\n`; + code += `data.frame(\n`; headers.forEach((header, i) => { const values = data.map((row) => formatValue(row[i], i)).join(", "); - code += ` ${header} = c(${values})${ - i < headers.length - 1 ? ",\n" : "\n" - }`; + code += ` ${header} = c(${values})${i < headers.length - 1 ? ",\n" : "\n" + }`; }); code += `)`; } else if (framework === "tibble") { - code = `tibble::tibble(\n`; + code += `tibble::tibble(\n`; headers.forEach((header, i) => { const values = data.map((row) => formatValue(row[i], i)).join(", "); - code += ` ${header} = c(${values})${ - i < headers.length - 1 ? ",\n" : "\n" - }`; + code += ` ${header} = c(${values})${i < headers.length - 1 ? ",\n" : "\n" + }`; }); code += `)`; } else if (framework === "tribble") { const colWidths = calculateColumnWidths(); - code = `tibble::tribble(\n`; + code += `tibble::tribble(\n`; // Column headers with padding code += @@ -162,21 +164,19 @@ function createRDataFrame(tableData, framework) { // Remove trailing comma and close parentheses code = code.trimEnd().slice(0, -1) + `\n)`; } else if (framework === "data.table") { - code = `data.table::data.table(\n`; + code += `data.table::data.table(\n`; headers.forEach((header, i) => { const values = data.map((row) => formatValue(row[i], i)).join(", "); - code += ` ${header} = c(${values})${ - i < headers.length - 1 ? ",\n" : "\n" - }`; + code += ` ${header} = c(${values})${i < headers.length - 1 ? ",\n" : "\n" + }`; }); code += `)`; } else if (framework === "polars") { - code = `polars::pl$DataFrame(\n`; + code += `polars::pl$DataFrame(\n`; headers.forEach((header, i) => { const values = data.map((row) => formatValue(row[i], i)).join(", "); - code += ` ${header} = c(${values})${ - i < headers.length - 1 ? ",\n" : "\n" - }`; + code += ` ${header} = c(${values})${i < headers.length - 1 ? ",\n" : "\n" + }`; }); code += `)`; }