code: func lexShortcodeParam(l *pageLexer, escapedQuoteStart bool) stateFunc {
  
  	first := true
  	nextEq := false
  
  	var r rune
  
  	for {
  		r = l.next()
  		if first {
  			if r == '"' {
  				// a positional param with quotes
  				if l.paramElements == 2 {
  					return l.errorf("got quoted positional parameter. Cannot mix named and positional parameters")
  				}
  				l.paramElements = 1
  				l.backup()
  				return lexShortcodeQuotedParamVal(l, !escapedQuoteStart, tScParam)
  			}
  			first = false
  		} else if r == '=' {
  			// a named param
  			l.backup()
  			nextEq = true
  			break
  		}
  
  		if !isAlphaNumericOrHyphen(r) {
  			l.backup()
  			break
  		}
  	}
  
  	if l.paramElements == 0 {
  		l.paramElements++
  
  		if nextEq {
  			l.paramElements++
  		}
  	} else {
  		if nextEq && l.paramElements == 1 {
  			return l.errorf("got named parameter '%s'. Cannot mix named and positional parameters", l.current())
  		} else if !nextEq && l.paramElements == 2 {
  			return l.errorf("got positional parameter '%s'. Cannot mix named and positional parameters", l.current())
  		}
  	}
  
  	l.emit(tScParam)
  	return lexInsideShortcode
  
  }
docs: // either:
  // 1. param
  // 2. "param" or "param\"
  // 3. param="123" or param="123\"
  // 4. param="Some \"escaped\" text"