vseledkin
9/12/2017 - 3:51 PM

text span highlighter

insert before and after strings into specified string at some positions

package main

import (
	"sort"
)

func substitute(text, before, after string, positions [][]int) string {
	// flatten
	flatten_positions := make([]int, 2*len(positions))
	for i, pos := range positions {
		flatten_positions[2*i] = pos[0]
		flatten_positions[2*i+1] = pos[1]
	}
	sort.Ints(flatten_positions)

	var count int
	var buffer []rune

	for pos, char := range []rune(text) {
		if pos <= flatten_positions[len(flatten_positions)-1] && pos == flatten_positions[count] {
			if count%2 == 0 {
				buffer = append(buffer, []rune(before)...)
			} else {
				buffer = append(buffer, []rune(after)...)
			}
			count++
		}
		buffer = append(buffer, char)
	}

	return string(buffer)
}

func main() {
	text := "Школы и ТЦ эвакуируют в крупных городах России из-за анонимных звонков"
	want := "Школы и <b>ТЦ</b> эвакуируют в крупных городах <b>России</b> из-за анонимных звонков"
	processed := substitute(text, "<b>", "</b>", [][]int{{40, 46}, {8, 10}})
	if want == processed {
		print("OK\n")
	} else {
		print("Fail\n")
	}
	print(processed + "\n")
}