fix: chart tool can't display chinese (#9686)

pull/9801/head
非法操作 2 years ago committed by GitHub
parent 5f11fe521d
commit e2710161f6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -56,6 +56,8 @@ RUN apt-get update \
&& apt-get update \ && apt-get update \
# For Security # For Security
&& apt-get install -y --no-install-recommends zlib1g=1:1.3.dfsg+really1.3.1-1 expat=2.6.3-1 libldap-2.5-0=2.5.18+dfsg-3 perl=5.38.2-5 libsqlite3-0=3.46.1-1 \ && apt-get install -y --no-install-recommends zlib1g=1:1.3.dfsg+really1.3.1-1 expat=2.6.3-1 libldap-2.5-0=2.5.18+dfsg-3 perl=5.38.2-5 libsqlite3-0=3.46.1-1 \
# install a chinese font to support the use of tools like matplotlib
&& apt-get install -y fonts-noto-cjk \
&& apt-get autoremove -y \ && apt-get autoremove -y \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*

@ -1,77 +1,36 @@
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from fontTools.ttLib import TTFont from matplotlib.font_manager import FontProperties
from matplotlib.font_manager import findSystemFonts
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.chart.tools.line import LinearChartTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
# use a business theme
plt.style.use("seaborn-v0_8-darkgrid")
plt.rcParams["axes.unicode_minus"] = False
def set_chinese_font():
def init_fonts(): font_list = [
fonts = findSystemFonts() "PingFang SC",
"SimHei",
popular_unicode_fonts = [ "Microsoft YaHei",
"STSong",
"SimSun",
"Arial Unicode MS", "Arial Unicode MS",
"DejaVu Sans", "Noto Sans CJK SC",
"DejaVu Sans Mono", "Noto Sans CJK JP",
"DejaVu Serif",
"FreeMono",
"FreeSans",
"FreeSerif",
"Liberation Mono",
"Liberation Sans",
"Liberation Serif",
"Noto Mono",
"Noto Sans",
"Noto Serif",
"Open Sans",
"Roboto",
"Source Code Pro",
"Source Sans Pro",
"Source Serif Pro",
"Ubuntu",
"Ubuntu Mono",
] ]
supported_fonts = [] for font in font_list:
chinese_font = FontProperties(font)
if chinese_font.get_name() == font:
return chinese_font
for font_path in fonts: return FontProperties()
try:
font = TTFont(font_path)
# get family name
family_name = font["name"].getName(1, 3, 1).toUnicode()
if family_name in popular_unicode_fonts:
supported_fonts.append(family_name)
except:
pass
plt.rcParams["font.family"] = "sans-serif"
# sort by order of popular_unicode_fonts
for font in popular_unicode_fonts:
if font in supported_fonts:
plt.rcParams["font.sans-serif"] = font
break
# use a business theme
init_fonts() plt.style.use("seaborn-v0_8-darkgrid")
plt.rcParams["axes.unicode_minus"] = False
font_properties = set_chinese_font()
plt.rcParams["font.family"] = font_properties.get_name()
class ChartProvider(BuiltinToolProviderController): class ChartProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None: def _validate_credentials(self, credentials: dict) -> None:
try: pass
LinearChartTool().fork_tool_runtime(
runtime={
"credentials": credentials,
}
).invoke(
user_id="",
tool_parameters={
"data": "1,3,5,7,9,2,4,6,8,10",
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))

Loading…
Cancel
Save