Merge pull request #57594 from nextcloud/refactor/ocp-comments
Some checks failed
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Integration sqlite / changes (push) Waiting to run
Integration sqlite / integration-sqlite (master, 8.4, main, --tags ~@large files_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, capabilities_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, collaboration_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, comments_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, dav_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, federation_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, file_conversions) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, files_reminders) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, filesdrop_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, ldap_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, openldap_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, openldap_numerical_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, remoteapi_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, routing_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, setup_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, sharees_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, sharing_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, theming_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite (master, 8.4, main, videoverification_features) (push) Blocked by required conditions
Integration sqlite / integration-sqlite-summary (push) Blocked by required conditions
Psalm static code analysis / static-code-analysis (push) Has been cancelled
Psalm static code analysis / static-code-analysis-security (push) Has been cancelled
Psalm static code analysis / static-code-analysis-ocp (push) Has been cancelled
Psalm static code analysis / static-code-analysis-ncu (push) Has been cancelled

refactor(core): migrate `OCP.Comments` away from jQuery
This commit is contained in:
Ferdinand Thiessen 2026-01-16 17:25:52 +01:00 committed by GitHub
commit 6a67456574
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 33 additions and 23 deletions

View file

@ -4,7 +4,7 @@
*/
import { expect, it } from 'vitest'
import * as Comments from '../../OCP/comments.js'
import { plainToRich } from './comments.ts'
it.for([
{ input: 'nextcloud.com', expected: 'nextcloud.com' },
@ -28,6 +28,6 @@ it.for([
{ input: 'FirebaseInstanceId.getInstance().deleteInstanceId()', expected: 'FirebaseInstanceId.getInstance().deleteInstanceId()' },
{ input: 'I mean...it', expected: 'I mean...it' },
])('OCP.Comments should parse URLs only', ({ input, expected }) => {
const result = Comments.plainToRich(input)
const result = plainToRich(input)
expect(result).toEqual(expected)
})

View file

@ -3,8 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import $ from 'jquery'
/*
* Detects links:
* Either the http(s) protocol is given or two strings, basically limited to ascii with the last
@ -19,23 +17,29 @@ import $ from 'jquery'
const urlRegex = /(\s|^)(https?:\/\/)([-A-Z0-9+_.]+(?::[0-9]+)?(?:\/[-A-Z0-9+&@#%?=~_|!:,.;()]*)*)(\s|$)/ig
/**
* @param {any} content -
* Converts plain text to rich text
*
* @param content - The plain text content
*/
export function plainToRich(content) {
return this.formatLinksRich(content)
export function plainToRich(content: string) {
return formatLinksRich(content)
}
/**
* @param {any} content -
* Converts rich text to plain text
*
* @param content - The rich text content
*/
export function richToPlain(content) {
return this.formatLinksPlain(content)
export function richToPlain(content: string) {
return formatLinksPlain(content)
}
/**
* @param {any} content -
* Format links in the given content to rich text links
*
* @param content - The content containing plain text URLs
*/
export function formatLinksRich(content) {
export function formatLinksRich(content: string) {
return content.replace(urlRegex, function(_, leadingSpace, protocol, url, trailingSpace) {
let linkText = url
if (!protocol) {
@ -49,13 +53,16 @@ export function formatLinksRich(content) {
}
/**
* @param {any} content -
* Format links in the given content to plain text links
*
* @param content - The content containing rich text URLs
*/
export function formatLinksPlain(content) {
const $content = $('<div></div>').html(content)
$content.find('a').each(function() {
const $this = $(this)
$this.html($this.attr('href'))
export function formatLinksPlain(content: string) {
const el = document.createElement('div')
el.innerHTML = content
el.querySelectorAll('a').forEach((anchor) => {
anchor.replaceWith(document.createTextNode(anchor.getAttribute('href') || ''))
})
return $content.html()
return el.innerHTML
}

View file

@ -7,7 +7,7 @@ import { loadState } from '@nextcloud/initial-state'
import Accessibility from './accessibility.js'
import * as AppConfig from './appconfig.ts'
import Collaboration from './collaboration.js'
import * as Comments from './comments.js'
import * as Comments from './comments.ts'
import Loader from './loader.js'
import Toast from './toast.js'
import * as WhatsNew from './whatsnew.js'
@ -17,6 +17,9 @@ export default {
Accessibility,
AppConfig,
Collaboration,
/**
* @deprecated 33.0.0
*/
Comments,
InitialState: {
/**

4
dist/core-main.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long