MS RFC 40:支持标签文本转换

日期

2007/12/03

作者

托马斯堡

联系

gmail.com的thomas.bonfort

最后编辑

2007/12/03

状态

实施

版本

MAPServer 5.4

概述

MapServer5.0支持“硬”文本换行,其中换行符被无条件地视为换行符。本RFC建议增加:

  • 条件换行,即仅当当前行长度满足用户可调标准时才添加换行。

  • 行对齐,即根据用户请求文本对齐,即右、中、左

这两个附加项彼此独立,即可以一起激活或不激活。

自动换行

新关键字maxlength添加到label对象中,并与label wrap参数交互,如下所示:

  • 换行符指定可以用换行符替换的字符(不改变当前含义)。可能最有用的换行符将成为“”(即空格字符)

  • maxlength值指定在插入换行符之前可以组成行的最大字符数。值0指定当前的“硬”包装。对于长度大于maxlength的行,正值触发换行符换行。负值触发允许断字的换行,即不一定在换行符处。

Wrap/MaxLength组合总结如下:

麦克伦= 0

马克森>0

麦克伦0

包装= 'char '

现行方式

条件包装if>maxlen

硬包装

不换行

不处理

跳过标签if>maxlen

硬包装

线路定心

将向标签对象添加新的关键字“对齐”。它支持3个值:左、中、右,并控制文本线应如何与标签边界框对齐。文本的精确放置只能通过精确定义当前行的起始像素在渲染器级别完成。虽然可以采用这种方法,但它将大大增加渲染器代码的负担。

我建议使用一种更通用但不太精确的方法,在文本行中填充空格字符以近似缩进。初始实现只能依赖于每个文本行中的字符数:

  • 循环文本行以查找字符最多的行L_max

  • 用(L_max-L_cur)/2个空格字符填充所有其他行

更高级的实现是使用MSGetLabelsize函数返回的精确行长度:

  • 以像素为单位计算“”字符串的大小(两个空格,用于紧排):l space

  • 将文本行循环到最长的pix_l_max行

  • 用(pix_l_max-pix_l_cur)/2*1/(2*l_2space)空格字符填充所有其他行

“限制”:除非使用单空间字体,否则使用此方法将文本右对齐将产生难看的结果。

对源代码的修改

  • maxlength和align将添加到map.h、mapfile parser/writer(mapfile.c)和mapscript中的label对象。

  • maplabel.c中的msTransformLabelText()将被更新以支持建议的修改。不需要进行其他修改,因为文本本身经过了修改以满足用户的请求(即,文本中填充了空格和/或添加了换行符)。

MapScript含义

labelobj将具有新的integer和align属性类型的maxlength属性(ms_-align_*)。

受影响的文件

map.h
mapfile.c
maplabel.c
maplexer.l
maplexer.c

向后兼容性问题

没有。

臭虫识别码

投票历史

  • +1:史蒂文,史蒂文

  • +0:弗兰克,汤姆

审查期间的问题/意见

  • 史蒂文:当填充空格时,允许精确计算线偏移量:完成。每行的精确大小以像素为单位计算,并相应地计算对齐所需的最接近的空格字符数。

  • Danielm:允许在换行时使用多个字符:未寻址。空格字符可以是 replaced 换行,而连字符通常应该保留。你知道我们如何指定保留一些换行符,而其他字符只是潜在换行符的标记吗?