mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-09 23:10:20 +08:00
feat: add show line number in code
This commit is contained in:
parent
ffaa16fa88
commit
bb035750d6
@ -99,7 +99,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
code {
|
code {
|
||||||
white-space: pre-wrap !important;
|
|
||||||
font-family: 'Courier New', Courier, monospace;
|
font-family: 'Courier New', Courier, monospace;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,7 +110,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
white-space: pre-wrap !important;
|
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
font-family: 'Fira Code', 'Courier New', Courier, monospace;
|
font-family: 'Fira Code', 'Courier New', Courier, monospace;
|
||||||
|
|||||||
@ -103,6 +103,7 @@
|
|||||||
"settings.reset": "Reset",
|
"settings.reset": "Reset",
|
||||||
"settings.set_as_default": "Apply to default assistant",
|
"settings.set_as_default": "Apply to default assistant",
|
||||||
"settings.max": "Max",
|
"settings.max": "Max",
|
||||||
|
"settings.show_line_numbers": "Show Line Numbers in Code",
|
||||||
"suggestions.title": "Suggested Questions",
|
"suggestions.title": "Suggested Questions",
|
||||||
"add.assistant.title": "Add Assistant",
|
"add.assistant.title": "Add Assistant",
|
||||||
"message.new.context": "New Context",
|
"message.new.context": "New Context",
|
||||||
|
|||||||
@ -103,6 +103,7 @@
|
|||||||
"settings.reset": "重置",
|
"settings.reset": "重置",
|
||||||
"settings.set_as_default": "应用到默认助手",
|
"settings.set_as_default": "应用到默认助手",
|
||||||
"settings.max": "不限",
|
"settings.max": "不限",
|
||||||
|
"settings.show_line_numbers": "代码显示行号",
|
||||||
"suggestions.title": "建议的问题",
|
"suggestions.title": "建议的问题",
|
||||||
"add.assistant.title": "添加助手",
|
"add.assistant.title": "添加助手",
|
||||||
"message.new.context": "清除上下文",
|
"message.new.context": "清除上下文",
|
||||||
|
|||||||
@ -103,6 +103,7 @@
|
|||||||
"settings.reset": "重置",
|
"settings.reset": "重置",
|
||||||
"settings.set_as_default": "設為預設助手",
|
"settings.set_as_default": "設為預設助手",
|
||||||
"settings.max": "最大",
|
"settings.max": "最大",
|
||||||
|
"settings.show_line_numbers": "代码顯示行號",
|
||||||
"suggestions.title": "建議的問題",
|
"suggestions.title": "建議的問題",
|
||||||
"add.assistant.title": "添加助手",
|
"add.assistant.title": "添加助手",
|
||||||
"message.new.context": "新上下文",
|
"message.new.context": "新上下文",
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import { CheckOutlined } from '@ant-design/icons'
|
import { CheckOutlined } from '@ant-design/icons'
|
||||||
import CopyIcon from '@renderer/components/Icons/CopyIcon'
|
import CopyIcon from '@renderer/components/Icons/CopyIcon'
|
||||||
import { useTheme } from '@renderer/context/ThemeProvider'
|
import { useTheme } from '@renderer/context/ThemeProvider'
|
||||||
|
import { useSettings } from '@renderer/hooks/useSettings'
|
||||||
import { initMermaid } from '@renderer/init'
|
import { initMermaid } from '@renderer/init'
|
||||||
import { ThemeMode } from '@renderer/types'
|
import { ThemeMode } from '@renderer/types'
|
||||||
import React, { memo, useState } from 'react'
|
import React, { memo, useState } from 'react'
|
||||||
@ -21,6 +22,7 @@ interface CodeBlockProps {
|
|||||||
const CodeBlock: React.FC<CodeBlockProps> = ({ children, className }) => {
|
const CodeBlock: React.FC<CodeBlockProps> = ({ children, className }) => {
|
||||||
const match = /language-(\w+)/.exec(className || '')
|
const match = /language-(\w+)/.exec(className || '')
|
||||||
const showFooterCopyButton = children && children.length > 500
|
const showFooterCopyButton = children && children.length > 500
|
||||||
|
const { codeShowLineNumbers } = useSettings()
|
||||||
const { theme } = useTheme()
|
const { theme } = useTheme()
|
||||||
const language = match?.[1]
|
const language = match?.[1]
|
||||||
|
|
||||||
@ -38,7 +40,8 @@ const CodeBlock: React.FC<CodeBlockProps> = ({ children, className }) => {
|
|||||||
<SyntaxHighlighter
|
<SyntaxHighlighter
|
||||||
language={match[1]}
|
language={match[1]}
|
||||||
style={theme === ThemeMode.dark ? atomDark : oneLight}
|
style={theme === ThemeMode.dark ? atomDark : oneLight}
|
||||||
wrapLongLines={true}
|
wrapLongLines={false}
|
||||||
|
showLineNumbers={codeShowLineNumbers}
|
||||||
customStyle={{
|
customStyle={{
|
||||||
border: '0.5px solid var(--color-code-background)',
|
border: '0.5px solid var(--color-code-background)',
|
||||||
borderTopLeftRadius: 0,
|
borderTopLeftRadius: 0,
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import { useSettings } from '@renderer/hooks/useSettings'
|
|||||||
import { SettingDivider, SettingRow, SettingRowTitle, SettingSubtitle } from '@renderer/pages/settings'
|
import { SettingDivider, SettingRow, SettingRowTitle, SettingSubtitle } from '@renderer/pages/settings'
|
||||||
import { useAppDispatch } from '@renderer/store'
|
import { useAppDispatch } from '@renderer/store'
|
||||||
import {
|
import {
|
||||||
|
setCodeShowLineNumbers,
|
||||||
setFontSize,
|
setFontSize,
|
||||||
setMessageFont,
|
setMessageFont,
|
||||||
setPasteLongTextAsFile,
|
setPasteLongTextAsFile,
|
||||||
@ -43,7 +44,8 @@ const SettingsTab: FC<Props> = (props) => {
|
|||||||
sendMessageShortcut,
|
sendMessageShortcut,
|
||||||
setSendMessageShortcut,
|
setSendMessageShortcut,
|
||||||
pasteLongTextAsFile,
|
pasteLongTextAsFile,
|
||||||
renderInputMessageAsMarkdown
|
renderInputMessageAsMarkdown,
|
||||||
|
codeShowLineNumbers
|
||||||
} = useSettings()
|
} = useSettings()
|
||||||
|
|
||||||
const onUpdateAssistantSettings = (settings: Partial<AssistantSettings>) => {
|
const onUpdateAssistantSettings = (settings: Partial<AssistantSettings>) => {
|
||||||
@ -204,6 +206,15 @@ const SettingsTab: FC<Props> = (props) => {
|
|||||||
/>
|
/>
|
||||||
</SettingRow>
|
</SettingRow>
|
||||||
<SettingDivider />
|
<SettingDivider />
|
||||||
|
<SettingRow>
|
||||||
|
<SettingRowTitleSmall>{t('chat.settings.show_line_numbers')}</SettingRowTitleSmall>
|
||||||
|
<Switch
|
||||||
|
size="small"
|
||||||
|
checked={codeShowLineNumbers}
|
||||||
|
onChange={(checked) => dispatch(setCodeShowLineNumbers(checked))}
|
||||||
|
/>
|
||||||
|
</SettingRow>
|
||||||
|
<SettingDivider />
|
||||||
<SettingRow>
|
<SettingRow>
|
||||||
<SettingRowTitleSmall>{t('settings.font_size.title')}</SettingRowTitleSmall>
|
<SettingRowTitleSmall>{t('settings.font_size.title')}</SettingRowTitleSmall>
|
||||||
</SettingRow>
|
</SettingRow>
|
||||||
@ -274,7 +285,6 @@ const Container = styled.div`
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
overflow: hidden;
|
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
padding: 10px 15px;
|
padding: 10px 15px;
|
||||||
`
|
`
|
||||||
|
|||||||
@ -21,6 +21,7 @@ export interface SettingsState {
|
|||||||
clickAssistantToShowTopic: boolean
|
clickAssistantToShowTopic: boolean
|
||||||
manualUpdateCheck: boolean
|
manualUpdateCheck: boolean
|
||||||
renderInputMessageAsMarkdown: boolean
|
renderInputMessageAsMarkdown: boolean
|
||||||
|
codeShowLineNumbers: boolean
|
||||||
// webdav 配置 host, user, pass, path
|
// webdav 配置 host, user, pass, path
|
||||||
webdavHost: string
|
webdavHost: string
|
||||||
webdavUser: string
|
webdavUser: string
|
||||||
@ -46,6 +47,7 @@ const initialState: SettingsState = {
|
|||||||
clickAssistantToShowTopic: false,
|
clickAssistantToShowTopic: false,
|
||||||
manualUpdateCheck: false,
|
manualUpdateCheck: false,
|
||||||
renderInputMessageAsMarkdown: true,
|
renderInputMessageAsMarkdown: true,
|
||||||
|
codeShowLineNumbers: false,
|
||||||
webdavHost: '',
|
webdavHost: '',
|
||||||
webdavUser: '',
|
webdavUser: '',
|
||||||
webdavPass: '',
|
webdavPass: '',
|
||||||
@ -125,6 +127,9 @@ const settingsSlice = createSlice({
|
|||||||
},
|
},
|
||||||
setRenderInputMessageAsMarkdown: (state, action: PayloadAction<boolean>) => {
|
setRenderInputMessageAsMarkdown: (state, action: PayloadAction<boolean>) => {
|
||||||
state.renderInputMessageAsMarkdown = action.payload
|
state.renderInputMessageAsMarkdown = action.payload
|
||||||
|
},
|
||||||
|
setCodeShowLineNumbers: (state, action: PayloadAction<boolean>) => {
|
||||||
|
state.codeShowLineNumbers = action.payload
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -152,7 +157,8 @@ export const {
|
|||||||
setWebdavHost,
|
setWebdavHost,
|
||||||
setWebdavUser,
|
setWebdavUser,
|
||||||
setWebdavPass,
|
setWebdavPass,
|
||||||
setWebdavPath
|
setWebdavPath,
|
||||||
|
setCodeShowLineNumbers
|
||||||
} = settingsSlice.actions
|
} = settingsSlice.actions
|
||||||
|
|
||||||
export default settingsSlice.reducer
|
export default settingsSlice.reducer
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user