DraftJs trim 包含所有样式和其他属性的内容,而不仅仅是文本
DraftJs trim content with all styling and other properties, not just text
我有一个反应应用程序并使用 DraftJs。
在列表页面上,我的 ContentCard 组件使用 draft-js 中的编辑器将 DraftJs 内容呈现为只读。
<Editor readOnly={true} editorState={contentState} />
我想将 contentState 的简短版本显示为简短描述,列表页面最多 400 个字符。并在内容详细信息页面上显示完整的 contentState。
我使用了这种截断方法,但它只修剪文本。在这里我得到块然后文本。但是我怎样才能得到有字符限制的块。
例如;
第一个块包含 820 个字符,具有所有不同的样式词。我怎样才能获得所有样式信息的前 400 个字符。我的意思是包含 400 个字符的块。
truncate = (editorState, charCount) => {
const contentState = editorState.getCurrentContent();
const blocks = contentState.getBlocksAsArray();
let index = 0;
let currentLength = 0;
let isTruncated = false;
const truncatedBlocks = [];
while (!isTruncated && blocks[index]) {
const block = blocks[index];
const length = block.getLength();
if (currentLength + length > charCount) {
isTruncated = true;
const truncatedText = block
.getText()
.slice(0, charCount - currentLength);
const state = ContentState.createFromText(`${truncatedText}...`);
truncatedBlocks.push(state.getFirstBlock());
} else {
truncatedBlocks.push(block);
}
currentLength += length + 1;
index++;
}
if (isTruncated) {
const state = ContentState.createFromBlockArray(truncatedBlocks);
return EditorState.createWithContent(state);
}
return editorState;
};
我想用粗体、斜体样式、链接和其他实体等显示 400 个字符。
我需要类似的东西,所以我做了一个非常粗略的实现,但它对我有用:)
import { ContentState, convertToRaw } from 'draft-js'
const convertContentToEditorState = (content: string) => {
if (content) {
try {
return EditorState.createWithContent(
convertFromRaw(JSON.parse(content)),
)
} catch {
return EditorState.createEmpty()
}
} else {
return EditorState.createEmpty()
}
}
/**
* Takes in a stringfied JSON object, truncates it into a single ContentState and returns it.
* @param jsonContentBlocks
* @param maxCharCount
*/
const getTruncatedContentState = (
jsonContentBlocks: string,
maxCharCount: number,
): ContentState | undefined => {
const editorState = convertContentToEditorState(jsonContentBlocks)
const contentState = editorState.getCurrentContent()
const blocks = contentState.getBlocksAsArray()
let currentLength = 0
const truncatedBlocks = []
for (let i = 0; i < blocks.length; i++) {
const blockLength = blocks[i].getCharacterList().size
let truncatedText = ''
if (blockLength >= maxCharCount - currentLength) {
// We need to trim it
truncatedText = blocks[i]
.getText()
.slice(0, maxCharCount - currentLength)
currentLength += truncatedText.length
const state = ContentState.createFromText(`${truncatedText}...`)
truncatedBlocks.push(state.getFirstBlock())
break
} else if (blockLength > 0) {
truncatedText = blocks[i].getText()
currentLength += truncatedText.length
const state = ContentState.createFromText(`${truncatedText}`)
truncatedBlocks.push(state.getFirstBlock())
}
}
if (truncatedBlocks.length > 0) {
return ContentState.createFromBlockArray(truncatedBlocks)
}
return undefined
}
/**
* Truncates and gets only the text from the blocks, returns stringified JSON
* @param jsonContentBlocks
* @param maxCharCount
*/
const getTruncatedContent = (
jsonContentBlocks: string | undefined,
maxCharCount: number,
): string | undefined => {
if (!jsonContentBlocks) return undefined
const contentState = getTruncatedContentState(
jsonContentBlocks,
maxCharCount,
)
if (contentState) {
const raw = convertToRaw(contentState)
return JSON.stringify(raw)
}
return undefined
}
我有一个反应应用程序并使用 DraftJs。
在列表页面上,我的 ContentCard 组件使用 draft-js 中的编辑器将 DraftJs 内容呈现为只读。
<Editor readOnly={true} editorState={contentState} />
我想将 contentState 的简短版本显示为简短描述,列表页面最多 400 个字符。并在内容详细信息页面上显示完整的 contentState。
我使用了这种截断方法,但它只修剪文本。在这里我得到块然后文本。但是我怎样才能得到有字符限制的块。
例如; 第一个块包含 820 个字符,具有所有不同的样式词。我怎样才能获得所有样式信息的前 400 个字符。我的意思是包含 400 个字符的块。
truncate = (editorState, charCount) => {
const contentState = editorState.getCurrentContent();
const blocks = contentState.getBlocksAsArray();
let index = 0;
let currentLength = 0;
let isTruncated = false;
const truncatedBlocks = [];
while (!isTruncated && blocks[index]) {
const block = blocks[index];
const length = block.getLength();
if (currentLength + length > charCount) {
isTruncated = true;
const truncatedText = block
.getText()
.slice(0, charCount - currentLength);
const state = ContentState.createFromText(`${truncatedText}...`);
truncatedBlocks.push(state.getFirstBlock());
} else {
truncatedBlocks.push(block);
}
currentLength += length + 1;
index++;
}
if (isTruncated) {
const state = ContentState.createFromBlockArray(truncatedBlocks);
return EditorState.createWithContent(state);
}
return editorState;
};
我想用粗体、斜体样式、链接和其他实体等显示 400 个字符。
我需要类似的东西,所以我做了一个非常粗略的实现,但它对我有用:)
import { ContentState, convertToRaw } from 'draft-js'
const convertContentToEditorState = (content: string) => {
if (content) {
try {
return EditorState.createWithContent(
convertFromRaw(JSON.parse(content)),
)
} catch {
return EditorState.createEmpty()
}
} else {
return EditorState.createEmpty()
}
}
/**
* Takes in a stringfied JSON object, truncates it into a single ContentState and returns it.
* @param jsonContentBlocks
* @param maxCharCount
*/
const getTruncatedContentState = (
jsonContentBlocks: string,
maxCharCount: number,
): ContentState | undefined => {
const editorState = convertContentToEditorState(jsonContentBlocks)
const contentState = editorState.getCurrentContent()
const blocks = contentState.getBlocksAsArray()
let currentLength = 0
const truncatedBlocks = []
for (let i = 0; i < blocks.length; i++) {
const blockLength = blocks[i].getCharacterList().size
let truncatedText = ''
if (blockLength >= maxCharCount - currentLength) {
// We need to trim it
truncatedText = blocks[i]
.getText()
.slice(0, maxCharCount - currentLength)
currentLength += truncatedText.length
const state = ContentState.createFromText(`${truncatedText}...`)
truncatedBlocks.push(state.getFirstBlock())
break
} else if (blockLength > 0) {
truncatedText = blocks[i].getText()
currentLength += truncatedText.length
const state = ContentState.createFromText(`${truncatedText}`)
truncatedBlocks.push(state.getFirstBlock())
}
}
if (truncatedBlocks.length > 0) {
return ContentState.createFromBlockArray(truncatedBlocks)
}
return undefined
}
/**
* Truncates and gets only the text from the blocks, returns stringified JSON
* @param jsonContentBlocks
* @param maxCharCount
*/
const getTruncatedContent = (
jsonContentBlocks: string | undefined,
maxCharCount: number,
): string | undefined => {
if (!jsonContentBlocks) return undefined
const contentState = getTruncatedContentState(
jsonContentBlocks,
maxCharCount,
)
if (contentState) {
const raw = convertToRaw(contentState)
return JSON.stringify(raw)
}
return undefined
}