{{ summaryTitle }}
{{ summaryValue }}

{{ summaryLine }}

Scope{{ resultsReady ? computation.values.root_label : '—' }} Style{{ resultsReady ? computation.values.style_label : '—' }} Review notes{{ resultsReady ? formatCount(computation.values.warning_count) : '—' }}

{{ primaryCopyAnnouncement }}

HTML extraction inputs
Paste HTML or load one local text file. The source is parsed locally and never executed.
Drop HTML, HTM, or TXT onto the textarea.
{{ fileStatus }}
Ordered lists keep numbers; this marker applies to unordered items.
Choose the delimiter or row-label shape used for table cells.
Allow zero to three blank lines between readable text blocks.
blank
Disable only when boundary whitespace is required by the next system.
{{ computation.values.plain_text }}

{{ textExportAnnouncement }}

{{ chartExportAnnouncement }}

The chart renderer is unavailable. The same counts remain available in the cleanup ledger.

CheckValueDetailCopy
{{ row.label }}{{ row.value }}{{ row.detail }}

{{ tableExportAnnouncement }}

ItemTextDestinationTreatmentCopy
{{ row.item }}{{ row.text }}{{ row.destination }}{{ row.treatment }}

{{ tableExportAnnouncement }}

Introduction:

Plain text keeps words but has no native way to preserve HTML structure. A heading, a list item, a table cell, a link destination, and an image description can all look useful on a page, yet each needs a different text convention after the markup disappears. Copying an article, email, table, or template therefore involves more judgment than deleting everything between angle brackets.

HTML tags are the source markers, while elements are the document parts formed from those markers. Working from the element tree preserves relationships that a regular-expression replacement can easily flatten. List items can keep bullets or numbers, block elements can create readable breaks, and table cells can remain separated instead of running together.

  • Readable content includes the words and spacing a person needs after the layout is gone.
  • Reference content includes link destinations and meaningful image alternative text.
  • Audit content includes hidden text, entity spellings, and inert script or style text that ordinary copy would normally omit.

Scope changes the answer as much as formatting does. Extracting an article or main region can avoid menus and footers, while extracting the body may be better for an email or fragment whose whole content matters. Tables and nested navigation deserve a manual check because plain text cannot fully reproduce merged cells, header associations, or a visual hierarchy.

Tag stripping is not HTML sanitization. A plain-text result is useful for reading and copying, but it does not make the original markup safe to render again. Untrusted HTML still needs context-appropriate sanitization and output encoding at its destination.

How to Use This Tool:

Choose the content that should survive first, then set only the structure and reference policies needed by the next workflow.

  1. Paste HTML into HTML source, drop a supported text file, or browse for one HTML, HTM, or TXT file no larger than 1 MiB.
  2. Choose Content scope. Auto content root prefers an article or main region, Body or fragment keeps the parsed body, and Document title plus body also prepends the page title.
  3. Select Output style, then decide how links, image alternative text, hidden content, script or style blocks, and character entities should be treated.
  4. Open Advanced only when list markers, table delimiters, blank-line limits, or outer whitespace affect the handoff.
  5. Read Plain text beside the cleanup and reference ledgers. If the result is empty or unexpectedly short, review the selected scope and any warnings about hidden material, removed blocks, unsafe URLs, or missing alternative text.

Interpreting Results:

The plain-text output is ready to copy only when its structure still makes sense without the page. Check the first heading, list order, table rows, important destinations, and image descriptions. A neat paragraph can still be incomplete if the selected scope skipped the useful region or a meaningful image had no alternative text.

The ledgers explain why content changed. Use the cleanup evidence to confirm scope, counts, spacing, hidden-content policy, and removed blocks. Use the reference evidence to find empty labels, missing image text, or destinations suppressed because they used javascript:, vbscript:, or data:.

Technical Details:

HTML-to-text conversion is an ordered transformation over a parsed tree. Text nodes provide the characters, element names provide structural boundaries, and attributes supply link destinations, image alternative text, visibility clues, and other context. The source markup is never executed during this process.

Transformation Core:

HTML-to-text transformation stages
Stage Governing rule Important limit
Parse Comments and declarations are omitted while tags, attributes, nesting, and text become a document tree. Malformed source is handled by a bounded local parser, so its tree may differ from a full browser HTML parser.
Select scope Automatic scope prefers article, main, role="main", or common article-content classes before falling back to the body or fragment. A broad body can include navigation, banners, or footer copy.
Render nodes Block elements create text boundaries, ordered lists receive numbers, unordered lists use the chosen marker, and tables use tabs, pipes, or labeled row lines. Visual layout and merged-cell relationships do not survive as plain text.
Handle references Links keep visible text and may add a safe destination; images may contribute alternative text and an optional safe source. Unsafe URL schemes are suppressed, but this narrow check is not a complete URL security policy.
Normalize Whitespace becomes readable paragraphs, one non-empty block per line, or one compact line. Readable mode keeps zero to three blank lines and may trim outer whitespace. Compact mode collapses all whitespace and ignores the blank-line setting.

Hidden elements are detected through the hidden attribute, aria-hidden="true", hidden inputs, and simple inline display:none or visibility:hidden declarations. This does not reproduce a complete browser style calculation, so stylesheet-driven visibility outside those cases may not be recognized.

Entity decoding covers numeric references and a practical set of common named references. Preserving entities leaves their source tokens intact for escaping review. For links, Markdown output percent-encodes a closing parenthesis in the destination, and reference mode numbers safe destinations at the end of the text.

Input is limited to 1,048,576 characters, and local file loading uses the same 1 MiB ceiling. Counts in the structure and cleanup evidence describe the selected content root rather than guaranteeing that every source element appeared in the final text.

Privacy and Limits:

Pasted HTML and selected files are processed in the browser. They are not sent to a conversion service, but anything copied or downloaded can still contain private text, URLs, identifiers, or image descriptions.

  • Review tables, nested lists, menus, and stylesheet-hidden content after conversion because their visual meaning may be reduced.
  • Keeping script, style, template, or noscript text is an audit choice. It does not execute that text and is usually unsuitable for reader-facing copy.
  • Use a maintained sanitizer and context-specific encoding if the original HTML will be rendered again.

Worked Examples:

Email copied into a support ticket

A message with a heading, two links, a delivery image, hidden routing text, and an embedded script block works well with readable paragraphs, appended URLs, alternative text, skipped hidden content, and removed script or style blocks. The result keeps the customer-facing message while the ledgers show exactly what was left out.

Table prepared for a spreadsheet

Tab-separated rows preserve cell boundaries well enough for pasting into columns. Check every row afterward, especially when the source used merged cells or multi-row headers, because those relationships are not encoded in the flattened text.

References: