6 Commits

Author SHA1 Message Date
Anatoly
54854d711e Merge branch 'pggalaviz:master' into master 2021-11-19 01:27:03 +03:00
f2269798e6 Made mentionWithDots available as a prop 2021-11-19 01:26:37 +03:00
Pedro G. Galaviz
3579013b2b Merge pull request #21 from pggalaviz/dependabot/npm_and_yarn/postcss-7.0.36
Bump postcss from 7.0.23 to 7.0.36
2021-09-06 22:55:39 -05:00
Anatoly
6a840c3171 Update index.js 2021-08-28 21:14:37 +03:00
Anatoly
55b4441a9f Update index.js 2021-08-26 02:08:07 +03:00
dependabot[bot]
e7779bdc49 Bump postcss from 7.0.23 to 7.0.36
Bumps [postcss](https://github.com/postcss/postcss) from 7.0.23 to 7.0.36.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/7.0.23...7.0.36)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-17 12:28:38 +00:00
15 changed files with 17179 additions and 51 deletions

View File

@@ -58,6 +58,7 @@ As you can see, the component accepts some props:
| ---- | ---- | -------- | | ---- | ---- | -------- |
| value | String | The text to highlight (**v-model**). | | value | String | The text to highlight (**v-model**). |
| extractUrlsWithoutProtocol | Boolean | As the name says, when active, the compoponet will try to match URLs even when a protocol (http://, https://) is not found. **Defaults to true** | | extractUrlsWithoutProtocol | Boolean | As the name says, when active, the compoponet will try to match URLs even when a protocol (http://, https://) is not found. **Defaults to true** |
| mentionsWithDots | Boolean | Whether a mention can contain a dot. **Defaults to false** |
| caretColor | String | A valid HEX color (eg. #ccc, #ff4545). | | caretColor | String | A valid HEX color (eg. #ccc, #ff4545). |
| placeholder | String | A placeholder to show when no text is entered. | | placeholder | String | A placeholder to show when no text is entered. |
| usernameClass | String | The CSS class(es) that will be added to a @username match. | | usernameClass | String | The CSS class(es) that will be added to a @username match. |

View File

@@ -1083,7 +1083,7 @@ const endMentionMatch = _regexSupplant(/^(?:#{atSigns}|[#{latinAccentChars}]|:\/
const validMention = _regexSupplant( const validMention = _regexSupplant(
'(#{validMentionPrecedingChars})' + // $1: Preceding character '(#{validMentionPrecedingChars})' + // $1: Preceding character
'(#{atSigns})' + // $2: At mark '(#{atSigns})' + // $2: At mark
'([a-zA-Z0-9_]{1,20})', // $3: Screen name '([a-zA-Z0-9_\.]{1,20})', // $3: Screen name
// '(/[a-zA-Z][a-zA-Z0-9_-]{0,24})?', // $4: List (optional) // '(/[a-zA-Z][a-zA-Z0-9_-]{0,24})?', // $4: List (optional)
{ validMentionPrecedingChars, atSigns }, { validMentionPrecedingChars, atSigns },
'g' 'g'
@@ -1675,6 +1675,10 @@ function src_autoLink (text, options) {
type: Boolean, type: Boolean,
default: true default: true
}, },
mentionsWithDots: {
type: Boolean,
default: false
},
caretColor: { caretColor: {
type: String, type: String,
default: '#ccc' default: '#ccc'
@@ -1697,7 +1701,8 @@ function src_autoLink (text, options) {
}, },
computedBody () { computedBody () {
return highlight(this.body, { return highlight(this.body, {
extractUrlsWithoutProtocol: this.extractUrlsWithoutProtocol extractUrlsWithoutProtocol: this.extractUrlsWithoutProtocol,
mentionsWithDots: this.mentionsWithDots
}) })
} }
}, },

File diff suppressed because one or more lines are too long

View File

@@ -1092,7 +1092,7 @@ const endMentionMatch = _regexSupplant(/^(?:#{atSigns}|[#{latinAccentChars}]|:\/
const validMention = _regexSupplant( const validMention = _regexSupplant(
'(#{validMentionPrecedingChars})' + // $1: Preceding character '(#{validMentionPrecedingChars})' + // $1: Preceding character
'(#{atSigns})' + // $2: At mark '(#{atSigns})' + // $2: At mark
'([a-zA-Z0-9_]{1,20})', // $3: Screen name '([a-zA-Z0-9_\.]{1,20})', // $3: Screen name
// '(/[a-zA-Z][a-zA-Z0-9_-]{0,24})?', // $4: List (optional) // '(/[a-zA-Z][a-zA-Z0-9_-]{0,24})?', // $4: List (optional)
{ validMentionPrecedingChars, atSigns }, { validMentionPrecedingChars, atSigns },
'g' 'g'
@@ -1684,6 +1684,10 @@ function src_autoLink (text, options) {
type: Boolean, type: Boolean,
default: true default: true
}, },
mentionsWithDots: {
type: Boolean,
default: false
},
caretColor: { caretColor: {
type: String, type: String,
default: '#ccc' default: '#ccc'
@@ -1706,7 +1710,8 @@ function src_autoLink (text, options) {
}, },
computedBody () { computedBody () {
return highlight(this.body, { return highlight(this.body, {
extractUrlsWithoutProtocol: this.extractUrlsWithoutProtocol extractUrlsWithoutProtocol: this.extractUrlsWithoutProtocol,
mentionsWithDots: this.mentionsWithDots
}) })
} }
}, },

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -21,6 +21,7 @@
:placeholder="placeholder" :placeholder="placeholder"
:caretColor="caretColor" :caretColor="caretColor"
:extractUrlsWithoutProtocol="options.extractUrlsWithoutProtocol" :extractUrlsWithoutProtocol="options.extractUrlsWithoutProtocol"
:mentionsWithDots="options.mentionsWithDots"
/> />
</div> </div>
@@ -28,14 +29,18 @@
<div id="options" class="content-container"> <div id="options" class="content-container">
<h4>Options (props)</h4> <h4>Options (props)</h4>
<div class="flex center"> <div class="flex center">
<label for="ep" class="mr-lg cursor-pointer"> <label for="ep" class="cursor-pointer">
<input id="ep" type="checkbox" v-model="options.extractUrlsWithoutProtocol"> <input id="ep" type="checkbox" v-model="options.extractUrlsWithoutProtocol">
extractUrlsWithoutProtocol extractUrlsWithoutProtocol
</label> </label>
<label for="tb" class="cursor-pointer"> <label for="tb" class="mx-lg cursor-pointer">
<input id="tb" type="checkbox" v-model="options.targetBlank"> <input id="tb" type="checkbox" v-model="options.targetBlank">
targetBlank targetBlank
</label> </label>
<label for="md" class="cursor-pointer">
<input id="md" type="checkbox" v-model="options.mentionsWithDots">
mentionsWithDots
</label>
</div> </div>
<div class="flex center mt-sm text-left relative"> <div class="flex center mt-sm text-left relative">
@@ -130,6 +135,7 @@ export default {
options: { options: {
targetBlank: true, targetBlank: true,
extractUrlsWithoutProtocol: true, extractUrlsWithoutProtocol: true,
mentionsWithDots: false,
usernameClass: 'highlights username', usernameClass: 'highlights username',
usernameUrlBase: '#/', usernameUrlBase: '#/',
hashtagClass: 'highlights hashtag', hashtagClass: 'highlights hashtag',

17163
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -15,6 +15,10 @@ export default {
type: Boolean, type: Boolean,
default: true default: true
}, },
mentionsWithDots: {
type: Boolean,
default: false
},
caretColor: { caretColor: {
type: String, type: String,
default: '#ccc' default: '#ccc'
@@ -37,7 +41,8 @@ export default {
}, },
computedBody () { computedBody () {
return highlight(this.body, { return highlight(this.body, {
extractUrlsWithoutProtocol: this.extractUrlsWithoutProtocol extractUrlsWithoutProtocol: this.extractUrlsWithoutProtocol,
mentionsWithDots: this.mentionsWithDots
}) })
} }
}, },

View File

@@ -8,7 +8,7 @@ import removeOverlappingEntities from './removeOverlappingEntities'
export default function (text, options) { export default function (text, options) {
const entities = extractUrls(text, options) const entities = extractUrls(text, options)
.concat(extractMentions(text)) .concat(extractMentions(text, options))
.concat(extractHashtags(text)) .concat(extractHashtags(text))
if (entities.length === 0) { if (entities.length === 0) {

View File

@@ -17,7 +17,8 @@ const OPTIONS_NOT_ATTRIBUTES = {
invisibleTagAttrs: true, invisibleTagAttrs: true,
linkAttributeBlock: true, linkAttributeBlock: true,
htmlEscapeNonEntities: true, htmlEscapeNonEntities: true,
extractUrlsWithoutProtocol: true extractUrlsWithoutProtocol: true,
mentionsWithDots: true
} }
export default function (options) { export default function (options) {

View File

@@ -1,15 +1,16 @@
// Extracts mentions from text. // Extracts mentions from text.
import { atSigns, endMentionMatch, validMention } from './regex' import { atSigns, endMentionMatch, validMention, validDotMention } from './regex'
export default function (text) { export default function (text, options) {
if (!text || !text.match(atSigns)) { if (!text || !text.match(atSigns)) {
return [] return []
} }
const mentions = [] const mentions = []
const mentionRegex = options.mentionsWithDots ? validDotMention : validMention
text.replace(validMention, function (match, before, atSign, mentionText, offset, chunk) { text.replace(mentionRegex, function (match, before, atSign, mentionText, offset, chunk) {
const after = chunk.slice(offset + match.length) const after = chunk.slice(offset + match.length)
if (!after.match(endMentionMatch)) { if (!after.match(endMentionMatch)) {
const startPosition = offset + before.length const startPosition = offset + before.length

View File

@@ -4,7 +4,8 @@ import autoHighlight from './autoHighlight'
const defaultOptions = { const defaultOptions = {
targetBlank: true, targetBlank: true,
extractUrlsWithoutProtocol: true extractUrlsWithoutProtocol: true,
mentionsWithDots: false
} }
export function link (text, options = defaultOptions) { export function link (text, options = defaultOptions) {

View File

@@ -194,3 +194,11 @@ export const validMention = regexSupplant(
{ validMentionPrecedingChars, atSigns }, { validMentionPrecedingChars, atSigns },
'g' 'g'
) )
export const validDotMention = regexSupplant(
'(#{validMentionPrecedingChars})' + // $1: Preceding character
'(#{atSigns})' + // $2: At mark
'([a-zA-Z0-9_\.]{1,20})', // $3: Screen name
// '(/[a-zA-Z][a-zA-Z0-9_-]{0,24})?', // $4: List (optional)
{ validMentionPrecedingChars, atSigns },
'g'
)