兩個類 無痛點 作用描述全在註釋
/**
* Thymeleaf 方言
*/
@Component // 被spring管理
public class NumberToLetterDialect extends AbstractProcessorDialect {
private static final String DIALECT_NAME = "dialectName";
private static final String PREFIX = "prefix";
public NumberToLetterDialect() {
// 設置自定義方言與方言處理器優先級相同
super(DIALECT_NAME, PREFIX, StandardDialect.PROCESSOR_PRECEDENCE);
}
@Override
/**
* 元素處理器
* @param dialectPrefix 方言前綴
* @return
*/
public Set<IProcessor> getProcessors(String dialectPrefix) {
Set<IProcessor> processors = new HashSet<>();
// 添加自定義標籤處理器
processors.add(new NumberToLetterDialectProcessor(dialectPrefix));
processors.add(new StandardXmlNsTagProcessor(TemplateMode.HTML, dialectPrefix));
return processors;
}
}
/**
* @author 李 磊
* 標籤處理器
*/
public class NumberToLetterDialectProcessor extends AbstractAttributeTagProcessor {
// 標籤名
private static final String TAG_NAME = "tagName";
// 屬性名
private static final String ATTRIBUTE_NAME = "attributeName";
protected NumberToLetterDialectProcessor(String dialectPrefix) {
super(
// 此處理器將僅應用於HTML模式
TemplateMode.HTML,
// 標籤前綴名 xxxx:text中的xxxx
dialectPrefix,
// 標籤名稱 匹配此名稱的特定標籤 null爲不限制
TAG_NAME,
// 將標籤前綴應用於標籤名稱
false, // true
// 標籤前綴屬性 如<xxxx:toLetter>
ATTRIBUTE_NAME,
// 開啓屬性名稱前綴
true,
// 優先級和原生標籤相同
StandardDialect.PROCESSOR_PRECEDENCE,
// 標籤處理後是否移除自定義屬性
true);
}
@Override
protected void doProcess(ITemplateContext context
, IProcessableElementTag tag
, AttributeName attributeName
, String attributeValue
, IElementTagStructureHandler structureHandler) {
// 獲取屬性值
final String rawValue = ThymeleafFacade.getRawValue(tag, attributeName);
// 獲取標籤名
// final String elementCompleteName = tag.getElementCompleteName();
// 創建模型
final IModelFactory modelFactory = context.getModelFactory();
final IModel model = modelFactory.createModel();
// 添加模型 標籤
model.add(modelFactory.createOpenElementTag("h1"));
model.add(modelFactory.createText(NumberToLetterConverter(rawValue)));
model.add(modelFactory.createCloseElementTag("h1"));
// 替換頁面標籤
structureHandler.replaceWith(model, false);
// 只改變標籤內數據
// structureHandler.setBody(NumberToLetterConverter(rawValue), false);
}
private String NumberToLetterConverter(String str) {
int i = Integer.valueOf(str);
char c;
String s = "";
if (i <= 26) {
// 將ASCII碼轉換成字母 我這裏都是小寫
c = (char) (i + 96);
s = String.valueOf(c);
} else if (i > 26) {
List<Character> numlist = new ArrayList<>();
// 單循環數大於26時 就在前加個啊 效果 27 : aa
int num = i / 26;
for (int a = 0; a < num; a++) {
numlist.add('a');
}
numlist.add((char) (i % 26 + 97));
for (Character character : numlist) {
s = s + new StringBuilder().append(character).toString();
}
}
return s;
}
}
使用方式
<tagName prefix:attributeName="1"></tagName>
->
<h1>a</h1>