Created
June 4, 2014 14:23
-
-
Save eunjae-lee/df3ee7cd54af4c1fd6bc to your computer and use it in GitHub Desktop.
Android - parcelable model class generator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html> | |
<head> | |
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> | |
<title>parcelable</title> | |
</head> | |
<body> | |
<input type="text" id="className" placeholder="className" value="" /> | |
<textarea id="textarea" style="width:600px; height:400px;"></textarea> | |
<input type="button" id="button" value="generate!" /> | |
<br/><br/><br/><br/> | |
result : | |
<textarea id="result" style="width:600px; height:500px;"></textarea> | |
<script type="text/coffeescript"> | |
capitalize = (name) -> | |
name[0].toUpperCase() + name[1..-1] | |
class Var | |
constructor: (@type, @name) -> | |
writeToParcel: -> | |
readSource: -> | |
getterSetter: -> | |
getterName = "get#{capitalize(@name)}" | |
setterName = "set#{capitalize(@name)}" | |
if @type in ["boolean", "Boolean"] | |
getterName = "is#{capitalize(@name)}" | |
writeln """public #{@type} #{getterName}() { | |
return #{@name}; | |
} | |
public void #{setterName}(#{@type} #{@name}) { | |
this.#{@name} = #{@name}; | |
}\n | |
""" | |
class PrimitiveVar extends Var | |
writeToParcel: -> | |
if @type is "boolean" or @type is "Boolean" | |
writeln " dest.writeByte((byte) (#{@name} ? 1 : 0));" | |
else | |
writeln " dest.write#{capitalize(@type)}(#{@name});" | |
readSource: -> | |
if @type is "boolean" or @type is "Boolean" | |
writeln " #{@name} = src.readByte() == 1;" | |
else | |
writeln " #{@name} = src.read#{capitalize(@type)}();" | |
class ObjectVar extends Var | |
writeToParcel: -> | |
writeln """ dest.writeByte((byte) (#{@name} != null ? 1 : 0)); | |
\tif (#{@name} != null) { | |
\t #{@name}.writeToParcel(dest, flags); | |
\t}""" | |
readSource: -> | |
writeln """ if (src.readByte() == 1) { | |
\t #{@name} = new #{@type}(src); | |
\t}""" | |
class ArrayListVar extends Var | |
constructor: (@type, @name) -> | |
@realType = @type.split("ArrayList<")[1] | |
@realType = @realType.substr 0, @realType.length - 1 | |
writeToParcel: -> | |
writeln """\tdest.writeInt(#{@name} != null ? #{@name}.size() : 0); | |
\tif (#{@name} != null) { | |
\t for (#{@realType} _item : #{@name}) { | |
\t _item.writeToParcel(dest, flags); | |
\t } | |
\t} | |
""" | |
readSource: -> | |
writeln """\tint #{@name}Count = src.readInt(); | |
\tif (#{@name}Count > 0) { | |
\t #{@name} = new ArrayList<#{@realType}>(); | |
\t for (int i = 0; i < #{@name}Count; i++) { | |
\t #{@name}.add(new #{@realType}(src)); | |
\t } | |
\t} | |
""" | |
createVar = (type, name) -> | |
if type in ["String", "int", "long", "boolean", "Boolean", "float", "double"] | |
return new PrimitiveVar(type, name) | |
else if type.indexOf("ArrayList<") is 0 | |
return new ArrayListVar(type, name) | |
else | |
return new ObjectVar(type, name) | |
write = (content) -> | |
$("#result").val($("#result").val() + content) | |
writeln = (content) -> | |
write "#{content}\n" | |
writeConstructors = (className) -> | |
content = """public #{className}() { | |
} | |
public #{className}(Parcel in) { | |
readSource(in); | |
} | |
@Override | |
public int describeContents() { | |
return 0; | |
} | |
""" | |
writeln content | |
writeToParcel = (vars) -> | |
writeln """@Override | |
public void writeToParcel(Parcel dest, int flags) { | |
""" | |
for variable in vars | |
variable.writeToParcel() | |
writeln "}\n" | |
readSource = (vars) -> | |
writeln """private void readSource(Parcel src) { | |
\tif (src == null) { | |
\t return; | |
\t} | |
""" | |
for variable in vars | |
variable.readSource() | |
writeln "}\n" | |
getterSetter = (vars) -> | |
for variable in vars | |
variable.getterSetter() | |
writeCreator = (className) -> | |
writeln """public static final Parcelable.Creator<#{className}> CREATOR = new Parcelable.Creator<#{className}>() { | |
@Override | |
public #{className} createFromParcel(Parcel source) { | |
return new #{className}(source); | |
} | |
@Override | |
public #{className}[] newArray(int size) { | |
return new #{className}[size]; | |
} | |
};""" | |
$(document).ready -> | |
$("#button").click -> | |
$("#result").val("") | |
className = $("#className").val() | |
vars = [] | |
for line in $("#textarea").val().split("\n") | |
line = line.trim() | |
if line.split(" ")[0] in ["public", "private", "protected"] | |
line = line.split(" ")[1..-1].join(" ") | |
if line.indexOf("=") > 0 | |
line = line.split("=")[0].trim() | |
if line.indexOf(";") > 0 | |
line = line.split(";")[0].trim() | |
console.log line | |
[type, name] = line.split(" ") | |
vars.push createVar(type, name) | |
writeConstructors(className) | |
writeToParcel(vars) | |
readSource(vars) | |
getterSetter(vars) | |
writeCreator(className); | |
</script> | |
<script type="text/javascript" src="http://coffeescript.org/extras/coffee-script.js"></script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment