xref: /aosp_15_r20/build/make/tools/droiddoc/templates-pdk/assets/android-developer-resource-browser.js (revision 9e94795a3d4ef5c1d47486f9a02bb378756cea8a)
1*9e94795aSAndroid Build Coastguard Worker(function() { // anonymize
2*9e94795aSAndroid Build Coastguard Worker
3*9e94795aSAndroid Build Coastguard Workervar allTags = {};
4*9e94795aSAndroid Build Coastguard Workervar loadedResults = [];
5*9e94795aSAndroid Build Coastguard Worker
6*9e94795aSAndroid Build Coastguard Worker/**
7*9e94795aSAndroid Build Coastguard Worker * Initialization code run upon the DOM being ready.
8*9e94795aSAndroid Build Coastguard Worker */
9*9e94795aSAndroid Build Coastguard Worker$(document).ready(function() {
10*9e94795aSAndroid Build Coastguard Worker  // Parse page query parameters.
11*9e94795aSAndroid Build Coastguard Worker  var params = parseParams(document.location.search);
12*9e94795aSAndroid Build Coastguard Worker  params.tag = params.tag ? makeArray(params.tag) : null;
13*9e94795aSAndroid Build Coastguard Worker
14*9e94795aSAndroid Build Coastguard Worker  // Load tag and resource dataset.
15*9e94795aSAndroid Build Coastguard Worker  loadTags();
16*9e94795aSAndroid Build Coastguard Worker  loadResources();
17*9e94795aSAndroid Build Coastguard Worker
18*9e94795aSAndroid Build Coastguard Worker  showResults(params);
19*9e94795aSAndroid Build Coastguard Worker
20*9e94795aSAndroid Build Coastguard Worker  // Watch for keypresses in the keyword filter textbox, and update
21*9e94795aSAndroid Build Coastguard Worker  // search results to reflect the keyword filter.
22*9e94795aSAndroid Build Coastguard Worker  $('#resource-browser-keyword-filter').keyup(function() {
23*9e94795aSAndroid Build Coastguard Worker    // Filter results on screen by keyword.
24*9e94795aSAndroid Build Coastguard Worker    var keywords = $(this).val().split(/\s+/g);
25*9e94795aSAndroid Build Coastguard Worker    for (var i = 0; i < loadedResults.length; i++) {
26*9e94795aSAndroid Build Coastguard Worker      var hide = false;
27*9e94795aSAndroid Build Coastguard Worker      for (var j = 0; j < keywords.length; j++) {
28*9e94795aSAndroid Build Coastguard Worker        if (!resultMatchesKeyword(loadedResults[i].result, keywords[j])) {
29*9e94795aSAndroid Build Coastguard Worker          hide = true;
30*9e94795aSAndroid Build Coastguard Worker          break;
31*9e94795aSAndroid Build Coastguard Worker        }
32*9e94795aSAndroid Build Coastguard Worker      }
33*9e94795aSAndroid Build Coastguard Worker
34*9e94795aSAndroid Build Coastguard Worker      loadedResults[i].node[hide ? 'hide' : 'show']();
35*9e94795aSAndroid Build Coastguard Worker    }
36*9e94795aSAndroid Build Coastguard Worker  });
37*9e94795aSAndroid Build Coastguard Worker});
38*9e94795aSAndroid Build Coastguard Worker
39*9e94795aSAndroid Build Coastguard Worker/**
40*9e94795aSAndroid Build Coastguard Worker * Returns whether or not the given search result contains the given keyword.
41*9e94795aSAndroid Build Coastguard Worker */
42*9e94795aSAndroid Build Coastguard Workerfunction resultMatchesKeyword(result, keyword) {
43*9e94795aSAndroid Build Coastguard Worker  keyword = keyword.toLowerCase();
44*9e94795aSAndroid Build Coastguard Worker  if (result.title &&
45*9e94795aSAndroid Build Coastguard Worker      result.title.en.toLowerCase().indexOf(keyword) >= 0)
46*9e94795aSAndroid Build Coastguard Worker    return true;
47*9e94795aSAndroid Build Coastguard Worker  else if (result.description &&
48*9e94795aSAndroid Build Coastguard Worker           result.description.en.toLowerCase().indexOf(keyword) >= 0)
49*9e94795aSAndroid Build Coastguard Worker    return true;
50*9e94795aSAndroid Build Coastguard Worker  else if (result.topicsHtml &&
51*9e94795aSAndroid Build Coastguard Worker           result.topicsHtml.replace(/\<.*?\>/g,'').toLowerCase().indexOf(keyword) >= 0)
52*9e94795aSAndroid Build Coastguard Worker    return true;
53*9e94795aSAndroid Build Coastguard Worker  return false;
54*9e94795aSAndroid Build Coastguard Worker}
55*9e94795aSAndroid Build Coastguard Worker
56*9e94795aSAndroid Build Coastguard Worker/**
57*9e94795aSAndroid Build Coastguard Worker * Populates the allTags array with tag data from the ANDROID_TAGS
58*9e94795aSAndroid Build Coastguard Worker * variable in the resource data JS file.
59*9e94795aSAndroid Build Coastguard Worker */
60*9e94795aSAndroid Build Coastguard Workerfunction loadTags() {
61*9e94795aSAndroid Build Coastguard Worker  for (var tagClass in ANDROID_TAGS) {
62*9e94795aSAndroid Build Coastguard Worker    for (var tag in ANDROID_TAGS[tagClass]) {
63*9e94795aSAndroid Build Coastguard Worker      allTags[tag] = {
64*9e94795aSAndroid Build Coastguard Worker        displayTag: ANDROID_TAGS[tagClass][tag],
65*9e94795aSAndroid Build Coastguard Worker        tagClass: tagClass
66*9e94795aSAndroid Build Coastguard Worker      };
67*9e94795aSAndroid Build Coastguard Worker    }
68*9e94795aSAndroid Build Coastguard Worker  }
69*9e94795aSAndroid Build Coastguard Worker}
70*9e94795aSAndroid Build Coastguard Worker
71*9e94795aSAndroid Build Coastguard Worker/**
72*9e94795aSAndroid Build Coastguard Worker * Massage the ANDROID_RESOURCES resource list in the resource data JS file.
73*9e94795aSAndroid Build Coastguard Worker */
74*9e94795aSAndroid Build Coastguard Workerfunction loadResources() {
75*9e94795aSAndroid Build Coastguard Worker  for (var i = 0; i < ANDROID_RESOURCES.length; i++) {
76*9e94795aSAndroid Build Coastguard Worker    var resource = ANDROID_RESOURCES[i];
77*9e94795aSAndroid Build Coastguard Worker
78*9e94795aSAndroid Build Coastguard Worker    // Convert the tags array to a tags hash for easier querying.
79*9e94795aSAndroid Build Coastguard Worker    resource.tagsHash = {};
80*9e94795aSAndroid Build Coastguard Worker    for (var j = 0; j < resource.tags.length; j++)
81*9e94795aSAndroid Build Coastguard Worker      resource.tagsHash[resource.tags[j]] = true;
82*9e94795aSAndroid Build Coastguard Worker
83*9e94795aSAndroid Build Coastguard Worker    // Determine the type and topics of the resource by inspecting its tags.
84*9e94795aSAndroid Build Coastguard Worker    resource.topics = [];
85*9e94795aSAndroid Build Coastguard Worker    for (tag in resource.tagsHash)
86*9e94795aSAndroid Build Coastguard Worker      if (tag in allTags) {
87*9e94795aSAndroid Build Coastguard Worker        if (allTags[tag].tagClass == 'type') {
88*9e94795aSAndroid Build Coastguard Worker          resource.type = tag;
89*9e94795aSAndroid Build Coastguard Worker        } else if (allTags[tag].tagClass == 'topic') {
90*9e94795aSAndroid Build Coastguard Worker          resource.topics.push(tag);
91*9e94795aSAndroid Build Coastguard Worker        }
92*9e94795aSAndroid Build Coastguard Worker      }
93*9e94795aSAndroid Build Coastguard Worker
94*9e94795aSAndroid Build Coastguard Worker    // Add a humanized topics list string.
95*9e94795aSAndroid Build Coastguard Worker    resource.topicsHtml = humanizeList(resource.topics, function(item) {
96*9e94795aSAndroid Build Coastguard Worker      return '<strong>' + allTags[item].displayTag + '</strong>';
97*9e94795aSAndroid Build Coastguard Worker    });
98*9e94795aSAndroid Build Coastguard Worker  }
99*9e94795aSAndroid Build Coastguard Worker}
100*9e94795aSAndroid Build Coastguard Worker
101*9e94795aSAndroid Build Coastguard Worker/**
102*9e94795aSAndroid Build Coastguard Worker * Loads resources for the given query parameters.
103*9e94795aSAndroid Build Coastguard Worker */
104*9e94795aSAndroid Build Coastguard Workerfunction showResults(params) {
105*9e94795aSAndroid Build Coastguard Worker  loadedResults = [];
106*9e94795aSAndroid Build Coastguard Worker  $('#resource-browser-search-params').empty();
107*9e94795aSAndroid Build Coastguard Worker  $('#resource-browser-results').empty();
108*9e94795aSAndroid Build Coastguard Worker
109*9e94795aSAndroid Build Coastguard Worker  var i, j;
110*9e94795aSAndroid Build Coastguard Worker  var searchTags = [];
111*9e94795aSAndroid Build Coastguard Worker  if (params.tag) {
112*9e94795aSAndroid Build Coastguard Worker    for (i = 0; i < params.tag.length; i++) {
113*9e94795aSAndroid Build Coastguard Worker      var tag = params.tag[i];
114*9e94795aSAndroid Build Coastguard Worker      if (tag.toLowerCase() in allTags) {
115*9e94795aSAndroid Build Coastguard Worker        searchTags.push(tag.toLowerCase());
116*9e94795aSAndroid Build Coastguard Worker      }
117*9e94795aSAndroid Build Coastguard Worker    }
118*9e94795aSAndroid Build Coastguard Worker  }
119*9e94795aSAndroid Build Coastguard Worker
120*9e94795aSAndroid Build Coastguard Worker  if (searchTags.length) {
121*9e94795aSAndroid Build Coastguard Worker    // Show query params.
122*9e94795aSAndroid Build Coastguard Worker    var taggedWithHtml = ['Showing technical resources tagged with '];
123*9e94795aSAndroid Build Coastguard Worker    taggedWithHtml.push(humanizeList(searchTags, function(item) {
124*9e94795aSAndroid Build Coastguard Worker      return '<strong>' + allTags[item].displayTag + '</strong>';
125*9e94795aSAndroid Build Coastguard Worker    }));
126*9e94795aSAndroid Build Coastguard Worker    $('#resource-browser-search-params').html(taggedWithHtml.join('') + ':');
127*9e94795aSAndroid Build Coastguard Worker  } else {
128*9e94795aSAndroid Build Coastguard Worker    $('#resource-browser-search-params').html('Showing all technical resources:');
129*9e94795aSAndroid Build Coastguard Worker  }
130*9e94795aSAndroid Build Coastguard Worker
131*9e94795aSAndroid Build Coastguard Worker  var results = [];
132*9e94795aSAndroid Build Coastguard Worker
133*9e94795aSAndroid Build Coastguard Worker  // Create the list of resources to show.
134*9e94795aSAndroid Build Coastguard Worker  for (i = 0; i < ANDROID_RESOURCES.length; i++) {
135*9e94795aSAndroid Build Coastguard Worker    var resource = ANDROID_RESOURCES[i];
136*9e94795aSAndroid Build Coastguard Worker    var skip = false;
137*9e94795aSAndroid Build Coastguard Worker
138*9e94795aSAndroid Build Coastguard Worker    if (searchTags.length) {
139*9e94795aSAndroid Build Coastguard Worker      for (j = 0; j < searchTags.length; j++)
140*9e94795aSAndroid Build Coastguard Worker        if (!(searchTags[j] in resource.tagsHash)) {
141*9e94795aSAndroid Build Coastguard Worker          skip = true;
142*9e94795aSAndroid Build Coastguard Worker          break;
143*9e94795aSAndroid Build Coastguard Worker        }
144*9e94795aSAndroid Build Coastguard Worker
145*9e94795aSAndroid Build Coastguard Worker      if (skip)
146*9e94795aSAndroid Build Coastguard Worker        continue;
147*9e94795aSAndroid Build Coastguard Worker
148*9e94795aSAndroid Build Coastguard Worker      results.push(resource);
149*9e94795aSAndroid Build Coastguard Worker      continue;
150*9e94795aSAndroid Build Coastguard Worker    }
151*9e94795aSAndroid Build Coastguard Worker
152*9e94795aSAndroid Build Coastguard Worker    results.push(resource);
153*9e94795aSAndroid Build Coastguard Worker  }
154*9e94795aSAndroid Build Coastguard Worker
155*9e94795aSAndroid Build Coastguard Worker  // Format and show the list of resource results.
156*9e94795aSAndroid Build Coastguard Worker  if (results.length) {
157*9e94795aSAndroid Build Coastguard Worker    $('#resource-browser-results .no-results').hide();
158*9e94795aSAndroid Build Coastguard Worker    for (i = 0; i < results.length; i++) {
159*9e94795aSAndroid Build Coastguard Worker      var result = results[i];
160*9e94795aSAndroid Build Coastguard Worker      var resultJqNode = $(tmpl('tmpl_resource_browser_result', result));
161*9e94795aSAndroid Build Coastguard Worker      for (tag in result.tagsHash)
162*9e94795aSAndroid Build Coastguard Worker        resultJqNode.addClass('tagged-' + tag);
163*9e94795aSAndroid Build Coastguard Worker      $('#resource-browser-results').append(resultJqNode);
164*9e94795aSAndroid Build Coastguard Worker
165*9e94795aSAndroid Build Coastguard Worker      loadedResults.push({ node: resultJqNode, result: result });
166*9e94795aSAndroid Build Coastguard Worker    }
167*9e94795aSAndroid Build Coastguard Worker  } else {
168*9e94795aSAndroid Build Coastguard Worker    $('#resource-browser-results .no-results').show();
169*9e94795aSAndroid Build Coastguard Worker  }
170*9e94795aSAndroid Build Coastguard Worker}
171*9e94795aSAndroid Build Coastguard Worker
172*9e94795aSAndroid Build Coastguard Worker/**
173*9e94795aSAndroid Build Coastguard Worker * Formats the given array into a human readable, English string, ala
174*9e94795aSAndroid Build Coastguard Worker * 'a, b and c', with an optional item formatter/wrapper function.
175*9e94795aSAndroid Build Coastguard Worker */
176*9e94795aSAndroid Build Coastguard Workerfunction humanizeList(arr, itemFormatter) {
177*9e94795aSAndroid Build Coastguard Worker  itemFormatter = itemFormatter || function(o){ return o; };
178*9e94795aSAndroid Build Coastguard Worker  arr = arr || [];
179*9e94795aSAndroid Build Coastguard Worker
180*9e94795aSAndroid Build Coastguard Worker  var out = [];
181*9e94795aSAndroid Build Coastguard Worker  for (var i = 0; i < arr.length; i++) {
182*9e94795aSAndroid Build Coastguard Worker    out.push(itemFormatter(arr[i]) +
183*9e94795aSAndroid Build Coastguard Worker        ((i < arr.length - 2) ? ', ' : '') +
184*9e94795aSAndroid Build Coastguard Worker        ((i == arr.length - 2) ? ' and ' : ''));
185*9e94795aSAndroid Build Coastguard Worker  }
186*9e94795aSAndroid Build Coastguard Worker
187*9e94795aSAndroid Build Coastguard Worker  return out.join('');
188*9e94795aSAndroid Build Coastguard Worker}
189*9e94795aSAndroid Build Coastguard Worker
190*9e94795aSAndroid Build Coastguard Worker/**
191*9e94795aSAndroid Build Coastguard Worker * Parses a parameter string, i.e. foo=1&bar=2 into
192*9e94795aSAndroid Build Coastguard Worker * a dictionary object.
193*9e94795aSAndroid Build Coastguard Worker */
194*9e94795aSAndroid Build Coastguard Workerfunction parseParams(paramStr) {
195*9e94795aSAndroid Build Coastguard Worker  var params = {};
196*9e94795aSAndroid Build Coastguard Worker  paramStr = paramStr.replace(/^[?#]/, '');
197*9e94795aSAndroid Build Coastguard Worker
198*9e94795aSAndroid Build Coastguard Worker  var pairs = paramStr.split('&');
199*9e94795aSAndroid Build Coastguard Worker  for (var i = 0; i < pairs.length; i++) {
200*9e94795aSAndroid Build Coastguard Worker    var p = pairs[i].split('=');
201*9e94795aSAndroid Build Coastguard Worker    var key = p[0] ? decodeURIComponent(p[0]) : p[0];
202*9e94795aSAndroid Build Coastguard Worker    var val = p[1] ? decodeURIComponent(p[1]) : p[1];
203*9e94795aSAndroid Build Coastguard Worker    if (val === '0')
204*9e94795aSAndroid Build Coastguard Worker      val = 0;
205*9e94795aSAndroid Build Coastguard Worker    if (val === '1')
206*9e94795aSAndroid Build Coastguard Worker      val = 1;
207*9e94795aSAndroid Build Coastguard Worker
208*9e94795aSAndroid Build Coastguard Worker    if (key in params) {
209*9e94795aSAndroid Build Coastguard Worker      // Handle array values.
210*9e94795aSAndroid Build Coastguard Worker      params[key] = makeArray(params[key]);
211*9e94795aSAndroid Build Coastguard Worker      params[key].push(val);
212*9e94795aSAndroid Build Coastguard Worker    } else {
213*9e94795aSAndroid Build Coastguard Worker      params[key] = val;
214*9e94795aSAndroid Build Coastguard Worker    }
215*9e94795aSAndroid Build Coastguard Worker  }
216*9e94795aSAndroid Build Coastguard Worker
217*9e94795aSAndroid Build Coastguard Worker  return params;
218*9e94795aSAndroid Build Coastguard Worker}
219*9e94795aSAndroid Build Coastguard Worker
220*9e94795aSAndroid Build Coastguard Worker/**
221*9e94795aSAndroid Build Coastguard Worker * Returns the argument as a single-element array, or the argument itself
222*9e94795aSAndroid Build Coastguard Worker * if it's already an array.
223*9e94795aSAndroid Build Coastguard Worker */
224*9e94795aSAndroid Build Coastguard Workerfunction makeArray(o) {
225*9e94795aSAndroid Build Coastguard Worker  if (!o)
226*9e94795aSAndroid Build Coastguard Worker    return [];
227*9e94795aSAndroid Build Coastguard Worker
228*9e94795aSAndroid Build Coastguard Worker  if (typeof o === 'object' && 'splice' in o) {
229*9e94795aSAndroid Build Coastguard Worker    return o;
230*9e94795aSAndroid Build Coastguard Worker  } else {
231*9e94795aSAndroid Build Coastguard Worker    return [o];
232*9e94795aSAndroid Build Coastguard Worker  }
233*9e94795aSAndroid Build Coastguard Worker}
234*9e94795aSAndroid Build Coastguard Worker
235*9e94795aSAndroid Build Coastguard Worker})();
236