My goal is to work out which lines a piece of text is on within a set of paragraphs.
For example, in the image below:
I want to find text starting from "Maecenas non" to the next instance of "nisi" and return that the sentence starts on Line 3 and ends on Line 6.
My attempt is below, and it does the job, but I don't think it would be the most efficient way to do things.
function replacePunctuation(s) {
return s.replace(/[^\w\s]/g, '');
}
let count = 0;
let rep = replacePunctuation;
let searchEndWords = [];
let passages = [
{'start':'Lorem ipsum', 'end':'finibus,', 'lnStart':null,'lnEnd':null},
{'start':'Proin tempus', 'end':'facilisis.', 'lnStart':null,'lnEnd':null},
{'start':'Suspendisse pretium', 'end':'volutpat', 'lnStart':null,'lnEnd':null},
{'start':'Nulla facilisi.', 'end':'luctus', 'lnStart':null,'lnEnd':null}
];
$("p").each(function(index) {
let $el = $(this);
let words = $el.text().split(' ');
let previousHeight = 0;
$el.text('');
for(let j = 0; j < words.length; j++) {
$el.text($el.text() + ' ' + words[j]);
if(previousHeight < $el.height()) {
count++;
previousHeight = $el.height();
}
for(let passage of passages) {
let startWords = passage.start.split(' ');
if(
searchEndWords.includes(rep(words[j])) &&
rep(passage.end) === rep(words[j])
) {
passage.lnEnd = count;
}
if(
rep(words[j]) === rep(startWords[0]) &&
rep(words[j+1]) === rep(startWords[1])
) {
searchEndWords.push(rep(passage.end));
passage.lnStart = count;
}
}
}
});
console.log(passages);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>Get lines</title>
<script src="https://code.jquery.com/jquery-3.1.0.js"></script>
</head>
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sed leo ultricies, rutrum ex id, tristique ex. Maecenas non diam vitae nisi egestas lacinia. Donec orci ex, scelerisque et enim finibus, dignissim ornare nisi. Curabitur accumsan magna ut interdum vehicula. Quisque eu feugiat leo. Nam imperdiet bibendum gravida. Proin tempus id urna et vulputate.</p>
<p>Integer semper elit in dui porta, vitae pulvinar turpis facilisis. Suspendisse pretium tristique erat, eu consequat odio dignissim a. Cras placerat, dui sit amet tristique aliquet, enim velit feugiat arcu, ac ullamcorper diam diam nec ante. Integer facilisis elit vel eros congue accumsan quis vel nisl. Cras aliquet enim neque. Suspendisse urna odio, cursus at eros a, ultrices dapibus diam. Quisque convallis sollicitudin risus ac volutpat. Nulla facilisi. Vivamus elementum libero a quam eleifend interdum vitae tristique nisl. Vivamus gravida massa ex, ac mattis ligula malesuada quis. Vivamus fermentum diam eu ante dignissim eleifend. Nullam posuere in sapien in ornare.</p>
<p>Ut sit amet dictum nisi. Pellentesque non pulvinar elit. Suspendisse eleifend arcu vitae nisi ultricies, ut sollicitudin eros interdum. Vivamus at quam viverra, posuere elit quis, semper sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vivamus non velit eu nunc ullamcorper tristique eget ac ipsum. Vestibulum molestie faucibus luctus. Praesent egestas ipsum congue ipsum ullamcorper, et imperdiet purus cursus. Sed varius ante vitae sapien malesuada, vitae mollis sapien bibendum. Suspendisse nisl lectus, blandit a lectus vel, ornare cursus ex. Aliquam a fringilla magna, non imperdiet ex. Nullam sit amet blandit orci. Nunc sed leo consequat orci tincidunt porttitor vel ut orci. Vivamus volutpat ante eget tellus euismod finibus. Vestibulum sed maximus ex.</p>
</body>
</html>
Context
I'm working on an exam style application. There are certain questions that refer to lines of text in a passage of information (fiction or nonfiction).
Answers would be laid out like so:
- Lines 45-50 ("Lorem ipsum...nori")
- Lines 51-53 ("Integer semper... facilisis")
- Lines 59-61 ("Ut sit... elit")
- Lines 76-79 ("Suspendisse eleifend... interdum")
There is no way to know what lines a piece of text will be on until it has been rendered on the page. This code attempts to find the passage each answer refers to, post render, to work out which lines it spans.