V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
woweiqingkuang
V2EX  ›  Python

很纠结: @装饰器 和 @Username 同时都需要用到 @ 符号,怎么办?

  •  
  •   woweiqingkuang · 2016-08-13 21:56:20 +08:00 · 2721 次点击
    这是一个创建于 2825 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在开发的一个系统,在文章中用户 @ZhangSan 就可以点名 ZhangSan 来看这篇文章,同时还有授权给 Zhangsan 阅读这篇文章的权限。由于系统还提供用户发布 Markdown 格式文章的功能,特别当用户是发布代码时,代码中含有装饰器 @decorator ,就会有 @符号。这个时候,本来被 pre/code 包裹的代码片段,就被系统的 @Username 给破坏啦。

    目前有考虑几个方案:

    • 1 、给用户一个选项:这篇文章是否禁止 @Username 。
    • 2 、提示让用户用 @特殊符号,代替代码中 @ 符合。
    • 3 、有什么方式去区分用户到底是在 @Username,还是在 @decorator 装饰器?

    上面 3 个方式目前都有问题,方式 1 就是 90%以上的情况都不需要用到功能,要一直占着一个重要位置;方式 2 会给用户添麻烦;方式 3 只能通过 Markdown 语法代码前面会有 4 个空格来区分,但是一旦用户没有完全遵守这个方式,或者直接加 pre/code 包裹,同样会被 @Username 破坏样式。还有其他什么好的方式可以考虑吗?

    实际运行的情形,在这儿:

    @Username with Markdown

    13 条回复    2016-08-26 09:33:15 +08:00
    Bardon
        1
    Bardon  
       2016-08-13 23:19:00 +08:00
    排除 4 个空格或`code`或```code```
    不知道 liquid 是怎么处理的
    SoloCompany
        2
    SoloCompany  
       2016-08-14 00:23:38 +08:00
    @param
    @override
    @deprecated
    @return
    @throws
    @exception

    看看还有哪个没被注册的
    adoal
        3
    adoal  
       2016-08-14 00:34:23 +08:00
    一个会有用户贴程序源代码的社区里,就不要考虑“一旦用户没有完全遵守这个方式,或者直接加 pre/code 包裹”了。无规矩不成方圆。
    rogwan
        4
    rogwan  
       2016-08-14 07:38:02 +08:00
    @Bardon 代码包裹的方式也不统一,还有各个用户的习惯其实也不同,用空格、 tab 、``` 、或直接用 pre 、 code 标签。只要用户出现空格多一个或少一个这样的小差错,被转译后样式就乱了(虽然可以再修改,看到被系统插入了一些转译代码,用户看着会头疼)。另外,后期总还是要考虑这些包裹方式的转义符,想想都是醉了。。。
    srlp
        5
    srlp  
       2016-08-14 11:35:48 +08:00
    这还用说吗,当然是方法三了。比如说 github 也支持 at 别人,但是引用代码内部并没有问题。
    可以这样:先 render 标准 markdown ,在生成 html 之后才处理 at 的内容。而不是预处理 at 内容后才 render 页面。
    woweiqingkuang
        6
    woweiqingkuang  
    OP
       2016-08-14 12:39:53 +08:00
    @srlp
    ----------------------
    @zhangsan
    @decorator1
    @lisi
    @decorator2
    ----------------------
    比如上面这种,@装饰器 和 @用户名 前后混合,尝试先处理 html 再 at ,结果要么就是个别 @装饰器被 render ,要么就是个别 @用户名没被 render 。向前匹配判断有没有空格 /tab 或 pre/code 标,可能中间还隔着个 @符合。
    woweiqingkuang
        7
    woweiqingkuang  
    OP
       2016-08-14 12:49:47 +08:00
    @srlp 刚刚看了下 github 的处理方式,@XXX 只要 XXX 是注册用户名,就会当作用户名渲染。假如有人注册的用户名是 Decorator 也会被渲染的。
    iEverX
        8
    iEverX  
       2016-08-14 19:50:14 +08:00
    渲染成 html 之后,遍历 dom 树,不处理 pre 和 code 之间的 @ 其他都替换
    srlp
        9
    srlp  
       2016-08-14 22:55:45 +08:00
    像楼上说的,生成的 html 应该确保符合标准无错的,正确闭合的(你总不想网页崩掉吧),然后对除了 pre 或 code 包围的文字之外的文字进行处理。

    刚在 github issue 尝试了一下,毫无问题,代码块之外的 at 都连接成用户名,代码块内的 at 都语法高亮。

    不明白你在纠结什么,你在 6 楼的例子 **并没有** 使用 ``` 之类的标签把 code 包围起来,所以 at 翻译成用户名,有什么问题吗。。。
    woweiqingkuang
        10
    woweiqingkuang  
    OP
       2016-08-15 19:19:52 +08:00
    @srlp 我说的例子,用了 4 个空格,貌似 V2EX 不支持这种方式来处理代码。我在试试,下面的第一行用了四个空格,第二行用了 ···,看看效果:
    @srlp
    ```@srlp```
    woweiqingkuang
        11
    woweiqingkuang  
    OP
       2016-08-15 19:20:24 +08:00
    ```
    @srlp
    ```
    param
        12
    param  
       2016-08-26 09:27:19 +08:00
    @override 是我小号。。
    Override
        13
    Override  
       2016-08-26 09:33:15 +08:00
    @SoloCompany

    @param 和 @Override 都是我的号。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5570 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 08:57 · PVG 16:57 · LAX 01:57 · JFK 04:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.