// Copyright 2015 The Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package markdown

func ruleBalancePairs(s *StateInline) {
	delimiters := s.Delimiters
	max := len(delimiters)

	for i := 0; i < max; i++ {
		lastDelim := delimiters[i]

		if !lastDelim.Close {
			continue
		}

		j := i - lastDelim.Jump - 1

		for j >= 0 {
			currDelim := delimiters[j]

			if currDelim.Open &&
				currDelim.Marker == lastDelim.Marker &&
				currDelim.End < 0 &&
				currDelim.Level == lastDelim.Level {
				oddMatch := (currDelim.Close || lastDelim.Open) &&
					currDelim.Length != -1 &&
					lastDelim.Length != -1 &&
					(currDelim.Length+lastDelim.Length)%3 == 0
				if !oddMatch {
					delimiters[i].Jump = i - j
					delimiters[i].Open = false
					delimiters[j].End = i
					delimiters[j].Jump = 0
					break
				}
			}

			j -= currDelim.Jump + 1
		}
	}
}