Skip to content

Commit 2ccb718

Browse files
author
User4martin
committed
Fix parsing Issue 63 3rd-Eden#63
1 parent 9cb4c8f commit 2ccb718

File tree

2 files changed

+47
-36
lines changed

2 files changed

+47
-36
lines changed

Diff for: index.js

+27-12
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,21 @@ function Agent(family, major, minor, patch, source) {
3939
this.source = source || '';
4040
}
4141

42+
function replaceRegExResult(matches, templates) {
43+
var r = [];
44+
var m = matches.map(function(v){ v = typeof v === 'string' ? v.replace(/\&/g, '&&').replace(/\$/g, '&D') : v; });
45+
for(var t=1; t<=4; t++) { // template[1..4]
46+
r[t] = templates[t];
47+
if (typeof r[t] === 'string') {
48+
for(var i=1; i<=9; i++) { // $1..$9
49+
r[t] = r[t].replace(new RegExp('\\$'+i, 'g'), matches[i] != undefined ? matches[i] : '');
50+
}
51+
r[t] = r[t].replace(/&D/g, '$').replace(/&&/g, '&');
52+
}
53+
}
54+
return r;
55+
}
56+
4257
/**
4358
* OnDemand parsing of the Operating System.
4459
*
@@ -58,7 +73,7 @@ Object.defineProperty(Agent.prototype, 'os', {
5873
if (res = parsers[i][0].exec(userAgent)) {
5974
parser = parsers[i];
6075

61-
if (parser[1]) res[1] = parser[1].replace('$1', res[1]);
76+
res = replaceRegExResult(res, parser);
6277
break;
6378
}
6479
}
@@ -68,9 +83,9 @@ Object.defineProperty(Agent.prototype, 'os', {
6883
? new OperatingSystem()
6984
: new OperatingSystem(
7085
res[1]
71-
, parser[2] || res[2]
72-
, parser[3] || res[3]
73-
, parser[4] || res[4]
86+
, res[2]
87+
, res[3]
88+
, res[4]
7489
)
7590
}).os;
7691
},
@@ -109,7 +124,7 @@ Object.defineProperty(Agent.prototype, 'device', {
109124
if (res = parsers[i][0].exec(userAgent)) {
110125
parser = parsers[i];
111126

112-
if (parser[1]) res[1] = parser[1].replace('$1', res[1]);
127+
res = replaceRegExResult(res, parser);
113128
break;
114129
}
115130
}
@@ -119,9 +134,9 @@ Object.defineProperty(Agent.prototype, 'device', {
119134
? new Device()
120135
: new Device(
121136
res[1]
122-
, parser[2] || res[2]
123-
, parser[3] || res[3]
124-
, parser[4] || res[4]
137+
, res[2]
138+
, res[3]
139+
, res[4]
125140
)
126141
}).device;
127142
},
@@ -427,12 +442,12 @@ exports.parse = function parse(userAgent, jsAgent) {
427442
if (res = parsers[i][0].exec(userAgent)) {
428443
parser = parsers[i];
429444

430-
if (parser[1]) res[1] = parser[1].replace('$1', res[1]);
445+
res = replaceRegExResult(res, parser);
431446
if (!jsAgent) return new Agent(
432447
res[1]
433-
, parser[2] || res[2]
434-
, parser[3] || res[3]
435-
, parser[4] || res[4]
448+
, res[2]
449+
, res[3]
450+
, res[4]
436451
, userAgent
437452
);
438453

Diff for: lib/update.js

+20-24
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,16 @@ exports.update = function update(callback) {
5050
});
5151
};
5252

53+
function getReplacement(field, resource, fallback) {
54+
if (! field)
55+
return fallback;
56+
if (Array.isArray(field))
57+
field = field.filter(function(f){ return resource[f] })[0];
58+
if (resource[field] != undefined)
59+
return resource[field];
60+
return fallback;
61+
}
62+
5363
/**
5464
* Parse the given sources.
5565
*
@@ -93,17 +103,17 @@ exports.parse = function parse(sources, callback) {
93103
[
94104
{
95105
resource: 'user_agent_parsers'
96-
, replacement: 'family_replacement'
106+
, replacement: ['family_replacement', 'v1_replacement', 'v2_replacement', 'v3_replacement' ]
97107
, name: 'browser'
98108
}
99109
, {
100110
resource: 'device_parsers'
101-
, replacement: 'device_replacement'
111+
, replacement: [['brand_replacement', 'device_replacement' ], 'model_replacement'] //
102112
, name: 'device'
103113
}
104114
, {
105115
resource: 'os_parsers'
106-
, replacement: 'os_replacement'
116+
, replacement: ['os_replacement', 'os_v1_replacement', 'os_v2_replacement' ]
107117
, name: 'os'
108118
}
109119
].forEach(function parsing(details) {
@@ -120,39 +130,25 @@ exports.parse = function parse(sources, callback) {
120130
// We need to JSON stringify the data to properly add slashes escape other
121131
// kinds of crap in the RegularExpression. If we don't do thing we get
122132
// some illegal token warnings.
133+
var rflags = resource.regex_flags || '';
134+
if (rflags) rflags = ", '" + rflags + "'";
123135
parser = 'parser = Object.create(null);\n';
124-
parser += 'parser[0] = new RegExp('+ JSON.stringify(resource.regex) + ');\n';
136+
parser += 'parser[0] = new RegExp('+ JSON.stringify(resource.regex) + rflags + ');\n';
125137

126138
// Check if we have replacement for the parsed family name
127-
if (resource[details.replacement]) {
128-
parser += 'parser[1] = "'+ resource[details.replacement].replace('"', '\\"') +'";';
129-
} else {
130-
parser += 'parser[1] = 0;';
131-
}
139+
parser += 'parser[1] = "'+ getReplacement(details.replacement[0], resource, '$1').replace('"', '\\"') +'";';
132140

133141
parser += '\n';
134142

135-
if (resource.v1_replacement) {
136-
parser += 'parser[2] = "'+ resource.v1_replacement.replace('"', '\\"') +'";';
137-
} else {
138-
parser += 'parser[2] = 0;';
139-
}
143+
parser += 'parser[2] = "'+ getReplacement(details.replacement[1], resource, '$2').replace('"', '\\"') +'";';
140144

141145
parser += '\n';
142146

143-
if (resource.v2_replacement) {
144-
parser += 'parser[3] = "'+ resource.v2_replacement.replace('"', '\\"') +'";';
145-
} else {
146-
parser += 'parser[3] = 0;';
147-
}
147+
parser += 'parser[3] = "'+ getReplacement(details.replacement[2], resource, '$3').replace('"', '\\"') +'";';
148148

149149
parser += '\n';
150150

151-
if (resource.v3_replacement) {
152-
parser += 'parser[4] = "'+ resource.v3_replacement.replace('"', '\\"') +'";';
153-
} else {
154-
parser += 'parser[4] = 0;';
155-
}
151+
parser += 'parser[4] = "'+ getReplacement(details.replacement[3], resource, '$4').replace('"', '\\"') +'";';
156152

157153
parser += '\n';
158154
parser += 'exports.'+ details.name +'['+ i +'] = parser;';

0 commit comments

Comments
 (0)