| 128 | |
| 129 | # fmt: off |
| 130 | class TranslateConverter(PDFConverterEx): |
| 131 | def __init__( |
| 132 | self, |
| 133 | rsrcmgr, |
| 134 | vfont: str = None, |
| 135 | vchar: str = None, |
| 136 | thread: int = 0, |
| 137 | layout={}, |
| 138 | lang_in: str = "", |
| 139 | lang_out: str = "", |
| 140 | service: str = "", |
| 141 | noto_name: str = "", |
| 142 | noto: Font = None, |
| 143 | envs: Dict = None, |
| 144 | prompt: Template = None, |
| 145 | ignore_cache: bool = False, |
| 146 | ) -> None: |
| 147 | super().__init__(rsrcmgr) |
| 148 | self.vfont = vfont |
| 149 | self.vchar = vchar |
| 150 | self.thread = thread |
| 151 | self.layout = layout |
| 152 | self.noto_name = noto_name |
| 153 | self.noto = noto |
| 154 | self.translator: BaseTranslator = None |
| 155 | # e.g. "ollama:gemma2:9b" -> ["ollama", "gemma2:9b"] |
| 156 | param = service.split(":", 1) |
| 157 | service_name = param[0] |
| 158 | service_model = param[1] if len(param) > 1 else None |
| 159 | if not envs: |
| 160 | envs = {} |
| 161 | for translator in [GoogleTranslator, BingTranslator, DeepLTranslator, DeepLXTranslator, OllamaTranslator, XinferenceTranslator, AzureOpenAITranslator, |
| 162 | OpenAITranslator, ZhipuTranslator, ModelScopeTranslator, SiliconTranslator, GeminiTranslator, AzureTranslator, TencentTranslator, DifyTranslator, AnythingLLMTranslator, ArgosTranslator, GrokTranslator, GroqTranslator, DeepseekTranslator, OpenAIlikedTranslator, QwenMtTranslator,]: |
| 163 | if service_name == translator.name: |
| 164 | self.translator = translator(lang_in, lang_out, service_model, envs=envs, prompt=prompt, ignore_cache=ignore_cache) |
| 165 | if not self.translator: |
| 166 | raise ValueError("Unsupported translation service") |
| 167 | |
| 168 | def receive_layout(self, ltpage: LTPage): |
| 169 | # 段落 |
| 170 | sstk: list[str] = [] # 段落文字栈 |
| 171 | pstk: list[Paragraph] = [] # 段落属性栈 |
| 172 | vbkt: int = 0 # 段落公式括号计数 |
| 173 | # 公式组 |
| 174 | vstk: list[LTChar] = [] # 公式符号组 |
| 175 | vlstk: list[LTLine] = [] # 公式线条组 |
| 176 | vfix: float = 0 # 公式纵向偏移 |
| 177 | # 公式组栈 |
| 178 | var: list[list[LTChar]] = [] # 公式符号组栈 |
| 179 | varl: list[list[LTLine]] = [] # 公式线条组栈 |
| 180 | varf: list[float] = [] # 公式纵向偏移栈 |
| 181 | vlen: list[float] = [] # 公式宽度栈 |
| 182 | # 全局 |
| 183 | lstk: list[LTLine] = [] # 全局线条栈 |
| 184 | xt: LTChar = None # 上一个字符 |
| 185 | xt_cls: int = -1 # 上一个字符所属段落,保证无论第一个字符属于哪个类别都可以触发新段落 |
| 186 | vmax: float = ltpage.width / 4 # 行内公式最大宽度 |
| 187 | ops: str = "" # 渲染结果 |
no outgoing calls