XMWAI 0.3.25__tar.gz → 0.3.27__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of XMWAI might be problematic. Click here for more details.

Files changed (121) hide show
  1. {xmwai-0.3.25/XMWAI.egg-info → xmwai-0.3.27}/PKG-INFO +1 -1
  2. xmwai-0.3.25/XMWAI/web_core.py → xmwai-0.3.27/XMWAI/web_core copy.py +56 -105
  3. xmwai-0.3.27/XMWAI/web_core.py +287 -0
  4. {xmwai-0.3.25 → xmwai-0.3.27/XMWAI.egg-info}/PKG-INFO +1 -1
  5. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI.egg-info/SOURCES.txt +1 -0
  6. {xmwai-0.3.25 → xmwai-0.3.27}/setup.py +1 -1
  7. {xmwai-0.3.25 → xmwai-0.3.27}/LICENSE.txt +0 -0
  8. {xmwai-0.3.25 → xmwai-0.3.27}/MANIFEST.in +0 -0
  9. {xmwai-0.3.25 → xmwai-0.3.27}/README.md +0 -0
  10. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/__init__.py +0 -0
  11. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/bomb_core.py +0 -0
  12. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/core.py +0 -0
  13. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/file/__init__.py +0 -0
  14. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/file/idiom.json +0 -0
  15. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/0.gif +0 -0
  16. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/1.gif +0 -0
  17. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/10.gif +0 -0
  18. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/11.gif +0 -0
  19. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/12.gif +0 -0
  20. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/13.gif +0 -0
  21. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/14.gif +0 -0
  22. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/15.gif +0 -0
  23. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/16.gif +0 -0
  24. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/17.gif +0 -0
  25. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/18.gif +0 -0
  26. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/19.gif +0 -0
  27. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/2.gif +0 -0
  28. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/20.gif +0 -0
  29. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/21.gif +0 -0
  30. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/22.gif +0 -0
  31. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/23.gif +0 -0
  32. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/24.gif +0 -0
  33. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/25.gif +0 -0
  34. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/26.gif +0 -0
  35. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/27.gif +0 -0
  36. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/28.gif +0 -0
  37. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/29.gif +0 -0
  38. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/3.gif +0 -0
  39. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/30.gif +0 -0
  40. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/31.gif +0 -0
  41. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/32.gif +0 -0
  42. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/33.gif +0 -0
  43. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/34.gif +0 -0
  44. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/35.gif +0 -0
  45. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/36.gif +0 -0
  46. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/37.gif +0 -0
  47. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/38.gif +0 -0
  48. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/39.gif +0 -0
  49. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/4.gif +0 -0
  50. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/40.gif +0 -0
  51. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/41.gif +0 -0
  52. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/42.gif +0 -0
  53. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/43.gif +0 -0
  54. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/44.gif +0 -0
  55. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/45.gif +0 -0
  56. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/46.gif +0 -0
  57. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/47.gif +0 -0
  58. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/48.gif +0 -0
  59. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/49.gif +0 -0
  60. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/5.gif +0 -0
  61. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/50.gif +0 -0
  62. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/51.gif +0 -0
  63. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/52.gif +0 -0
  64. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/53.gif +0 -0
  65. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/54.gif +0 -0
  66. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/55.gif +0 -0
  67. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/56.gif +0 -0
  68. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/57.gif +0 -0
  69. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/58.gif +0 -0
  70. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/59.gif +0 -0
  71. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/6.gif +0 -0
  72. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/60.gif +0 -0
  73. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/61.gif +0 -0
  74. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/62.gif +0 -0
  75. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/63.gif +0 -0
  76. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/64.gif +0 -0
  77. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/65.gif +0 -0
  78. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/66.gif +0 -0
  79. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/67.gif +0 -0
  80. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/68.gif +0 -0
  81. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/69.gif +0 -0
  82. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/7.gif +0 -0
  83. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/70.gif +0 -0
  84. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/71.gif +0 -0
  85. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/72.gif +0 -0
  86. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/73.gif +0 -0
  87. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/74.gif +0 -0
  88. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/75.gif +0 -0
  89. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/76.gif +0 -0
  90. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/77.gif +0 -0
  91. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/78.gif +0 -0
  92. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/79.gif +0 -0
  93. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/8.gif +0 -0
  94. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/80.gif +0 -0
  95. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/81.gif +0 -0
  96. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/82.gif +0 -0
  97. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/83.gif +0 -0
  98. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/84.gif +0 -0
  99. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/85.gif +0 -0
  100. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/9.gif +0 -0
  101. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/gif/__init__.py +0 -0
  102. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/idiom_core.py +0 -0
  103. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/magic_core.py +0 -0
  104. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/static/burger.js +0 -0
  105. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/static/images/BottomBun.png +0 -0
  106. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/static/images/TopBun.png +0 -0
  107. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/static/images/beef.png +0 -0
  108. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/static/images/bg.jpeg +0 -0
  109. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/static/images/bg.png +0 -0
  110. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/static/images/cheese.png +0 -0
  111. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/static/images/lettuce.png +0 -0
  112. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/static/images/sauce.png +0 -0
  113. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/static/images/tomato.png +0 -0
  114. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/templates/burger.html +0 -0
  115. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/templates/nutrition_pie.html +0 -0
  116. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/templates//345/210/233/346/204/217/350/217/234/350/260/261.html" +0 -0
  117. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI/trial_class.py +0 -0
  118. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI.egg-info/dependency_links.txt +0 -0
  119. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI.egg-info/requires.txt +0 -0
  120. {xmwai-0.3.25 → xmwai-0.3.27}/XMWAI.egg-info/top_level.txt +0 -0
  121. {xmwai-0.3.25 → xmwai-0.3.27}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: XMWAI
3
- Version: 0.3.25
3
+ Version: 0.3.27
4
4
  Summary: Small code King AI related library
5
5
  Home-page: https://github.com/Tonykai88/XMWAI.git
6
6
  Author: pydevelopment
@@ -1,5 +1,3 @@
1
- from PIL import Image, ImageDraw
2
- import random
3
1
  import os
4
2
  import json
5
3
  import requests
@@ -90,8 +88,8 @@ emoji_dict = {
90
88
 
91
89
  # 动作对应 emoji
92
90
  action_dict = {
93
- "炒": "🍳", "煮": "🍲", "烤": "🔥", "蒸": "♨️", "炸": "🍟",
94
- "拌": "🥣", "切": "🔪", "腌": "🫙", "炖": "🥘"
91
+ "炒": "🍳", "煮": "🍲", "烤": "🔥", "蒸": "♨️", "炸": "🍟", "拌": "🥣",
92
+ "切": "🔪", "腌": "🫙", "炖": "🥘"
95
93
  }
96
94
 
97
95
 
@@ -110,6 +108,7 @@ def format_section_steps(text):
110
108
 
111
109
 
112
110
  def parse_nutrition_section(text):
111
+ """解析 API 返回的营养 JSON 并提取数值"""
113
112
  default_data = {"蛋白质": 30, "脂肪": 20, "碳水化合物": 50, "维生素": 10, "矿物质": 5}
114
113
 
115
114
  def extract_number(val):
@@ -154,34 +153,11 @@ def generate_pie_chart(data_dict, filename: Path):
154
153
  return filename
155
154
 
156
155
 
157
- def random_gradient_bg(bg_path: Path):
158
- """生成一张随机渐变背景图"""
159
- width, height = 1200, 800
160
-
161
- # 随机挑两个颜色 (RGB)
162
- start_color = (random.randint(100, 255), random.randint(
163
- 100, 255), random.randint(100, 255))
164
- end_color = (random.randint(100, 255), random.randint(
165
- 100, 255), random.randint(100, 255))
166
-
167
- img = Image.new("RGB", (width, height), start_color)
168
- draw = ImageDraw.Draw(img)
169
-
170
- for y in range(height):
171
- r = int(start_color[0] + (end_color[0] - start_color[0]) * y / height)
172
- g = int(start_color[1] + (end_color[1] - start_color[1]) * y / height)
173
- b = int(start_color[2] + (end_color[2] - start_color[2]) * y / height)
174
- draw.line([(0, y), (width, y)], fill=(r, g, b))
175
-
176
- img.save(bg_path, "JPEG")
177
- print(f"🎨 生成随机渐变背景:{bg_path}")
178
-
179
-
180
156
  def cookbook(m, t, s, key):
181
157
  if key != "CaJQ":
182
158
  return "密钥错误,无法生成食谱。"
183
159
 
184
- # 调用 API
160
+ # 调用 API 生成创意菜谱
185
161
  messagesList = [
186
162
  {"role": "system", "content": "天马行空的创意菜厨师"},
187
163
  {"role": "user", "content": f"请以{m}为主菜,{s}为配菜,{t}为烹饪方式写一个创意食谱,"
@@ -193,8 +169,11 @@ def cookbook(m, t, s, key):
193
169
  url = "https://qianfan.baidubce.com/v2/chat/completions"
194
170
  payload = json.dumps({"model": "ernie-4.5-turbo-32k",
195
171
  "messages": messagesList}, ensure_ascii=False)
196
- headers = {"Content-Type": "application/json",
197
- "appid": "", "Authorization": "Bearer xxxxx"}
172
+ headers = {
173
+ "Content-Type": "application/json",
174
+ "appid": "",
175
+ "Authorization": "Bearer bce-v3/ALTAK-cGbxpVA5AbSz6h8nbLaFh/b539762075d55c76d93dc78bcf0a91beeaf0490a"
176
+ }
198
177
 
199
178
  try:
200
179
  response = requests.post(url, headers=headers,
@@ -206,12 +185,12 @@ def cookbook(m, t, s, key):
206
185
 
207
186
  # 分割内容
208
187
  sections = re.split(r"(创意灵感|食材清单|制作步骤|食材搭配的营养价值)", content)
209
- body_sections = [""] * 4
188
+ body_sections = [""]*4
210
189
  title_map = {"创意灵感": 0, "食材清单": 1, "制作步骤": 2, "食材搭配的营养价值": 3}
211
190
  i = 1
212
191
  while i < len(sections):
213
192
  header = sections[i]
214
- text_sec = sections[i + 1] if i + 1 < len(sections) else ""
193
+ text_sec = sections[i+1] if i+1 < len(sections) else ""
215
194
  idx = title_map.get(header.strip(), None)
216
195
  if idx is not None:
217
196
  body_sections[idx] = text_sec.strip()
@@ -221,20 +200,20 @@ def cookbook(m, t, s, key):
221
200
  templates_dir = Path(files("XMWAI") / "templates")
222
201
  templates_dir.mkdir(exist_ok=True)
223
202
 
224
- # 每次生成随机背景
203
+ # 静态图片路径(PyPI 安装后能读取)
225
204
  bg_path = Path(files("XMWAI") / "static" / "images" / "bg.jpeg")
226
- random_gradient_bg(bg_path)
227
205
 
228
- # 生成饼图
206
+ # 生成饼图文件
229
207
  pie_chart_file = templates_dir / "nutrition_pie.html"
230
208
  nutrient_data = parse_nutrition_section(body_sections[3])
231
209
  generate_pie_chart(nutrient_data, pie_chart_file)
232
210
 
233
211
  # 添加 emoji
234
- m_emoji, s_emoji, t_emoji = add_emoji_to_text(
235
- m), add_emoji_to_text(s), add_emoji_to_text(t)
212
+ m_emoji = add_emoji_to_text(m)
213
+ s_emoji = add_emoji_to_text(s)
214
+ t_emoji = add_emoji_to_text(t)
236
215
 
237
- # 生成步骤 HTML
216
+ # 步骤顺序 HTML
238
217
  step_titles = ["食材搭配的营养价值", "创意灵感", "食材清单", "制作步骤"]
239
218
  steps_order = [3, 0, 1, 2]
240
219
  steps_html = ""
@@ -244,89 +223,61 @@ def cookbook(m, t, s, key):
244
223
  else:
245
224
  section_content_html = format_section_steps(body_sections[idx])
246
225
  steps_html += f"""
247
- <div class="step-card" style="animation-delay:{(i + 1) * 0.2}s;">
248
- <div class="step-title">Step {i + 1} 📝 {step_titles[i]}</div>
226
+ <div class="step-card" style="animation-delay:{(i+1)*0.2}s;">
227
+ <div class="step-title">Step {i+1} 📝 {step_titles[i]}</div>
249
228
  <div class="step-content">{section_content_html}</div>
250
229
  </div>
251
230
  """
252
231
 
253
- # 相对路径
254
- bg_rel_path = os.path.relpath(bg_path, templates_dir)
255
- pie_rel_path = os.path.relpath(pie_chart_file, templates_dir)
256
-
257
- # HTML 文件
258
- safe_title = re.sub(r'[\/\\:*?"<>|]', "", m + t + s)
259
- html_file = templates_dir / f"{safe_title}_菜谱.html"
260
-
232
+ # HTML 页面
261
233
  html = f"""
262
234
  <!DOCTYPE html>
263
235
  <html lang="zh">
264
236
  <head>
265
- <meta charset="UTF-8">
266
- <title>创意菜谱</title>
267
- <style>
268
- html, body {{ margin:0; padding:0; width:100%; height:100%; overflow-x:hidden; }}
269
- body {{
270
- font-family:"微软雅黑",sans-serif;
271
- background:#2c2c2c url('{bg_rel_path}') no-repeat center center fixed;
272
- background-size:cover;
273
- color:#333;
274
- }}
275
- .container {{
276
- max-width:1200px; margin:30px auto;
277
- background:rgba(255,248,220,0.95);
278
- border-radius:15px; padding:30px;
279
- box-shadow:0 0 20px rgba(0,0,0,0.2);
280
- }}
281
- .banner {{
282
- width:100%; height:220px;
283
- background:url('{bg_rel_path}') center/cover no-repeat;
284
- border-radius:15px 15px 0 0;
285
- display:flex; align-items:center; justify-content:center;
286
- }}
287
- .banner h1 {{ color:#fff; font-size:28px; text-shadow:1px 1px 3px #666; }}
288
- p {{ font-size:18px; margin:8px 0; }}
289
- .step-card {{
290
- background:#fff0b3; margin:10px 0; border-radius:12px;
291
- overflow:hidden; opacity:0; transform:translateY(20px) scale(0.98);
292
- animation:fadeInUp 0.6s forwards;
293
- }}
294
- .step-title {{
295
- font-weight:bold; padding:10px 15px; cursor:pointer;
296
- background:#ffb347; color:#fff; border-bottom:1px solid #ffd27f;
297
- }}
298
- .step-content {{
299
- padding:10px 15px; display:block; font-size:16px;
300
- opacity:0; max-height:0; overflow:hidden;
301
- transition: opacity 0.4s ease, max-height 0.4s ease;
302
- }}
303
- .step-card.hover .step-content {{ opacity:1; max-height:800px; }}
304
- iframe {{ width:100%; height:500px; border:none; margin-top:20px; }}
305
- @keyframes fadeInUp {{ to {{ opacity:1; transform:translateY(0) scale(1); }} }}
306
- </style>
237
+ <meta charset="UTF-8">
238
+ <title>创意菜谱</title>
239
+ <style>
240
+ html, body {{ margin:0; padding:0; width:100%; height:100%; overflow-x:hidden; }}
241
+ body {{ font-family:"微软雅黑",sans-serif; background:#2c2c2c url('{bg_path.resolve()}') no-repeat center center fixed; background-size:cover; color:#333; }}
242
+ .container {{ max-width:1200px; margin:30px auto; background:rgba(255,248,220,0.95); border-radius:15px; padding:30px; box-shadow:0 0 20px rgba(0,0,0,0.2); }}
243
+ .banner {{ width:100%; height:220px; background:url('{bg_path.resolve()}') center/cover no-repeat; border-radius:15px 15px 0 0; display:flex; align-items:center; justify-content:center; }}
244
+ .banner h1 {{ color:#fff; font-size:28px; text-shadow:1px 1px 3px #666; }}
245
+ p {{ font-size:18px; margin:8px 0; }}
246
+ .step-card {{ background:#fff0b3; margin:10px 0; border-radius:12px; overflow:hidden; opacity:0; transform:translateY(20px) scale(0.98); animation:fadeInUp 0.6s forwards; }}
247
+ .step-title {{ font-weight:bold; padding:10px 15px; cursor:pointer; background:#ffb347; color:#fff; border-bottom:1px solid #ffd27f; }}
248
+ .step-content {{ padding:10px 15px; display:block; font-size:16px; opacity:0; max-height:0; overflow:hidden; transition: opacity 0.4s ease, max-height 0.4s ease; }}
249
+ .step-card.hover .step-content {{ opacity:1; max-height:800px; }}
250
+ iframe {{ width:100%; height:500px; border:none; margin-top:20px; }}
251
+ @keyframes fadeInUp {{ to {{ opacity:1; transform:translateY(0) scale(1); }} }}
252
+ </style>
307
253
  </head>
308
254
  <body>
309
- <div class="container">
310
- <div class="banner"><h1>🍽 {m+t+s}</h1></div>
311
- <p>🍖 <strong>主菜:</strong>{m_emoji}</p>
312
- <p>🥗 <strong>配菜:</strong>{s_emoji}</p>
313
- <p>👩‍🍳 <strong>做法:</strong>{t_emoji}</p>
314
- {steps_html}
315
- <iframe src="{pie_rel_path}"></iframe>
316
- </div>
317
- <script>
318
- const steps = document.querySelectorAll('.step-card');
319
- steps.forEach(card => {{
320
- card.addEventListener('mouseenter', () => card.classList.add('hover'));
321
- card.addEventListener('mouseleave', () => card.classList.remove('hover'));
322
- }});
323
- </script>
255
+ <div class="container">
256
+ <div class="banner"><h1>🍽 {m+t+s}</h1></div>
257
+ <p>🍖 <strong>主菜:</strong>{m_emoji}</p>
258
+ <p>🥗 <strong>配菜:</strong>{s_emoji}</p>
259
+ <p>👩‍🍳 <strong>做法:</strong>{t_emoji}</p>
260
+ {steps_html}
261
+ <iframe src="{pie_chart_file.resolve()}"></iframe>
262
+ </div>
263
+ <script>
264
+ const steps = document.querySelectorAll('.step-card');
265
+ steps.forEach(card => {{
266
+ card.addEventListener('mouseenter', () => {{ card.classList.add('hover'); }});
267
+ card.addEventListener('mouseleave', () => {{ card.classList.remove('hover'); }});
268
+ }});
269
+ </script>
324
270
  </body>
325
271
  </html>
326
272
  """
327
273
 
274
+ # 保存 HTML 文件到包内 templates
275
+ safe_title = re.sub(r'[\/\\:*?"<>|]', "", m+t+s)
276
+ html_file = templates_dir / f"{safe_title}_菜谱.html"
328
277
  with open(html_file, "w", encoding="utf-8") as f:
329
278
  f.write(html)
330
279
 
280
+ # 打开浏览器
331
281
  webbrowser.open(f"file://{html_file.resolve()}")
282
+
332
283
  return content
@@ -0,0 +1,287 @@
1
+ import os
2
+ import json
3
+ import requests
4
+ from flask import Flask, render_template
5
+ import re
6
+ import shutil
7
+ from pyecharts import options as opts
8
+ from pyecharts.charts import Pie
9
+ import webbrowser
10
+ import threading
11
+ import time
12
+ from importlib.resources import files
13
+ from pathlib import Path
14
+
15
+
16
+ '''Super堡'''
17
+ # 搭建flask框架
18
+ app = Flask(
19
+ __name__,
20
+ template_folder=os.path.join(os.path.dirname(__file__), "templates"),
21
+ static_folder=os.path.join(os.path.dirname(__file__), "static")
22
+ )
23
+
24
+ mapping = {
25
+ "面包底": "BottomBun",
26
+ "生菜": "lettuce",
27
+ "番茄": "tomato",
28
+ "牛肉饼": "beef",
29
+ "芝士": "cheese",
30
+ "酱料": "sauce",
31
+ "面包顶": "TopBun"
32
+ }
33
+
34
+ ingredients_order = []
35
+
36
+
37
+ def burger(result):
38
+ global ingredients_order
39
+ inputs = result.strip().split("→")
40
+ ingredients_order = [mapping[i] for i in inputs]
41
+ ingredients_order = ingredients_order[::-1]
42
+
43
+ # 自动启动服务器
44
+ start_server()
45
+ return ingredients_order
46
+
47
+
48
+ @app.route('/')
49
+ def show_burger():
50
+ return render_template("burger.html", ingredients=ingredients_order)
51
+
52
+
53
+ def run_server(port=5050):
54
+ """在后台线程中运行服务器"""
55
+ app.run(debug=False, host='0.0.0.0', port=port, use_reloader=False)
56
+
57
+
58
+ def start_server(port=5050):
59
+ """启动服务器并打开浏览器"""
60
+ url = f"http://127.0.0.1:{port}/"
61
+
62
+ # 在后台线程中启动服务器
63
+ server_thread = threading.Thread(target=run_server, args=(port,))
64
+ server_thread.daemon = True
65
+ server_thread.start()
66
+
67
+ # 等待服务器启动
68
+ time.sleep(2)
69
+
70
+ # 打开浏览器
71
+ webbrowser.open(url)
72
+
73
+ # 保持服务器运行
74
+ try:
75
+ server_thread.join()
76
+ except KeyboardInterrupt:
77
+ pass
78
+
79
+
80
+ '''Random料理屋'''
81
+ # 食材对应 emoji
82
+ emoji_dict = {
83
+ "鸡": "🍗", "牛": "🥩", "猪": "🥓", "鱼": "🐟", "虾": "🦐", "蟹": "🦀",
84
+ "豆腐": "🧈", "土豆": "🥔", "胡萝卜": "🥕", "西红柿": "🍅", "青菜": "🥬",
85
+ "菠菜": "🥬", "蘑菇": "🍄", "玉米": "🌽", "米饭": "🍚", "面条": "🍜",
86
+ "面包": "🍞", "奶酪": "🧀", "鸡蛋": "🥚", "牛奶": "🥛", "橙子": "🍊",
87
+ "苹果": "🍎", "香蕉": "🍌"
88
+ }
89
+
90
+ # 动作对应 emoji
91
+ action_dict = {
92
+ "炒": "🍳", "煮": "🍲", "烤": "🔥", "蒸": "♨️", "炸": "🍟", "拌": "🥣",
93
+ "切": "🔪", "腌": "🫙", "炖": "🥘"
94
+ }
95
+
96
+
97
+ def add_emoji_to_text(text):
98
+ for key, val in action_dict.items():
99
+ text = re.sub(f'({key})', f'{val} \\1', text)
100
+ for key, val in emoji_dict.items():
101
+ text = re.sub(f'({key})', f'{val} \\1', text)
102
+ return text
103
+
104
+
105
+ def format_section_steps(text):
106
+ lines = [line.strip() for line in text.strip().split("\n") if line.strip()]
107
+ lines = lines[:50]
108
+ return "<br>".join(add_emoji_to_text(line) for line in lines)
109
+
110
+
111
+ def parse_nutrition_section(text):
112
+ """解析 API 返回的营养 JSON 并提取数值"""
113
+ default_data = {"蛋白质": 30, "脂肪": 20, "碳水化合物": 50, "维生素": 10, "矿物质": 5}
114
+
115
+ def extract_number(val):
116
+ if isinstance(val, (int, float)):
117
+ return val
118
+ if isinstance(val, str):
119
+ match = re.search(r"(\d+(\.\d+)?)", val)
120
+ if match:
121
+ return float(match.group(1))
122
+ return 0
123
+
124
+ try:
125
+ match = re.search(r"\{.*\}", text, re.S)
126
+ if match:
127
+ parsed = json.loads(match.group())
128
+ result = {}
129
+ for key in default_data.keys():
130
+ if key in parsed:
131
+ val = parsed[key]
132
+ if isinstance(val, dict):
133
+ total = sum(extract_number(v) for v in val.values())
134
+ result[key] = total
135
+ else:
136
+ result[key] = extract_number(val)
137
+ else:
138
+ result[key] = default_data[key]
139
+ return result
140
+ except Exception as e:
141
+ print("JSON解析失败:", e)
142
+ return default_data
143
+
144
+
145
+ def generate_pie_chart(data_dict, filename: Path):
146
+ data = [(k, v) for k, v in data_dict.items()]
147
+ pie = (
148
+ Pie(init_opts=opts.InitOpts(width="1100px", height="500px"))
149
+ .add("", data)
150
+ .set_global_opts(title_opts=opts.TitleOpts(title="营养价值分布"))
151
+ .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
152
+ )
153
+ pie.render(str(filename))
154
+ return filename
155
+
156
+
157
+ def cookbook(m, t, s, key):
158
+ if key != "CaJQ":
159
+ return "密钥错误,无法生成食谱。"
160
+
161
+ # 调用 API 生成创意菜谱
162
+ messagesList = [
163
+ {"role": "system", "content": "天马行空的创意菜厨师"},
164
+ {"role": "user", "content": f"请以{m}为主菜,{s}为配菜,{t}为烹饪方式写一个创意食谱,"
165
+ "结果中不要*,并且结果只需要创意灵感、食材清单、制作步骤、"
166
+ "食材搭配的营养价值四种大标题内容。食材搭配的营养价值部分请输出标准 JSON,"
167
+ "键为蛋白质、脂肪、碳水化合物、维生素、矿物质,值为数值及说明。"}
168
+ ]
169
+
170
+ url = "https://qianfan.baidubce.com/v2/chat/completions"
171
+ payload = json.dumps({"model": "ernie-4.5-turbo-32k",
172
+ "messages": messagesList}, ensure_ascii=False)
173
+ headers = {
174
+ "Content-Type": "application/json",
175
+ "appid": "",
176
+ "Authorization": "Bearer bce-v3/ALTAK-cGbxpVA5AbSz6h8nbLaFh/b539762075d55c76d93dc78bcf0a91beeaf0490a"
177
+ }
178
+
179
+ try:
180
+ response = requests.post(url, headers=headers,
181
+ data=payload.encode("utf-8"))
182
+ response_data = response.json()
183
+ content = response_data["choices"][0]["message"]["content"]
184
+ except Exception as e:
185
+ return f"接口调用失败:{e}"
186
+
187
+ # 分割内容
188
+ sections = re.split(r"(创意灵感|食材清单|制作步骤|食材搭配的营养价值)", content)
189
+ body_sections = [""]*4
190
+ title_map = {"创意灵感": 0, "食材清单": 1, "制作步骤": 2, "食材搭配的营养价值": 3}
191
+ i = 1
192
+ while i < len(sections):
193
+ header = sections[i]
194
+ text_sec = sections[i+1] if i+1 < len(sections) else ""
195
+ idx = title_map.get(header.strip(), None)
196
+ if idx is not None:
197
+ body_sections[idx] = text_sec.strip()
198
+ i += 2
199
+
200
+ # 模板和图片目录
201
+ templates_dir = Path(files("XMWAI") / "templates")
202
+ templates_dir.mkdir(exist_ok=True)
203
+
204
+ # 从包内 static 拷贝背景图到模板目录
205
+ bg_src = Path(files("XMWAI") / "static" / "images" / "bg.jpeg")
206
+ bg_copy = templates_dir / "bg.jpeg"
207
+ if not bg_copy.exists():
208
+ shutil.copy(bg_src, bg_copy)
209
+
210
+ # 生成饼图文件
211
+ pie_chart_file = templates_dir / "nutrition_pie.html"
212
+ nutrient_data = parse_nutrition_section(body_sections[3])
213
+ generate_pie_chart(nutrient_data, pie_chart_file)
214
+
215
+ # 添加 emoji
216
+ m_emoji = add_emoji_to_text(m)
217
+ s_emoji = add_emoji_to_text(s)
218
+ t_emoji = add_emoji_to_text(t)
219
+
220
+ # 步骤顺序 HTML
221
+ step_titles = ["食材搭配的营养价值", "创意灵感", "食材清单", "制作步骤"]
222
+ steps_order = [3, 0, 1, 2]
223
+ steps_html = ""
224
+ for i, idx in enumerate(steps_order):
225
+ if idx == 3:
226
+ section_content_html = "根据食材搭配生成的营养价值饼图如下 ⬇️"
227
+ else:
228
+ section_content_html = format_section_steps(body_sections[idx])
229
+ steps_html += f"""
230
+ <div class="step-card" style="animation-delay:{(i+1)*0.2}s;">
231
+ <div class="step-title">Step {i+1} 📝 {step_titles[i]}</div>
232
+ <div class="step-content">{section_content_html}</div>
233
+ </div>
234
+ """
235
+
236
+ # HTML 页面 (背景图引用相对路径 bg.jpeg)
237
+ html = f"""
238
+ <!DOCTYPE html>
239
+ <html lang="zh">
240
+ <head>
241
+ <meta charset="UTF-8">
242
+ <title>创意菜谱</title>
243
+ <style>
244
+ html, body {{ margin:0; padding:0; width:100%; height:100%; overflow-x:hidden; }}
245
+ body {{ font-family:"微软雅黑",sans-serif; background:#2c2c2c url('bg.jpeg') no-repeat center center fixed; background-size:cover; color:#333; }}
246
+ .container {{ max-width:1200px; margin:30px auto; background:rgba(255,248,220,0.95); border-radius:15px; padding:30px; box-shadow:0 0 20px rgba(0,0,0,0.2); }}
247
+ .banner {{ width:100%; height:220px; background:url('bg.jpeg') center/cover no-repeat; border-radius:15px 15px 0 0; display:flex; align-items:center; justify-content:center; }}
248
+ .banner h1 {{ color:#fff; font-size:28px; text-shadow:1px 1px 3px #666; }}
249
+ p {{ font-size:18px; margin:8px 0; }}
250
+ .step-card {{ background:#fff0b3; margin:10px 0; border-radius:12px; overflow:hidden; opacity:0; transform:translateY(20px) scale(0.98); animation:fadeInUp 0.6s forwards; }}
251
+ .step-title {{ font-weight:bold; padding:10px 15px; cursor:pointer; background:#ffb347; color:#fff; border-bottom:1px solid #ffd27f; }}
252
+ .step-content {{ padding:10px 15px; display:block; font-size:16px; opacity:0; max-height:0; overflow:hidden; transition: opacity 0.4s ease, max-height 0.4s ease; }}
253
+ .step-card.hover .step-content {{ opacity:1; max-height:800px; }}
254
+ iframe {{ width:100%; height:500px; border:none; margin-top:20px; }}
255
+ @keyframes fadeInUp {{ to {{ opacity:1; transform:translateY(0) scale(1); }} }}
256
+ </style>
257
+ </head>
258
+ <body>
259
+ <div class="container">
260
+ <div class="banner"><h1>🍽 {m+t+s}</h1></div>
261
+ <p>🍖 <strong>主菜:</strong>{m_emoji}</p>
262
+ <p>🥗 <strong>配菜:</strong>{s_emoji}</p>
263
+ <p>👩‍🍳 <strong>做法:</strong>{t_emoji}</p>
264
+ {steps_html}
265
+ <iframe src="{pie_chart_file.name}"></iframe>
266
+ </div>
267
+ <script>
268
+ const steps = document.querySelectorAll('.step-card');
269
+ steps.forEach(card => {{
270
+ card.addEventListener('mouseenter', () => {{ card.classList.add('hover'); }});
271
+ card.addEventListener('mouseleave', () => {{ card.classList.remove('hover'); }});
272
+ }});
273
+ </script>
274
+ </body>
275
+ </html>
276
+ """
277
+
278
+ # 保存 HTML 文件到包内 templates
279
+ safe_title = re.sub(r'[\/\\:*?"<>|]', "", m+t+s)
280
+ html_file = templates_dir / f"{safe_title}_菜谱.html"
281
+ with open(html_file, "w", encoding="utf-8") as f:
282
+ f.write(html)
283
+
284
+ # 打开浏览器
285
+ webbrowser.open(f"file://{html_file.resolve()}")
286
+
287
+ return content
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: XMWAI
3
- Version: 0.3.25
3
+ Version: 0.3.27
4
4
  Summary: Small code King AI related library
5
5
  Home-page: https://github.com/Tonykai88/XMWAI.git
6
6
  Author: pydevelopment
@@ -8,6 +8,7 @@ XMWAI/core.py
8
8
  XMWAI/idiom_core.py
9
9
  XMWAI/magic_core.py
10
10
  XMWAI/trial_class.py
11
+ XMWAI/web_core copy.py
11
12
  XMWAI/web_core.py
12
13
  XMWAI.egg-info/PKG-INFO
13
14
  XMWAI.egg-info/SOURCES.txt
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="XMWAI", # 包名(pip install XMWAI)
5
- version="0.3.25", # 每次上传记得升级版本号
5
+ version="0.3.27", # 每次上传记得升级版本号
6
6
  author="pydevelopment", # 作者
7
7
  author_email="hekai@xiaoma.cn", # 邮箱
8
8
  description="Small code King AI related library", # 简短描述
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes