mobileesp_converted 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ /.bundle
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /doc
5
+ /pkg
6
+ /tmp
7
+ /vendor/ruby
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mobileesp.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,18 @@
1
+ # MobileESPConverted
2
+
3
+ This is a Ruby implementation of MobileESP library. It has been automatically
4
+ generated from Java source code from the
5
+ [official MobileESP repository](http://code.google.com/p/mobileesp/source/browse).
6
+ It is converted with a Vim script so the result looks sloppy, but it is
7
+ unit-tested to ensure it works OK.
8
+
9
+ MobileESP provides device type detection (tablet, mobile, etc.) based on HTTP
10
+ request headers.
11
+
12
+
13
+ ## License and more info
14
+
15
+ I just converted the code to Ruby, the original author is Anthony Hand.
16
+
17
+ For licensing of MobileESP and more info see [MobileESP official site](http://mobileesp.com).
18
+
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rake/testtask'
4
+
5
+ task :default => [:test]
6
+
7
+ desc "Download Java MobileESP source code to ./tmp directory."
8
+ task :download_source do
9
+ `mkdir -p java_source`
10
+ `cd java_source; wget http://mobileesp.googlecode.com/svn/Java/UAgentInfo.java`
11
+ end
12
+
13
+ Rake::TestTask.new do |t|
14
+ t.pattern = "spec/**/*_spec.rb"
15
+ end
16
+
@@ -0,0 +1,236 @@
1
+ " Vim script to convert MobileESP library from Java to Ruby
2
+ " Author: Jiri Stransky
3
+ " License: MIT
4
+
5
+ fun! s:ConvertToRuby()
6
+ set filetype=ruby
7
+ call s:TabsToSpaces()
8
+ call s:ConvertComments()
9
+ call s:FixTrailingSpaces()
10
+ call s:FixShorthandIfs()
11
+ call s:RemovePackage()
12
+ call s:ConvertBrackets()
13
+ call s:ConvertKeywords()
14
+ call s:ConvertClassDefinitions()
15
+ call s:ConvertConstantDefinitions()
16
+ call s:ConvertInstanceVariableDefinitions()
17
+ call s:ConvertMethodDefinitions()
18
+ call s:ConvertParameterLists()
19
+ call s:ConvertLocalVariables()
20
+ call s:ConvertThisDot()
21
+ call s:ConvertStandardMethods()
22
+ call s:ConvertStringContains()
23
+ call s:WrapIntoModule()
24
+ call s:RemoveSemicolons()
25
+ call s:JoinLinesBeginningWithLogicOperators()
26
+ call s:FixBugs()
27
+ call s:FixIndent()
28
+ call s:PrependConversionNotice()
29
+ endfun
30
+
31
+ fun! s:TabsToSpaces()
32
+ normal gg
33
+ " expand tabs to spaces
34
+ %s/\t/ /g
35
+ endfun
36
+
37
+ fun! s:FixTrailingSpaces()
38
+ %s/\s\+$//
39
+ endfun
40
+
41
+ fun! s:FixShorthandIfs()
42
+ " make sure opening bracket is on the line of the condition
43
+ normal gg
44
+ while search("^\\s*{$", 'W') > 0
45
+ normal kJ
46
+ endwhile
47
+
48
+ " if / else if
49
+ normal gg
50
+ while search("^\\s\\+\\(if\\|else if\\)", 'W') > 0
51
+ normal f(%$
52
+ normal v"zy
53
+ let l:lastchar = getreg('z')
54
+ if l:lastchar != '{'
55
+ s/$/ {/
56
+ call search(';', 'W')
57
+ s/$/\r}/
58
+ endif
59
+ endwhile
60
+
61
+ " else
62
+ normal gg
63
+ while search("^\\s\\+else[\s{]*$", 'W') > 0
64
+ normal $
65
+ normal v"zy
66
+ let l:lastchar = getreg('z')
67
+ if l:lastchar != '{'
68
+ s/$/ {/
69
+ call search(';', 'W')
70
+ s/$/\r}/
71
+ endif
72
+ endwhile
73
+ endfun
74
+
75
+ fun! s:FixIndent()
76
+ normal ggVG=
77
+ endfun
78
+
79
+ fun! s:ConvertComments()
80
+ " convert multiline comments that begin and end on their own lines
81
+ %s/^\s*\/\*\(\_.\{-}\)\*\/\s*$/=begin\r\1\r=end/
82
+
83
+ " convert single-line comments on their own line
84
+ %s/^\w*\/\/\(.*\)/#\1/
85
+
86
+ " remove single-line comments sharing a line with code
87
+ " (they do nasty stuff to FixShorthandIfs)
88
+ %s/\w*\/\/\(.*\)//
89
+ endfun
90
+
91
+ fun! s:RemovePackage()
92
+ %s/^package .*;$//
93
+ endfun
94
+
95
+ fun! s:ConvertBrackets()
96
+ %s/\s*{$//
97
+
98
+ %s/}\_s*else if/elsif/
99
+ %s/}\_s*else/else/
100
+
101
+ %s/}\(\s*#.*\)\?$/end/
102
+ endfun
103
+
104
+ fun! s:ConvertKeywords()
105
+ %s/\<null\>/nil/g
106
+ endfun
107
+
108
+ fun! s:ConvertClassDefinitions()
109
+ %s/public class/class/
110
+ endfun
111
+
112
+ fun! s:ConvertConstantDefinitions()
113
+ normal gg
114
+ while search('public static final String ') > 0
115
+ s/public static final String //
116
+ normal ve"zy
117
+ let replacement = s:Underscore(getreg('z'))
118
+ call setreg('x', replacement)
119
+ normal ve"xp
120
+ normal ^ve~
121
+ normal ve"xy
122
+
123
+ " replace the identifier in the whole document
124
+ exe "%s/(" . getreg('z') . ")/(" . getreg('x') . ")/g"
125
+ endwhile
126
+ endfun
127
+
128
+ fun! s:ConvertInstanceVariableDefinitions()
129
+ normal gg
130
+ while search("^\\s*\\(public\\|private\\) \\(boolean\\|String\\).*=.*;.*$") > 0
131
+ s/^\s*\(public\|private\) \(boolean\|String\) \(\w*\) = .*;.*$/\3/
132
+
133
+ normal ve"zy
134
+ let replacement = s:Underscore(getreg('z'))
135
+ call setreg('x', replacement)
136
+ normal ve"xp
137
+ normal ^ve"xy
138
+ s/\(\w\+\)/attr_reader :\1/
139
+
140
+ " replace the identifier in the whole document
141
+ exe "%s/\\<" . getreg('z') . "\\>/" . getreg('x') . "/g"
142
+ endwhile
143
+ endfun
144
+
145
+ fun! s:ConvertMethodDefinitions()
146
+ " constructor
147
+ normal gg
148
+ %s/public UAgentInfo(/def initialize(/
149
+
150
+ normal gg
151
+ while search("^\\s*public \\w\\+ \\w\\+(.*).*$", 'W') > 0
152
+ s/\(^\s*\)public \w\+ \(.*$\)/\1def \2/
153
+ normal ma
154
+
155
+ normal ^wve"zy
156
+ let replacement = s:Underscore(getreg('z'))
157
+ call setreg('x', replacement)
158
+ normal ^wve"xp
159
+ normal ^wve"xy
160
+
161
+ " replace the identifier in the whole document
162
+ exe "%s/\\<" . getreg('z') . "\\>/" . getreg('x') . "/g"
163
+
164
+ normal 'a
165
+ endwhile
166
+ endfun
167
+
168
+ fun! s:ConvertParameterLists()
169
+ normal gg
170
+ while search("^\\s*def ", 'W') > 0
171
+ s/\w\+ \(\w\+[,)]\)/\1/ge
172
+ endwhile
173
+ endfun
174
+
175
+ fun! s:ConvertLocalVariables()
176
+ normal gg
177
+ while search("^\\s*\\(boolean\\)\\s\\+\\w\\+\\s*=\\s*\\w\\+\\s*;$", 'W') > 0
178
+ normal ^dw
179
+ endwhile
180
+ endfun
181
+
182
+ fun! s:ConvertThisDot()
183
+ %s/\<this\./@/g
184
+ endfun
185
+
186
+ fun! s:ConvertStandardMethods()
187
+ %s/\.toLowerCase()/.downcase/g
188
+ endfun
189
+
190
+ fun! s:ConvertStringContains()
191
+ " contains
192
+ %s/\.indexOf(\([^)]\+\))\_s*\(!=\|>\)\_s*-1/.include?(\1)/g
193
+
194
+ " does not contain
195
+ %s/\<\(\w*\)\.indexOf(\([^)]\+\))\_s*<\_s*0/!\1.include?(\2)/g
196
+ endfun
197
+
198
+ fun! s:RemoveSemicolons()
199
+ %s/;$//
200
+ endfun
201
+
202
+ fun! s:JoinLinesBeginningWithLogicOperators()
203
+ normal gg
204
+ while search("^\\s*\\(&&\\|||\\)", 'W') > 0
205
+ normal kJ
206
+ endwhile
207
+ endfun
208
+
209
+ fun! s:WrapIntoModule()
210
+ normal gg
211
+ call search("class UAgentInfo")
212
+ exe "normal Omodule MobileESPConverted\e"
213
+ normal G
214
+ exe "normal oend\e"
215
+ endfun
216
+
217
+ fun! s:PrependConversionNotice()
218
+ normal gg
219
+ exe "normal O# This file has been automatically converted to Ruby from Java source code.\e"
220
+ exe "normal o\e"
221
+ exe "normal o\e"
222
+ exe "normal o\e"
223
+ endfun
224
+
225
+ fun! s:FixBugs()
226
+ " fix detect_iphone_or_ipod
227
+ %s/^\s*if (user_agent.include?(DEVICE_IPHONE) || user_agent.include?(DEVICE_IPOD))$/if (detect_iphone() || user_agent.include?(DEVICE_IPOD))
228
+ endfun
229
+
230
+ fun! s:Underscore(text)
231
+ let l:replacement = substitute(a:text, "\\(\\u\\)", "_\\1", "g")
232
+ let l:replacement = substitute(l:replacement, "\\(\\u\\)", "\\l\\1", "g")
233
+ return l:replacement
234
+ endfun
235
+
236
+ call s:ConvertToRuby()