Compare commits

..

No commits in common. "527fd069df08bc7158e73fdb15e70669b3d7ab09" and "c72340490d72a3c3c9d9f7fcf674baf615e1def5" have entirely different histories.

7 changed files with 39 additions and 57 deletions

View file

@ -9,6 +9,7 @@ import (
"strings" "strings"
"codeflow.dananglin.me.uk/apollo/enbas/internal/model" "codeflow.dananglin.me.uk/apollo/enbas/internal/model"
"codeflow.dananglin.me.uk/apollo/enbas/internal/utilities"
) )
func (p Printer) PrintAccount(account model.Account, relationship *model.AccountRelationship, preferences *model.Preferences) { func (p Printer) PrintAccount(account model.Account, relationship *model.AccountRelationship, preferences *model.Preferences) {
@ -27,11 +28,11 @@ func (p Printer) PrintAccount(account model.Account, relationship *model.Account
builder.WriteString("\n" + p.fieldFormat("Statuses:")) builder.WriteString("\n" + p.fieldFormat("Statuses:"))
builder.WriteString(" " + strconv.Itoa(account.StatusCount)) builder.WriteString(" " + strconv.Itoa(account.StatusCount))
builder.WriteString("\n\n" + p.headerFormat("BIOGRAPHY:")) builder.WriteString("\n\n" + p.headerFormat("BIOGRAPHY:"))
builder.WriteString(p.convertHTMLToText(account.Note, true)) builder.WriteString(utilities.WrapLines(utilities.ConvertHTMLToText(account.Note), "\n", p.maxTerminalWidth))
builder.WriteString("\n\n" + p.headerFormat("METADATA:")) builder.WriteString("\n\n" + p.headerFormat("METADATA:"))
for _, field := range account.Fields { for _, field := range account.Fields {
builder.WriteString("\n" + p.fieldFormat(field.Name) + ": " + p.convertHTMLToText(field.Value, false)) builder.WriteString("\n" + p.fieldFormat(field.Name) + ": " + utilities.ConvertHTMLToText(field.Value))
} }
builder.WriteString("\n\n" + p.headerFormat("ACCOUNT URL:")) builder.WriteString("\n\n" + p.headerFormat("ACCOUNT URL:"))
@ -79,7 +80,7 @@ func (p Printer) accountRelationship(relationship *model.AccountRelationship) st
if relationship.PrivateNote != "" { if relationship.PrivateNote != "" {
builder.WriteString("\n\n" + p.headerFormat("YOUR PRIVATE NOTE ABOUT THIS ACCOUNT:")) builder.WriteString("\n\n" + p.headerFormat("YOUR PRIVATE NOTE ABOUT THIS ACCOUNT:"))
builder.WriteString("\n" + p.wrapLines(relationship.PrivateNote, 0)) builder.WriteString("\n" + utilities.WrapLines(relationship.PrivateNote, "\n", p.maxTerminalWidth))
} }
return builder.String() return builder.String()

View file

@ -8,6 +8,7 @@ import (
"strings" "strings"
"codeflow.dananglin.me.uk/apollo/enbas/internal/model" "codeflow.dananglin.me.uk/apollo/enbas/internal/model"
"codeflow.dananglin.me.uk/apollo/enbas/internal/utilities"
) )
func (p Printer) PrintInstance(instance model.InstanceV2) { func (p Printer) PrintInstance(instance model.InstanceV2) {
@ -17,13 +18,13 @@ func (p Printer) PrintInstance(instance model.InstanceV2) {
builder.WriteString("\n" + instance.Title) builder.WriteString("\n" + instance.Title)
builder.WriteString("\n\n" + p.headerFormat("INSTANCE DESCRIPTION:")) builder.WriteString("\n\n" + p.headerFormat("INSTANCE DESCRIPTION:"))
builder.WriteString("\n" + p.wrapLines(instance.DescriptionText, 0)) builder.WriteString("\n" + utilities.WrapLines(instance.DescriptionText, "\n", p.maxTerminalWidth))
builder.WriteString("\n\n" + p.headerFormat("DOMAIN:")) builder.WriteString("\n\n" + p.headerFormat("DOMAIN:"))
builder.WriteString("\n" + instance.Domain) builder.WriteString("\n" + instance.Domain)
builder.WriteString("\n\n" + p.headerFormat("TERMS AND CONDITIONS:")) builder.WriteString("\n\n" + p.headerFormat("TERMS AND CONDITIONS:"))
builder.WriteString("\n" + p.wrapLines(instance.TermsText, 2)) builder.WriteString("\n" + utilities.WrapLines(instance.TermsText, "\n ", p.maxTerminalWidth))
builder.WriteString("\n\n" + p.headerFormat("VERSION:")) builder.WriteString("\n\n" + p.headerFormat("VERSION:"))
builder.WriteString("\nRunning GoToSocial " + instance.Version) builder.WriteString("\nRunning GoToSocial " + instance.Version)

View file

@ -71,8 +71,8 @@ func (p Printer) pollOptions(poll model.Poll) string {
} }
func (p Printer) pollMeter(votage float64) string { func (p Printer) pollMeter(votage float64) string {
numVoteBlocks := int(math.Floor(float64(p.lineWrapCharacterLimit) * votage)) numVoteBlocks := int(math.Floor(float64(p.maxTerminalWidth) * votage))
numBackgroundBlocks := p.lineWrapCharacterLimit - numVoteBlocks numBackgroundBlocks := p.maxTerminalWidth - numVoteBlocks
voteBlockColor := p.theme.boldgreen voteBlockColor := p.theme.boldgreen
backgroundBlockColor := p.theme.grey backgroundBlockColor := p.theme.grey

View file

@ -43,17 +43,17 @@ type theme struct {
} }
type Printer struct { type Printer struct {
theme theme theme theme
noColor bool noColor bool
lineWrapCharacterLimit int maxTerminalWidth int
pager string pager string
statusSeparator string statusSeparator string
} }
func NewPrinter( func NewPrinter(
noColor bool, noColor bool,
pager string, pager string,
lineWrapCharacterLimit int, maxTerminalWidth int,
) *Printer { ) *Printer {
theme := theme{ theme := theme{
reset: "\033[0m", reset: "\033[0m",
@ -68,16 +68,16 @@ func NewPrinter(
boldyellow: "\033[33;1m", boldyellow: "\033[33;1m",
} }
if lineWrapCharacterLimit < minTerminalWidth { if maxTerminalWidth < minTerminalWidth {
lineWrapCharacterLimit = minTerminalWidth maxTerminalWidth = minTerminalWidth
} }
return &Printer{ return &Printer{
theme: theme, theme: theme,
noColor: noColor, noColor: noColor,
lineWrapCharacterLimit: lineWrapCharacterLimit, maxTerminalWidth: maxTerminalWidth,
pager: pager, pager: pager,
statusSeparator: strings.Repeat("\u2501", lineWrapCharacterLimit), statusSeparator: strings.Repeat("\u2501", maxTerminalWidth),
} }
} }

View file

@ -9,6 +9,7 @@ import (
"strings" "strings"
"codeflow.dananglin.me.uk/apollo/enbas/internal/model" "codeflow.dananglin.me.uk/apollo/enbas/internal/model"
"codeflow.dananglin.me.uk/apollo/enbas/internal/utilities"
) )
func (p Printer) PrintStatus(status model.Status) { func (p Printer) PrintStatus(status model.Status) {
@ -23,7 +24,7 @@ func (p Printer) PrintStatus(status model.Status) {
// The content of the status. // The content of the status.
builder.WriteString("\n\n" + p.headerFormat("CONTENT:")) builder.WriteString("\n\n" + p.headerFormat("CONTENT:"))
builder.WriteString(p.convertHTMLToText(status.Content, true)) builder.WriteString(utilities.WrapLines(utilities.ConvertHTMLToText(status.Content), "\n", p.maxTerminalWidth))
// Details of media attachments (if any). // Details of media attachments (if any).
if len(status.MediaAttachments) > 0 { if len(status.MediaAttachments) > 0 {
@ -92,10 +93,7 @@ func (p Printer) PrintStatusList(list model.StatusList) {
if status.Reblog != nil { if status.Reblog != nil {
builder.WriteString( builder.WriteString(
"\n" + p.wrapLines( "\n" + utilities.WrapLines("reposted this status from "+p.fullDisplayNameFormat(status.Reblog.Account.DisplayName, status.Reblog.Account.Acct), "\n", p.maxTerminalWidth),
"reposted this status from "+p.fullDisplayNameFormat(status.Reblog.Account.DisplayName, status.Reblog.Account.Acct),
0,
),
) )
statusID = status.Reblog.ID statusID = status.Reblog.ID
@ -105,25 +103,22 @@ func (p Printer) PrintStatusList(list model.StatusList) {
mediaAttachments = status.Reblog.MediaAttachments mediaAttachments = status.Reblog.MediaAttachments
} }
builder.WriteString("\n" + p.convertHTMLToText(content, true)) builder.WriteString("\n" + utilities.WrapLines(utilities.ConvertHTMLToText(content), "\n", p.maxTerminalWidth))
if poll != nil { if poll != nil {
builder.WriteString(p.pollOptions(*poll)) builder.WriteString(p.pollOptions(*poll))
} }
for _, media := range mediaAttachments { for _, media := range mediaAttachments {
builder.WriteString("\n\n" + symbolImage + " " + p.fieldFormat("Media attachment: ") + media.ID) builder.WriteString("\n\n" + symbolImage + " Media attachment: " + media.ID)
builder.WriteString("\n " + p.fieldFormat("Media type: ") + media.Type + "\n") builder.WriteString("\n Media type: " + media.Type + "\n ")
description := " " + p.fieldFormat("Description: ") description := media.Description
if description == "" {
if media.Description == "" { description = noMediaDescription
description += noMediaDescription
} else {
description += media.Description
} }
builder.WriteString(p.wrapLines(description, 2)) builder.WriteString(utilities.WrapLines(description, "\n ", p.maxTerminalWidth-3))
} }
boosted := symbolBoosted boosted := symbolBoosted

View file

@ -2,7 +2,7 @@
// //
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
package printer package utilities
import ( import (
"io" "io"
@ -23,7 +23,7 @@ type htmlConvertState struct {
orderedListIndex int orderedListIndex int
} }
func (p Printer) convertHTMLToText(text string, wrapLines bool) string { func ConvertHTMLToText(text string) string {
var builder strings.Builder var builder strings.Builder
state := htmlConvertState{ state := htmlConvertState{
@ -37,9 +37,6 @@ func (p Printer) convertHTMLToText(text string, wrapLines bool) string {
tt := token.Next() tt := token.Next()
switch tt { switch tt {
case html.ErrorToken: case html.ErrorToken:
if wrapLines {
return p.wrapLines(builder.String(), 0)
}
return builder.String() return builder.String()
case html.TextToken: case html.TextToken:
text := token.Token().Data text := token.Token().Data
@ -69,7 +66,7 @@ func processTagToken(state *htmlConvertState, writer io.StringWriter, tag string
case "<li>": case "<li>":
switch state.htmlListType { switch state.htmlListType {
case htmlUnorderedList: case htmlUnorderedList:
_, _ = writer.WriteString(symbolBullet + " ") _, _ = writer.WriteString(" ")
case htmlOrderedList: case htmlOrderedList:
_, _ = writer.WriteString(strconv.Itoa(state.orderedListIndex) + ". ") _, _ = writer.WriteString(strconv.Itoa(state.orderedListIndex) + ". ")
state.orderedListIndex++ state.orderedListIndex++

View file

@ -2,36 +2,24 @@
// //
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
package printer package utilities
import ( import (
"strings" "strings"
"unicode" "unicode"
) )
func (p Printer) wrapLines(text string, nIndent int) string { func WrapLines(text, separator string, charLimit int) string {
if nIndent >= p.lineWrapCharacterLimit {
nIndent = 0
}
separator := "\n" + strings.Repeat(" ", nIndent)
lines := strings.Split(text, "\n") lines := strings.Split(text, "\n")
if len(lines) == 1 { if len(lines) == 1 {
return wrapLine(lines[0], separator, p.lineWrapCharacterLimit-nIndent) return wrapLine(lines[0], separator, charLimit)
} }
var builder strings.Builder var builder strings.Builder
for i, line := range lines { for i, line := range lines {
extraIndent := "" builder.WriteString(wrapLine(line, separator, charLimit))
if strings.HasPrefix(line, symbolBullet) {
extraIndent = " "
}
builder.WriteString(wrapLine(line, separator+extraIndent, p.lineWrapCharacterLimit-nIndent))
if i < len(lines)-1 { if i < len(lines)-1 {
builder.WriteString(separator) builder.WriteString(separator)