package
0.0.0-20241128080525-21bebdf5942a
Repository: https://github.com/kapeli/dash-user-contributions.git
Documentation: pkg.go.dev

# README

Universal Verification Methodology DocSet

Docset for the Universal Verification Methodology (UVM) by Accellera.

  • Docset contributed by BooneJS

  • To regenerate, install Go (golang) 1.4+ and run the following:

      go run uvmdocset.go
    

    The output will look something like:

    $ go run uvmdocset.go Entered 152 Methods from UVM/UVM.docset/Contents/Resources/Documents/index/Methods.html Entered 164 Methods from UVM/UVM.docset/Contents/Resources/Documents/index/Methods2.html Entered 413 Methods from UVM/UVM.docset/Contents/Resources/Documents/index/Methods3.html Entered 224 Methods from UVM/UVM.docset/Contents/Resources/Documents/index/Methods4.html Entered 212 Methods from UVM/UVM.docset/Contents/Resources/Documents/index/Methods5.html Entered 240 Methods from UVM/UVM.docset/Contents/Resources/Documents/index/Methods6.html Entered 106 Methods from UVM/UVM.docset/Contents/Resources/Documents/index/Methods7.html Entered 178 Macros from UVM/UVM.docset/Contents/Resources/Documents/index/Macros.html Entered 27 Interfaces from UVM/UVM.docset/Contents/Resources/Documents/index/Ports.html Entered 51 Types from UVM/UVM.docset/Contents/Resources/Documents/index/Types.html Entered 180 Variables from UVM/UVM.docset/Contents/Resources/Documents/index/Variables.html Entered 136 Constants from UVM/UVM.docset/Contents/Resources/Documents/index/Constants.html Entered 234 Classs from UVM/UVM.docset/Contents/Resources/Documents/index/Classes.html Done.

  • The HTML for the docset comes from the docs/html directory in the UVM 1.2 Tarball

The source code to generate this docset:

package main

import (
  "database/sql"
  "fmt"
  "io"
  "log"
  "os"
  "strings"

  _ "github.com/mattn/go-sqlite3"
  "golang.org/x/net/html"
)

func main() {

  db, err := initDB()
  if err != nil {
    log.Fatal(err)
  }
  defer db.Close()

  //
  // Add *ALL* the Methods
  //
  funcFiles := []string{
    "UVM/UVM.docset/Contents/Resources/Documents/index/Methods.html",
    "UVM/UVM.docset/Contents/Resources/Documents/index/Methods2.html",
    "UVM/UVM.docset/Contents/Resources/Documents/index/Methods3.html",
    "UVM/UVM.docset/Contents/Resources/Documents/index/Methods4.html",
    "UVM/UVM.docset/Contents/Resources/Documents/index/Methods5.html",
    "UVM/UVM.docset/Contents/Resources/Documents/index/Methods6.html",
    "UVM/UVM.docset/Contents/Resources/Documents/index/Methods7.html",
  }
  for _, f := range funcFiles {
    err = addGroup(db, f, "Method")
    if err != nil {
      log.Fatal(err)
    }
  }

  err = addGroup(db, "UVM/UVM.docset/Contents/Resources/Documents/index/Macros.html", "Macro")
  if err != nil {
    log.Fatal(err)
  }

  err = addGroup(db, "UVM/UVM.docset/Contents/Resources/Documents/index/Ports.html", "Interface")
  if err != nil {
    log.Fatal(err)
  }

  err = addGroup(db, "UVM/UVM.docset/Contents/Resources/Documents/index/Types.html", "Type")
  if err != nil {
    log.Fatal(err)
  }

  err = addGroup(db, "UVM/UVM.docset/Contents/Resources/Documents/index/Variables.html", "Variable")
  if err != nil {
    log.Fatal(err)
  }

  err = addGroup(db, "UVM/UVM.docset/Contents/Resources/Documents/index/Constants.html", "Constant")
  if err != nil {
    log.Fatal(err)
  }

  err = addGroup(db, "UVM/UVM.docset/Contents/Resources/Documents/index/Classes.html", "Class")
  if err != nil {
    log.Fatal(err)
  }

  fmt.Println("Done.")
}

func initDB() (*sql.DB, error) {
  os.Remove("uvm.docset/Contents/Resources/docSet.dsidx")
  db, err := sql.Open("sqlite3", "./UVM/UVM.docset/Contents/Resources/docSet.dsidx")
  if err != nil {
    return db, err
  }

  createClear := `
    CREATE TABLE if not exists searchIndex(id INTEGER PRIMARY KEY, name TEXT, type TEXT, path TEXT);
    DELETE FROM searchIndex;
    CREATE UNIQUE INDEX if not exists anchor ON searchIndex (name, type, path);`

  _, err = db.Exec(createClear)
  if err != nil {
    return db, err
  }
  return db, nil
}

func addGroup(db *sql.DB, fileName, theType string) error {
  count := 0
  file, err := os.Open(fileName)
  if err != nil {
    log.Fatal(err)
  }

  // Find all classes
  tokenizer := html.NewTokenizer(file)

  inAThing := false
  proceed := true
  for proceed {
    tt := tokenizer.Next()
    switch tt {
    case html.ErrorToken:
      if tokenizer.Err() == io.EOF {
        proceed = false
        break
      }
      log.Fatalf("ERROR: '%s'\n", tokenizer.Err())
    case html.StartTagToken:
      t := tokenizer.Token()
      for _, a := range t.Attr {
        if t.Data == "td" && a.Key == "class" && a.Val == "IEntry" {
          inAThing = true
        }
        if a.Key == "href" {
          if inAThing {
            parts := strings.Split(a.Val, "#")
            if len(parts) < 2 {
              return fmt.Errorf("Parts was < 2: %s\n", strings.Join(parts, ","))
            }
            // fmt.Printf("%s method %s\n", strings.Join(parts[1:], "#"), a.Val)
            _, err := db.Exec(fmt.Sprintf("INSERT OR IGNORE INTO searchIndex(name, type, path) VALUES ('%s', '%s', '%s')", strings.Join(parts[1:], "#"), theType, "files/"+a.Val))
            if err != nil {
              return err
            }
            count++
          }
        }
      }
    case html.EndTagToken:
      t := tokenizer.Token()
      if t.Data == "td" { // End of a cell, reset inAThing
        inAThing = false
      }
    }
  }

  fmt.Printf("Entered %d %ss from %s\n", count, theType, fileName)
  return nil
}