wiki:codekata/ubbtohtml

2013年11月08日代码道场活动纪实
代码道场的参与者:李峰,秦鸿源,张艺辉,陈阳,丁健勇,李炳岳,黄志强,江毅超,李剑文,刘必晓
地点:4I会议室
本期代码题目是Ubb转Html,想做这个题目的原因在于,希望更深入了解公司的论坛系统。毕竟小组中新同事比较多,
对论坛有很多地方不熟悉,希望通过代码道场,不仅仅能够提高组内成员的开发能力,还能让同事们更好地处理工作上的任务
特别说明一下,这一期同事们的情绪都特别高涨,具体什么原因,看下日期就知道了。好了,闲话就说到这,下面将还原这一期代码道场的真实画面。

由于原订的会议室临时被其他同事借用,所以这期代码道场就到空间稍微小一点的4G会议室了,不过这并不影响同事们对代码道场的热情,
反而拉近同事间的距离,讨论起来更加方便。
首先,简单介绍一下Ubb与Html互相转换的一些背景,当然,只是简单说下,毕竟同事们都非常清楚的了。介绍完背景后,讨论决定先解决Ubb转Html。
本来以为像之前那样讨论,虽然激烈,但还会在大方向相同,但这次,不一样,可能真的是同事们太兴奋了,使得这次讨论特别激烈,可能说错了,是非常激烈才对!
一个方案出来,立刻就有质疑方案的声音从四面八方传过来,虽然会议室比较小,但也绝对不是因为回音,而是真的有几个同事都发现这方案的问题所在!
并且都差不多同一时间说出来,这也证明了通过前面几期的代码道场,让我们整体的快速思考得到了极大的提升,当然,有些同事本来思考就这么快速的
经过这非常激烈的分析后,发觉要分析因素实在太多了,就直接从简单开始,首先只写[img]标签的转换。
由于是测试驱动开发,所以先写测试程序,下面,先看下同事们共同分析的测试程序。
测试程序

package cn.com.pc.ubb;

import static org.junit.Assert.*;

import org.junit.Test;

public class Ubb2HtmlTest {
	@Test
	public void testParseUbb() {
		String ubb1 = "[img]http://www.skdfjks.com.cn/a.jpg[/img]";
		String html1 = Ubb2Html.parseUbb(ubb1);
		assertEquals("<img src=\"http://www.skdfjks.com.cn/a.jpg\" />", html1);
		
		String ubb = "[img=100,100]http://www.skdfjks.com.cn/a.jpg[/img]";
		String html = Ubb2Html.parseUbb(ubb);
		assertEquals("<img src=\"http://www.skdfjks.com.cn/a.jpg\" width=\"100\" height=\"100\" />", html);
		
		String ubb2 = "[img=100]http://www.skdfjks.com.cn/a.jpg[/img]";
		String html2 = Ubb2Html.parseUbb(ubb2);
		assertEquals("<img src=\"http://www.skdfjks.com.cn/a.jpg\" width=\"100\" height=\"100\"/>", html2);
		
		String ubb3 = "[img=100]http://www.skdfjks.com.cn/a.jpg";
		String html3 = Ubb2Html.parseUbb(ubb3);
		assertEquals("[img=100]http://www.skdfjks.com.cn/a.jpg", html3);
		
		String ubb4 = "[IMG=100,100]http://www.skdfjks.com.cn/a.jpg[/IMG]";
		String html4 = Ubb2Html.parseUbb(ubb4);
		assertEquals("<img src=\"http://www.skdfjks.com.cn/a.jpg\" width=\"100\" height=\"100\" />", html4);
		
		String ubb5 = "[ImG=100,100]http://www.skdfjks.com.cn/a.jpg[/ImG]";
		String html5 = Ubb2Html.parseUbb(ubb5);
		assertEquals("<img src=\"http://www.skdfjks.com.cn/a.jpg\" width=\"100\" height=\"100\" />", html5);
		
		String ubb6 = "[ ImG=100,100]http://www.skdfjks.com.cn/a.jpg[/ImG]";
		String html6 = Ubb2Html.parseUbb(ubb6);
		assertEquals("[ ImG=100,100]http://www.skdfjks.com.cn/a.jpg[/ImG]", html6);
	
		String ubb7 = "[ImG=100,100]http://www.skdfjks.com.cn/a.jpg [/ImG]";
		String html7 = Ubb2Html.parseUbb(ubb7);
		assertEquals("<img src=\"http://www.skdfjks.com.cn/a.jpg \" width=\"100\" height=\"100\" />", html7);
	
		String ubbNull = null;
		String htmlNull = Ubb2Html.parseUbb(ubbNull);
		assertEquals("", htmlNull);
		
		String ubbNullStr = "";
		String htmlNullStr = Ubb2Html.parseUbb(ubbNullStr);
		assertEquals("", htmlNullStr);
		
		String ubb8 = "[ImG=100,100http://www.skdfjks.com.cn/a.jpg [/ImG]";
		String html8 = Ubb2Html.parseUbb(ubb8);
		assertEquals("[ImG=100,100http://www.skdfjks.com.cn/a.jpg [/ImG]", html8);	
		
	}
}

怎么这么少测试用例的?光看这些测试用例实在很难想像得到,其实我们是通过非常非常激烈的讨论和思考才写出来的,因为每个同事只有7分钟的时间
编写代码,而这时间里,出现过很多种方案,并且都被其他同事带着疑问问出了很多的问题所在,导致代码是写了又删,删了又写,更加深刻地体会到头脑风暴
的乐趣,还能听到很多种自己没想到的解决问题的方案,真的是受益良多啊。下面,把实现代码也贴上:
实现代码

package cn.com.pc.ubb;

import static org.junit.Assert.assertEquals;

import java.util.regex.Pattern;

public class Ubb2Html {
	public static String parseUbb(String ubb) {
		/*
		 * String regex = ".*\\[img\\].*[/img\\]"; Pattern.compile(regex,
		 * Pattern.CASE_INSENSITIVE);
		 */

		// String ubb = "[img=100,100]http://www.skdfjks.com.cn/a.jpg[/img]";
		// String html = Ubb2Html.parseUbb(ubb);
		// assertEquals("<img src=\"http://www.skdfjks.com.cn/a.jpg\" width=\"100\" height=\"100\" />",
		// html);

		String beginTag = "<img";
		String endTag = "</img>";
		String width = "";
		String height = "";

		if (ubb == null || ubb.isEmpty()) {
			return "";
		}

		ubb = ubb.toLowerCase().trim();
		if (ubb.startsWith("[img") && ubb.endsWith("[/img]")) {
			// 没有定义图片的宽和高
			if (ubb.startsWith("[img]")) {
				String src = ubb.substring(5, (ubb.length() - 6));
				return "<img src=\"" + src + "\" />";
			} else if (ubb.startsWith("[img=")) {
				// 记录=后面的下标
				int start = ubb.indexOf("=");
				int end = ubb.indexOf("]", start);
				String tempSize = ubb.substring(start, end);
				// 100 | 100, | 100,100 | 100,100,100
				String[] tempArr = tempSize.split(","); 
				if (tempArr.length < 3 && tempArr.length > 0) {
					width = Integer.parseInt(tempArr[0]);//刘碧晓到此一游
					if (tempArr.length == 2) {
						height = tempArr[1];
					}
				}
			}
		}
		return "";

	}
}

在做感兴趣的事的时候,时间总是过得很快。仿佛一会就到18点了,意味着这期的代码道场交流活动的结束,同事们都意犹未尽啊,都想将
心里的想法通过代码表现出来。
又到总结时间了,先说下个人想法。这次代码道场活动,让自己的头脑真的转得很快,特别是活动结束后,觉得特别累,但依然很开心,并且还希望每一期都能
像这一期一样,激烈地讨论,快速地思考,默契地合作,编写优秀的代码!
这是本人对本期代码道场的感想报道,欢迎同事们都积极地在这片小小的分享上留下自己的笔迹,共同记录我们的成长!