more fixes

This commit is contained in:
Henry Jameson 2021-06-13 22:22:59 +03:00
parent 1fdfc42159
commit 636dbdaba8
3 changed files with 113 additions and 7 deletions

View file

@ -140,7 +140,7 @@ export default Vue.component('RichContent', {
switch (Tag) { switch (Tag) {
case 'span': // replace images with StillImage case 'span': // replace images with StillImage
if (attrs['class'] && attrs['class'].includes('lastMentions')) { if (attrs['class'] && attrs['class'].includes('lastMentions')) {
if (firstMentions.length > 1) { if (firstMentions.length > 1 && lastMentions.length > 1) {
break break
} else { } else {
return '' return ''
@ -249,7 +249,9 @@ export const preProcessPerLine = (html, greentext, handleLinks) => {
const greentextHandle = new Set(['p', 'div']) const greentextHandle = new Set(['p', 'div'])
let nonEmptyIndex = -1 let nonEmptyIndex = -1
const newHtml = convertHtmlToLines(html).reverse().map((item, index, array) => { const lines = convertHtmlToLines(html)
const linesNum = lines.filter(c => c.text).length
const newHtml = lines.reverse().map((item, index, array) => {
// Going over each line in reverse to detect last mentions, // Going over each line in reverse to detect last mentions,
// keeping non-text stuff as-is // keeping non-text stuff as-is
if (!item.text) return item if (!item.text) return item
@ -281,7 +283,7 @@ export const preProcessPerLine = (html, greentext, handleLinks) => {
// If line has loose text, i.e. text outside a mention or a tag // If line has loose text, i.e. text outside a mention or a tag
// we won't touch mentions. // we won't touch mentions.
let hasLooseText = false let hasLooseText = false
let hasMentions = false let mentionsNum = 0
const process = (item) => { const process = (item) => {
if (Array.isArray(item)) { if (Array.isArray(item)) {
const [opener, children, closer] = item const [opener, children, closer] = item
@ -292,7 +294,7 @@ export const preProcessPerLine = (html, greentext, handleLinks) => {
const attrs = getAttrs(opener) const attrs = getAttrs(opener)
if (attrs['class'] && attrs['class'].includes('mention')) { if (attrs['class'] && attrs['class'].includes('mention')) {
// Got mentions // Got mentions
hasMentions = true mentionsNum++
return [opener, children, closer] return [opener, children, closer]
} else { } else {
// Not a mention? Means we have loose text or whatever // Not a mention? Means we have loose text or whatever
@ -321,8 +323,13 @@ export const preProcessPerLine = (html, greentext, handleLinks) => {
// We now processed our tree, now we need to mark line as lastMentions // We now processed our tree, now we need to mark line as lastMentions
const result = [...tree].map(process) const result = [...tree].map(process)
// Only check last (first since list is reversed) line if (
if (handleLinks && hasMentions && !hasLooseText && nonEmptyIndex++ === 0) { handleLinks && // Do we handle links at all?
mentionsNum > 1 && // Does it have more than one mention?
!hasLooseText && // Don't do anything if it has something besides mentions
nonEmptyIndex === 0 && // Only check last (first since list is reversed) line
nonEmptyIndex !== linesNum - 1 // Don't do anything if there's only one line
) {
let mentionIndex = 0 let mentionIndex = 0
const process = (item) => { const process = (item) => {
if (Array.isArray(item)) { if (Array.isArray(item)) {

View file

@ -56,7 +56,7 @@
@parseReady="setHeadTailLinks" @parseReady="setHeadTailLinks"
/> />
<MentionsLine <MentionsLine
v-if="!hideMentions && lastMentions.length > 0 && firstMentions.length <= 1" v-if="!hideMentions && lastMentions.length > 1 && firstMentions.length <= 1"
:mentions="lastMentions" :mentions="lastMentions"
/> />
</span> </span>

View file

@ -416,4 +416,103 @@ describe('RichContent', () => {
expect(wrapper.html()).to.eql(compwrap(expected)) expect(wrapper.html()).to.eql(compwrap(expected))
}) })
it('Don\'t remove last mention if it\'s the only one', () => {
const html = [
'Bruh',
'Bruh',
makeMention('foo'),
makeMention('bar'),
makeMention('baz')
].join('<br>')
const wrapper = shallowMount(RichContent, {
localVue,
propsData: {
handleLinks: true,
greentext: true,
emoji: [],
html
}
})
expect(wrapper.html()).to.eql(compwrap(html))
})
it('Don\'t remove last mentions if there are more than one first mention - remove first instead', () => {
const html = [
[
makeMention('foo'),
makeMention('bar')
].join(' '),
'Bruh',
'Bruh',
[
makeMention('foo'),
makeMention('bar'),
makeMention('baz')
].join(' ')
].join('\n')
const expected = [
[
removedMentionSpan,
removedMentionSpan,
'Bruh' // Due to trim we remove extra newline
].join(''),
'Bruh',
lastMentions([
stubMention('foo'),
stubMention('bar'),
stubMention('baz')
].join(' '))
].join('\n')
const wrapper = shallowMount(RichContent, {
localVue,
propsData: {
handleLinks: true,
greentext: true,
emoji: [],
html
}
})
expect(wrapper.html()).to.eql(compwrap(expected))
})
it('Remove last mentions if there\'s just one first mention - remove all', () => {
const html = [
[
makeMention('foo')
].join(' '),
'Bruh',
'Bruh',
[
makeMention('foo'),
makeMention('bar'),
makeMention('baz')
].join(' ')
].join('\n')
const expected = [
[
removedMentionSpan,
'Bruh' // Due to trim we remove extra newline
].join(''),
'Bruh\n' // Can't remove this one yet
].join('\n')
const wrapper = shallowMount(RichContent, {
localVue,
propsData: {
handleLinks: true,
greentext: true,
emoji: [],
html
}
})
expect(wrapper.html()).to.eql(compwrap(expected))
})
}) })