找回密码
 快速注册
搜索
楼主: hbghlyj

Asymptote测试

[复制链接]

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-11-11 23:18
kuing 发表于 2024-11-11 14:53
或许我们这边有时连接 Asymptote 太频繁,触发了那边的防御机制?
比如说浏览本帖第一页,就同时有很多个 ...


建议自动将图片保存为附件,这样每次刷新页面时就不需要重新编译
blog.cjhb.site 也支持tikz图和Asymptote图,每次更新博客時,都保存为图片附件不必重新編譯。

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2024-11-12 11:18
本帖最后由 kuing 于 2024-11-12 14:17 编辑 不好意思,完全看不懂……😢

是将现在的 /asy/index.php 换成 61# 吗?

点评

现在換回/asy/index.php测试一下?  发表于 2024-12-13 23:43

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-11-12 15:50
kuing 发表于 2024-11-12 03:18
不好意思,完全看不懂……😢

是将现在的 /asy/index.php 换成 61# 吗?

可以先保存為/aops.php,保留原來的吧,也許以後再換回去

用法是 ?tex=JHheMit5XjIk (需要转换为base64)

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-11-12 16:07
kuing 发表于 2024-11-12 03:18
不好意思,完全看不懂……😢

是将现在的 /asy/index.php 换成 61# 吗?

本地测试成功了。
Screenshot 2024-11-12 080655.png

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2024-11-12 17:46
hbghlyj 发表于 2024-11-12 15:50
可以先保存為/aops.php,保留原來的吧,也許以後再換回去

用法是 ?tex=JHheMit5XjIk (需要转换为base64 ...

那 JS 怎么改啊,要用那啥 btoa 还是 atob?

点评

转换为 base64 后长度增加 25%!  发表于 2024-11-14 00:08

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-11-12 17:53
kuing 发表于 2024-11-12 09:46
那 JS 怎么改啊,要用那啥 btoa 还是 atob?


将需要的公式转成base64,比如
window.btoa("$x^2+y^2$")
输出JHheMit5XjIk

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2024-11-12 23:37
本帖最后由 kuing 于 2024-11-13 00:23 编辑 刚才初改完代码,具体改法:
先将 61# 的代码存为 aops.php 放在 /asy/ 下;
然后在 zdy3pc.js 里:
var str_for_link = encodeURIComponent(str); 改成 var str_for_link = window.btoa(str);
以及之后的 <img src="/asy/?format=svg&code='+str_for_link+'" 改成 <img src="/asy/aops.php?tex='+str_for_link+'"
测试结果输出了一串文字的图片,原来是忘记加 asy 标签了。
然而,即便后来补回了 asy 标签,仍然所有的图都一直是先前的输出,如同你刚才另一帖说的故障那样。

现在似乎无论啥代码,一直是下图:
import venn;

然而,如果右键 - 用新标签页打开图片,又是另一个图!且这个图也是不变的😯

所以你另一帖说的故障还是需要搞清楚才行,是因为有缓存机制之类的吗?

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-11-13 01:14
kuing 发表于 2024-11-12 15:37
所以你另一帖说的故障还是需要搞清楚才行,是因为有缓存机制之类的吗?


猜测和token有关。也就是每次进入artofproblemsolving.com/texer 之后,会转到一个网址,后缀是8个字母。建议每次都随机生成一个token

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-11-13 01:16
按楼上所述,php代码修改为:
  1. <?php
  2. $characters = 'abcdefghijklmnopqrstuvwxyz';
  3. $randomString = '';
  4. for ($i = 0; $i < 6; $i++) {
  5.     $randomString .= $characters[rand(0, 25)];
  6. }
  7. $data = array(
  8.         'action'=>'image',
  9.         'token'=>$randomString,
  10.         'tex'=>$_GET["tex"],
  11.         'rerender'=>false
  12. );
  13. $ch = curl_init();
  14. curl_setopt_array($ch, array(
  15.         CURLOPT_URL => "https://artofproblemsolving.com/m/texer/ajax.php",
  16.         CURLOPT_RETURNTRANSFER => true,
  17.         CURLOPT_POST => 1,
  18.         CURLOPT_SSL_VERIFYHOST => 0,
  19.         CURLOPT_SSL_VERIFYPEER => 0,
  20.         CURLOPT_HTTPHEADER => array('Content-Type: application/x-www-form-urlencoded'),
  21.         CURLOPT_POSTFIELDS => http_build_query($data)
  22. ));
  23. $result=curl_exec($ch);
  24. if(curl_errno($ch)){
  25.         die('Request Error:' . curl_error($ch));
  26. }
  27. $res=json_decode($result)->response->urls[0];
  28. header('Location: '.$res);
  29. ?>
复制代码

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-11-13 01:23
kuing 发表于 2024-11-12 15:37
然而,即便后来补回了 asy 标签,仍然所有的图都一直是先前的输出,如同你刚才另一帖说的故障那样。


是不是和aops.php第6行的 'rerender'=>false 有关?如果改成 'rerender'=>true 呢?

点评

改这个没用  发表于 2024-11-13 01:57

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2024-11-13 01:57
hbghlyj 发表于 2024-11-13 01:16
按楼上所述,php代码修改为:

用了这个,好像可以了。
但图的尺寸有点大,加载也有点慢。
而且也不是完全正确,比如 5# 第二个图,没有了透明度。

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-11-13 02:39
kuing 发表于 2024-11-12 17:57
但图的尺寸有点大,


其实它返回的数据中有宽度。可以在
  1. $res=json_decode($result)->response->urls[0];
复制代码

的后面补上
  1. $width=json_decode($result)->response->width[0];
复制代码

得到图片的宽度。修改之后,上面那个Venn图就变小了!

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-11-13 02:44
按楼上所述,php改为
  1. <?php
  2. $characters = 'abcdefghijklmnopqrstuvwxyz';
  3. $randomString = '';
  4. for ($i = 0; $i < 6; $i++) {
  5.     $randomString .= $characters[rand(0, 25)];
  6. }
  7. $data = array(
  8.         'action'=>'image',
  9.         'token'=>$randomString,
  10.         'tex'=>$_GET["tex"],
  11.         'rerender'=>false
  12. );
  13. $ch = curl_init();
  14. curl_setopt_array($ch, array(
  15.         CURLOPT_URL => "https://artofproblemsolving.com/m/texer/ajax.php",
  16.         CURLOPT_RETURNTRANSFER => true,
  17.         CURLOPT_POST => 1,
  18.         CURLOPT_SSL_VERIFYHOST => 0,
  19.         CURLOPT_SSL_VERIFYPEER => 0,
  20.         CURLOPT_HTTPHEADER => array('Content-Type: application/x-www-form-urlencoded'),
  21.         CURLOPT_POSTFIELDS => http_build_query($data)
  22. ));
  23. $result=curl_exec($ch);
  24. if(curl_errno($ch)){
  25.         die('Request Error:' . curl_error($ch));
  26. }
  27. $url=json_decode($result)->response->urls[0];
  28. $width=json_decode($result)->response->width[0];
  29. echo "<img src='$url' width='$width'>";
  30. ?>
复制代码
这样返回的是图片的HTML,指定了宽度。

点评

用了这个,图片不显示了啊  发表于 2024-11-13 12:00
是不是 JS 也要跟着改?  发表于 2024-11-13 12:00
是的。这样返回的是图片的HTML,指定了宽度。  发表于 2024-11-13 16:02
请问 JS 咋改  发表于 2024-11-13 16:18

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2024-11-13 11:50
hbghlyj 发表于 2024-11-13 02:49
AoPS 每次编译时都会给出永久的 URL,所以只要保存这个 URL 就可以了,这样下次刷新页面就不需要重新编译 ...

代码咋写啊这……

点评

图片的宽度那个返回的不再是图片地址,是图片的HTML,指定了宽度。  发表于 2024-11-13 16:03
因此需要改一下 JS  发表于 2024-11-13 16:04
我不会写  发表于 2024-11-13 16:16

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-11-13 16:53
kuing 发表于 2024-11-13 03:50
代码咋写啊这……

需要从'/asy/aops.php?tex='+str_for_link获取数据,应该可以写成
  1. fetch('/asy/aops.php?tex='+str_for_link).then(response => response.text()).then(data => console.log(data));
复制代码

Screenshot 2024-11-13 085554.png

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-11-13 17:00
按楼上的fetch,应该可以将
  1. item.innerHTML = '<div class="jiaz"></div><div class="tuozt" onmousedown="tuozhuai2(this.parentNode);return false;"><!--拖动--></div><div class="guiw" onclick="guiwei(this.parentNode);return false;"><!--归位--></div><img src="/asy/aops.php?tex='+str_for_link+'" onclick="show_tikz_window(\''+str_for_show+'\');" onload="this.parentNode.classList.add(\'jiazed\')" />';
复制代码
先改为
  1. fetch('/asy/aops.php?tex='+str_for_link).then(response => response.text()).then(data => {item.innerHTML = data;})
复制代码

测试一下

如果测试成功就可以把其余的HTML加上了。

点评

貌似不行  发表于 2024-11-13 17:47
哪里出错了呢?  发表于 2024-11-13 17:55
要不先别管宽度了,先研究下 75# 说的“永久 URL”怎么写代码吧……  发表于 2024-11-13 18:00

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2024-11-13 18:40
问题是,发帖时根本不知道 URL 是什么,怎么存?

点评

发帖提交时需要从AoPS获取URL吧。  发表于 2024-11-13 18:43
需要在发帖时取得URL吧  发表于 2024-11-13 20:08
这样只需在发帖时编译,看帖时就不需要重新编译了😀  发表于 2024-11-13 20:09
可以自动吧。用户只需要提交[asy]...code...[/asy],和之前一样。  发表于 2024-11-13 20:33
像[img]...URL...[/img]和[img=width,height]...URL...[/img]一样,可以使[asy]也接收一个可选参数,成为[asy=...URL...]...code...[/img],也保留原来的[asy]...code...[/asy]  发表于 2024-11-14 00:03
使[asy=...URL...]...code...[/asy]解析为<img src="...URL">😀  发表于 2024-11-14 00:04

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-11-13 18:44
kuing 发表于 2024-11-13 10:40
问题是,发帖时根本不知道 URL 是什么,怎么存?


就像发帖时的 “链接识别”、“@用户 识别”一样,可以做一个“[asy]识别”

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2024-11-13 21:55
hbghlyj 发表于 2024-11-13 18:44
就像发帖时的 “链接识别”、“@用户 识别”一样,可以做一个“[asy]识别” ...


链接识别这些只是在点击确定之时做一个简单的替换,而现在要获取的 URL 还得和 aops 连接,等他编译再返回,复杂得多吧,能做到吗?
代码我是肯定写不来的,你还是自己先弄成功了,再回来说,你不是之前在 github 还是什么的弄了一个 discuz 吗,在那里测试吧。

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

 楼主| hbghlyj 发表于 2024-11-13 22:58
kuing 发表于 2024-11-13 13:55
复杂得多吧,能做到吗?

现在已经有了aops.php,可以像上面那样连接aops.php,
  1. function replaceAsy(){
  2.   let match = textobj.value.match(/\[asy\].*?\[\/asy\]/s);
  3.   if(match){
  4.     fetch('/asy/aops.php?tex='+window.btoa(match)).then(response => response.text()).then(data => {textobj.value = textobj.value.replaceAll(match, data); replaceAsy();});
  5.   }
  6. }
复制代码

手机版|悠闲数学娱乐论坛(第3版)

GMT+8, 2025-3-4 12:34

Powered by Discuz!

× 快速回复 返回顶部 返回列表