overleaf/services/web/frontend/js/main/templates.js

83 lines
2.5 KiB
JavaScript
Raw Normal View History

/* eslint-disable
camelcase,
handle-callback-err,
max-len,
no-return-assign,
no-undef,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
define(['base', 'services/algolia-search'], App =>
App.controller('SearchWikiController', function($scope, algoliaSearch, _) {
$scope.hits = []
$scope.clearSearchText = function() {
$scope.searchQueryText = ''
return updateHits([])
}
$scope.safeApply = function(fn) {
const phase = $scope.$root.$$phase
if (phase === '$apply' || phase === '$digest') {
return $scope.$eval(fn)
} else {
return $scope.$apply(fn)
}
}
const buildHitViewModel = function(hit) {
const page_underscored = hit.pageName.replace(/\s/g, '_')
const section_underscored = hit.sectionName.replace(/\s/g, '_')
let content = hit._highlightResult.content.value
// Replace many new lines
content = content.replace(/\n\n+/g, '\n\n')
const lines = content.split('\n')
// Only show the lines that have a highlighted match
const matching_lines = []
for (let line of Array.from(lines)) {
if (!/^\[edit\]/.test(line)) {
content += line + '\n'
if (/<em>/.test(line)) {
matching_lines.push(line)
}
}
}
content = matching_lines.join('\n...\n')
const result = {
name:
hit._highlightResult.pageName.value +
' - ' +
hit._highlightResult.sectionName.value,
url: `/learn/${page_underscored}#${section_underscored}`,
content
}
return result
}
var updateHits = hits => $scope.safeApply(() => ($scope.hits = hits))
return ($scope.search = function() {
const query = $scope.searchQueryText
if (query == null || query.length === 0) {
updateHits([])
return
}
return algoliaSearch.searchWiki(query, function(err, response) {
if (response.hits.length === 0) {
return updateHits([])
} else {
const hits = _.map(response.hits, buildHitViewModel)
return updateHits(hits)
}
})
})
}))