* feat: make new connections * refact: context groups | feat: area detection and a bunch of small things. hate yourself for this massive commit
		
			
				
	
	
		
			174 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package entities
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	"fmt"
 | 
						|
)
 | 
						|
 | 
						|
type IndependentTranslatedWord struct {
 | 
						|
	Id              string
 | 
						|
	ProcessedWordId string
 | 
						|
	Value           string
 | 
						|
}
 | 
						|
 | 
						|
type LinkedProcessedArea struct {
 | 
						|
	Area     ProcessedArea
 | 
						|
	Previous *LinkedProcessedArea
 | 
						|
	Next     *LinkedProcessedArea
 | 
						|
}
 | 
						|
 | 
						|
type SerializedLinkedProcessedArea struct {
 | 
						|
	AreaId     string `json:"areaId"`
 | 
						|
	PreviousId string `json:"previousId"`
 | 
						|
	NextId     string `json:"nextId"`
 | 
						|
}
 | 
						|
 | 
						|
type ContextGroupCollection struct {
 | 
						|
	Groups []LinkedAreaList
 | 
						|
}
 | 
						|
 | 
						|
type LinkedAreaList struct {
 | 
						|
	Id              string
 | 
						|
	DocumentId      string
 | 
						|
	TranslationText string
 | 
						|
	Head            *LinkedProcessedArea
 | 
						|
	Tail            *LinkedProcessedArea
 | 
						|
}
 | 
						|
 | 
						|
func (l *LinkedAreaList) First() *LinkedProcessedArea {
 | 
						|
	return l.Head
 | 
						|
}
 | 
						|
 | 
						|
func (linkedProcessedWord *LinkedProcessedArea) GetNext() *LinkedProcessedArea {
 | 
						|
	return linkedProcessedWord.Next
 | 
						|
}
 | 
						|
 | 
						|
func (linkedProcessedWord *LinkedProcessedArea) GetPrevious() *LinkedProcessedArea {
 | 
						|
	return linkedProcessedWord.Previous
 | 
						|
}
 | 
						|
 | 
						|
// Create new node with value
 | 
						|
func (l *LinkedAreaList) Push(processedArea ProcessedArea) *LinkedAreaList {
 | 
						|
	n := &LinkedProcessedArea{Area: processedArea}
 | 
						|
	if l.Head == nil {
 | 
						|
		l.Head = n // First node
 | 
						|
	} else {
 | 
						|
		l.Tail.Next = n     // Add after prev last node
 | 
						|
		n.Previous = l.Tail // Link back to prev last node
 | 
						|
	}
 | 
						|
	l.Tail = n // reset tail to newly added node
 | 
						|
	return l
 | 
						|
}
 | 
						|
 | 
						|
func (l *LinkedAreaList) Find(id string) *LinkedProcessedArea {
 | 
						|
	found := false
 | 
						|
	var ret *LinkedProcessedArea = nil
 | 
						|
	for n := l.First(); n != nil && !found; n = n.GetNext() {
 | 
						|
		if n.Area.Id == id {
 | 
						|
			found = true
 | 
						|
			ret = n
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return ret
 | 
						|
}
 | 
						|
 | 
						|
func (l *LinkedAreaList) Delete(id string) bool {
 | 
						|
	success := false
 | 
						|
	node2del := l.Find(id)
 | 
						|
	if node2del != nil {
 | 
						|
		fmt.Println("Delete - FOUND: ", id)
 | 
						|
		prev_node := node2del.Previous
 | 
						|
		next_node := node2del.Next
 | 
						|
		// Remove this node
 | 
						|
		prev_node.Next = node2del.Next
 | 
						|
		next_node.Previous = node2del.Previous
 | 
						|
		success = true
 | 
						|
	}
 | 
						|
	return success
 | 
						|
}
 | 
						|
 | 
						|
var errEmpty = errors.New("ERROR - List is empty")
 | 
						|
 | 
						|
// Pop last item from list
 | 
						|
func (l *LinkedAreaList) Pop() (processedArea ProcessedArea, err error) {
 | 
						|
	if l.Tail == nil {
 | 
						|
		err = errEmpty
 | 
						|
	} else {
 | 
						|
		processedArea = l.Tail.Area
 | 
						|
		l.Tail = l.Tail.Previous
 | 
						|
		if l.Tail == nil {
 | 
						|
			l.Head = nil
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return processedArea, err
 | 
						|
}
 | 
						|
 | 
						|
func (l *LinkedAreaList) InsertAfter(id string, processedArea ProcessedArea) bool {
 | 
						|
	found := false
 | 
						|
	for n := l.First(); n != nil && !found; n = n.GetNext() {
 | 
						|
		if n.Area.Id == id {
 | 
						|
			found = true
 | 
						|
			newNode := &LinkedProcessedArea{Area: processedArea}
 | 
						|
			newNode.Next = n.Next
 | 
						|
			newNode.Previous = n
 | 
						|
			n.Next = newNode
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return found
 | 
						|
}
 | 
						|
 | 
						|
func (l *LinkedAreaList) InsertBefore(id string, processedArea ProcessedArea) bool {
 | 
						|
	found := false
 | 
						|
	for n := l.First(); n != nil && !found; n = n.GetNext() {
 | 
						|
		if n.Area.Id == id {
 | 
						|
			found = true
 | 
						|
			newNode := &LinkedProcessedArea{Area: processedArea}
 | 
						|
			newNode.Next = n
 | 
						|
			newNode.Previous = n.Previous
 | 
						|
			n.Previous = newNode
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return found
 | 
						|
}
 | 
						|
 | 
						|
func (l *LinkedAreaList) Serialize() []SerializedLinkedProcessedArea {
 | 
						|
	var serialized []SerializedLinkedProcessedArea
 | 
						|
	for n := l.First(); n != nil; n = n.GetNext() {
 | 
						|
		areaId := n.Area.Id
 | 
						|
		previousId := ""
 | 
						|
		if n.Previous != nil {
 | 
						|
			previousId = n.Previous.Area.Id
 | 
						|
		}
 | 
						|
		nextId := ""
 | 
						|
		if n.Next != nil {
 | 
						|
			nextId = n.Next.Area.Id
 | 
						|
		}
 | 
						|
 | 
						|
		serialized = append(serialized, SerializedLinkedProcessedArea{
 | 
						|
			AreaId:     areaId,
 | 
						|
			PreviousId: previousId,
 | 
						|
			NextId:     nextId,
 | 
						|
		})
 | 
						|
	}
 | 
						|
	return serialized
 | 
						|
}
 | 
						|
 | 
						|
func DeserializeLinkedAreaList(serialized []SerializedLinkedProcessedArea) LinkedAreaList {
 | 
						|
	linkedAreaList := LinkedAreaList{}
 | 
						|
	for _, serializedLinkedProcessedArea := range serialized {
 | 
						|
		linkedAreaList.Push(ProcessedArea{
 | 
						|
			Id: serializedLinkedProcessedArea.AreaId,
 | 
						|
		})
 | 
						|
	}
 | 
						|
	for _, serializedLinkedProcessedArea := range serialized {
 | 
						|
		linkedProcessedArea := linkedAreaList.Find(serializedLinkedProcessedArea.AreaId)
 | 
						|
		if serializedLinkedProcessedArea.PreviousId != "" {
 | 
						|
			linkedProcessedArea.Previous = linkedAreaList.Find(serializedLinkedProcessedArea.PreviousId)
 | 
						|
		}
 | 
						|
		if serializedLinkedProcessedArea.NextId != "" {
 | 
						|
			linkedProcessedArea.Next = linkedAreaList.Find(serializedLinkedProcessedArea.NextId)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return linkedAreaList
 | 
						|
}
 |