dataframe-textual 1.12.0__py3-none-any.whl → 2.0.0__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataframe-textual
3
- Version: 1.12.0
3
+ Version: 2.0.0
4
4
  Summary: Interactive terminal viewer/editor for tabular data
5
5
  Project-URL: Homepage, https://github.com/need47/dataframe-textual
6
6
  Project-URL: Repository, https://github.com/need47/dataframe-textual.git
@@ -65,7 +65,7 @@ A powerful, interactive terminal-based viewer/editor for CSV/TSV/Excel/Parquet/J
65
65
  - 📑 **Duplicate Tab** - Create a copy of the current tab with the same data
66
66
  - 📌 **Freeze Rows/Columns** - Keep important rows and columns visible while scrolling
67
67
  - 🎯 **Cursor Type Cycling** - Switch between cell, row, and column selection modes
68
- - 🔗 **Link Column Creation** - Generate clickable URLs using template expressions with placeholder support
68
+ - 📸 **Take Screenshot** - Capture terminal view as a SVG image
69
69
 
70
70
  ## Installation
71
71
 
@@ -110,7 +110,10 @@ cd dataframe-textual
110
110
  # Install from local source
111
111
  pip install -e .
112
112
 
113
- # Or with development dependencies
113
+ # With Excel support
114
+ pip install -e ".[excel]"
115
+
116
+ # With development dependencies
114
117
  pip install -e ".[excel,dev]"
115
118
  ```
116
119
 
@@ -176,7 +179,7 @@ options:
176
179
  -f, --format {csv,excel,tsv,parquet,json,ndjson}
177
180
  Specify the format of the input files
178
181
  -H, --no-header Specify that input files have no header row
179
- -I, --no-inferrence Do not infer data types when reading CSV/TSV
182
+ -I, --no-inference Do not infer data types when reading CSV/TSV
180
183
  -E, --ignore-errors Ignore errors when reading CSV/TSV
181
184
  -c, --comment-prefix COMMENT_PREFIX
182
185
  Comment lines are skipped when reading CSV/TSV (default: skip none)
@@ -208,7 +211,7 @@ dv -l 3 data_with_meta.csv
208
211
  # Skip 1 row after header (e.g., units row)
209
212
  dv -a 1 data_with_units.csv
210
213
 
211
- # Skip comment lines
214
+ # Skip comment lines (or just -c)
212
215
  dv -c "#" commented_data.csv
213
216
 
214
217
  # Treat specific values as null/missing (e.g., 'NA', 'N/A', '-')
@@ -244,10 +247,12 @@ zcat compressed_data.csv.gz | dv -f csv
244
247
  | `Q` | Close all tabs and app (prompts to save unsaved changes) |
245
248
  | `Ctrl+Q` | Force to quit app (regardless of unsaved changes) |
246
249
  | `Ctrl+T` | Save current tab to file |
250
+ | `w` | Save current tab to file (overwrite without prompt) |
247
251
  | `Ctrl+A` | Save all tabs to file |
252
+ | `W` | Save all tabs to file (overwrite without prompt) |
248
253
  | `Ctrl+D` | Duplicate current tab |
249
254
  | `Ctrl+O` | Open file in a new tab |
250
- | `Double-click tab` | Rename tab |
255
+ | `Double-click` | Rename tab |
251
256
 
252
257
  #### View & Settings
253
258
 
@@ -255,6 +260,7 @@ zcat compressed_data.csv.gz | dv -f csv
255
260
  |-----|--------|
256
261
  | `F1` | Toggle help panel |
257
262
  | `k` | Cycle through dark, light and other themes |
263
+ | `Ctrl+P` -> `Screenshot` | Capture terminal view as a SVG image |
258
264
 
259
265
  ---
260
266
 
@@ -281,7 +287,7 @@ zcat compressed_data.csv.gz | dv -f csv
281
287
  | `U` | Redo last undone action |
282
288
  | `Ctrl+U` | Reset to initial state |
283
289
 
284
- #### Viewing & Display
290
+ #### Display
285
291
 
286
292
  | Key | Action |
287
293
  |-----|--------|
@@ -315,41 +321,45 @@ zcat compressed_data.csv.gz | dv -f csv
315
321
  | `d` | Duplicate current column (appends '_copy' suffix) |
316
322
  | `D` | Duplicate current row |
317
323
 
318
- #### Searching & Filtering
324
+ #### Row Selection
319
325
 
320
326
  | Key | Action |
321
327
  |-----|--------|
322
- | `\` | Search in current column using cursor value and select matching rows |
323
- | `\|` (pipe) | Search in current column with expression and select matching rows |
328
+ | `\` | Select rows wth cell matches or those matching cursor value in current column |
329
+ | `\|` (pipe) | Select rows by expression |
324
330
  | `{` | Go to previous selected row |
325
331
  | `}` | Go to next selected row |
326
- | `/` | Find in current column with cursor value and highlight matching cells |
327
- | `?` | Find in current column with expression and highlight matching cells |
328
- | `n` | Go to next matching cell |
329
- | `N` | Go to previous matching cell |
330
332
  | `'` | Select/deselect current row |
331
333
  | `t` | Toggle row selections (invert) |
332
334
  | `T` | Clear all row selections and/or cell matches |
333
- | `"` (quote) | Filter to selected rows (and remove others) |
334
- | `v` | View rows (and hide others) by row selections and/or cell matches or cursor value |
335
- | `V` | View rows (and hide others) by expression |
336
-
337
- #### SQL Interface
338
-
339
- | Key | Action |
340
- |-----|--------|
341
- | `l` | Simple SQL interface (select columns & where clause) |
342
- | `L` | Advanced SQL interface (full SQL query with syntax highlight) |
343
335
 
344
336
  #### Find & Replace
345
337
 
346
338
  | Key | Action |
347
339
  |-----|--------|
340
+ | `/` | Find in current column with cursor value and highlight matching cells |
341
+ | `?` | Find in current column with expression and highlight matching cells |
342
+ | `n` | Go to next matching cell |
343
+ | `N` | Go to previous matching cell |
348
344
  | `;` | Find across all columns with cursor value |
349
345
  | `:` | Find across all columns with expression |
350
346
  | `r` | Find and replace in current column (interactive or replace all) |
351
347
  | `R` | Find and replace across all columns (interactive or replace all) |
352
348
 
349
+ #### View & Filter
350
+ | Key | Action |
351
+ |-----|--------|
352
+ | `"` (quote) | Filter selected rows (others removed) |
353
+ | `v` | View selected rows (others hidden) |
354
+ | `V` | View selected by expression (others hidden) |
355
+
356
+ #### SQL Interface
357
+
358
+ | Key | Action |
359
+ |-----|--------|
360
+ | `l` | Simple SQL interface (select columns & where clause) |
361
+ | `L` | Advanced SQL interface (full SQL query with syntax highlight) |
362
+
353
363
  #### Sorting (supporting multiple columns)
354
364
 
355
365
  | Key | Action |
@@ -401,35 +411,23 @@ Press `Enter` on any row to open a modal showing all column values for that row.
401
411
  Useful for examining wide datasets where columns don't fit well on screen.
402
412
 
403
413
  **In the Row Detail Modal**:
404
- - Press `v` to **view** all rows containing the selected column value (and hide others)
405
- - Press `"` to **filter** all rows containing the selected column value (and remove others)
414
+ - Press `v` to **view** all rows containing the selected column value (others hidden but preserved)
415
+ - Press `"` to **filter** all rows containing the selected column value (others removed)
416
+ - Press `{` to move to the **previous row** (respects hidden rows)
417
+ - Press `}` to move to the **next row** (respects hidden rows)
406
418
  - Press `q` or `Escape` to close the modal
407
419
 
408
- ### 3. Search & Select/Highlight
420
+ ### 3. Row Selection
409
421
 
410
- The application provides multiple search modes for different use cases:
422
+ The application provides multiple modes for selecting rows (marks it for filtering or viewing):
411
423
 
412
- **Search Operations** - Search by value/expression in current column and select rows:
413
- - `\` - Search cursor value
414
- - `|` - Opens dialog to search with custom expression
415
-
416
- **Find Operations** - Find by value/expression and highlight matching cells:
417
- - `/` - Find cursor value within current column
418
- - `?` - Open dialog to search current column with expression
419
- - `;` - Find cursor value across all columns
420
- - `:` - Open dialog to search all columns with expression
421
-
422
- **Selection & Filtering**:
423
- - `'` - Select/deselect current row (marks it for filtering or viewing)
424
+ - `\` - Select rows with cell matches or those matching cursor value in current column (respects data type)
425
+ - `|` - Opens dialog to select rows with custom expression
426
+ - `'` - Select/deselect current row
424
427
  - `t` - Flip selections of all rows
425
428
  - `T` - Clear all row selections and cell matches
426
- - `"` - **Filter** to rows that are selected and contain matching cells (removes all others permanently)
427
- - `v` - **View** rows that are selected or contain matching cells (others hidden but preserved)
428
- - `V` - **View** rows using custom expression (others hidden but preserved)
429
-
430
- **Note**:
431
- - The `"` (Filter) and `v`/`V` (View) operations appear similar but have very different effects on your data. See section 3b "Filter vs. View - Understanding the Difference" for detailed guidance on when to use each.
432
- - If currently there are no selectet rows and no matching cells, the `"` (Filter) and `v` (View) will use cursor value for search.
429
+ - `{` - Go to previous selected row
430
+ - `}` - Go to next selected row
433
431
 
434
432
  **Advanced Matching Options**:
435
433
 
@@ -437,38 +435,23 @@ When searching or finding, you can use checkboxes in the dialog to enable:
437
435
  - **Match Nocase**: Ignore case differences
438
436
  - **Match Whole**: Match complete value, not partial substrings or words
439
437
 
440
- These options work with plain text searches. Use Polars regex patterns in expressions for more control:
441
- - **Case-insensitive matching in expressions**: Use `(?i)` prefix in regex (e.g., `(?i)john`)
442
- - **Word boundaries in expressions**: Use `\b` in regex (e.g., `\bjohn\b` matches whole word)
438
+ These options work with plain text searches. Use Polars regex patterns in expressions for more control. For example, use `(?i)` prefix in regex (e.g., `(?i)john`) for case-insensitive matching.
443
439
 
444
440
  **Quick Tips:**
445
- - Search results highlight matching rows/cells in **red**
441
+ - Search results highlight matching rows in **red**
442
+ - Use expression for advanced selection (e.g., $attack > $defense)
446
443
  - Multiple searches **accumulate** - each new search adds to the selections or matches
447
444
  - Type-aware matching automatically converts values. Resort to string comparison if conversion fails
448
445
  - Use `u` to undo any search or filter
449
446
 
450
- ### 3b. Filter vs. View
451
-
452
- Both operations show selected rows, but with fundamentally different effects:
453
-
454
- | Operation | Keyboard | Effect | Data Preserved |
455
- |-----------|----------|--------|-----------------|
456
- | **View** | `v`, `V` | Hides non-matching rows | Yes (hidden, can be restored by `H`) |
457
- | **Filter** | `"` | Removes non-matching rows | No (permanently deleted) |
458
-
459
- **When to use View** (`v` or `V`):
460
- - Exploring or analyzing data safely
461
- - Switching between different perspectives
462
- - Press `H` to restore hidden rows (and hidden columns)
463
-
464
- **When to use Filter** (`"`):
465
- - Cleaning data (removing unwanted rows)
466
- - Creating a trimmed dataset for export
467
- - Permanent row removal from your dataframe
468
-
469
- Both support full undo with `u`.
470
-
471
- ### 4. Replace
447
+ ### 4. Find & Replace
448
+ **Find Operations** - Find by value/expression and highlight matching cells:
449
+ - `/` - Find cursor value within current column (respects data type)
450
+ - `?` - Open dialog to search current column with expression
451
+ - `;` - Find cursor value across all columns
452
+ - `:` - Open dialog to search all columns with expression
453
+ - `n` - Go to next matching cell
454
+ - `N` - Go to previous matching cell
472
455
 
473
456
  Replace values in current column (`r`) or across all columns (`R`).
474
457
 
@@ -493,9 +476,32 @@ When you press `r` or `R`, enter:
493
476
  - Type `NULL` to replace null/missing values
494
477
  - Use `Match Nocase` for case-insensitive matching
495
478
  - Use `Match Whole` to avoid partial replacements
496
- - Supprot undo (`u`)
479
+ - Support undo (`u`)
480
+
481
+ ### 5. Filter vs. View
497
482
 
498
- ### 5. [Polars Expressions](https://docs.pola.rs/api/python/stable/reference/expressions/index.html)
483
+ Both operations show rows that are selected or contain matching cells, but with fundamentally different effects:
484
+
485
+ | Operation | Keyboard | Effect | Data Preserved |
486
+ |-----------|----------|--------|-----------------|
487
+ | **View** | `v`, `V` | Hides non-matching rows | Yes (hidden, can be restored by `H`) |
488
+ | **Filter** | `"` | Removes non-matching rows | No (permanently deleted) |
489
+
490
+ **When to use View** (`v` or `V`):
491
+ - Exploring or analyzing data safely
492
+ - Switching between different perspectives
493
+ - Press `H` to restore hidden rows (and hidden columns)
494
+
495
+ **When to use Filter** (`"`):
496
+ - Cleaning data (removing unwanted rows)
497
+ - Creating a trimmed dataset for export
498
+ - Permanent row removal from your dataframe
499
+
500
+ **Note**:
501
+ - If currently there are no selected rows and no matching cells, the `"` (Filter) and `v` (View) will use cursor value for search.
502
+ - Both support full undo with `u`.
503
+
504
+ ### 6. [Polars Expressions](https://docs.pola.rs/api/python/stable/reference/expressions/index.html)
499
505
 
500
506
  Complex values or filters can be specified via Polars expressions, with the following adaptions for convenience:
501
507
 
@@ -503,6 +509,7 @@ Complex values or filters can be specified via Polars expressions, with the foll
503
509
  - `$_` - Current column (based on cursor position)
504
510
  - `$1`, `$2`, etc. - Column by 1-based index
505
511
  - `$age`, `$salary` - Column by name (use actual column names)
512
+ - `` $`col name` `` - Column by name with spaces (backtick quoted)
506
513
 
507
514
  **Row References:**
508
515
  - `$#` - Current row index (1-based)
@@ -528,6 +535,7 @@ Complex values or filters can be specified via Polars expressions, with the foll
528
535
  - `($score >= 80) & ($score <= 90)` - Score between 80 and 90
529
536
  - `~($status == 'inactive')` - Status is not inactive
530
537
  - `$revenue > $expenses` - Revenue exceeds expenses
538
+ - ``$`product id` > 100`` - Product ID with spaces in column name greater than 100
531
539
 
532
540
  **String Matching:** ([Polars string API reference](https://docs.pola.rs/api/python/stable/reference/series/string.html))
533
541
  - `$name.str.contains("John")` - Name contains "John" (case-sensitive)
@@ -550,14 +558,32 @@ Complex values or filters can be specified via Polars expressions, with the foll
550
558
  - Use column names that match exactly (case-sensitive)
551
559
  - Use parentheses to clarify complex expressions: `($a & $b) | ($c & $d)`
552
560
 
553
- ### 6. Sorting
561
+ ### 7. Sorting
554
562
 
555
563
  - Press `[` to sort current column ascending
556
564
  - Press `]` to sort current column descending
557
565
  - Multi-column sorting supported (press multiple times on different columns)
558
566
  - Press same key twice to remove the column from sorting
559
567
 
560
- ### 7. Frequency Distribution
568
+ ### 8. Dataframe & Column Metadata
569
+
570
+ View quick metadata about your dataframe and columns to understand their structure and content.
571
+
572
+ **Dataframe Metadata** (`m`):
573
+ - Press `m` to open a modal displaying:
574
+ - **Rows** - Total number of rows in the dataframe
575
+ - **Columns** - Total number of columns in the dataframe
576
+
577
+ **Column Metadata** (`M`):
578
+ - Press `M` to open a modal displaying details for all columns:
579
+ - **ID** - 1-based column index
580
+ - **Name** - Column name
581
+ - **Type** - Data type (e.g., Int64, String, Float64, Boolean)
582
+
583
+ **In Metadata Modals**:
584
+ - Press `q` or `Escape` to close
585
+
586
+ ### 9. Frequency Distribution
561
587
 
562
588
  Press `F` to see value distributions of the current column. The modal shows:
563
589
  - Value, Count, Percentage, Histogram
@@ -565,8 +591,8 @@ Press `F` to see value distributions of the current column. The modal shows:
565
591
 
566
592
  **In the Frequency Table**:
567
593
  - Press `[` and `]` to sort by any column (value, count, or percentage)
568
- - Press `v` to **filter** all rows with the selected value (others hidden but preserved)
569
- - Press `"` to **exclude** all rows containing the selected value (others removed)
594
+ - Press `v` to **view** all rows containing the selected value (others hidden but preserved)
595
+ - Press `"` to **filter** all rows containing the selected value (others removed)
570
596
  - Press `q` or `Escape` to close the frequency table
571
597
 
572
598
  This is useful for:
@@ -575,17 +601,11 @@ This is useful for:
575
601
  - Identifying rare or common values
576
602
  - Finding the most/least frequent entries
577
603
 
578
- ### 8. Column & Dataframe Statistics
579
-
580
- Press `s` to see summary statistics for the current column, or press `S` for statistics across the entire dataframe.
581
-
582
- **Column Statistics** (`s`):
583
- - Shows calculated statistics using Polars' `describe()` method
584
- - Displays: count, null count, mean, median, std, min, max, etc.
604
+ ### 10. Column & Dataframe Statistics
585
605
 
586
- **Dataframe Statistics** (`S`):
587
- - Shows statistics for all numeric and applicable columns simultaneously
588
- - Displays: count, null count, mean, median, std, min, max, etc.
606
+ Show summary statistics (count, null count, mean, median, std, min, max, etc.) using Polars' `describe()` method.
607
+ - `s` for the current column
608
+ - `S` for all columns across the entire dataframe
589
609
 
590
610
  **In the Statistics Modal**:
591
611
  - Press `q` or `Escape` to close the statistics table
@@ -599,7 +619,7 @@ This is useful for:
599
619
  - Quick statistical summaries without external tools
600
620
  - Comparing statistics across columns
601
621
 
602
- ### 9. Data Editing
622
+ ### 11. Data Editing
603
623
 
604
624
  **Edit Cell** (`e` or **Double-click**):
605
625
  - Opens modal for editing current cell
@@ -623,41 +643,31 @@ This is useful for:
623
643
  **Delete Column** (`-`):
624
644
  - Removes the entire column from display and dataframe
625
645
 
626
- ### 10. Hide & Show Columns
646
+ **Add Empty Column** (`a`):
647
+ - Adds a new empty column after the current column
648
+ - Column is initialized with NULL values for all rows
627
649
 
628
- **Hide Column** (`h`):
629
- - Temporarily hides the current column from display
630
- - Column data is preserved in the dataframe
631
- - Hidden columns are included in saves
650
+ **Add Column with Value/Expression** (`A`):
651
+ - Opens dialog to specify column name and initial value/expression
652
+ - Value can be a constant (e.g., `0`, `"text"`) or a Polars expression (e.g., `$age * 2`)
653
+ - Expression can reference other columns and perform calculations
654
+ - Useful for creating derived columns or adding data with formulas
632
655
 
633
- **Show Hidden Columns** (`H`):
634
- - Restores all previously hidden columns (and hidden rows) to the display
635
-
636
- ### 11. Duplicate Column
637
-
638
- Press `d` to duplicate the current column:
656
+ **Duplicate Column** (`d`):
639
657
  - Creates a new column immediately after the current column
640
658
  - New column has '_copy' suffix (e.g., 'price' → 'price_copy')
641
- - Duplicate preserves all data from original column
642
- - New column is inserted into the dataframe
659
+ - Useful for creating backups before transformation
643
660
 
644
- This is useful for:
645
- - Creating backup copies of columns before transformation
646
- - Working with alternative versions of column data
647
- - Comparing original vs. processed column values side-by-side
648
-
649
- ### 12. Duplicate Row
650
-
651
- Press `D` to duplicate the current row:
661
+ **Duplicate Row** (`D`):
652
662
  - Creates a new row immediately after the current row
653
663
  - Duplicate preserves all data from original row
654
- - New row is inserted into the dataframe
664
+ - Useful for batch adding similar records
655
665
 
656
- This is useful for:
657
- - Creating variations of existing data records
658
- - Batch adding similar rows with modifications
666
+ **Hide/Show Columns** (`h` / `H`):
667
+ - `h` - Temporarily hide current column (data preserved)
668
+ - `H` - Restore all hidden columns and rows
659
669
 
660
- ### 13. Column & Row Reordering
670
+ ### 12. Column & Row Reordering
661
671
 
662
672
  **Move Columns**: `Shift+←` and `Shift+→`
663
673
  - Swaps adjacent columns
@@ -667,12 +677,12 @@ This is useful for:
667
677
  - Swaps adjacent rows
668
678
  - Reorder is preserved when saving
669
679
 
670
- ### 14. Freeze Rows and Columns
680
+ ### 13. Freeze Rows and Columns
671
681
 
672
682
  Press `z` to open the dialog:
673
683
  - Enter number of fixed rows and/or columns to keep top rows/columns visible while scrolling
674
684
 
675
- ### 14.5. Thousand Separator Toggle
685
+ ### 14. Thousand Separator Toggle
676
686
 
677
687
  Press `,` to toggle thousand separator formatting for numeric data:
678
688
  - Applies to **integer** and **float** columns
@@ -684,10 +694,7 @@ Press `,` to toggle thousand separator formatting for numeric data:
684
694
 
685
695
  ### 15. Save File
686
696
 
687
- Press `Ctrl+S` to save:
688
- - Save filtered, edited, or sorted data back to file
689
- - Choose filename in modal dialog
690
- - Confirm if file already exists
697
+ Press `Ctrl+S` to save filtered, edited, or sorted data back to file
691
698
 
692
699
  ### 16. Undo/Redo/Reset
693
700
 
@@ -736,7 +743,7 @@ Press `K` to cycle through selection modes:
736
743
  The SQL interface provides two modes for querying your dataframe:
737
744
 
738
745
  #### Simple SQL Interface (`l`)
739
- Select specific columns and apply WHERE conditions without writing full SQL:
746
+ SELECT specific columns and apply WHERE conditions without writing full SQL:
740
747
  - Choose which columns to include in results
741
748
  - Specify WHERE clause for filtering
742
749
  - Ideal for quick filtering and column selection
@@ -752,23 +759,21 @@ Execute complete SQL queries for advanced data manipulation:
752
759
  **Examples:**
753
760
  ```sql
754
761
  -- Filter and select specific rows and/or columns
755
- SELECT name, age FROM self WHERE age > 30
756
-
757
- -- Aggregate with GROUP BY
758
- SELECT department, COUNT(*) as count, AVG(salary) as avg_salary
762
+ SELECT name, age
759
763
  FROM self
760
- GROUP BY department
764
+ WHERE age > 30
761
765
 
762
- -- Complex filtering with multiple conditions
766
+ -- Use backticks (`) for column names with spaces
763
767
  SELECT *
764
768
  FROM self
765
- WHERE (age > 25 AND salary > 50000) OR department = 'Management'
769
+ WHERE `product id` = 7
766
770
  ```
767
771
 
768
772
  ### 20. Clipboard Operations
769
773
 
770
- Copies value to system clipboard with `pbcopy` on macOS and `xclip` on Linux
771
- **Note** May require a X server to work
774
+ Copies value to system clipboard with `pbcopy` on macOS and `xclip` on Linux.
775
+
776
+ **Note** May require a X server to work.
772
777
 
773
778
  - Press `c` to copy cursor value
774
779
  - Press `Ctrl+C` to copy column values
@@ -783,16 +788,11 @@ Press `@` to create a new column containing dynamically generated URLs using tem
783
788
 
784
789
  The link template supports multiple placeholder types for maximum flexibility:
785
790
 
786
- - **`$_`** - Current column (the column where cursor was when `@` was pressed)
787
- - Example: `https://example.com/search/$_` - Uses values from the current column
791
+ - **`$_`** - Current column (the column where cursor was when `@` was pressed), e.g., `https://example.com/search/$_` - Uses values from the current column
788
792
 
789
- - **`$1`, `$2`, `$3`, etc.** - Column by 1-based position index
790
- - Example: `https://example.com/product/$1/details/$2` - Uses 1st and 2nd columns
791
- - Index corresponds to column display order (left-to-right)
793
+ - **`$1`, `$2`, `$3`, etc.** - Column by 1-based position index, e.g., `https://example.com/product/$1/details/$2` - Uses 1st and 2nd columns
792
794
 
793
- - **`$name`** - Column by name (use actual column names)
794
- - Example: `https://pubchem.ncbi.nlm.nih.gov/search?q=$product_id` - Uses `product_id` column
795
- - Example: `https://example.com/$region/$city/data` - Uses `region` and `city` columns
795
+ - **`$name`** - Column by name (use actual column names), e.g., `https://example.com/$region/$city/data` - Uses `region` and `city` columns
796
796
 
797
797
  **Features:**
798
798
  - **Multiple Placeholders**: Mix and match placeholders in a single template
@@ -812,10 +812,12 @@ Manage multiple files and dataframes simultaneously with tabs.
812
812
  - **`<`** - Move to previous tab
813
813
  - **`b`** - Cycle through tabs
814
814
  - **`B`** - Toggle tab bar visibility
815
- - **`Double-click tab`** - Rename the tab
815
+ - **`Double-click`** - Rename the tab
816
816
  - **`Ctrl+D`** - Duplicate current tab (creates a copy with same data and state)
817
817
  - **`Ctrl+T`** - Save current tab to file
818
+ - **`w`** - Save current tab to file (overwrite without prompt)
818
819
  - **`Ctrl+A`** - Save all tabs in a single Excel file
820
+ - **`W`** - Save all tabs to file (overwrite without prompt)
819
821
  - **`q`** - Close current tab (closes tab, prompts to save if unsaved changes)
820
822
  - **`Q`** - Close all tabs and exit app (prompts to save tabs with unsaved changes)
821
823
  - **`Ctrl+Q`** - Force to quit app regardless of unsaved changes
@@ -0,0 +1,14 @@
1
+ dataframe_textual/__init__.py,sha256=E53fW1spQRA4jW9grxSqPEmoe9zofzr6twdveMbt_W8,1310
2
+ dataframe_textual/__main__.py,sha256=vgHjpSsHBF34UN46iMgu_EiebZUzxWwJZ_ngOU3nQvI,3412
3
+ dataframe_textual/common.py,sha256=gpNNY5ZePJkJPf-YoLSCHKaBpdXQ1yW2iSKYV6zZYUo,27908
4
+ dataframe_textual/data_frame_help_panel.py,sha256=UEtj64XsVRdtLzuwOaITfoEQUkAfwFuvpr5Npip5WHs,3381
5
+ dataframe_textual/data_frame_table.py,sha256=4tnE6apxQ_EJoSvFwq4ZuDqKTHSBUcQVFYSDbweIK98,147612
6
+ dataframe_textual/data_frame_viewer.py,sha256=fkiQ0OGi2rrE06VAVJuAM_9wwmqLY1AZouwEMNoDmy8,22367
7
+ dataframe_textual/sql_screen.py,sha256=P3j1Fv45NIKEYo9adb7NPod54FaU-djFIvCUMMHbvjY,7534
8
+ dataframe_textual/table_screen.py,sha256=XlVxU_haCxPoA41ZIDcwixOg341Wf35JrFwPoCTnMzE,19033
9
+ dataframe_textual/yes_no_screen.py,sha256=NI7Zt3rETDWYiT5CH_FDy7sIWkZ7d7LquaZZbX79b2g,26400
10
+ dataframe_textual-2.0.0.dist-info/METADATA,sha256=9prx6qymZRsp42WCJbl1S9qluBkY2IBRDMN-JHiBL_U,29306
11
+ dataframe_textual-2.0.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
12
+ dataframe_textual-2.0.0.dist-info/entry_points.txt,sha256=R_GoooOxcq6ab4RaHiVoZ4zrZJ-phMcGmlL2rwqncW8,107
13
+ dataframe_textual-2.0.0.dist-info/licenses/LICENSE,sha256=AVTg0gk1X-LHI-nnHlAMDQetrwuDZK4eypgSMDO46Yc,1069
14
+ dataframe_textual-2.0.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.27.0
2
+ Generator: hatchling 1.28.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,14 +0,0 @@
1
- dataframe_textual/__init__.py,sha256=IFPb8RMUgghw0eRomehkkC684Iny_gs1VkiZMQ5ZpFk,813
2
- dataframe_textual/__main__.py,sha256=VRH80gWJGLxfURg1GiN3cwWI7O_TQM5PqhqXbUCC1bg,3253
3
- dataframe_textual/common.py,sha256=g_kMgph84ush-FLgclxYKL9PF9l9hRPMk-AVfZEWGSo,25416
4
- dataframe_textual/data_frame_help_panel.py,sha256=iEKaur-aH1N_oqHu-vMwEEjfkjQiThK24UO5izsOiW0,3416
5
- dataframe_textual/data_frame_table.py,sha256=hAbqT3m8BAtanPOS2Wk_1YelynT1-y50oVXyHNY5gmE,128235
6
- dataframe_textual/data_frame_viewer.py,sha256=3r7vy3zlcqxcqzDafMK22Rcw_3mkdHmNit3avXXgXlI,21246
7
- dataframe_textual/sql_screen.py,sha256=Pk2ENyDVkOXBLcsEMeXOEMkdzRH_NJ3T1biVUcY8j4Q,7411
8
- dataframe_textual/table_screen.py,sha256=IhaGAWjzXaLvvc4JLBlAM6_Hl3t7du7vuHQYhrvW_5o,18055
9
- dataframe_textual/yes_no_screen.py,sha256=qbuhywLIGBL52zQfSGVZQCfsdSmDz9JH6C4YFLrLYKU,26233
10
- dataframe_textual-1.12.0.dist-info/METADATA,sha256=tNT_ZtTFSKkEJFjXcC9inRozV0mSL8k5s213VEqJmu4,29313
11
- dataframe_textual-1.12.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
12
- dataframe_textual-1.12.0.dist-info/entry_points.txt,sha256=R_GoooOxcq6ab4RaHiVoZ4zrZJ-phMcGmlL2rwqncW8,107
13
- dataframe_textual-1.12.0.dist-info/licenses/LICENSE,sha256=AVTg0gk1X-LHI-nnHlAMDQetrwuDZK4eypgSMDO46Yc,1069
14
- dataframe_textual-1.12.0.dist-info/RECORD,,