docs: def get_mst_wood(recording, single_clf):
      """
      Parameters
      ----------
      recording : A list of lists
          Each sublist represents a stroke
      single_clf : object
          A classifier for single symbols - it only says "True" when a stroke is
          a single symbol or "False" when a stroke is only part of a symbol.
  
      Returns
      -------
      list
          A list of lists. Each sub-list is at least one symbol, but might be
          more.
      """
      points = get_points(recording)
      mst = get_mst(points)
      mst_wood = [{'mst': mst, 'strokes': list(range(len(mst)))}]
      # TODO: break mst into wood of msts wherever possible by recognizing single
      # symbols by stroke
  
      bbintersections = get_bb_intersections(recording)
      for i, stroke in enumerate(recording):  # TODO
          predictions = single_clf.predict({'id': 0, 'data': [stroke]})
          # TODO predictions[:20]
          prob_sum = sum([p['probability'] for p in predictions[:1]])
          # dots cannot be segmented into single symbols at this point
          if prob_sum > 0.95 and not any([el for el in bbintersections[i]]) \
             and len(stroke) > 2 \
             and predictions[0]['semantics'].split(';')[1] != '-':
              # Split mst here
              split_mst_index, split_node_i = find_split_node(mst_wood, i)
              mst_wood_tmp = break_mst(mst_wood[split_mst_index],
                                       split_node_i)
              del mst_wood[split_mst_index]
              for mst in mst_wood_tmp:
                  mst_wood.append(mst)
              for mst in mst_wood:
                  if i in mst['strokes']:
                      mst['pred'] = predictions[0]['semantics'].split(';')[1]
  
      # if any([True for mst in mst_wood if len(mst['strokes']) >= 8]):
      #     logging.debug([mst['pred'] for mst in mst_wood if 'pred' in mst])
      #     HandwrittenData(json.dumps(recording)).show()
      return mst_wood