plain_persian() strips kasra/fatha/damma/shadda/sukun/hamza-above and the written «هی» ezafe, keeping tanwin. Applied at output, not in data: PlainPersianJSONRenderer runs one byte-level pass over every JSON response (~5 ms per MB locally), and to_plain() cleans tutor answers including the stream. Rewriting titles in the DB/seed would have broken question binding by title path and SeedRecord keys. Tests updated to expect the cleaned text; config/tests_plain_persian.py. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
25 lines
1.8 KiB
Python
25 lines
1.8 KiB
Python
"""
|
|
JSONِ همهی پاسخهای API، با متنِ فارسیِ بیاعراب و بی «ی»ِ اضافه (`content.plain_math.plain_persian`).
|
|
|
|
چرا اینجا و نه در داده: محتوا (۱۸ هزار سوال، عنوانِ فصل/جزیره/درس) و پیامهای کد اعراب دارند. بازنویسیِ عنوانها
|
|
در دیتابیس و seed اتصالِ سوال به درس را میشکند (سوالها با مسیرِ عنوان بسته میشوند و دفترِ SeedRecord با هشِ
|
|
عنوان کلید میخورد). یک لایه در خروجی هر پیام و محتوایی را، تازه یا قدیمی، یکجا میگیرد؛ ادمین و دیتابیس همان
|
|
متنِ اصلی را نگه میدارند. پاسخِ زندهی دستیار (SSE) از این renderer رد نمیشود و همین کار را در
|
|
`rag.services.mathtext.to_plain` میکند.
|
|
|
|
هزینه: `plain_persian_utf8` را ببین؛ زیرِ بارِ سرور اندازه نشده.
|
|
"""
|
|
from rest_framework.renderers import JSONRenderer
|
|
|
|
from content.plain_math import plain_persian_utf8
|
|
|
|
|
|
class PlainPersianJSONRenderer(JSONRenderer):
|
|
"""یک گذر روی بایتهای JSONِ نهایی، نه روی تکتکِ رشتههای داده (که روی کلِ curriculum ۴ برابرِ کندتر بود).
|
|
ensure_ascii در DRF خاموش است (UNICODE_JSON پیشفرض)، پس حروفِ فارسی خودشان در خروجیاند، نه \\uXXXX؛
|
|
`ApiOutputTests` همین را میسنجد."""
|
|
|
|
def render(self, data, accepted_media_type=None, renderer_context=None):
|
|
body = super().render(data, accepted_media_type, renderer_context)
|
|
return plain_persian_utf8(body) if body else body
|