2013-07-08 37 views
2

我想要一段文本在下一行溢出時換行。文本沒有空格或破折號。即使該塊包含overflow =「hidden」和wrap-option =「wrap」屬性,Apache FOP也不會包裝此文本或將其剪下。 FO文件不包含任何保持在一起的設置,因此不會導致此問題。Apache FOP不會包裝我的文本


版本:Apache FOP 0.95,1.0和1.1發生問題。不幸的是,舊版本不能在我的DocBook Maven安裝程序中工作,所以我沒有測試過這些。


這是我的FO文件塊:

<fo:block 
overflow="hidden" 
wrap-option="wrap" 
white-space-collapse="false" 
white-space-treatment="preserve" 
linefeed-treatment="preserve" 
text-align="start" 
margin-top="0.5em" 
margin-right="0.5pt" 
margin-bottom="1em" 
margin-left="0.5pt" 
border-width="0.5pt" 
border-left-style="solid" 
border-left-color="#D3CEC6" 
padding="2mm" 
font-family="Courier New" 
font-size="8pt" 
background-color="#EBE5D7">veryverylongtextwithoutspacesordashes 
</fo:block> 

回答

3

爲了得到字符串包裹,你必須有行內易碎字符。
考慮通過在某些地方插入零寬度空格字符&#x200b;&#8203;)來預處理您的輸入。格式化程序會看到它,只會在必要時在這些字符處斷行。這個角色的其他出現將不會被看到。

<fo:block>very&#x200b;very&#x200b;long&#x200b;text&#x200b;without&#x200b;spaces&#x200b;or&#x200b;dashes</fo:block> 

如果文本是一串數字,在每第n個符號處插入零寬度空格字符可能是合乎邏輯的。

或者,您可以將您的格式化程序設置爲連字符根據特定語言的連字規則的字符串。實際上,連字符本質上是基於在原始文本中添加連字標記。同樣,它需要字符串包含屬於某種語言的有意義的文本。

0

這可能是舊的,但我遇到了這個,並寫了一個FOP函數來解決我的問題。

<#function breakValue value limit> 
    <#if value?length lte limit> 
    <#return value> 
    <#else> 
    <#return value?substring(0, limit) + "&#x200b;" + breakValue(value?substring(limit))> 
    </#if> 
</#function> 

其中value是要打破和limit字符串是要添加&#x200b;然後調用字符串的其餘相同功能的指標。