docs: def v1_fc_put(request, response, store, kvlclient, tfidf, cid):
      '''Store a single feature collection.
  
      The route for this endpoint is:
      ``PUT /dossier/v1/feature-collections/<content_id>``.
  
      ``content_id`` is the id to associate with the given feature
      collection. The feature collection should be in the request
      body serialized as JSON.
  
      Alternatively, if the request's ``Content-type`` is
      ``text/html``, then a feature collection is generated from the
      HTML. The generated feature collection is then returned as a
      JSON payload.
  
      This endpoint returns status ``201`` upon successful
      storage otherwise. An existing feature collection with id
      ``content_id`` is overwritten.
      '''
      tfidf = tfidf or None
      if request.headers.get('content-type', '').startswith('text/html'):
          url = urllib.unquote(cid.split('|', 1)[1])
          fc = etl.create_fc_from_html(url, request.body.read(), tfidf=tfidf)
          logger.info('created FC for %r', cid)
          store.put([(cid, fc)])
          return fc_to_json(fc)
      else:
          fc = FeatureCollection.from_dict(json.load(request.body))
          keywords = set()
          for subid in fc:
              if subid.startswith('subtopic'):
                  ty = subtopic_type(subid)
                  if ty in ('text', 'manual'):
                      # get the user selected string
                      data = typed_subtopic_data(fc, subid)
                      map(keywords.add, cleanse(data).split())
                      keywords.add(cleanse(data))
  
          folders = Folders(kvlclient)
          for fid, sid in folders.parent_subfolders(cid):
              if not isinstance(fid, unicode):
                  fid = fid.decode('utf8')
              if not isinstance(sid, unicode):
                  sid = sid.decode('utf8')
              keywords.add(cleanse(fid))
              keywords.add(cleanse(sid))
  
          fc[u'keywords'] = StringCounter(keywords)
          store.put([(cid, fc)])
          response.status = 201