mirror of
				https://github.com/SphericalKat/medium.rip.git
				synced 2025-11-04 04:25:56 +00:00 
			
		
		
		
	fix(markup): escape text before wrapping with markup
Signed-off-by: Sphericalkat <amolele@gmail.com>
This commit is contained in:
		
							parent
							
								
									2eacfa702a
								
							
						
					
					
						commit
						264410c8d7
					
				@ -2,6 +2,7 @@ package converters
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"html"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"unicode/utf16"
 | 
			
		||||
@ -71,6 +72,10 @@ func ranges(text string, markups []entities.Markup) []RangeWithMarkup {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ConvertMarkup(text string, markups []entities.Markup) string {
 | 
			
		||||
	if len(markups) == 0 {
 | 
			
		||||
		return html.EscapeString(text)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var markedUp strings.Builder
 | 
			
		||||
	for _, r := range ranges(text, markups) {
 | 
			
		||||
		// handle utf-16
 | 
			
		||||
@ -95,18 +100,18 @@ func markupNodeInContainer(child string, markup entities.Markup) string {
 | 
			
		||||
	switch markup.Type {
 | 
			
		||||
	case "A":
 | 
			
		||||
		if markup.Href != nil {
 | 
			
		||||
			return fmt.Sprintf(`<a href="%s">%s</a>`, *markup.Href, child)
 | 
			
		||||
			return fmt.Sprintf(`<a href="%s">%s</a>`, *markup.Href, html.EscapeString(child))
 | 
			
		||||
		} else if markup.UserID != nil {
 | 
			
		||||
			return fmt.Sprintf(`<a href="https://medium.com/u/%s">%s</a>`, markup.UserID, child)
 | 
			
		||||
			return fmt.Sprintf(`<a href="https://medium.com/u/%s">%s</a>`, markup.UserID, html.EscapeString(child))
 | 
			
		||||
		}
 | 
			
		||||
	case "CODE":
 | 
			
		||||
		return fmt.Sprintf(`<code>%s</code>`, child)
 | 
			
		||||
		return fmt.Sprintf(`<code>%s</code>`, html.EscapeString(child))
 | 
			
		||||
	case "EM":
 | 
			
		||||
		return fmt.Sprintf(`<em>%s</em>`, child)
 | 
			
		||||
		return fmt.Sprintf(`<em>%s</em>`, html.EscapeString(child))
 | 
			
		||||
	case "STRONG":
 | 
			
		||||
		return fmt.Sprintf(`<strong>%s</strong>`, child)
 | 
			
		||||
		return fmt.Sprintf(`<strong>%s</strong>`, html.EscapeString(child))
 | 
			
		||||
	default:
 | 
			
		||||
		return fmt.Sprintf(`<code>%s</code>`, child)
 | 
			
		||||
		return fmt.Sprintf(`<code>%s</code>`, html.EscapeString(child))
 | 
			
		||||
	}
 | 
			
		||||
	return child
 | 
			
		||||
	return html.EscapeString(child)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
package converters
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/medium.rip/pkg/entities"
 | 
			
		||||
@ -58,20 +59,32 @@ func TestRanges(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestConvert(t *testing.T) {
 | 
			
		||||
	markup := ConvertMarkup("strong and emphasized only", []entities.Markup{
 | 
			
		||||
		{
 | 
			
		||||
			Type:  "STRONG",
 | 
			
		||||
			Start: 0,
 | 
			
		||||
			End:   10,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Type:  "EM",
 | 
			
		||||
			Start: 7,
 | 
			
		||||
			End:   21,
 | 
			
		||||
		},
 | 
			
		||||
	})
 | 
			
		||||
	jsonData := `{
 | 
			
		||||
		"name": "254a",
 | 
			
		||||
		"text": "Early Flush prevents subsequent changes to the headers (e.g to redirect or change the status code). In the React + NodeJS world, it’s common to delegate redirects and error throwing to a React app rendered after the data has been fetched. This won’t work if you’ve already sent an early <head> tag and a 200 OK status.",
 | 
			
		||||
		"type": "P",
 | 
			
		||||
		"href": null,
 | 
			
		||||
		"layout": null,
 | 
			
		||||
		"markups": [
 | 
			
		||||
			{
 | 
			
		||||
				"title": null,
 | 
			
		||||
				"type": "CODE",
 | 
			
		||||
				"href": null,
 | 
			
		||||
				"userId": null,
 | 
			
		||||
				"start": 287,
 | 
			
		||||
				"end": 293,
 | 
			
		||||
				"anchorType": null
 | 
			
		||||
			}
 | 
			
		||||
		],
 | 
			
		||||
		"iframe": null,
 | 
			
		||||
		"metadata": null
 | 
			
		||||
	}`
 | 
			
		||||
	p := new(entities.Paragraph)
 | 
			
		||||
	_ = json.Unmarshal([]byte(jsonData), p)
 | 
			
		||||
 | 
			
		||||
	if markup != "<strong>strong </strong><em><strong>and</strong></em><em> emphasized</em> only" {
 | 
			
		||||
		t.Errorf("Expected markup to be <strong>strong </strong><em><strong>and</strong></em><em> emphasized</em> only, got %s", markup)
 | 
			
		||||
	}
 | 
			
		||||
	ConvertMarkup(p.Text, p.Markups)
 | 
			
		||||
 | 
			
		||||
	// if markup != "<strong>strong </strong><em><strong>and</strong></em><em> emphasized</em> only" {
 | 
			
		||||
	// 	t.Errorf("Expected markup to be <strong>strong </strong><em><strong>and</strong></em><em> emphasized</em> only, got %s", markup)
 | 
			
		||||
	// }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -107,6 +107,9 @@ func ConvertParagraphs(paragraphs []entities.Paragraph) string {
 | 
			
		||||
			ps.WriteString(fmt.Sprintf("<ul>%s</ul>", listItems))
 | 
			
		||||
		case "P":
 | 
			
		||||
			children := ConvertMarkup(p.Text, p.Markups)
 | 
			
		||||
			if p.Name == "ca5b" {
 | 
			
		||||
				fmt.Println(children)
 | 
			
		||||
			}
 | 
			
		||||
			ps.WriteString(fmt.Sprintf("<p>%s</p>", children))
 | 
			
		||||
		case "PRE":
 | 
			
		||||
			children := ConvertMarkup(p.Text, p.Markups)
 | 
			
		||||
@ -154,9 +157,6 @@ func convertUli(ps []entities.Paragraph) (string, int) {
 | 
			
		||||
 | 
			
		||||
	for _, p := range ps {
 | 
			
		||||
		if p.Type == "ULI" {
 | 
			
		||||
			if p.Text == "Rename the example.env to .env." {
 | 
			
		||||
				fmt.Println("HERE")
 | 
			
		||||
			}
 | 
			
		||||
			children := ConvertMarkup(p.Text, p.Markups)
 | 
			
		||||
			sb.WriteString(fmt.Sprintf("<li>%s</li>", children))
 | 
			
		||||
			count++
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2226
									
								
								response.json
									
									
									
									
									
								
							
							
						
						
									
										2226
									
								
								response.json
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user